kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
190 lines (189 loc) • 39 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = MapPopoverFactory;
exports.getSelectedFeature = getSelectedFeature;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _mapPopoverContent = _interopRequireDefault(require("./map-popover-content"));
var _icons = require("../common/icons");
var _reactIntl = require("react-intl");
var _localization = require("@kepler.gl/localization");
var _context = require("../context");
var _layers = require("@kepler.gl/layers");
var _commonUtils = require("@kepler.gl/common-utils");
var _constants = require("@kepler.gl/constants");
var _reducers = require("@kepler.gl/reducers");
var _react2 = require("@floating-ui/react");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
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 SELECTABLE_LAYERS = [_constants.LAYER_TYPES.hexagonId, _constants.LAYER_TYPES.geojson];
var MAX_WIDTH = 500;
var MAX_HEIGHT = 600;
var StyledMapPopover = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n\n max-width: ", "px;\n max-height: ", "px;\n padding: 14px;\n & > * + * {\n margin-top: 6px;\n }\n ", ";\n font-family: ", ";\n font-size: 11px;\n font-weight: 500;\n background-color: ", ";\n color: ", ";\n z-index: 98; /* should be below 99 which is side pane */\n overflow-x: auto;\n box-shadow: ", ";\n\n &:hover {\n background-color: ", ";\n }\n\n .primary-label {\n color: ", ";\n font-size: 10px;\n }\n\n .map-popover__layer-info,\n .coordingate-hover-info {\n & > * + * {\n margin-top: 7px;\n }\n }\n\n table {\n width: auto;\n display: grid;\n border-collapse: collapse;\n row-gap: 5px;\n column-gap: 5px;\n }\n\n .coordingate-hover-info > table {\n grid-template-columns: auto auto auto;\n }\n .map-popover__layer-info > table {\n grid-template-columns: auto auto;\n }\n\n tbody,\n tr {\n display: contents;\n }\n\n td {\n border-color: transparent;\n color: ", ";\n }\n\n td.row__value {\n text-align: right;\n font-weight: 500;\n color: ", ";\n }\n"])), MAX_WIDTH, MAX_HEIGHT, function (props) {
return props.theme.scrollBar;
}, function (props) {
return props.theme.fontFamily;
}, function (props) {
return props.theme.panelBackground;
}, function (props) {
return props.theme.textColor;
}, function (props) {
return props.theme.panelBoxShadow;
}, function (props) {
return "".concat(props.theme.panelBackground, "dd");
}, function (props) {
return props.theme.notificationColors.success;
}, function (props) {
return props.theme.textColor;
}, function (props) {
return props.theme.textColorHl;
});
var PinnedButtons = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-self: center;\n align-items: center;\n justify-items: center;\n & > * + * {\n margin-left: 10px;\n }\n"])));
var PopoverContent = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n & > * + * {\n margin-top: 12px;\n }\n"])));
var StyledIcon = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n\n &:hover {\n cursor: pointer;\n color: ", ";\n }\n"])), function (props) {
return props.theme.activeColor;
}, function (props) {
return props.theme.linkBtnColor;
});
var StyledSelectGeometry = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n color: ", ";\n svg {\n margin-right: 6px;\n }\n\n &:hover {\n cursor: pointer;\n color: ", ";\n }\n"])), function (props) {
return props.theme.textColorHl;
}, function (props) {
return props.theme.linkBtnColor;
});
MapPopoverFactory.deps = [_mapPopoverContent["default"]];
function getSelectedFeature(layerHoverProp) {
var _layer$config, _layer$config2;
var layer = layerHoverProp === null || layerHoverProp === void 0 ? void 0 : layerHoverProp.layer;
var fieldIdx;
var selectedFeature;
switch (layer === null || layer === void 0 ? void 0 : layer.type) {
case _constants.LAYER_TYPES.hexagonId:
fieldIdx = (_layer$config = layer.config) === null || _layer$config === void 0 || (_layer$config = _layer$config.columns) === null || _layer$config === void 0 || (_layer$config = _layer$config.hex_id) === null || _layer$config === void 0 ? void 0 : _layer$config.fieldIdx;
selectedFeature = (0, _commonUtils.idToPolygonGeo)({
id: (0, _reducers.getLayerHoverPropValue)(layerHoverProp === null || layerHoverProp === void 0 ? void 0 : layerHoverProp.data, fieldIdx)
}, {
isClosed: true
});
break;
case _constants.LAYER_TYPES.geojson:
fieldIdx = (_layer$config2 = layer.config) === null || _layer$config2 === void 0 || (_layer$config2 = _layer$config2.columns) === null || _layer$config2 === void 0 || (_layer$config2 = _layer$config2.geojson) === null || _layer$config2 === void 0 ? void 0 : _layer$config2.fieldIdx;
selectedFeature = (0, _layers.parseGeoJsonRawFeature)((0, _reducers.getLayerHoverPropValue)(layerHoverProp === null || layerHoverProp === void 0 ? void 0 : layerHoverProp.data, fieldIdx));
break;
default:
break;
}
if (selectedFeature) {
return _objectSpread(_objectSpread({}, selectedFeature), {}, {
// unique id should be assigned to features in the editor
id: (0, _commonUtils.generateHashId)(8)
});
} else {
return null;
}
}
function MapPopoverFactory(MapPopoverContent) {
var MapPopover = function MapPopover(_ref) {
var _layerHoverProp$layer, _layerHoverProp$layer2;
var x = _ref.x,
y = _ref.y,
frozen = _ref.frozen,
coordinate = _ref.coordinate,
layerHoverProp = _ref.layerHoverProp,
isBase = _ref.isBase,
zoom = _ref.zoom,
container = _ref.container,
onClose = _ref.onClose,
onSetFeatures = _ref.onSetFeatures,
setSelectedFeature = _ref.setSelectedFeature,
featureCollection = _ref.featureCollection;
var _useState = (0, _react.useState)('start'),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
horizontalPlacement = _useState2[0],
setHorizontalPlacement = _useState2[1];
var moveLeft = function moveLeft() {
return setHorizontalPlacement('end');
};
var moveRight = function moveRight() {
return setHorizontalPlacement('start');
};
var rootContext = (0, _react.useContext)(_context.RootContext);
var _useFloating = (0, _react2.useFloating)({
placement: "".concat(horizontalPlacement == 'end' ? 'left' : 'right', "-start"),
middleware: [(0, _react2.offset)({
mainAxis: 20,
alignmentAxis: 20
}), (0, _react2.flip)()]
}),
refs = _useFloating.refs,
context = _useFloating.context,
floatingStyles = _useFloating.floatingStyles;
var onSetSelectedFeature = (0, _react.useCallback)(function () {
var clickContext = {
mapIndex: 0,
rightClick: true,
position: {
x: x,
y: y
}
};
var selectedFeature = getSelectedFeature(layerHoverProp);
if (selectedFeature) {
setSelectedFeature(selectedFeature, clickContext);
var updatedFeatures = featureCollection ? [].concat((0, _toConsumableArray2["default"])(featureCollection.features), [selectedFeature]) : [selectedFeature];
onSetFeatures(updatedFeatures);
}
onClose();
}, [onClose, onSetFeatures, x, y, setSelectedFeature, layerHoverProp, featureCollection]);
var containerBounds = container === null || container === void 0 ? void 0 : container.getBoundingClientRect();
var clientPoint = (0, _react2.useClientPoint)(context, {
x: ((containerBounds === null || containerBounds === void 0 ? void 0 : containerBounds.left) || 0) + x,
y: ((containerBounds === null || containerBounds === void 0 ? void 0 : containerBounds.top) || 0) + y
});
var _useInteractions = (0, _react2.useInteractions)([clientPoint]),
getFloatingProps = _useInteractions.getFloatingProps;
return /*#__PURE__*/_react["default"].createElement(_react2.FloatingPortal, {
root: rootContext === null || rootContext === void 0 ? void 0 : rootContext.current
}, /*#__PURE__*/_react["default"].createElement(StyledMapPopover, (0, _extends2["default"])({
className: "map-popover",
ref: refs.setFloating,
style: floatingStyles
}, getFloatingProps()), frozen ? /*#__PURE__*/_react["default"].createElement(PinnedButtons, null, horizontalPlacement === 'start' && /*#__PURE__*/_react["default"].createElement(StyledIcon, {
className: "popover-arrow-left",
onClick: moveLeft
}, /*#__PURE__*/_react["default"].createElement(_icons.ArrowLeft, null)), /*#__PURE__*/_react["default"].createElement(StyledIcon, {
className: "popover-pin",
onClick: onClose
}, /*#__PURE__*/_react["default"].createElement(_icons.Pin, {
height: "16px"
})), horizontalPlacement === 'end' && /*#__PURE__*/_react["default"].createElement(StyledIcon, {
className: "popover-arrow-right",
onClick: moveRight
}, /*#__PURE__*/_react["default"].createElement(_icons.ArrowRight, null)), isBase && /*#__PURE__*/_react["default"].createElement("div", {
className: "primary-label"
}, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, {
id: "mapPopover.primary"
}))) : null, /*#__PURE__*/_react["default"].createElement(PopoverContent, null, /*#__PURE__*/_react["default"].createElement(MapPopoverContent, {
coordinate: coordinate,
zoom: zoom,
layerHoverProp: layerHoverProp
})), layerHoverProp !== null && layerHoverProp !== void 0 && (_layerHoverProp$layer = layerHoverProp.layer) !== null && _layerHoverProp$layer !== void 0 && _layerHoverProp$layer.type && SELECTABLE_LAYERS.includes(layerHoverProp === null || layerHoverProp === void 0 || (_layerHoverProp$layer2 = layerHoverProp.layer) === null || _layerHoverProp$layer2 === void 0 ? void 0 : _layerHoverProp$layer2.type) && frozen ? /*#__PURE__*/_react["default"].createElement(StyledSelectGeometry, {
className: "select-geometry",
onClick: onSetSelectedFeature
}, /*#__PURE__*/_react["default"].createElement(_icons.CursorPoint, null), "Select Geometry") : null));
};
return (0, _reactIntl.injectIntl)(MapPopover);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWFwUG9wb3ZlckNvbnRlbnQiLCJfaWNvbnMiLCJfcmVhY3RJbnRsIiwiX2xvY2FsaXphdGlvbiIsIl9jb250ZXh0IiwiX2xheWVycyIsIl9jb21tb25VdGlscyIsIl9jb25zdGFudHMiLCJfcmVkdWNlcnMiLCJfcmVhY3QyIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJfdGVtcGxhdGVPYmplY3Q0IiwiX3RlbXBsYXRlT2JqZWN0NSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlNFTEVDVEFCTEVfTEFZRVJTIiwiTEFZRVJfVFlQRVMiLCJoZXhhZ29uSWQiLCJnZW9qc29uIiwiTUFYX1dJRFRIIiwiTUFYX0hFSUdIVCIsIlN0eWxlZE1hcFBvcG92ZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwidGhlbWUiLCJzY3JvbGxCYXIiLCJmb250RmFtaWx5IiwicGFuZWxCYWNrZ3JvdW5kIiwidGV4dENvbG9yIiwicGFuZWxCb3hTaGFkb3ciLCJjb25jYXQiLCJub3RpZmljYXRpb25Db2xvcnMiLCJzdWNjZXNzIiwidGV4dENvbG9ySGwiLCJQaW5uZWRCdXR0b25zIiwiUG9wb3ZlckNvbnRlbnQiLCJTdHlsZWRJY29uIiwiYWN0aXZlQ29sb3IiLCJsaW5rQnRuQ29sb3IiLCJTdHlsZWRTZWxlY3RHZW9tZXRyeSIsIk1hcFBvcG92ZXJGYWN0b3J5IiwiZGVwcyIsIk1hcFBvcG92ZXJDb250ZW50RmFjdG9yeSIsImdldFNlbGVjdGVkRmVhdHVyZSIsImxheWVySG92ZXJQcm9wIiwiX2xheWVyJGNvbmZpZyIsIl9sYXllciRjb25maWcyIiwibGF5ZXIiLCJmaWVsZElkeCIsInNlbGVjdGVkRmVhdHVyZSIsInR5cGUiLCJjb25maWciLCJjb2x1bW5zIiwiaGV4X2lkIiwiaWRUb1BvbHlnb25HZW8iLCJpZCIsImdldExheWVySG92ZXJQcm9wVmFsdWUiLCJkYXRhIiwiaXNDbG9zZWQiLCJwYXJzZUdlb0pzb25SYXdGZWF0dXJlIiwiZ2VuZXJhdGVIYXNoSWQiLCJNYXBQb3BvdmVyQ29udGVudCIsIk1hcFBvcG92ZXIiLCJfcmVmIiwiX2xheWVySG92ZXJQcm9wJGxheWVyIiwiX2xheWVySG92ZXJQcm9wJGxheWVyMiIsIngiLCJ5IiwiZnJvemVuIiwiY29vcmRpbmF0ZSIsImlzQmFzZSIsInpvb20iLCJjb250YWluZXIiLCJvbkNsb3NlIiwib25TZXRGZWF0dXJlcyIsInNldFNlbGVjdGVkRmVhdHVyZSIsImZlYXR1cmVDb2xsZWN0aW9uIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwiaG9yaXpvbnRhbFBsYWNlbWVudCIsInNldEhvcml6b250YWxQbGFjZW1lbnQiLCJtb3ZlTGVmdCIsIm1vdmVSaWdodCIsInJvb3RDb250ZXh0IiwidXNlQ29udGV4dCIsIlJvb3RDb250ZXh0IiwiX3VzZUZsb2F0aW5nIiwidXNlRmxvYXRpbmciLCJwbGFjZW1lbnQiLCJtaWRkbGV3YXJlIiwib2Zmc2V0IiwibWFpbkF4aXMiLCJhbGlnbm1lbnRBeGlzIiwiZmxpcCIsInJlZnMiLCJjb250ZXh0IiwiZmxvYXRpbmdTdHlsZXMiLCJvblNldFNlbGVjdGVkRmVhdHVyZSIsInVzZUNhbGxiYWNrIiwiY2xpY2tDb250ZXh0IiwibWFwSW5kZXgiLCJyaWdodENsaWNrIiwicG9zaXRpb24iLCJ1cGRhdGVkRmVhdHVyZXMiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZmVhdHVyZXMiLCJjb250YWluZXJCb3VuZHMiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRQb2ludCIsInVzZUNsaWVudFBvaW50IiwibGVmdCIsInRvcCIsIl91c2VJbnRlcmFjdGlvbnMiLCJ1c2VJbnRlcmFjdGlvbnMiLCJnZXRGbG9hdGluZ1Byb3BzIiwiY3JlYXRlRWxlbWVudCIsIkZsb2F0aW5nUG9ydGFsIiwicm9vdCIsImN1cnJlbnQiLCJfZXh0ZW5kczIiLCJjbGFzc05hbWUiLCJyZWYiLCJzZXRGbG9hdGluZyIsInN0eWxlIiwib25DbGljayIsIkFycm93TGVmdCIsIlBpbiIsImhlaWdodCIsIkFycm93UmlnaHQiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiaW5jbHVkZXMiLCJDdXJzb3JQb2ludCIsImluamVjdEludGwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFwL21hcC1wb3BvdmVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IE1hcFBvcG92ZXJDb250ZW50RmFjdG9yeSBmcm9tICcuL21hcC1wb3BvdmVyLWNvbnRlbnQnO1xuaW1wb3J0IHtQaW4sIEFycm93TGVmdCwgQXJyb3dSaWdodCwgQ3Vyc29yUG9pbnR9IGZyb20gJy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQge2luamVjdEludGwsIEludGxTaGFwZX0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7Um9vdENvbnRleHR9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHtwYXJzZUdlb0pzb25SYXdGZWF0dXJlfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkLCBpZFRvUG9seWdvbkdlb30gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtMQVlFUl9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMYXllckhvdmVyUHJvcCwgZ2V0TGF5ZXJIb3ZlclByb3BWYWx1ZX0gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG5pbXBvcnQge0ZlYXR1cmUsIEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIEZsb2F0aW5nUG9ydGFsLFxuICBmbGlwLFxuICBvZmZzZXQsXG4gIHVzZUNsaWVudFBvaW50LFxuICB1c2VGbG9hdGluZyxcbiAgdXNlSW50ZXJhY3Rpb25zXG59IGZyb20gJ0BmbG9hdGluZy11aS9yZWFjdCc7XG5cbmNvbnN0IFNFTEVDVEFCTEVfTEFZRVJTOiBzdHJpbmdbXSA9IFtMQVlFUl9UWVBFUy5oZXhhZ29uSWQsIExBWUVSX1RZUEVTLmdlb2pzb25dO1xuY29uc3QgTUFYX1dJRFRIID0gNTAwO1xuY29uc3QgTUFYX0hFSUdIVCA9IDYwMDtcblxuY29uc3QgU3R5bGVkTWFwUG9wb3ZlciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgbWF4LXdpZHRoOiAke01BWF9XSURUSH1weDtcbiAgbWF4LWhlaWdodDogJHtNQVhfSEVJR0hUfXB4O1xuICBwYWRkaW5nOiAxNHB4O1xuICAmID4gKiArICoge1xuICAgIG1hcmdpbi10b3A6IDZweDtcbiAgfVxuICAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNjcm9sbEJhcn07XG4gIGZvbnQtZmFtaWx5OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRGYW1pbHl9O1xuICBmb250LXNpemU6IDExcHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kfTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbiAgei1pbmRleDogOTg7IC8qIHNob3VsZCBiZSBiZWxvdyA5OSB3aGljaCBpcyBzaWRlIHBhbmUgKi9cbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJveFNoYWRvd307XG5cbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBgJHtwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9ZGRgfTtcbiAgfVxuXG4gIC5wcmltYXJ5LWxhYmVsIHtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ub3RpZmljYXRpb25Db2xvcnMuc3VjY2Vzc307XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICB9XG5cbiAgLm1hcC1wb3BvdmVyX19sYXllci1pbmZvLFxuICAuY29vcmRpbmdhdGUtaG92ZXItaW5mbyB7XG4gICAgJiA+ICogKyAqIHtcbiAgICAgIG1hcmdpbi10b3A6IDdweDtcbiAgICB9XG4gIH1cblxuICB0YWJsZSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIHJvdy1nYXA6IDVweDtcbiAgICBjb2x1bW4tZ2FwOiA1cHg7XG4gIH1cblxuICAuY29vcmRpbmdhdGUtaG92ZXItaW5mbyA+IHRhYmxlIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0byBhdXRvO1xuICB9XG4gIC5tYXAtcG9wb3Zlcl9fbGF5ZXItaW5mbyA+IHRhYmxlIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gYXV0bztcbiAgfVxuXG4gIHRib2R5LFxuICB0ciB7XG4gICAgZGlzcGxheTogY29udGVudHM7XG4gIH1cblxuICB0ZCB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3J9O1xuICB9XG5cbiAgdGQucm93X192YWx1ZSB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JIbH07XG4gIH1cbmA7XG5cbmNvbnN0IFBpbm5lZEJ1dHRvbnMgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgJiA+ICogKyAqIHtcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgfVxuYDtcblxuY29uc3QgUG9wb3ZlckNvbnRlbnQgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAmID4gKiArICoge1xuICAgIG1hcmdpbi10b3A6IDEycHg7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEljb24gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5hY3RpdmVDb2xvcn07XG5cbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFNlbGVjdEdlb21ldHJ5ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICBzdmcge1xuICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICB9XG5cbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxpbmtCdG5Db2xvcn07XG4gIH1cbmA7XG5cbk1hcFBvcG92ZXJGYWN0b3J5LmRlcHMgPSBbTWFwUG9wb3ZlckNvbnRlbnRGYWN0b3J5XTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGVkRmVhdHVyZShsYXllckhvdmVyUHJvcDogTGF5ZXJIb3ZlclByb3AgfCBudWxsKTogRmVhdHVyZSB8IG51bGwge1xuICBjb25zdCBsYXllciA9IGxheWVySG92ZXJQcm9wPy5sYXllcjtcbiAgbGV0IGZpZWxkSWR4O1xuICBsZXQgc2VsZWN0ZWRGZWF0dXJlO1xuICBzd2l0Y2ggKGxheWVyPy50eXBlKSB7XG4gICAgY2FzZSBMQVlFUl9UWVBFUy5oZXhhZ29uSWQ6XG4gICAgICBmaWVsZElkeCA9IGxheWVyLmNvbmZpZz8uY29sdW1ucz8uaGV4X2lkPy5maWVsZElkeDtcbiAgICAgIHNlbGVjdGVkRmVhdHVyZSA9IGlkVG9Qb2x5Z29uR2VvKFxuICAgICAgICB7aWQ6IGdldExheWVySG92ZXJQcm9wVmFsdWUobGF5ZXJIb3ZlclByb3A/LmRhdGEsIGZpZWxkSWR4KX0sXG4gICAgICAgIHtpc0Nsb3NlZDogdHJ1ZX1cbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIExBWUVSX1RZUEVTLmdlb2pzb246XG4gICAgICBmaWVsZElkeCA9IGxheWVyLmNvbmZpZz8uY29sdW1ucz8uZ2VvanNvbj8uZmllbGRJZHg7XG4gICAgICBzZWxlY3RlZEZlYXR1cmUgPSBwYXJzZUdlb0pzb25SYXdGZWF0dXJlKFxuICAgICAgICBnZXRMYXllckhvdmVyUHJvcFZhbHVlKGxheWVySG92ZXJQcm9wPy5kYXRhLCBmaWVsZElkeClcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICBpZiAoc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNlbGVjdGVkRmVhdHVyZSxcbiAgICAgIC8vIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gZmVhdHVyZXMgaW4gdGhlIGVkaXRvclxuICAgICAgaWQ6IGdlbmVyYXRlSGFzaElkKDgpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNYXBQb3BvdmVyUHJvcHMgPSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBmcm96ZW4/OiBib29sZWFuO1xuICBjb29yZGluYXRlOiBbbnVtYmVyLCBudW1iZXJdIHwgYm9vbGVhbjtcbiAgbGF5ZXJIb3ZlclByb3A6IExheWVySG92ZXJQcm9wIHwgbnVsbDtcbiAgaXNCYXNlPzogYm9vbGVhbjtcbiAgem9vbTogbnVtYmVyO1xuICBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIG9uQ2xvc2U6ICgpID0+IHZvaWQ7XG4gIG9uU2V0RmVhdHVyZXM6IChmZWF0dXJlczogRmVhdHVyZVtdKSA9PiBhbnk7XG4gIHNldFNlbGVjdGVkRmVhdHVyZTogKGZlYXR1cmU6IEZlYXR1cmUgfCBudWxsLCBjbGlja0NvbnRleHQ/OiBGZWF0dXJlU2VsZWN0aW9uQ29udGV4dCkgPT4gYW55O1xuICBmZWF0dXJlQ29sbGVjdGlvbj86IHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgZmVhdHVyZXM6IEZlYXR1cmVbXTtcbiAgfTtcbn07XG5cbnR5cGUgSW50bFByb3BzID0ge1xuICBpbnRsOiBJbnRsU2hhcGU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNYXBQb3BvdmVyRmFjdG9yeShcbiAgTWFwUG9wb3ZlckNvbnRlbnQ6IFJldHVyblR5cGU8dHlwZW9mIE1hcFBvcG92ZXJDb250ZW50RmFjdG9yeT5cbikge1xuICBjb25zdCBNYXBQb3BvdmVyOiBSZWFjdC5GQzxNYXBQb3BvdmVyUHJvcHMgJiBJbnRsUHJvcHM+ID0gKHtcbiAgICB4LFxuICAgIHksXG4gICAgZnJvemVuLFxuICAgIGNvb3JkaW5hdGUsXG4gICAgbGF5ZXJIb3ZlclByb3AsXG4gICAgaXNCYXNlLFxuICAgIHpvb20sXG4gICAgY29udGFpbmVyLFxuICAgIG9uQ2xvc2UsXG4gICAgb25TZXRGZWF0dXJlcyxcbiAgICBzZXRTZWxlY3RlZEZlYXR1cmUsXG4gICAgZmVhdHVyZUNvbGxlY3Rpb25cbiAgfSkgPT4ge1xuICAgIGNvbnN0IFtob3Jpem9udGFsUGxhY2VtZW50LCBzZXRIb3Jpem9udGFsUGxhY2VtZW50XSA9IHVzZVN0YXRlKCdzdGFydCcpO1xuICAgIGNvbnN0IG1vdmVMZWZ0ID0gKCkgPT4gc2V0SG9yaXpvbnRhbFBsYWNlbWVudCgnZW5kJyk7XG4gICAgY29uc3QgbW92ZVJpZ2h0ID0gKCkgPT4gc2V0SG9yaXpvbnRhbFBsYWNlbWVudCgnc3RhcnQnKTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZUNvbnRleHQoUm9vdENvbnRleHQpO1xuICAgIGNvbnN0IHtyZWZzLCBjb250ZXh0LCBmbG9hdGluZ1N0eWxlc30gPSB1c2VGbG9hdGluZyh7XG4gICAgICBwbGFjZW1lbnQ6IGAke2hvcml6b250YWxQbGFjZW1lbnQgPT0gJ2VuZCcgPyAnbGVmdCcgOiAncmlnaHQnfS1zdGFydGAsXG4gICAgICBtaWRkbGV3YXJlOiBbb2Zmc2V0KHttYWluQXhpczogMjAsIGFsaWdubWVudEF4aXM6IDIwfSksIGZsaXAoKV1cbiAgICB9KTtcbiAgICBjb25zdCBvblNldFNlbGVjdGVkRmVhdHVyZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGNsaWNrQ29udGV4dCA9IHtcbiAgICAgICAgbWFwSW5kZXg6IDAsXG4gICAgICAgIHJpZ2h0Q2xpY2s6IHRydWUsXG4gICAgICAgIHBvc2l0aW9uOiB7eCwgeX1cbiAgICAgIH07XG4gICAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmUgPSBnZXRTZWxlY3RlZEZlYXR1cmUobGF5ZXJIb3ZlclByb3ApO1xuICAgICAgaWYgKHNlbGVjdGVkRmVhdHVyZSkge1xuICAgICAgICBzZXRTZWxlY3RlZEZlYXR1cmUoc2VsZWN0ZWRGZWF0dXJlLCBjbGlja0NvbnRleHQpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmVhdHVyZXMgPSBmZWF0dXJlQ29sbGVjdGlvblxuICAgICAgICAgID8gWy4uLmZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLCBzZWxlY3RlZEZlYXR1cmVdXG4gICAgICAgICAgOiBbc2VsZWN0ZWRGZWF0dXJlXTtcbiAgICAgICAgb25TZXRGZWF0dXJlcyh1cGRhdGVkRmVhdHVyZXMpO1xuICAgICAgfVxuICAgICAgb25DbG9zZSgpO1xuICAgIH0sIFtvbkNsb3NlLCBvblNldEZlYXR1cmVzLCB4LCB5LCBzZXRTZWxlY3RlZEZlYXR1cmUsIGxheWVySG92ZXJQcm9wLCBmZWF0dXJlQ29sbGVjdGlvbl0pO1xuXG4gICAgY29uc3QgY29udGFpbmVyQm91bmRzID0gY29udGFpbmVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjbGllbnRQb2ludCA9IHVzZUNsaWVudFBvaW50KGNvbnRleHQsIHtcbiAgICAgIHg6IChjb250YWluZXJCb3VuZHM/LmxlZnQgfHwgMCkgKyB4LFxuICAgICAgeTogKGNvbnRhaW5lckJvdW5kcz8udG9wIHx8IDApICsgeVxuICAgIH0pO1xuICAgIGNvbnN0IHtnZXRGbG9hdGluZ1Byb3BzfSA9IHVzZUludGVyYWN0aW9ucyhbY2xpZW50UG9pbnRdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RmxvYXRpbmdQb3J0YWwgcm9vdD17cm9vdENvbnRleHQ/LmN1cnJlbnR9PlxuICAgICAgICA8U3R5bGVkTWFwUG9wb3ZlclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm1hcC1wb3BvdmVyXCJcbiAgICAgICAgICByZWY9e3JlZnMuc2V0RmxvYXRpbmd9XG4gICAgICAgICAgc3R5bGU9e2Zsb2F0aW5nU3R5bGVzfVxuICAgICAgICAgIHsuLi5nZXRGbG9hdGluZ1Byb3BzKCl9XG4gICAgICAgID5cbiAgICAgICAgICB7ZnJvemVuID8gKFxuICAgICAgICAgICAgPFBpbm5lZEJ1dHRvbnM+XG4gICAgICAgICAgICAgIHtob3Jpem9udGFsUGxhY2VtZW50ID09PSAnc3RhcnQnICYmIChcbiAgICAgICAgICAgICAgICA8U3R5bGVkSWNvbiBjbGFzc05hbWU9XCJwb3BvdmVyLWFycm93LWxlZnRcIiBvbkNsaWNrPXttb3ZlTGVmdH0+XG4gICAgICAgICAgICAgICAgICA8QXJyb3dMZWZ0IC8+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRJY29uPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8U3R5bGVkSWNvbiBjbGFzc05hbWU9XCJwb3BvdmVyLXBpblwiIG9uQ2xpY2s9e29uQ2xvc2V9PlxuICAgICAgICAgICAgICAgIDxQaW4gaGVpZ2h0PVwiMTZweFwiIC8+XG4gICAgICAgICAgICAgIDwvU3R5bGVkSWNvbj5cbiAgICAgICAgICAgICAge2hvcml6b250YWxQbGFjZW1lbnQgPT09ICdlbmQnICYmIChcbiAgICAgICAgICAgICAgICA8U3R5bGVkSWNvbiBjbGFzc05hbWU9XCJwb3BvdmVyLWFycm93LXJpZ2h0XCIgb25DbGljaz17bW92ZVJpZ2h0fT5cbiAgICAgICAgICAgICAgICAgIDxBcnJvd1JpZ2h0IC8+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRJY29uPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aXNCYXNlICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInByaW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPVwibWFwUG9wb3Zlci5wcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvUGlubmVkQnV0dG9ucz5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8UG9wb3ZlckNvbnRlbnQ+XG4gICAgICAgICAgICA8TWFwUG9wb3ZlckNvbnRlbnRcbiAgICAgICAgICAgICAgY29vcmRpbmF0ZT17Y29vcmRpbmF0ZX1cbiAgICAgICAgICAgICAgem9vbT17em9vbX1cbiAgICAgICAgICAgICAgbGF5ZXJIb3ZlclByb3A9e2xheWVySG92ZXJQcm9wfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICAgIHtsYXllckhvdmVyUHJvcD8ubGF5ZXI/LnR5cGUgJiZcbiAgICAgICAgICBTRUxFQ1RBQkxFX0xBWUVSUy5pbmNsdWRlcyhsYXllckhvdmVyUHJvcD8ubGF5ZXI/LnR5cGUpICYmXG4gICAgICAgICAgZnJvemVuID8gKFxuICAgICAgICAgICAgPFN0eWxlZFNlbGVjdEdlb21ldHJ5IGNsYXNzTmFtZT1cInNlbGVjdC1nZW9tZXRyeVwiIG9uQ2xpY2s9e29uU2V0U2VsZWN0ZWRGZWF0dXJlfT5cbiAgICAgICAgICAgICAgPEN1cnNvclBvaW50IC8+XG4gICAgICAgICAgICAgIFNlbGVjdCBHZW9tZXRyeVxuICAgICAgICAgICAgPC9TdHlsZWRTZWxlY3RHZW9tZXRyeT5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9TdHlsZWRNYXBQb3BvdmVyPlxuICAgICAgPC9GbG9hdGluZ1BvcnRhbD5cbiAgICApO1xuICB9O1xuICBy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