UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

186 lines (152 loc) 21.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getDefaultLayerGroupVisibility = getDefaultLayerGroupVisibility; exports.isValidStyleUrl = isValidStyleUrl; exports.getStyleDownloadUrl = getStyleDownloadUrl; exports.scaleMapStyleByResolution = scaleMapStyleByResolution; exports.mergeLayerGroupVisibility = mergeLayerGroupVisibility; exports.editBottomMapStyle = exports.editTopMapStyle = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _immutable = _interopRequireDefault(require("immutable")); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _defaultSettings = require("../../constants/default-settings"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function getDefaultLayerGroupVisibility(_ref) { var _ref$layerGroups = _ref.layerGroups, layerGroups = _ref$layerGroups === void 0 ? [] : _ref$layerGroups; return layerGroups.reduce(function (accu, layer) { return _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 {Immutable.Map} top map style */ var 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 _immutable["default"].fromJS(_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 {Immutable.Map} bottom map style */ exports.editTopMapStyle = editTopMapStyle; var 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); }); }); // console.log(filteredLayers) return _immutable["default"].fromJS(_objectSpread({}, mapStyle.style, { layers: filteredLayers })); }, resolver); exports.editBottomMapStyle = editBottomMapStyle; var mapUrlRg = /^mapbox:\/\/styles\/[-a-z0-9]{2,256}\/[-a-z0-9]{2,256}/; var httpRg = /^(?=(http:|https:))/; var mapboxStyleApiUrl = 'https://api.mapbox.com/styles/v1/'; // 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) { 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(mapboxStyleApiUrl).concat(styleId, "?pluginName=Keplergl&access_token=").concat(accessToken); } // style url not recognized return null; } 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$f = _defaultSettings.RESOLUTION_OPTIONS.find(function (r) { return r.id === resolution; }), scale = _RESOLUTION_OPTIONS$f.scale, zoomOffset = _RESOLUTION_OPTIONS$f.zoomOffset; var copyStyle = mapboxStyle.toJS(); (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 _immutable["default"].fromJS(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({}, accu, {}, defaultLayerGroup.hasOwnProperty(key) ? (0, _defineProperty2["default"])({}, key, currentLayerGroup[key]) : {}); }, defaultLayerGroup); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9tYXAtc3R5bGUtdXRpbHMvbWFwYm94LWdsLXN0eWxlLWVkaXRvci5qcyJdLCJuYW1lcyI6WyJnZXREZWZhdWx0TGF5ZXJHcm91cFZpc2liaWxpdHkiLCJsYXllckdyb3VwcyIsInJlZHVjZSIsImFjY3UiLCJsYXllciIsInNsdWciLCJkZWZhdWx0VmlzaWJpbGl0eSIsInJlc29sdmVyIiwiaWQiLCJtYXBTdHlsZSIsInZpc2libGVMYXllckdyb3VwcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJkIiwic29ydCIsImpvaW4iLCJlZGl0VG9wTWFwU3R5bGUiLCJ2aXNpYmxlRmlsdGVycyIsImxnIiwibWFwIiwiZmlsdGVyZWRMYXllcnMiLCJzdHlsZSIsImxheWVycyIsInNvbWUiLCJtYXRjaCIsIkltbXV0YWJsZSIsImZyb21KUyIsImVkaXRCb3R0b21NYXBTdHlsZSIsImludmlzaWJsZUZpbHRlcnMiLCJldmVyeSIsIm1hcFVybFJnIiwiaHR0cFJnIiwibWFwYm94U3R5bGVBcGlVcmwiLCJpc1ZhbGlkU3R5bGVVcmwiLCJ1cmwiLCJCb29sZWFuIiwiZ2V0U3R5bGVEb3dubG9hZFVybCIsInN0eWxlVXJsIiwiYWNjZXNzVG9rZW4iLCJzdGFydHNXaXRoIiwic3R5bGVJZCIsInJlcGxhY2UiLCJzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uIiwibWFwYm94U3R5bGUiLCJyZXNvbHV0aW9uIiwibGFiZWxMYXllckdyb3VwIiwiREVGQVVMVF9MQVlFUl9HUk9VUFMiLCJmaW5kIiwibGFiZWxMYXllckZpbHRlciIsIlJFU09MVVRJT05TIiwiT05FX1giLCJSRVNPTFVUSU9OX09QVElPTlMiLCJyIiwic2NhbGUiLCJ6b29tT2Zmc2V0IiwiY29weVN0eWxlIiwidG9KUyIsImZvckVhY2giLCJtYXh6b29tIiwibWluem9vbSIsImxheW91dCIsIkFycmF5IiwiaXNBcnJheSIsInN0b3BzIiwic3RvcCIsIk1hdGgiLCJsb2cyIiwibWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eSIsImRlZmF1bHRMYXllckdyb3VwIiwiY3VycmVudExheWVyR3JvdXAiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7Ozs7O0FBTU8sU0FBU0EsOEJBQVQsT0FBNEQ7QUFBQSw4QkFBbkJDLFdBQW1CO0FBQUEsTUFBbkJBLFdBQW1CLGlDQUFMLEVBQUs7QUFDakUsU0FBT0EsV0FBVyxDQUFDQyxNQUFaLENBQ0wsVUFBQ0MsSUFBRCxFQUFPQyxLQUFQO0FBQUEsNkJBQ0tELElBREwsdUNBRUdDLEtBQUssQ0FBQ0MsSUFGVCxFQUVnQkQsS0FBSyxDQUFDRSxpQkFGdEI7QUFBQSxHQURLLEVBS0wsRUFMSyxDQUFQO0FBT0Q7O0FBRUQsSUFBTUMsUUFBUSxHQUFHLFNBQVhBLFFBQVc7QUFBQSxNQUFFQyxFQUFGLFNBQUVBLEVBQUY7QUFBQSxNQUFNQyxRQUFOLFNBQU1BLFFBQU47QUFBQSxvQ0FBZ0JDLGtCQUFoQjtBQUFBLE1BQWdCQSxrQkFBaEIsc0NBQXFDLEVBQXJDO0FBQUEsbUJBQ1pGLEVBRFksY0FDTkcsTUFBTSxDQUFDQyxJQUFQLENBQVlGLGtCQUFaLEVBQ05HLE1BRE0sQ0FDQyxVQUFBQyxDQUFDO0FBQUEsV0FBSUosa0JBQWtCLENBQUNJLENBQUQsQ0FBdEI7QUFBQSxHQURGLEVBRU5DLElBRk0sR0FHTkMsSUFITSxDQUdELEdBSEMsQ0FETTtBQUFBLENBQWpCO0FBTUE7Ozs7Ozs7OztBQU9PLElBQU1DLGVBQWUsR0FBRyx3QkFBUSxpQkFBd0M7QUFBQSxNQUF0Q1QsRUFBc0MsU0FBdENBLEVBQXNDO0FBQUEsTUFBbENDLFFBQWtDLFNBQWxDQSxRQUFrQztBQUFBLE1BQXhCQyxrQkFBd0IsU0FBeEJBLGtCQUF3QjtBQUM3RSxNQUFNUSxjQUFjLEdBQUcsQ0FBQ1QsUUFBUSxDQUFDUixXQUFULElBQXdCLEVBQXpCLEVBQ3BCWSxNQURvQixDQUNiLFVBQUFNLEVBQUU7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cEMsQ0FIRixFQUlFO0FBQ0FsRCxVQUFBQSxDQUFDLENBQUMrQyxNQUFGLENBQVMsV0FBVCxFQUFzQkcsS0FBdEIsQ0FBNEJOLE9BQTVCLENBQW9DLFVBQUFPLElBQUksRUFBSTtBQUMxQztBQUNBQSxZQUFBQSxJQUFJLENBQUMsQ0FBRCxDQUFKLElBQVdDLElBQUksQ0FBQ0MsSUFBTCxDQUFVYixLQUFWLENBQVgsQ0FGMEMsQ0FHMUM7O0FBQ0FXLFlBQUFBLElBQUksQ0FBQyxDQUFELENBQUosSUFBV1gsS0FBWDtBQUNELFdBTEQ7QUFNRDtBQUNGO0FBQ0YsS0F6QkQ7QUEyQkEsV0FBTzVCLHNCQUFVQyxNQUFWLENBQWlCNkIsU0FBakIsQ0FBUDtBQUNEOztBQUVELFNBQU9aLFdBQVA7QUFDRDtBQUVEOzs7Ozs7Ozs7QUFPTyxTQUFTd0IseUJBQVQsQ0FBbUNDLGlCQUFuQyxFQUFzREMsaUJBQXRELEVBQXlFO0FBQzlFLFNBQU8zRCxNQUFNLENBQUNDLElBQVAsQ0FBWTBELGlCQUFaLEVBQ0pwRSxNQURJLENBQ0csVUFBQ0MsSUFBRCxFQUFPb0UsR0FBUDtBQUFBLDZCQUNIcEUsSUFERyxNQUVGa0UsaUJBQWlCLENBQUNHLGNBQWxCLENBQWlDRCxHQUFqQyx5Q0FBMENBLEdBQTFDLEVBQWdERCxpQkFBaUIsQ0FBQ0MsR0FBRCxDQUFqRSxJQUEwRSxFQUZ4RTtBQUFBLEdBREgsRUFJREYsaUJBSkMsQ0FBUDtBQUtEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IEltbXV0YWJsZSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbG9kYXNoLm1lbW9pemUnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9MQVlFUl9HUk9VUFMsXG4gIFJFU09MVVRJT05TLFxuICBSRVNPTFVUSU9OX09QVElPTlNcbn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdExheWVyR3JvdXBWaXNpYmlsaXR5KHtsYXllckdyb3VwcyA9IFtdfSkge1xuICByZXR1cm4gbGF5ZXJHcm91cHMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllcikgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbbGF5ZXIuc2x1Z106IGxheWVyLmRlZmF1bHRWaXNpYmlsaXR5XG4gICAgfSksXG4gICAge31cbiAgKTtcbn1cblxuY29uc3QgcmVzb2x2ZXIgPSAoe2lkLCBtYXBTdHlsZSwgdmlzaWJsZUxheWVyR3JvdXBzID0ge319KSA9PlxuICBgJHtpZH06JHtPYmplY3Qua2V5cyh2aXNpYmxlTGF5ZXJHcm91cHMpXG4gICAgLmZpbHRlcihkID0+IHZpc2libGVMYXllckdyb3Vwc1tkXSlcbiAgICAuc29ydCgpXG4gICAgLmpvaW4oJy0nKX1gO1xuXG4vKipcbiAqIEVkaXQgcHJlc2V0IG1hcCBzdHlsZSB0byBrZWVwIG9ubHkgdmlzaWJsZSBsYXllcnNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbWFwU3R5bGUgLSBwcmVzZXQgbWFwIHN0eWxlXG4gKiBAcGFyYW0ge29iamVjdH0gdmlzaWJsZUxheWVyR3JvdXBzIC0gdmlzaWJsZSBsYXllcnMgb2YgdG9wIG1hcFxuICogQHJldHVybnMge0ltbXV0YWJsZS5NYXB9IHRvcCBtYXAgc3R5bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRUb3BNYXBTdHlsZSA9IG1lbW9pemUoKHtpZCwgbWFwU3R5bGUsIHZpc2libGVMYXllckdyb3Vwc30pID0+IHtcbiAgY29uc3QgdmlzaWJsZUZpbHRlcnMgPSAobWFwU3R5bGUubGF5ZXJHcm91cHMgfHwgW10pXG4gICAgLmZpbHRlcihsZyA9PiB2aXNpYmxlTGF5ZXJHcm91cHNbbGcuc2x1Z10pXG4gICAgLm1hcChsZyA9PiBsZy5maWx0ZXIpO1xuXG4gIC8vIGlmIHRvcCBtYXBcbiAgLy8ga2VlcCBvbmx5IHZpc2libGUgbGF5ZXJzXG4gIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbWFwU3R5bGUuc3R5bGUubGF5ZXJzLmZpbHRlcihsYXllciA9PlxuICAgIHZpc2libGVGaWx0ZXJzLnNvbWUobWF0Y2ggPT4gbWF0Y2gobGF5ZXIpKVxuICApO1xuXG4gIHJldHVybiBJbW11dGFibGUuZnJvbUpTKHtcbiAgICAuLi5tYXBTdHlsZS5zdHlsZSxcbiAgICBsYXllcnM6IGZpbHRlcmVkTGF5ZXJzXG4gIH0pO1xufSwgcmVzb2x2ZXIpO1xuXG4vKipcbiAqIEVkaXQgcHJlc2V0IG1hcCBzdHlsZSB0byBmaWx0ZXIgb3V0IGludmlzaWJsZSBsYXllcnNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbWFwU3R5bGUgLSBwcmVzZXQgbWFwIHN0eWxlXG4gKiBAcGFyYW0ge29iamVjdH0gdmlzaWJsZUxheWVyR3JvdXBzIC0gdmlzaWJsZSBsYXllcnMgb2YgYm90dG9tIG1hcFxuICogQHJldHVybnMge0ltbXV0YWJsZS5NYXB9IGJvdHRvbSBtYXAgc3R5bGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVkaXRCb3R0b21NYXBTdHlsZSA9IG1lbW9pemUoXG4gICh7aWQsIG1hcFN0eWxlLCB2aXNpYmxlTGF5ZXJHcm91cHN9KSA9PiB7XG4gICAgY29uc3QgaW52aXNpYmxlRmlsdGVycyA9IChtYXBTdHlsZS5sYXllckdyb3VwcyB8fCBbXSlcbiAgICAgIC5maWx0ZXIobGcgPT4gIXZpc2libGVMYXllckdyb3Vwc1tsZy5zbHVnXSlcbiAgICAgIC5tYXAobGcgPT4gbGcuZmlsdGVyKTtcblxuICAgIC8vIGlmIGJvdHRvbSBtYXBcbiAgICAvLyBmaWx0ZXIgb3V0IGludmlzaWJsZSBsYXllcnNcbiAgICBjb25zdCBmaWx0ZXJlZExheWVycyA9IG1hcFN0eWxlLnN0eWxlLmxheWVycy5maWx0ZXIobGF5ZXIgPT5cbiAgICAgIGludmlzaWJsZUZpbHRlcnMuZXZlcnkobWF0Y2ggPT4gIW1hdGNoKGxheWVyKSlcbiAgICApO1xuXG4gICAgLy8gY29uc29sZS5sb2coZmlsdGVyZWRMYXllcnMpXG4gICAgcmV0dXJuIEltbXV0YWJsZS5mcm9tSlMoe1xuICAgICAgLi4ubWFwU3R5bGUuc3R5bGUsXG4gICAgICBsYXllcnM6IGZpbHRlcmVkTGF5ZXJzXG4gICAgfSk7XG4gIH0sXG4gIHJlc29sdmVyXG4pO1xuXG5jb25zdCBtYXBVcmxSZyA9IC9ebWFwYm94OlxcL1xcL3N0eWxlc1xcL1stYS16MC05XXsyLDI1Nn1cXC9bLWEtejAtOV17MiwyNTZ9LztcbmNvbnN0IGh0dHBSZyA9IC9eKD89KGh0dHA6fGh0dHBzOikpLztcbmNvbnN0IG1hcGJveFN0eWxlQXBpVXJsID0gJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vc3R5bGVzL3YxLyc7XG5cbi8vIHZhbGlkIHN0eWxlIHVybFxuLy8gbWFwYm94Oi8vc3R5bGVzL3ViZXJkYXRhL2NqZnlsMDNrcDF0dWwyc21mNXYydGJkZDRcbi8vIGxvd2VyY2FzZSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBkYXNoZXMgb25seS5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3R5bGVVcmwodXJsKSB7XG4gIHJldHVybiB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBCb29sZWFuKHVybC5tYXRjaChtYXBVcmxSZykgfHwgdXJsLm1hdGNoKGh0dHBSZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVEb3dubG9hZFVybChzdHlsZVVybCwgYWNjZXNzVG9rZW4pIHtcbiAgaWYgKHN0eWxlVXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgIHJldHVybiBzdHlsZVVybDtcbiAgfVxuXG4gIC8vIG1hcGJveDovL3N0eWxlcy9qY2tyL2NqaGNsMGx4djEzZGkycnBmb3l0ZGJkeWpcbiAgaWYgKHN0eWxlVXJsLnN0YXJ0c1dpdGgoJ21hcGJveDovL3N0eWxlcycpKSB7XG4gICAgY29uc3Qgc3R5bGVJZCA9IHN0eWxlVXJsLnJlcGxhY2UoJ21hcGJveDovL3N0eWxlcy8nLCAnJyk7XG5cbiAgICAvLyBodHRwczovL2FwaS5tYXBib3guY29tL3N0eWxlcy92MS9oZXNoYW4wMTMxL2NqZzFiZnVtbzFjd20ycmxyanhraW5mZ3c/cGx1Z2luTmFtZT1LZXBsZXJnbCZhY2Nlc3NfdG9rZW49PHRva2VuPlxuICAgIHJldHVybiBgJHttYXBib3hTdHlsZUFwaVVybH0ke3N0eWxlSWR9P3BsdWdpbk5hbWU9S2VwbGVyZ2wmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YFxuICB9XG5cbiAgLy8gc3R5bGUgdXJsIG5vdCByZWNvZ25pemVkXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVNYXBTdHlsZUJ5UmVzb2x1dGlvbihtYXBib3hTdHlsZSwgcmVzb2x1dGlvbikge1xuICBjb25zdCBsYWJlbExheWVyR3JvdXAgPSBERUZBVUxUX0xBWUVSX0dST1VQUy5maW5kKGxnID0+IGxnLnNsdWcgPT09ICdsYWJlbCcpO1xuICBjb25zdCB7ZmlsdGVyOiBsYWJlbExheWVyRmlsdGVyfSA9IGxhYmVsTGF5ZXJHcm91cDtcblxuICBpZiAocmVzb2x1dGlvbiAhPT0gUkVTT0xVVElPTlMuT05FX1ggJiYgbWFwYm94U3R5bGUpIHtcbiAgICBjb25zdCB7c2NhbGUsIHpvb21PZmZzZXR9ID0gUkVTT0xVVElPTl9PUFRJT05TLmZpbmQoXG4gICAgICByID0+IHIuaWQgPT09IHJlc29sdXRpb25cbiAgICApO1xuICAgIGNvbnN0IGNvcHlTdHlsZSA9IG1hcGJveFN0eWxlLnRvSlMoKTtcbiAgICAoY29weVN0eWxlLmxheWVycyB8fCBbXSkuZm9yRWFjaChkID0+IHtcbiAgICAgIC8vIGVkaXQgbWluem9vbSBhbmQgbWF4em9vbVxuICAgICAgaWYgKGQubWF4em9vbSkge1xuICAgICAgICBkLm1heHpvb20gKz0gem9vbU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKGQubWluem9vbSkge1xuICAgICAgICBkLm1pbnpvb20gKz0gem9vbU9mZnNldDtcbiAgICAgIH1cblxuICAgICAgLy8gZWRpdCB0ZXh0IHNpemVcbiAgICAgIGlmIChsYWJlbExheWVyRmlsdGVyKGQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkLmxheW91dCAmJlxuICAgICAgICAgIGQubGF5b3V0Wyd0ZXh0LXNpemUnXSAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoZC5sYXlvdXRbJ3RleHQtc2l6ZSddLnN0b3BzKVxuICAgICAgICApIHtcbiAgICAgICAgICBkLmxheW91dFsndGV4dC1zaXplJ10uc3RvcHMuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgICAgICAgIC8vIHpvb21cbiAgICAgICAgICAgIHN0b3BbMF0gKz0gTWF0aC5sb2cyKHNjYWxlKTtcbiAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgIHN0b3BbMV0gKj0gc2NhbGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBJbW11dGFibGUuZnJvbUpTKGNvcHlTdHlsZSk7XG4gIH1cblxuICByZXR1cm4gbWFwYm94U3R5bGU7XG59XG5cbi8qKlxuICogV2hlbiBzd2l0Y2ggdG8gYSBuZXcgc3R5bGUsIHRyeSB0byBrZWVwIGN1cnJlbnQgbGF5ZXIgZ3JvdXAgdmlzaWJpbGl0eVxuICogYnkgbWVyZ2luZyBkZWZhdWx0IGFuZCBjdXJyZW50XG4gKiBAcGFyYW0ge29iamVjdH0gZGVmYXVsdExheWVyR3JvdXBcbiAqIEBwYXJhbSB7b2JqZWN0fSBjdXJyZW50TGF5ZXJHcm91cFxuICogQHJldHVybiB7b2JqZWN0fSBtZXJnZWRMYXllckdyb3Vwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eShkZWZhdWx0TGF5ZXJHcm91cCwgY3VycmVudExheWVyR3JvdXApIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGN1cnJlbnRMYXllckdyb3VwKVxuICAgIC5yZWR1Y2UoKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oZGVmYXVsdExheWVyR3JvdXAuaGFzT3duUHJvcGVydHkoa2V5KSA/IHtba2V5XTogY3VycmVudExheWVyR3JvdXBba2V5XX0gOiB7fSlcbiAgICB9KSwgZGVmYXVsdExheWVyR3JvdXApO1xufVxuXG4iXX0=