kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
121 lines (103 loc) • 14.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = MapTooltipContainer;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireDefault(require("react"));
var _mapPopover = _interopRequireDefault(require("./map-popover"));
var _viewportMercatorProject = _interopRequireDefault(require("viewport-mercator-project"));
// Copyright (c) 2023 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
MapTooltipContainer.deps = [_mapPopover["default"]];
var getHoverXY = function getHoverXY(viewport, lngLat) {
var screenCoord = !viewport || !lngLat ? null : viewport.project(lngLat);
return screenCoord && {
x: screenCoord[0],
y: screenCoord[1]
};
};
function MapTooltipContainer(MapPopover) {
/* eslint-disable complexity */
var MapTooltip = _react["default"].memo(function (_ref) {
var mapState = _ref.mapState,
hoverInfo = _ref.hoverInfo,
clicked = _ref.clicked,
datasets = _ref.datasets,
interactionConfig = _ref.interactionConfig,
layers = _ref.layers,
mapLayers = _ref.mapLayers,
_ref$mousePos = _ref.mousePos,
mousePosition = _ref$mousePos.mousePosition,
coordinate = _ref$mousePos.coordinate,
pinned = _ref$mousePos.pinned,
onClose = _ref.onClose;
if (!mousePosition) {
return null;
} // if clicked something, ignore hover behavior
var objectInfo = clicked || hoverInfo;
var layerHoverProp = null;
var position = {
x: mousePosition[0],
y: mousePosition[1]
};
if (interactionConfig.tooltip.enabled && objectInfo && objectInfo.picked) {
// if anything hovered
var object = objectInfo.object,
overlay = objectInfo.layer; // deckgl layer to kepler-gl layer
var layer = layers[overlay.props.idx];
if (layer.config.isVisible && layer.getHoverData && (!mapLayers || mapLayers[layer.id].isVisible)) {
// if layer is visible and have hovered data
var dataId = layer.config.dataId;
var _datasets$dataId2 = datasets[dataId],
allData = _datasets$dataId2.allData,
fields = _datasets$dataId2.fields;
var data = layer.getHoverData(object, allData);
var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId];
layerHoverProp = {
data: data,
fields: fields,
fieldsToShow: fieldsToShow,
layer: layer
};
}
}
if (pinned || clicked) {
// project lnglat to screen so that tooltip follows the object on zoom
var viewport = new _viewportMercatorProject["default"](mapState);
var lngLat = clicked ? clicked.lngLat : pinned.coordinate;
position = getHoverXY(viewport, lngLat);
}
return (/*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(MapPopover, (0, _extends2["default"])({}, position, {
layerHoverProp: layerHoverProp,
coordinate: interactionConfig.coordinate.enabled && ((pinned || {}).coordinate || coordinate),
freezed: Boolean(clicked || pinned),
onClose: onClose,
mapW: mapState.width,
mapH: mapState.height
})))
);
});
MapTooltip.displayName = 'MapTooltip';
return MapTooltip;
}
/* eslint-enable complexity */
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21hcC9tYXAtdG9vbHRpcC5qcyJdLCJuYW1lcyI6WyJNYXBUb29sdGlwQ29udGFpbmVyIiwiZGVwcyIsIk1hcFBvcG92ZXJGYWN0b3J5IiwiZ2V0SG92ZXJYWSIsInZpZXdwb3J0IiwibG5nTGF0Iiwic2NyZWVuQ29vcmQiLCJwcm9qZWN0IiwieCIsInkiLCJNYXBQb3BvdmVyIiwiTWFwVG9vbHRpcCIsIlJlYWN0IiwibWVtbyIsIm1hcFN0YXRlIiwiaG92ZXJJbmZvIiwiY2xpY2tlZCIsImRhdGFzZXRzIiwiaW50ZXJhY3Rpb25Db25maWciLCJsYXllcnMiLCJtYXBMYXllcnMiLCJtb3VzZVBvcyIsIm1vdXNlUG9zaXRpb24iLCJjb29yZGluYXRlIiwicGlubmVkIiwib25DbG9zZSIsIm9iamVjdEluZm8iLCJsYXllckhvdmVyUHJvcCIsInBvc2l0aW9uIiwidG9vbHRpcCIsImVuYWJsZWQiLCJwaWNrZWQiLCJvYmplY3QiLCJvdmVybGF5IiwibGF5ZXIiLCJwcm9wcyIsImlkeCIsImNvbmZpZyIsImlzVmlzaWJsZSIsImdldEhvdmVyRGF0YSIsImlkIiwiZGF0YUlkIiwiYWxsRGF0YSIsImZpZWxkcyIsImRhdGEiLCJmaWVsZHNUb1Nob3ciLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwiQm9vbGVhbiIsIndpZHRoIiwiaGVpZ2h0IiwiZGlzcGxheU5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQXRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU1BQSxtQkFBbUIsQ0FBQ0MsSUFBcEIsR0FBMkIsQ0FBQ0Msc0JBQUQsQ0FBM0I7O0FBRUEsSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ0MsUUFBRCxFQUFXQyxNQUFYLEVBQXNCO0FBQ3ZDLE1BQU1DLFdBQVcsR0FBRyxDQUFDRixRQUFELElBQWEsQ0FBQ0MsTUFBZCxHQUF1QixJQUF2QixHQUE4QkQsUUFBUSxDQUFDRyxPQUFULENBQWlCRixNQUFqQixDQUFsRDtBQUNBLFNBQU9DLFdBQVcsSUFBSTtBQUFDRSxJQUFBQSxDQUFDLEVBQUVGLFdBQVcsQ0FBQyxDQUFELENBQWY7QUFBb0JHLElBQUFBLENBQUMsRUFBRUgsV0FBVyxDQUFDLENBQUQ7QUFBbEMsR0FBdEI7QUFDRCxDQUhEOztBQUtlLFNBQVNOLG1CQUFULENBQTZCVSxVQUE3QixFQUF5QztBQUN0RDtBQUNBLE1BQU1DLFVBQVUsR0FBR0Msa0JBQU1DLElBQU4sQ0FBVyxnQkFVTztBQUFBLFFBVEpDLFFBU0ksUUFUSkEsUUFTSTtBQUFBLFFBUkpDLFNBUUksUUFSSkEsU0FRSTtBQUFBLFFBUEpDLE9BT0ksUUFQSkEsT0FPSTtBQUFBLFFBTkpDLFFBTUksUUFOSkEsUUFNSTtBQUFBLFFBTEpDLGlCQUtJLFFBTEpBLGlCQUtJO0FBQUEsUUFKSkMsTUFJSSxRQUpKQSxNQUlJO0FBQUEsUUFISkMsU0FHSSxRQUhKQSxTQUdJO0FBQUEsNkJBRkpDLFFBRUk7QUFBQSxRQUZPQyxhQUVQLGlCQUZPQSxhQUVQO0FBQUEsUUFGc0JDLFVBRXRCLGlCQUZzQkEsVUFFdEI7QUFBQSxRQUZrQ0MsTUFFbEMsaUJBRmtDQSxNQUVsQztBQUFBLFFBREpDLE9BQ0ksUUFESkEsT0FDSTs7QUFDbkMsUUFBSSxDQUFDSCxhQUFMLEVBQW9CO0FBQ2xCLGFBQU8sSUFBUDtBQUNELEtBSGtDLENBS25DOzs7QUFDQSxRQUFNSSxVQUFVLEdBQUdWLE9BQU8sSUFBSUQsU0FBOUI7QUFDQSxRQUFJWSxjQUFjLEdBQUcsSUFBckI7QUFDQSxRQUFJQyxRQUFRLEdBQUc7QUFBQ3BCLE1BQUFBLENBQUMsRUFBRWMsYUFBYSxDQUFDLENBQUQsQ0FBakI7QUFBc0JiLE1BQUFBLENBQUMsRUFBRWEsYUFBYSxDQUFDLENBQUQ7QUFBdEMsS0FBZjs7QUFFQSxRQUNFSixpQkFBaUIsQ0FBQ1csT0FBbEIsQ0FBMEJDLE9BQTFCLElBQ0FKLFVBREEsSUFFQUEsVUFBVSxDQUFDSyxNQUhiLEVBSUU7QUFDQTtBQUNBLFVBQU9DLE1BQVAsR0FBaUNOLFVBQWpDLENBQU9NLE1BQVA7QUFBQSxVQUFzQkMsT0FBdEIsR0FBaUNQLFVBQWpDLENBQWVRLEtBQWYsQ0FGQSxDQUlBOztBQUNBLFVBQU1BLEtBQUssR0FBR2YsTUFBTSxDQUFDYyxPQUFPLENBQUNFLEtBQVIsQ0FBY0MsR0FBZixDQUFwQjs7QUFFQSxVQUNFRixLQUFLLENBQUNHLE1BQU4sQ0FBYUMsU0FBYixJQUNBSixLQUFLLENBQUNLLFlBRE4sS0FFQyxDQUFDbkIsU0FBRCxJQUFjQSxTQUFTLENBQUNjLEtBQUssQ0FBQ00sRUFBUCxDQUFULENBQW9CRixTQUZuQyxDQURGLEVBSUU7QUFFQTtBQUNBLFlBQWdCRyxNQUFoQixHQUEyQlAsS0FBM0IsQ0FBT0csTUFBUCxDQUFnQkksTUFBaEI7QUFDQSxnQ0FBMEJ4QixRQUFRLENBQUN3QixNQUFELENBQWxDO0FBQUEsWUFBT0MsT0FBUCxxQkFBT0EsT0FBUDtBQUFBLFlBQWdCQyxNQUFoQixxQkFBZ0JBLE1BQWhCO0FBQ0EsWUFBTUMsSUFBSSxHQUFHVixLQUFLLENBQUNLLFlBQU4sQ0FBbUJQLE1BQW5CLEVBQTJCVSxPQUEzQixDQUFiO0FBQ0EsWUFBTUcsWUFBWSxHQUFHM0IsaUJBQWlCLENBQUNXLE9BQWxCLENBQTBCUSxNQUExQixDQUFpQ1EsWUFBakMsQ0FBOENKLE1BQTlDLENBQXJCO0FBRUFkLFFBQUFBLGNBQWMsR0FBRztBQUNmaUIsVUFBQUEsSUFBSSxFQUFKQSxJQURlO0FBRWZELFVBQUFBLE1BQU0sRUFBTkEsTUFGZTtBQUdmRSxVQUFBQSxZQUFZLEVBQVpBLFlBSGU7QUFJZlgsVUFBQUEsS0FBSyxFQUFMQTtBQUplLFNBQWpCO0FBTUQ7QUFDRjs7QUFFRCxRQUFJVixNQUFNLElBQUlSLE9BQWQsRUFBdUI7QUFDckI7QUFDQSxVQUFNWixRQUFRLEdBQUcsSUFBSTBDLG1DQUFKLENBQXdCaEMsUUFBeEIsQ0FBakI7QUFDQSxVQUFNVCxNQUFNLEdBQUdXLE9BQU8sR0FBR0EsT0FBTyxDQUFDWCxNQUFYLEdBQW9CbUIsTUFBTSxDQUFDRCxVQUFqRDtBQUNBSyxNQUFBQSxRQUFRLEdBQUd6QixVQUFVLENBQUNDLFFBQUQsRUFBV0MsTUFBWCxDQUFyQjtBQUNEOztBQUVELHlCQUNFLDBEQUNFLGdDQUFDLFVBQUQsZ0NBQ011QixRQUROO0FBRUUsUUFBQSxjQUFjLEVBQUVELGNBRmxCO0FBR0UsUUFBQSxVQUFVLEVBQUVULGlCQUFpQixDQUFDSyxVQUFsQixDQUE2Qk8sT0FBN0IsS0FBeUMsQ0FBQ04sTUFBTSxJQUFJLEVBQVgsRUFBZUQsVUFBZixJQUE2QkEsVUFBdEUsQ0FIZDtBQUlFLFFBQUEsT0FBTyxFQUFFd0IsT0FBTyxDQUFDL0IsT0FBTyxJQUFJUSxNQUFaLENBSmxCO0FBS0UsUUFBQSxPQUFPLEVBQUVDLE9BTFg7QUFNRSxRQUFBLElBQUksRUFBRVgsUUFBUSxDQUFDa0MsS0FOakI7QUFPRSxRQUFBLElBQUksRUFBRWxDLFFBQVEsQ0FBQ21DO0FBUGpCLFNBREY7QUFERjtBQWFELEdBeEVrQixDQUFuQjs7QUEwRUF0QyxFQUFBQSxVQUFVLENBQUN1QyxXQUFYLEdBQXlCLFlBQXpCO0FBRUEsU0FBT3ZDLFVBQVA7QUFDRDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNYXBQb3BvdmVyRmFjdG9yeSBmcm9tICdjb21wb25lbnRzL21hcC9tYXAtcG9wb3Zlcic7XG5pbXBvcnQgV2ViTWVyY2F0b3JWaWV3cG9ydCBmcm9tICd2aWV3cG9ydC1tZXJjYXRvci1wcm9qZWN0JztcblxuTWFwVG9vbHRpcENvbnRhaW5lci5kZXBzID0gW01hcFBvcG92ZXJGYWN0b3J5XTtcblxuY29uc3QgZ2V0SG92ZXJYWSA9ICh2aWV3cG9ydCwgbG5nTGF0KSA9PiB7XG4gIGNvbnN0IHNjcmVlbkNvb3JkID0gIXZpZXdwb3J0IHx8ICFsbmdMYXQgPyBudWxsIDogdmlld3BvcnQucHJvamVjdChsbmdMYXQpO1xuICByZXR1cm4gc2NyZWVuQ29vcmQgJiYge3g6IHNjcmVlbkNvb3JkWzBdLCB5OiBzY3JlZW5Db29yZFsxXX07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYXBUb29sdGlwQ29udGFpbmVyKE1hcFBvcG92ZXIpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuICBjb25zdCBNYXBUb29sdGlwID0gUmVhY3QubWVtbygoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZVBvczoge21vdXNlUG9zaXRpb24sIGNvb3JkaW5hdGUsIHBpbm5lZH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pID0+IHtcbiAgICBpZiAoIW1vdXNlUG9zaXRpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGlmIGNsaWNrZWQgc29tZXRoaW5nLCBpZ25vcmUgaG92ZXIgYmVoYXZpb3JcbiAgICBjb25zdCBvYmplY3RJbmZvID0gY2xpY2tlZCB8fCBob3ZlckluZm87XG4gICAgbGV0IGxheWVySG92ZXJQcm9wID0gbnVsbDtcbiAgICBsZXQgcG9zaXRpb24gPSB7eDogbW91c2VQb3NpdGlvblswXSwgeTogbW91c2VQb3NpdGlvblsxXX07XG5cbiAgICBpZiAoXG4gICAgICBpbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmVuYWJsZWQgJiZcbiAgICAgIG9iamVjdEluZm8gJiZcbiAgICAgIG9iamVjdEluZm8ucGlja2VkXG4gICAgKSB7XG4gICAgICAvLyBpZiBhbnl0aGluZyBob3ZlcmVkXG4gICAgICBjb25zdCB7b2JqZWN0LCBsYXllcjogb3ZlcmxheX0gPSBvYmplY3RJbmZvO1xuXG4gICAgICAvLyBkZWNrZ2wgbGF5ZXIgdG8ga2VwbGVyLWdsIGxheWVyXG4gICAgICBjb25zdCBsYXllciA9IGxheWVyc1tvdmVybGF5LnByb3BzLmlkeF07XG5cbiAgICAgIGlmIChcbiAgICAgICAgbGF5ZXIuY29uZmlnLmlzVmlzaWJsZSAmJlxuICAgICAgICBsYXllci5nZXRIb3ZlckRhdGEgJiZcbiAgICAgICAgKCFtYXBMYXllcnMgfHwgbWFwTGF5ZXJzW2xheWVyLmlkXS5pc1Zpc2libGUpXG4gICAgICApIHtcblxuICAgICAgICAvLyBpZiBsYXllciBpcyB2aXNpYmxlIGFuZCBoYXZlIGhvdmVyZWQgZGF0YVxuICAgICAgICBjb25zdCB7Y29uZmlnOiB7ZGF0YUlkfX0gPSBsYXllcjtcbiAgICAgICAgY29uc3Qge2FsbERhdGEsIGZpZWxkc30gPSBkYXRhc2V0c1tkYXRhSWRdO1xuICAgICAgICBjb25zdCBkYXRhID0gbGF5ZXIuZ2V0SG92ZXJEYXRhKG9iamVjdCwgYWxsRGF0YSk7XG4gICAgICAgIGNvbnN0IGZpZWxkc1RvU2hvdyA9IGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuXG4gICAgICAgIGxheWVySG92ZXJQcm9wID0ge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIGZpZWxkc1RvU2hvdyxcbiAgICAgICAgICBsYXllclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBpbm5lZCB8fCBjbGlja2VkKSB7XG4gICAgICAvLyBwcm9qZWN0IGxuZ2xhdCB0byBzY3JlZW4gc28gdGhhdCB0b29sdGlwIGZvbGxvd3MgdGhlIG9iamVjdCBvbiB6b29tXG4gICAgICBjb25zdCB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KG1hcFN0YXRlKTtcbiAgICAgIGNvbnN0IGxuZ0xhdCA9IGNsaWNrZWQgPyBjbGlja2VkLmxuZ0xhdCA6IHBpbm5lZC5jb29yZGluYXRlO1xuICAgICAgcG9zaXRpb24gPSBnZXRIb3ZlclhZKHZpZXdwb3J0LCBsbmdMYXQpO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8TWFwUG9wb3ZlclxuICAgICAgICAgIHsuLi5wb3NpdGlvbn1cbiAgICAgICAgICBsYXllckhvdmVyUHJvcD17bGF5ZXJIb3ZlclByb3B9XG4gICAgICAgICAgY29vcmRpbmF0ZT17aW50ZXJhY3Rpb25Db25maWcuY29vcmRpbmF0ZS5lbmFibGVkICYmICgocGlubmVkIHx8IHt9KS5jb29yZGluYXRlIHx8IGNvb3JkaW5hdGUpfVxuICAgICAgICAgIGZyZWV6ZWQ9e0Jvb2xlYW4oY2xpY2tlZCB8fCBwaW5uZWQpfVxuICAgICAgICAgIG9uQ2xvc2U9e29uQ2xvc2V9XG4gICAgICAgICAgbWFwVz17bWFwU3RhdGUud2lkdGh9XG4gICAgICAgICAgbWFwSD17bWFwU3RhdGUuaGVpZ2h0fVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfSk7XG5cbiAgTWFwVG9vbHRpcC5kaXNwbGF5TmFtZSA9ICdNYXBUb29sdGlwJztcblxuICByZXR1cm4gTWFwVG9vbHRpcDtcbn1cbi8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuIl19