kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
214 lines (178 loc) • 24.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.editTopMapStyle = exports.editBottomMapStyle = void 0;
exports.getDefaultLayerGroupVisibility = getDefaultLayerGroupVisibility;
exports.getStyleDownloadUrl = getStyleDownloadUrl;
exports.getStyleImageIcon = getStyleImageIcon;
exports.isValidStyleUrl = isValidStyleUrl;
exports.mergeLayerGroupVisibility = mergeLayerGroupVisibility;
exports.scaleMapStyleByResolution = scaleMapStyleByResolution;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _lodash = _interopRequireDefault(require("lodash.memoize"));
var _lodash2 = _interopRequireDefault(require("lodash.clonedeep"));
var _defaultSettings = require("../../constants/default-settings");
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; }
var mapUrlRg = /^mapbox:\/\/styles\/[-a-z0-9]{2,256}\/[-a-z0-9]{2,256}/;
var httpRg = /^(?=(http:|https:))/;
function getDefaultLayerGroupVisibility(_ref) {
var _ref$layerGroups = _ref.layerGroups,
layerGroups = _ref$layerGroups === void 0 ? [] : _ref$layerGroups;
return layerGroups.reduce(function (accu, layer) {
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.slug, layer.defaultVisibility));
}, {});
}
var resolver = function resolver(_ref2) {
var id = _ref2.id,
mapStyle = _ref2.mapStyle,
_ref2$visibleLayerGro = _ref2.visibleLayerGroups,
visibleLayerGroups = _ref2$visibleLayerGro === void 0 ? {} : _ref2$visibleLayerGro;
return "".concat(id, ":").concat(Object.keys(visibleLayerGroups).filter(function (d) {
return visibleLayerGroups[d];
}).sort().join('-'));
};
/**
* Edit preset map style to keep only visible layers
*
* @param {Object} mapStyle - preset map style
* @param {Object} visibleLayerGroups - visible layers of top map
* @returns {Object} top map style
*/
var editTopMapStyle = exports.editTopMapStyle = (0, _lodash["default"])(function (_ref3) {
var id = _ref3.id,
mapStyle = _ref3.mapStyle,
visibleLayerGroups = _ref3.visibleLayerGroups;
var visibleFilters = (mapStyle.layerGroups || []).filter(function (lg) {
return visibleLayerGroups[lg.slug];
}).map(function (lg) {
return lg.filter;
}); // if top map
// keep only visible layers
var filteredLayers = mapStyle.style.layers.filter(function (layer) {
return visibleFilters.some(function (match) {
return match(layer);
});
});
return _objectSpread(_objectSpread({}, mapStyle.style), {}, {
layers: filteredLayers
});
}, resolver);
/**
* Edit preset map style to filter out invisible layers
*
* @param {Object} mapStyle - preset map style
* @param {Object} visibleLayerGroups - visible layers of bottom map
* @returns {Object} bottom map style
*/
var editBottomMapStyle = exports.editBottomMapStyle = (0, _lodash["default"])(function (_ref4) {
var id = _ref4.id,
mapStyle = _ref4.mapStyle,
visibleLayerGroups = _ref4.visibleLayerGroups;
var invisibleFilters = (mapStyle.layerGroups || []).filter(function (lg) {
return !visibleLayerGroups[lg.slug];
}).map(function (lg) {
return lg.filter;
}); // if bottom map
// filter out invisible layers
var filteredLayers = mapStyle.style.layers.filter(function (layer) {
return invisibleFilters.every(function (match) {
return !match(layer);
});
});
return _objectSpread(_objectSpread({}, mapStyle.style), {}, {
layers: filteredLayers
});
}, resolver); // valid style url
// mapbox://styles/uberdata/cjfyl03kp1tul2smf5v2tbdd4
// lowercase letters, numbers and dashes only.
function isValidStyleUrl(url) {
return typeof url === 'string' && Boolean(url.match(mapUrlRg) || url.match(httpRg));
}
function getStyleDownloadUrl(styleUrl, accessToken, mapboxApiUrl) {
if (styleUrl.startsWith('http')) {
return styleUrl;
} // mapbox://styles/jckr/cjhcl0lxv13di2rpfoytdbdyj
if (styleUrl.startsWith('mapbox://styles')) {
var styleId = styleUrl.replace('mapbox://styles/', ''); // https://api.mapbox.com/styles/v1/heshan0131/cjg1bfumo1cwm2rlrjxkinfgw?pluginName=Keplergl&access_token=<token>
return "".concat(mapboxApiUrl || _defaultSettings.DEFAULT_MAPBOX_API_URL, "/styles/v1/").concat(styleId, "?pluginName=Keplergl&access_token=").concat(accessToken);
} // style url not recognized
return null;
}
/**
* Generate static map image from style Url to be used as icon
* @param {Object} param
* @param {string} param.styleUrl
* @param {string} param.mapboxApiAccessToken
* @param {string} param.mapboxApiUrl
* @param {Object} param.mapState
* @param {numbers} param.mapW
* @param {numbers} param.mapH
*/
function getStyleImageIcon(_ref5) {
var styleUrl = _ref5.styleUrl,
mapboxApiAccessToken = _ref5.mapboxApiAccessToken,
_ref5$mapboxApiUrl = _ref5.mapboxApiUrl,
mapboxApiUrl = _ref5$mapboxApiUrl === void 0 ? _defaultSettings.DEFAULT_MAPBOX_API_URL : _ref5$mapboxApiUrl,
_ref5$mapState = _ref5.mapState,
mapState = _ref5$mapState === void 0 ? {
longitude: -122.3391,
latitude: 37.7922,
zoom: 9
} : _ref5$mapState,
_ref5$mapW = _ref5.mapW,
mapW = _ref5$mapW === void 0 ? 400 : _ref5$mapW,
_ref5$mapH = _ref5.mapH,
mapH = _ref5$mapH === void 0 ? 300 : _ref5$mapH;
var styleId = styleUrl.replace('mapbox://styles/', '');
return "".concat(mapboxApiUrl, "/styles/v1/").concat(styleId, "/static/") + "".concat(mapState.longitude, ",").concat(mapState.latitude, ",").concat(mapState.zoom, ",0,0/") + "".concat(mapW, "x").concat(mapH) + "?access_token=".concat(mapboxApiAccessToken, "&logo=false&attribution=false");
}
function scaleMapStyleByResolution(mapboxStyle, resolution) {
var labelLayerGroup = _defaultSettings.DEFAULT_LAYER_GROUPS.find(function (lg) {
return lg.slug === 'label';
});
var labelLayerFilter = labelLayerGroup.filter;
if (resolution !== _defaultSettings.RESOLUTIONS.ONE_X && mapboxStyle) {
var _RESOLUTION_OPTIONS$f2 = _defaultSettings.RESOLUTION_OPTIONS.find(function (r) {
return r.id === resolution;
}),
scale = _RESOLUTION_OPTIONS$f2.scale,
zoomOffset = _RESOLUTION_OPTIONS$f2.zoomOffset;
var copyStyle = (0, _lodash2["default"])(mapboxStyle);
(copyStyle.layers || []).forEach(function (d) {
// edit minzoom and maxzoom
if (d.maxzoom) {
d.maxzoom += zoomOffset;
}
if (d.minzoom) {
d.minzoom += zoomOffset;
} // edit text size
if (labelLayerFilter(d)) {
if (d.layout && d.layout['text-size'] && Array.isArray(d.layout['text-size'].stops)) {
d.layout['text-size'].stops.forEach(function (stop) {
// zoom
stop[0] += Math.log2(scale); // size
stop[1] *= scale;
});
}
}
});
return copyStyle;
}
return mapboxStyle;
}
/**
* When switch to a new style, try to keep current layer group visibility
* by merging default and current
* @param {Object} defaultLayerGroup
* @param {Object} currentLayerGroup
* @return {Object} mergedLayerGroups
*/
function mergeLayerGroupVisibility(defaultLayerGroup, currentLayerGroup) {
return Object.keys(currentLayerGroup).reduce(function (accu, key) {
return _objectSpread(_objectSpread({}, accu), defaultLayerGroup.hasOwnProperty(key) ? (0, _defineProperty2["default"])({}, key, currentLayerGroup[key]) : {});
}, defaultLayerGroup);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9tYXAtc3R5bGUtdXRpbHMvbWFwYm94LWdsLXN0eWxlLWVkaXRvci5qcyJdLCJuYW1lcyI6WyJtYXBVcmxSZyIsImh0dHBSZyIsImdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSIsImxheWVyR3JvdXBzIiwicmVkdWNlIiwiYWNjdSIsImxheWVyIiwic2x1ZyIsImRlZmF1bHRWaXNpYmlsaXR5IiwicmVzb2x2ZXIiLCJpZCIsIm1hcFN0eWxlIiwidmlzaWJsZUxheWVyR3JvdXBzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImQiLCJzb3J0Iiwiam9pbiIsImVkaXRUb3BNYXBTdHlsZSIsInZpc2libGVGaWx0ZXJzIiwibGciLCJtYXAiLCJmaWx0ZXJlZExheWVycyIsInN0eWxlIiwibGF5ZXJzIiwic29tZSIsIm1hdGNoIiwiZWRpdEJvdHRvbU1hcFN0eWxlIiwiaW52aXNpYmxlRmlsdGVycyIsImV2ZXJ5IiwiaXNWYWxpZFN0eWxlVXJsIiwidXJsIiwiQm9vbGVhbiIsImdldFN0eWxlRG93bmxvYWRVcmwiLCJzdHlsZVVybCIsImFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwic3RhcnRzV2l0aCIsInN0eWxlSWQiLCJyZXBsYWNlIiwiREVGQVVMVF9NQVBCT1hfQVBJX1VSTCIsImdldFN0eWxlSW1hZ2VJY29uIiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtYXBTdGF0ZSIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiem9vbSIsIm1hcFciLCJtYXBIIiwic2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbiIsIm1hcGJveFN0eWxlIiwicmVzb2x1dGlvbiIsImxhYmVsTGF5ZXJHcm91cCIsIkRFRkFVTFRfTEFZRVJfR1JPVVBTIiwiZmluZCIsImxhYmVsTGF5ZXJGaWx0ZXIiLCJSRVNPTFVUSU9OUyIsIk9ORV9YIiwiUkVTT0xVVElPTl9PUFRJT05TIiwiciIsInNjYWxlIiwiem9vbU9mZnNldCIsImNvcHlTdHlsZSIsImZvckVhY2giLCJtYXh6b29tIiwibWluem9vbSIsImxheW91dCIsIkFycmF5IiwiaXNBcnJheSIsInN0b3BzIiwic3RvcCIsIk1hdGgiLCJsb2cyIiwibWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eSIsImRlZmF1bHRMYXllckdyb3VwIiwiY3VycmVudExheWVyR3JvdXAiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7Ozs7OztBQU9BLElBQU1BLFFBQVEsR0FBRyx3REFBakI7QUFDQSxJQUFNQyxNQUFNLEdBQUcscUJBQWY7O0FBRU8sU0FBU0MsOEJBQVQsT0FBNEQ7QUFBQSw4QkFBbkJDLFdBQW1CO0FBQUEsTUFBbkJBLFdBQW1CLGlDQUFMLEVBQUs7QUFDakUsU0FBT0EsV0FBVyxDQUFDQyxNQUFaLENBQ0wsVUFBQ0MsSUFBRCxFQUFPQyxLQUFQO0FBQUEsMkNBQ0tELElBREwsNENBRUdDLEtBQUssQ0FBQ0MsSUFGVCxFQUVnQkQsS0FBSyxDQUFDRSxpQkFGdEI7QUFBQSxHQURLLEVBS0wsRUFMSyxDQUFQO0FBT0Q7O0FBRUQsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVc7QUFBQSxNQUFFQyxFQUFGLFNBQUVBLEVBQUY7QUFBQSxNQUFNQyxRQUFOLFNBQU1BLFFBQU47QUFBQSxvQ0FBZ0JDLGtCQUFoQjtBQUFBLE1BQWdCQSxrQkFBaEIsc0NBQXFDLEVBQXJDO0FBQUEsbUJBQ1pGLEVBRFksY0FDTkcsTUFBTSxDQUFDQyxJQUFQLENBQVlGLGtCQUFaLEVBQ05HLE1BRE0sQ0FDQyxVQUFBQyxDQUFDO0FBQUEsV0FBSUosa0JBQWtCLENBQUNJLENBQUQsQ0FBdEI7QUFBQSxHQURGLEVBRU5DLElBRk0sR0FHTkMsSUFITSxDQUdELEdBSEMsQ0FETTtBQUFBLENBQWpCO0FBTUE7Ozs7Ozs7OztBQU9PLElBQU1DLGVBQWUsNkJBQUcsd0JBQVEsaUJBQXdDO0FBQUEsTUFBdENULEVBQXNDLFNBQXRDQSxFQUFzQztBQUFBLE1BQWxDQyxRQUFrQyxTQUFsQ0EsUUFBa0M7QUFBQSxNQUF4QkMsa0JBQXdCLFNBQXhCQSxrQkFBd0I7QUFDN0UsTUFBTVEsY0FBYyxHQUFHLENBQUNULFFBQVEsQ0FBQ1IsV0FBVCxJQUF3QixFQUF6QixFQUNwQlksTUFEb0IsQ0FDYixVQUFBTSxFQUFFO0FBQUEsV0FBSVQsa0JBQWtCLENBQUNTLEVBQUUsQ0FBQ2QsSUFBSixDQUF0QjtBQUFBLEdBRFcsRUFFcEJlLEdBRm9CLENBRWhCLFVBQUFELEVBQUU7QUFBQSxXQUFJQSxFQUFFLENBQUNOLE1BQVA7QUFBQSxHQUZjLENBQXZCLENBRDZFLENBSzdFO0FBQ0E7O0FBQ0EsTUFBTVEsY0FBYyxHQUFHWixRQUFRLENBQUNhLEtBQVQsQ0FBZUMsTUFBZixDQUFzQlYsTUFBdEIsQ0FBNkIsVUFBQVQsS0FBSztBQUFBLFdBQ3ZEYyxjQUFjLENBQUNNLElBQWYsQ0FBb0IsVUFBQUMsS0FBSztBQUFBLGFBQUlBLEtBQUssQ0FBQ3JCLEtBQUQsQ0FBVDtBQUFBLEtBQXpCLENBRHVEO0FBQUEsR0FBbEMsQ0FBdkI7QUFJQSx5Q0FDS0ssUUFBUSxDQUFDYSxLQURkO0FBRUVDLElBQUFBLE1BQU0sRUFBRUY7QUFGVjtBQUlELENBZjhCLEVBZTVCZCxRQWY0QixDQUF4QjtBQWlCUDs7Ozs7Ozs7QUFPTyxJQUFNbUIsa0JBQWtCLGdDQUFHLHdCQUNoQyxpQkFBd0M7QUFBQSxNQUF0Q2xCLEVBQXNDLFNBQXRDQSxFQUFzQztBQUFBLE1BQWxDQyxRQUFrQyxTQUFsQ0EsUUFBa0M7QUFBQSxNQUF4QkMsa0JBQXdCLFNBQXhCQSxrQkFBd0I7QUFDdEMsTUFBTWlCLGdCQUFnQixHQUFHLENBQUNsQixRQUFRLENBQUNSLFdBQVQsSUFBd0IsRUFBekIsRUFDdEJZLE1BRHNCLENBQ2YsVUFBQU0sRUFBRTtBQUFBLFdBQUksQ0FBQ1Qsa0JBQWtCLENBQUNTLEVBQUUsQ0FBQ2QsSUFBSixDQUF2QjtBQUFBLEdBRGEsRUFFdEJlLEdBRnNCLENBRWxCLFVBQUFELEVBQUU7QUFBQSxXQUFJQSxFQUFFLENBQUNOLE1BQVA7QUFBQSxHQUZnQixDQUF6QixDQURzQyxDQUt0QztBQUNBOztBQUNBLE1BQU1RLGNBQWMsR0FBR1osUUFBUSxDQUFDYSxLQUFULENBQWVDLE1BQWYsQ0FBc0JWLE1BQXRCLENBQTZCLFVBQUFULEtBQUs7QUFBQSxXQUN2RHVCLGdCQUFnQixDQUFDQyxLQUFqQixDQUF1QixVQUFBSCxLQUFLO0FBQUEsYUFBSSxDQUFDQSxLQUFLLENBQUNyQixLQUFELENBQVY7QUFBQSxLQUE1QixDQUR1RDtBQUFBLEdBQWxDLENBQXZCO0FBSUEseUNBQ0tLLFFBQVEsQ0FBQ2EsS0FEZDtBQUVFQyxJQUFBQSxNQUFNLEVBQUVGO0FBRlY7QUFJRCxDQWhCK0IsRUFpQmhDZCxRQWpCZ0MsQ0FBM0IsQyxDQW9CUDtBQUNBO0FBQ0E7O0FBQ08sU0FBU3NCLGVBQVQsQ0FBeUJDLEdBQXpCLEVBQThCO0FBQ25DLFNBQU8sT0FBT0EsR0FBUCxLQUFlLFFBQWYsSUFBMkJDLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDTCxLQUFKLENBQVUzQixRQUFWLEtBQXVCZ0MsR0FBRyxDQUFDTCxLQUFKLENBQVUxQixNQUFWLENBQXhCLENBQXpDO0FBQ0Q7O0FBRU0sU0FBU2lDLG1CQUFULENBQTZCQyxRQUE3QixFQUF1Q0MsV0FBdkMsRUFBb0RDLFlBQXBELEVBQWtFO0FBQ3ZFLE1BQUlGLFFBQVEsQ0FBQ0csVUFBVCxDQUFvQixNQUFwQixDQUFKLEVBQWlDO0FBQy9CLFdBQU9ILFFBQVA7QUFDRCxHQUhzRSxDQUt2RTs7O0FBQ0EsTUFBSUEsUUFBUSxDQUFDRyxVQUFULENBQW9CLGlCQUFwQixDQUFKLEVBQTRDO0FBQzFDLFFBQU1DLE9BQU8sR0FBR0osUUFBUSxDQUFDSyxPQUFULENBQWlCLGtCQUFqQixFQUFxQyxFQUFyQyxDQUFoQixDQUQwQyxDQUcxQzs7QUFDQSxxQkFBVUgsWUFBWSxJQUFJSSx1Q0FBMUIsd0JBQThERixPQUE5RCwrQ0FBMEdILFdBQTFHO0FBQ0QsR0FYc0UsQ0FhdkU7OztBQUNBLFNBQU8sSUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7OztBQVVPLFNBQVNNLGlCQUFULFFBV0o7QUFBQSxNQVZEUCxRQVVDLFNBVkRBLFFBVUM7QUFBQSxNQVREUSxvQkFTQyxTQVREQSxvQkFTQztBQUFBLGlDQVJETixZQVFDO0FBQUEsTUFSREEsWUFRQyxtQ0FSY0ksdUNBUWQ7QUFBQSw2QkFQREcsUUFPQztBQUFBLE1BUERBLFFBT0MsK0JBUFU7QUFDVEMsSUFBQUEsU0FBUyxFQUFFLENBQUMsUUFESDtBQUVUQyxJQUFBQSxRQUFRLEVBQUUsT0FGRDtBQUdUQyxJQUFBQSxJQUFJLEVBQUU7QUFIRyxHQU9WO0FBQUEseUJBRkRDLElBRUM7QUFBQSxNQUZEQSxJQUVDLDJCQUZNLEdBRU47QUFBQSx5QkFEREMsSUFDQztBQUFBLE1BRERBLElBQ0MsMkJBRE0sR0FDTjtBQUNELE1BQU1WLE9BQU8sR0FBR0osUUFBUSxDQUFDSyxPQUFULENBQWlCLGtCQUFqQixFQUFxQyxFQUFyQyxDQUFoQjtBQUVBLFNBQU8sVUFBR0gsWUFBSCx3QkFBNkJFLE9BQTdCLDBCQUNKSyxRQUFRLENBQUNDLFNBREwsY0FDa0JELFFBQVEsQ0FBQ0UsUUFEM0IsY0FDdUNGLFFBQVEsQ0FBQ0csSUFEaEQsdUJBRUpDLElBRkksY0FFSUMsSUFGSiw0QkFHVU4sb0JBSFYsa0NBQVA7QUFJRDs7QUFFTSxTQUFTTyx5QkFBVCxDQUFtQ0MsV0FBbkMsRUFBZ0RDLFVBQWhELEVBQTREO0FBQ2pFLE1BQU1DLGVBQWUsR0FBR0Msc0NBQXFCQyxJQUFyQixDQUEwQixVQUFBbEMsRUFBRTtBQUFBLFdBQUlBLEVBQUUsQ0FBQ2QsSUFBSCxLQUFZLE9BQWhCO0FBQUEsR0FBNUIsQ0FBeEI7O0FBQ0EsTUFBZWlELGdCQUFmLEdBQW1DSCxlQUFuQyxDQUFPdEMsTUFBUDs7QUFFQSxNQUFJcUMsVUFBVSxLQUFLSyw2QkFBWUMsS0FBM0IsSUFBb0NQLFdBQXhDLEVBQXFEO0FBQ25ELGlDQUE0QlEsb0NBQW1CSixJQUFuQixDQUMxQixVQUFBSyxDQUFDO0FBQUEsYUFBSUEsQ0FBQyxDQUFDbEQsRUFBRixLQUFTMEMsVUFBYjtBQUFBLEtBRHlCLENBQTVCO0FBQUEsUUFBT1MsS0FBUCwwQkFBT0EsS0FBUDtBQUFBLFFBQWNDLFVBQWQsMEJBQWNBLFVBQWQ7O0FBR0EsUUFBTUMsU0FBUyxHQUFHLHlCQUFVWixXQUFWLENBQWxCO0FBQ0EsS0FBQ1ksU0FBUyxDQUFDdEMsTUFBVixJQUFvQixFQUFyQixFQUF5QnVDLE9BQXpCLENBQWlDLFVBQUFoRCxDQUFDLEVBQUk7QUFDcEM7QUFDQSxVQUFJQSxDQUFDLENBQUNpRCxPQUFOLEVBQWU7QUFDYmpELFFBQUFBLENBQUMsQ0FBQ2lELE9BQUYsSUFBYUgsVUFBYjtBQUNEOztBQUVELFVBQUk5QyxDQUFDLENBQUNrRCxPQUFOLEVBQWU7QUFDYmxELFFBQUFBLENBQUMsQ0FBQ2tELE9BQUYsSUFBYUosVUFBYjtBQUNELE9BUm1DLENBVXBDOzs7QUFDQSxVQUFJTixnQkFBZ0IsQ0FBQ3hDLENBQUQsQ0FBcEIsRUFBeUI7QUFDdkIsWUFDRUEsQ0FBQyxDQUFDbUQsTUFBRixJQUNBbkQsQ0FBQyxDQUFDbUQsTUFBRixDQUFTLFdBQVQsQ0FEQSxJQUVBQyxLQUFLLENBQUNDLE9BQU4sQ0FBY3JELENBQUMsQ0FBQ21ELE1BQUYsQ0FBUyxXQUFULEVBQXNCRyxLQUFwQyxDQUhGLEVBSUU7QUFDQXRELFVBQUFBLENBQUMsQ0FBQ21ELE1BQUYsQ0FBUyxXQUFULEVBQXNCRyxLQUF0QixDQUE0Qk4sT0FBNUIsQ0FBb0MsVUFBQU8sSUFBSSxFQUFJO0FBQzFDO0FBQ0FBLFlBQUFBLElBQUksQ0FBQyxDQUFELENBQUosSUFBV0MsSUFBSSxDQUFDQyxJQUFMLENBQVVaLEtBQVYsQ0FBWCxDQUYwQyxDQUcxQzs7QUFDQVUsWUFBQUEsSUFBSSxDQUFDLENBQUQsQ0FBSixJQUFXVixLQUFYO0FBQ0QsV0FMRDtBQU1EO0FBQ0Y7QUFDRixLQXpCRDtBQTJCQSxXQUFPRSxTQUFQO0FBQ0Q7O0FBRUQsU0FBT1osV0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7OztBQU9PLFNBQVN1Qix5QkFBVCxDQUFtQ0MsaUJBQW5DLEVBQXNEQyxpQkFBdEQsRUFBeUU7QUFDOUUsU0FBTy9ELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZOEQsaUJBQVosRUFDSnhFLE1BREksQ0FDRyxVQUFDQyxJQUFELEVBQU93RSxHQUFQO0FBQUEsMkNBQ0h4RSxJQURHLEdBRUZzRSxpQkFBaUIsQ0FBQ0csY0FBbEIsQ0FBaUNELEdBQWpDLHlDQUEwQ0EsR0FBMUMsRUFBZ0RELGlCQUFpQixDQUFDQyxHQUFELENBQWpFLElBQTBFLEVBRnhFO0FBQUEsR0FESCxFQUlERixpQkFKQyxDQUFQO0FBS0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdsb2Rhc2gubWVtb2l6ZSc7XG5pbXBvcnQgY2xvbmREZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9MQVlFUl9HUk9VUFMsXG4gIFJFU09MVVRJT05TLFxuICBSRVNPTFVUSU9OX09QVElPTlMsXG4gIERFRkFVTFRfTUFQQk9YX0FQSV9VUkxcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5jb25zdCBtYXBVcmxSZyA9IC9ebWFwYm94OlxcL1xcL3N0eWxlc1xcL1stYS16MC05XXsyLDI1Nn1cXC9bLWEtejAtOV17MiwyNTZ9LztcbmNvbnN0IGh0dHBSZyA9IC9eKD89KGh0dHA6fGh0dHBzOikpLztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSh7bGF5ZXJHcm91cHMgPSBbXX0pIHtcbiAgcmV0dXJuIGxheWVyR3JvdXBzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2xheWVyLnNsdWddOiBsYXllci5kZWZhdWx0VmlzaWJpbGl0eVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG59XG5cbmNvbnN0IHJlc29sdmVyID0gKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3VwcyA9IHt9fSkgPT5cbiAgYCR7aWR9OiR7T2JqZWN0LmtleXModmlzaWJsZUxheWVyR3JvdXBzKVxuICAgIC5maWx0ZXIoZCA9PiB2aXNpYmxlTGF5ZXJHcm91cHNbZF0pXG4gICAgLnNvcnQoKVxuICAgIC5qb2luKCctJyl9YDtcblxuLyoqXG4gKiBFZGl0IHByZXNldCBtYXAgc3R5bGUgdG8ga2VlcCBvbmx5IHZpc2libGUgbGF5ZXJzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1hcFN0eWxlIC0gcHJlc2V0IG1hcCBzdHlsZVxuICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIHRvcCBtYXBcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRvcCBtYXAgc3R5bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUb3BNYXBTdHlsZSA9IG1lbW9pemUoKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3Vwc30pID0+IHtcbiAgY29uc3QgdmlzaWJsZUZpbHRlcnMgPSAobWFwU3R5bGUubGF5ZXJHcm91cHMgfHwgW10pXG4gICAgLmZpbHRlcihsZyA9PiB2aXNpYmxlTGF5ZXJHcm91cHNbbGcuc2x1Z10pXG4gICAgLm1hcChsZyA9PiBsZy5maWx0ZXIpO1xuXG4gIC8vIGlmIHRvcCBtYXBcbiAgLy8ga2VlcCBvbmx5IHZpc2libGUgbGF5ZXJzXG4gIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbWFwU3R5bGUuc3R5bGUubGF5ZXJzLmZpbHRlcihsYXllciA9PlxuICAgIHZpc2libGVGaWx0ZXJzLnNvbWUobWF0Y2ggPT4gbWF0Y2gobGF5ZXIpKVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4ubWFwU3R5bGUuc3R5bGUsXG4gICAgbGF5ZXJzOiBmaWx0ZXJlZExheWVyc1xuICB9O1xufSwgcmVzb2x2ZXIpO1xuXG4vKipcbiAqIEVkaXQgcHJlc2V0IG1hcCBzdHlsZSB0byBmaWx0ZXIgb3V0IGludmlzaWJsZSBsYXllcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwU3R5bGUgLSBwcmVzZXQgbWFwIHN0eWxlXG4gKiBAcGFyYW0ge09iamVjdH0gdmlzaWJsZUxheWVyR3JvdXBzIC0gdmlzaWJsZSBsYXllcnMgb2YgYm90dG9tIG1hcFxuICogQHJldHVybnMge09iamVjdH0gYm90dG9tIG1hcCBzdHlsZVxuICovXG5leHBvcnQgY29uc3QgZWRpdEJvdHRvbU1hcFN0eWxlID0gbWVtb2l6ZShcbiAgKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3Vwc30pID0+IHtcbiAgICBjb25zdCBpbnZpc2libGVGaWx0ZXJzID0gKG1hcFN0eWxlLmxheWVyR3JvdXBzIHx8IFtdKVxuICAgICAgLmZpbHRlcihsZyA9PiAhdmlzaWJsZUxheWVyR3JvdXBzW2xnLnNsdWddKVxuICAgICAgLm1hcChsZyA9PiBsZy5maWx0ZXIpO1xuXG4gICAgLy8gaWYgYm90dG9tIG1hcFxuICAgIC8vIGZpbHRlciBvdXQgaW52aXNpYmxlIGxheWVyc1xuICAgIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbWFwU3R5bGUuc3R5bGUubGF5ZXJzLmZpbHRlcihsYXllciA9PlxuICAgICAgaW52aXNpYmxlRmlsdGVycy5ldmVyeShtYXRjaCA9PiAhbWF0Y2gobGF5ZXIpKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFwU3R5bGUuc3R5bGUsXG4gICAgICBsYXllcnM6IGZpbHRlcmVkTGF5ZXJzXG4gICAgfTtcbiAgfSxcbiAgcmVzb2x2ZXJcbik7XG5cbi8vIHZhbGlkIHN0eWxlIHVybFxuLy8gbWFwYm94Oi8vc3R5bGVzL3ViZXJkYXRhL2NqZnlsMDNrcDF0dWwyc21mNXYydGJkZDRcbi8vIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMgb25seS5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3R5bGVVcmwodXJsKSB7XG4gIHJldHVybiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBCb29sZWFuKHVybC5tYXRjaChtYXBVcmxSZykgfHwgdXJsLm1hdGNoKGh0dHBSZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVEb3dubG9hZFVybChzdHlsZVVybCwgYWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCkge1xuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgcmV0dXJuIHN0eWxlVXJsO1xuICB9XG5cbiAgLy8gbWFwYm94Oi8vc3R5bGVzL2pja3IvY2poY2wwbHh2MTNkaTJycGZveXRkYmR5alxuICBpZiAoc3R5bGVVcmwuc3RhcnRzV2l0aCgnbWFwYm94Oi8vc3R5bGVzJykpIHtcbiAgICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICAgIC8vIGh0dHBzOi8vYXBpLm1hcGJveC5jb20vc3R5bGVzL3YxL2hlc2hhbjAxMzEvY2pnMWJmdW1vMWN3bTJybHJqeGtpbmZndz9wbHVnaW5OYW1lPUtlcGxlcmdsJmFjY2Vzc190b2tlbj08dG9rZW4+XG4gICAgcmV0dXJuIGAke21hcGJveEFwaVVybCB8fCBERUZBVUxUX01BUEJPWF9BUElfVVJMfS9zdHlsZXMvdjEvJHtzdHlsZUlkfT9wbHVnaW5OYW1lPUtlcGxlcmdsJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWBcbiAgfVxuXG4gIC8vIHN0eWxlIHVybCBub3QgcmVjb2duaXplZFxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBzdGF0aWMgbWFwIGltYWdlIGZyb20gc3R5bGUgVXJsIHRvIGJlIHVzZWQgYXMgaWNvblxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW0uc3R5bGVVcmxcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbS5tYXBib3hBcGlBY2Nlc3NUb2tlblxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtLm1hcGJveEFwaVVybFxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtLm1hcFN0YXRlXG4gKiBAcGFyYW0ge251bWJlcnN9IHBhcmFtLm1hcFdcbiAqIEBwYXJhbSB7bnVtYmVyc30gcGFyYW0ubWFwSFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVJbWFnZUljb24oe1xuICBzdHlsZVVybCxcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gIG1hcGJveEFwaVVybCA9IERFRkFVTFRfTUFQQk9YX0FQSV9VUkwsXG4gIG1hcFN0YXRlID0ge1xuICAgIGxvbmdpdHVkZTogLTEyMi4zMzkxLFxuICAgIGxhdGl0dWRlOiAzNy43OTIyLFxuICAgIHpvb206IDlcbiAgfSxcbiAgbWFwVyA9IDQwMCxcbiAgbWFwSCA9IDMwMFxufSkge1xuICBjb25zdCBzdHlsZUlkID0gc3R5bGVVcmwucmVwbGFjZSgnbWFwYm94Oi8vc3R5bGVzLycsICcnKTtcblxuICByZXR1cm4gYCR7bWFwYm94QXBpVXJsfS9zdHlsZXMvdjEvJHtzdHlsZUlkfS9zdGF0aWMvYCArXG4gIGAke21hcFN0YXRlLmxvbmdpdHVkZX0sJHttYXBTdGF0ZS5sYXRpdHVkZX0sJHttYXBTdGF0ZS56b29tfSwwLDAvYCArXG4gIGAke21hcFd9eCR7bWFwSH1gICtcbiAgYD9hY2Nlc3NfdG9rZW49JHttYXBib3hBcGlBY2Nlc3NUb2tlbn0mbG9nbz1mYWxzZSZhdHRyaWJ1dGlvbj1mYWxzZWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uKG1hcGJveFN0eWxlLCByZXNvbHV0aW9uKSB7XG4gIGNvbnN0IGxhYmVsTGF5ZXJHcm91cCA9IERFRkFVTFRfTEFZRVJfR1JPVVBTLmZpbmQobGcgPT4gbGcuc2x1ZyA9PT0gJ2xhYmVsJyk7XG4gIGNvbnN0IHtmaWx0ZXI6IGxhYmVsTGF5ZXJGaWx0ZXJ9ID0gbGFiZWxMYXllckdyb3VwO1xuXG4gIGlmIChyZXNvbHV0aW9uICE9PSBSRVNPTFVUSU9OUy5PTkVfWCAmJiBtYXBib3hTdHlsZSkge1xuICAgIGNvbnN0IHtzY2FsZSwgem9vbU9mZnNldH0gPSBSRVNPTFVUSU9OX09QVElPTlMuZmluZChcbiAgICAgIHIgPT4gci5pZCA9PT0gcmVzb2x1dGlvblxuICAgICk7XG4gICAgY29uc3QgY29weVN0eWxlID0gY2xvbmREZWVwKG1hcGJveFN0eWxlKTtcbiAgICAoY29weVN0eWxlLmxheWVycyB8fCBbXSkuZm9yRWFjaChkID0+IHtcbiAgICAgIC8vIGVkaXQgbWluem9vbSBhbmQgbWF4em9vbVxuICAgICAgaWYgKGQubWF4em9vbSkge1xuICAgICAgICBkLm1heHpvb20gKz0gem9vbU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKGQubWluem9vbSkge1xuICAgICAgICBkLm1pbnpvb20gKz0gem9vbU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgLy8gZWRpdCB0ZXh0IHNpemVcbiAgICAgIGlmIChsYWJlbExheWVyRmlsdGVyKGQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkLmxheW91dCAmJlxuICAgICAgICAgIGQubGF5b3V0Wyd0ZXh0LXNpemUnXSAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoZC5sYXlvdXRbJ3RleHQtc2l6ZSddLnN0b3BzKVxuICAgICAgICApIHtcbiAgICAgICAgICBkLmxheW91dFsndGV4dC1zaXplJ10uc3RvcHMuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgICAgICAgIC8vIHpvb21cbiAgICAgICAgICAgIHN0b3BbMF0gKz0gTWF0aC5sb2cyKHNjYWxlKTtcbiAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgIHN0b3BbMV0gKj0gc2NhbGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb3B5U3R5bGU7XG4gIH1cblxuICByZXR1cm4gbWFwYm94U3R5bGU7XG59XG5cbi8qKlxuICogV2hlbiBzd2l0Y2ggdG8gYSBuZXcgc3R5bGUsIHRyeSB0byBrZWVwIGN1cnJlbnQgbGF5ZXIgZ3JvdXAgdmlzaWJpbGl0eVxuICogYnkgbWVyZ2luZyBkZWZhdWx0IGFuZCBjdXJyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdExheWVyR3JvdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50TGF5ZXJHcm91cFxuICogQHJldHVybiB7T2JqZWN0fSBtZXJnZWRMYXllckdyb3Vwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eShkZWZhdWx0TGF5ZXJHcm91cCwgY3VycmVudExheWVyR3JvdXApIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGN1cnJlbnRMYXllckdyb3VwKVxuICAgIC5yZWR1Y2UoKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oZGVmYXVsdExheWVyR3JvdXAuaGFzT3duUHJvcGVydHkoa2V5KSA/IHtba2V5XTogY3VycmVudExheWVyR3JvdXBba2V5XX0gOiB7fSlcbiAgICB9KSwgZGVmYXVsdExheWVyR3JvdXApO1xufVxuXG4iXX0=