UNPKG

kepler.gl

Version:

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

165 lines (163 loc) 34.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof3 = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _classnames = _interopRequireDefault(require("classnames")); var _utilities = require("@dnd-kit/utilities"); var _chickletedInput = require("../../../common/item-selector/chickleted-input"); var _icons = require("../../../common/icons"); var _dropdownList = _interopRequireDefault(require("../../../common/item-selector/dropdown-list")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/localization/src"); var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _tippyTooltip = _interopRequireDefault(require("../../../common/tippy-tooltip")); var _useOnClickOutside = _interopRequireDefault(require("../../../hooks/use-on-click-outside")); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; // 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" != _typeof3(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 ChickletAddonWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n"]))); var ChickletAddon = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n margin-right: 4px;\n"]))); var StyledPopover = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: -64px;\n position: absolute;\n top: 20px;\n width: 140px;\n z-index: 101;\n"]))); var hashStyles = { SHOW: 'SHOW', ACTIVE: 'ACTIVE' }; var IconDiv = _styledComponents["default"].div.attrs({ className: 'tooltip-chicklet__icon' })(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n"])), function (props) { return props.$status === hashStyles.SHOW ? props.theme.subtextColorActive : props.$status === hashStyles.ACTIVE ? props.theme.activeColor : props.theme.textColor; }); var SortableStyledItem = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n transition: ", ";\n transform: ", ";\n &.sorting {\n opacity: 0.3;\n pointer-events: none;\n }\n &:hover {\n .tooltip-chicklet__drag-handler {\n opacity: 1;\n }\n }\n"])), function (props) { return props.$transition; }, function (props) { return props.$transform; }); var StyledDragHandle = _styledComponents["default"].div.attrs({ className: 'tooltip-chicklet__drag-handler' })(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n z-index: 1000;\n opacity: 0;\n margin-left: -5px;\n &:hover {\n cursor: move;\n color: ", ";\n }\n"])), function (props) { return props.theme.tooltipVerticalLineColor; }); var StyledTag = _styledComponents["default"].span(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n margin-right: 5px;\n text-overflow: ellipsis;\n width: 100%;\n overflow: hidden;\n max-width: 160px;\n"]))); function getFormatTooltip(formatLabels, format) { if (!format) { return null; } var formatLabel = formatLabels.find(function (fl) { return (0, _src2.getFormatValue)(fl) === format; }); if (formatLabel) { return formatLabel.label; } return (0, _typeof2["default"])(format) === 'object' ? JSON.stringify(format, null, 2) : String(format); } // TODO: a factory should take other factories as input function TooltipChickletFactory(dataId, config, onChange, fields, onDisplayFormatChange) { var TooltipChicklet = function TooltipChicklet(props) { var disabled = props.disabled, item = props.item, displayOption = props.displayOption, remove = props.remove, attributes = props.attributes, listeners = props.listeners, setNodeRef = props.setNodeRef, transform = props.transform, transition = props.transition, isDragging = props.isDragging; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), show = _useState2[0], setShow = _useState2[1]; var ref = (0, _useOnClickOutside["default"])(function () { return setShow(false); }); // const {show} = this.state; var tooltipField = config.fieldsToShow[dataId].find(function (fieldToShow) { return fieldToShow.name === item.name; }); if (!tooltipField) { return null; } var field = fields.find(function (f) { return f.name === tooltipField.name; }); if (!field) { return null; } var formatLabels = (0, _src2.getFormatLabels)(fields, tooltipField.name); var hasFormat = Boolean(field.displayFormat); var selectionIndex = formatLabels.findIndex(function (fl) { return (0, _src2.getFormatValue)(fl) === field.displayFormat; }); var hashStyle = show ? hashStyles.SHOW : hasFormat ? hashStyles.ACTIVE : null; return /*#__PURE__*/_react["default"].createElement(SortableStyledItem, (0, _extends2["default"])({ ref: setNodeRef, className: (0, _classnames["default"])('sortable-layer-items', { sorting: isDragging }), $transform: _utilities.CSS.Translate.toString(transform), $transition: transition || '' }, attributes), /*#__PURE__*/_react["default"].createElement(_chickletedInput.ChickletButton, null, /*#__PURE__*/_react["default"].createElement(StyledDragHandle, listeners, /*#__PURE__*/_react["default"].createElement(_icons.VertDots, { height: "12px" })), /*#__PURE__*/_react["default"].createElement(StyledTag, { title: displayOption(item) }, displayOption(item)), formatLabels.length > 1 && /*#__PURE__*/_react["default"].createElement(ChickletAddonWrapper, null, /*#__PURE__*/_react["default"].createElement(_tippyTooltip["default"], { placement: "top", render: function render() { return /*#__PURE__*/_react["default"].createElement("span", null, hasFormat ? getFormatTooltip(formatLabels, field.displayName) : /*#__PURE__*/_react["default"].createElement(_src.FormattedMessage, { id: 'fieldSelector.formatting' })); } }, /*#__PURE__*/_react["default"].createElement(ChickletAddon, null, /*#__PURE__*/_react["default"].createElement(IconDiv, { $status: hashStyle }, /*#__PURE__*/_react["default"].createElement(_icons.Hash, { height: "8px", onClick: function onClick(e) { e.stopPropagation(); setShow(Boolean(!show)); } })))), show && /*#__PURE__*/_react["default"].createElement(StyledPopover, { ref: ref }, /*#__PURE__*/_react["default"].createElement(_dropdownList["default"], { options: formatLabels, selectionIndex: selectionIndex, displayOption: function displayOption(option) { return option.label; }, onOptionSelected: function onOptionSelected(result, e) { e.stopPropagation(); setShow(false); var displayFormat = (0, _src2.getFormatValue)(result); var oldFieldsToShow = config.fieldsToShow[dataId]; var fieldsToShow = oldFieldsToShow.map(function (fieldToShow) { return fieldToShow.name === tooltipField.name ? { name: tooltipField.name, format: displayFormat } : fieldToShow; }); var newConfig = _objectSpread(_objectSpread({}, config), {}, { fieldsToShow: _objectSpread(_objectSpread({}, config.fieldsToShow), {}, (0, _defineProperty2["default"])({}, dataId, fieldsToShow)) }); onChange(newConfig); onDisplayFormatChange(dataId, field.name, displayFormat); } }))), /*#__PURE__*/_react["default"].createElement(_icons.Delete, { height: "16px", onClick: disabled ? null : remove }))); }; return TooltipChicklet; } var _default = exports["default"] = TooltipChickletFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl91dGlsaXRpZXMiLCJfY2hpY2tsZXRlZElucHV0IiwiX2ljb25zIiwiX2Ryb3Bkb3duTGlzdCIsIl9zcmMiLCJfc3JjMiIsIl90aXBweVRvb2x0aXAiLCJfdXNlT25DbGlja091dHNpZGUiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl90ZW1wbGF0ZU9iamVjdDciLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YzIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiQ2hpY2tsZXRBZGRvbldyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIkNoaWNrbGV0QWRkb24iLCJTdHlsZWRQb3BvdmVyIiwiaGFzaFN0eWxlcyIsIlNIT1ciLCJBQ1RJVkUiLCJJY29uRGl2IiwiYXR0cnMiLCJjbGFzc05hbWUiLCJwcm9wcyIsIiRzdGF0dXMiLCJ0aGVtZSIsInN1YnRleHRDb2xvckFjdGl2ZSIsImFjdGl2ZUNvbG9yIiwidGV4dENvbG9yIiwiU29ydGFibGVTdHlsZWRJdGVtIiwiJHRyYW5zaXRpb24iLCIkdHJhbnNmb3JtIiwiU3R5bGVkRHJhZ0hhbmRsZSIsInRvb2x0aXBWZXJ0aWNhbExpbmVDb2xvciIsIlN0eWxlZFRhZyIsInNwYW4iLCJnZXRGb3JtYXRUb29sdGlwIiwiZm9ybWF0TGFiZWxzIiwiZm9ybWF0IiwiZm9ybWF0TGFiZWwiLCJmaW5kIiwiZmwiLCJnZXRGb3JtYXRWYWx1ZSIsImxhYmVsIiwiX3R5cGVvZjIiLCJKU09OIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwiVG9vbHRpcENoaWNrbGV0RmFjdG9yeSIsImRhdGFJZCIsImNvbmZpZyIsIm9uQ2hhbmdlIiwiZmllbGRzIiwib25EaXNwbGF5Rm9ybWF0Q2hhbmdlIiwiVG9vbHRpcENoaWNrbGV0IiwiZGlzYWJsZWQiLCJpdGVtIiwiZGlzcGxheU9wdGlvbiIsInJlbW92ZSIsImF0dHJpYnV0ZXMiLCJsaXN0ZW5lcnMiLCJzZXROb2RlUmVmIiwidHJhbnNmb3JtIiwidHJhbnNpdGlvbiIsImlzRHJhZ2dpbmciLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJzaG93Iiwic2V0U2hvdyIsInJlZiIsInVzZU9uQ2xpY2tPdXRzaWRlIiwidG9vbHRpcEZpZWxkIiwiZmllbGRzVG9TaG93IiwiZmllbGRUb1Nob3ciLCJuYW1lIiwiZmllbGQiLCJmIiwiZ2V0Rm9ybWF0TGFiZWxzIiwiaGFzRm9ybWF0IiwiQm9vbGVhbiIsImRpc3BsYXlGb3JtYXQiLCJzZWxlY3Rpb25JbmRleCIsImZpbmRJbmRleCIsImhhc2hTdHlsZSIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJjbGFzc25hbWVzIiwic29ydGluZyIsIkNTUyIsIlRyYW5zbGF0ZSIsInRvU3RyaW5nIiwiQ2hpY2tsZXRCdXR0b24iLCJWZXJ0RG90cyIsImhlaWdodCIsInRpdGxlIiwicGxhY2VtZW50IiwicmVuZGVyIiwiZGlzcGxheU5hbWUiLCJGb3JtYXR0ZWRNZXNzYWdlIiwiaWQiLCJIYXNoIiwib25DbGljayIsInN0b3BQcm9wYWdhdGlvbiIsIm9wdGlvbnMiLCJvcHRpb24iLCJvbk9wdGlvblNlbGVjdGVkIiwicmVzdWx0Iiwib2xkRmllbGRzVG9TaG93IiwibWFwIiwibmV3Q29uZmlnIiwiRGVsZXRlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3JjL3NpZGUtcGFuZWwvaW50ZXJhY3Rpb24tcGFuZWwvdG9vbHRpcC1jb25maWcvdG9vbHRpcC1jaGlja2xldC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlU3RhdGUsIENTU1Byb3BlcnRpZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQsIHtJU3R5bGVkQ29tcG9uZW50fSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7RHJhZ2dhYmxlQXR0cmlidXRlc30gZnJvbSAnQGRuZC1raXQvY29yZSc7XG5pbXBvcnQge0NTUywgVHJhbnNmb3JtfSBmcm9tICdAZG5kLWtpdC91dGlsaXRpZXMnO1xuaW1wb3J0IHtDaGlja2xldEJ1dHRvbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2l0ZW0tc2VsZWN0b3IvY2hpY2tsZXRlZC1pbnB1dCc7XG5pbXBvcnQge0hhc2gsIERlbGV0ZSwgVmVydERvdHN9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9pY29ucyc7XG5pbXBvcnQgRHJvcGRvd25MaXN0IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9pdGVtLXNlbGVjdG9yL2Ryb3Bkb3duLWxpc3QnO1xuaW1wb3J0IHtGb3JtYXR0ZWRNZXNzYWdlfSBmcm9tICdAa2VwbGVyLmdsL2xvY2FsaXphdGlvbic7XG5pbXBvcnQge1RpbWVMYWJlbEZvcm1hdCwgVG9vbHRpcEZpZWxkc30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge2dldEZvcm1hdFZhbHVlLCBnZXRGb3JtYXRMYWJlbHN9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IFRpcHB5VG9vbHRpcCBmcm9tICcuLi8uLi8uLi9jb21tb24vdGlwcHktdG9vbHRpcCc7XG5pbXBvcnQge1Rvb2x0aXBGb3JtYXR9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB1c2VPbkNsaWNrT3V0c2lkZSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2Utb24tY2xpY2stb3V0c2lkZSc7XG5pbXBvcnQge0Jhc2VDb21wb25lbnRQcm9wc30gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuXG5pbnRlcmZhY2UgVG9vbHRpcENoaWNrbGV0UHJvcHMge1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgaXRlbToge25hbWU6IHN0cmluZ307XG4gIGRpc3BsYXlPcHRpb246IChpdGVtOiBhbnkpID0+IHN0cmluZztcbiAgcmVtb3ZlOiBhbnk7XG5cbiAgYXR0cmlidXRlczogRHJhZ2dhYmxlQXR0cmlidXRlcztcbiAgbGlzdGVuZXJzOiBhbnk7XG4gIHNldE5vZGVSZWY6IChub2RlOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG4gIHRyYW5zZm9ybTogVHJhbnNmb3JtIHwgbnVsbDtcbiAgdHJhbnNpdGlvbj86IHN0cmluZztcbiAgaXNEcmFnZ2luZzogYm9vbGVhbjtcbn1cblxudHlwZSBUb29sdGlwQ29uZmlnID0ge1xuICBmaWVsZHNUb1Nob3c6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7bmFtZTogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZyB8IG51bGx9W107XG4gIH07XG4gIGNvbXBhcmVNb2RlOiBib29sZWFuO1xuICBjb21wYXJlVHlwZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IENoaWNrbGV0QWRkb25XcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcblxuY29uc3QgQ2hpY2tsZXRBZGRvbiA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi1yaWdodDogNHB4O1xuYDtcblxuY29uc3QgU3R5bGVkUG9wb3ZlciA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi1sZWZ0OiAtNjRweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDIwcHg7XG4gIHdpZHRoOiAxNDBweDtcbiAgei1pbmRleDogMTAxO1xuYDtcblxuY29uc3QgaGFzaFN0eWxlcyA9IHtcbiAgU0hPVzogJ1NIT1cnIGFzIGNvbnN0LFxuICBBQ1RJVkU6ICdBQ1RJVkUnIGFzIGNvbnN0XG59O1xuXG5leHBvcnQgdHlwZSBJY29uRGl2UHJvcHMgPSBCYXNlQ29tcG9uZW50UHJvcHMgJiB7XG4gICRzdGF0dXM/OiAnU0hPVycgfCAnQUNUSVZFJyB8IG51bGw7XG59O1xuXG5jb25zdCBJY29uRGl2OiBJU3R5bGVkQ29tcG9uZW50PCd3ZWInLCBJY29uRGl2UHJvcHM+ID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3Rvb2x0aXAtY2hpY2tsZXRfX2ljb24nXG59KTxJY29uRGl2UHJvcHM+YFxuICBjb2xvcjogJHtwcm9wcyA9PlxuICAgIHByb3BzLiRzdGF0dXMgPT09IGhhc2hTdHlsZXMuU0hPV1xuICAgICAgPyBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3JBY3RpdmVcbiAgICAgIDogcHJvcHMuJHN0YXR1cyA9PT0gaGFzaFN0eWxlcy5BQ1RJVkVcbiAgICAgID8gcHJvcHMudGhlbWUuYWN0aXZlQ29sb3JcbiAgICAgIDogcHJvcHMudGhlbWUudGV4dENvbG9yfTtcbmA7XG5cbmV4cG9ydCB0eXBlIFNvcnRhYmxlU3R5bGVkSXRlbVByb3BzID0gQmFzZUNvbXBvbmVudFByb3BzICYge1xuICAkdHJhbnNpdGlvbj86IENTU1Byb3BlcnRpZXNbJ3RyYW5zaXRpb24nXTtcbiAgJHRyYW5zZm9ybT86IENTU1Byb3BlcnRpZXNbJ3RyYW5zZm9ybSddO1xuICByZWY6IChub2RlOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG59O1xuY29uc3QgU29ydGFibGVTdHlsZWRJdGVtOiBJU3R5bGVkQ29tcG9uZW50PFxuICAnd2ViJyxcbiAgU29ydGFibGVTdHlsZWRJdGVtUHJvcHNcbj4gPSBzdHlsZWQuZGl2PFNvcnRhYmxlU3R5bGVkSXRlbVByb3BzPmBcbiAgdHJhbnNpdGlvbjogJHtwcm9wcyA9PiBwcm9wcy4kdHJhbnNpdGlvbn07XG4gIHRyYW5zZm9ybTogJHtwcm9wcyA9PiBwcm9wcy4kdHJhbnNmb3JtfTtcbiAgJi5zb3J0aW5nIHtcbiAgICBvcGFjaXR5OiAwLjM7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cbiAgJjpob3ZlciB7XG4gICAgLnRvb2x0aXAtY2hpY2tsZXRfX2RyYWctaGFuZGxlciB7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRHJhZ0hhbmRsZSA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICd0b29sdGlwLWNoaWNrbGV0X19kcmFnLWhhbmRsZXInXG59KWBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgei1pbmRleDogMTAwMDtcbiAgb3BhY2l0eTogMDtcbiAgbWFyZ2luLWxlZnQ6IC01cHg7XG4gICY6aG92ZXIge1xuICAgIGN1cnNvcjogbW92ZTtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50b29sdGlwVmVydGljYWxMaW5lQ29sb3J9O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRUYWcgPSBzdHlsZWQuc3BhbmBcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgbWF4LXdpZHRoOiAxNjBweDtcbmA7XG5cbmZ1bmN0aW9uIGdldEZvcm1hdFRvb2x0aXAoZm9ybWF0TGFiZWxzOiBUaW1lTGFiZWxGb3JtYXRbXSwgZm9ybWF0OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghZm9ybWF0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZm9ybWF0TGFiZWwgPSBmb3JtYXRMYWJlbHMuZmluZChmbCA9PiBnZXRGb3JtYXRWYWx1ZShmbCkgPT09IGZvcm1hdCk7XG4gIGlmIChmb3JtYXRMYWJlbCkge1xuICAgIHJldHVybiBmb3JtYXRMYWJlbC5sYWJlbDtcbiAgfVxuICByZXR1cm4gdHlwZW9mIGZvcm1hdCA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShmb3JtYXQsIG51bGwsIDIpIDogU3RyaW5nKGZvcm1hdCk7XG59XG5cbi8vIFRPRE86IGEgZmFjdG9yeSBzaG91bGQgdGFrZSBvdGhlciBmYWN0b3JpZXMgYXMgaW5wdXRcbmZ1bmN0aW9uIFRvb2x0aXBDaGlja2xldEZhY3RvcnkoXG4gIGRhdGFJZDogc3RyaW5nLFxuICBjb25maWc6IFRvb2x0aXBDb25maWcsXG4gIG9uQ2hhbmdlOiAoY2ZnOiBUb29sdGlwQ29uZmlnKSA9PiB2b2lkLFxuICBmaWVsZHM6IFRvb2x0aXBGaWVsZHNbXSxcbiAgb25EaXNwbGF5Rm9ybWF0Q2hhbmdlXG4pOiBSZWFjdC5GQzxUb29sdGlwQ2hpY2tsZXRQcm9wcz4ge1xuICBjb25zdCBUb29sdGlwQ2hpY2tsZXQ6IFJlYWN0LkZDPFRvb2x0aXBDaGlja2xldFByb3BzPiA9IChwcm9wczogVG9vbHRpcENoaWNrbGV0UHJvcHMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGl0ZW0sXG4gICAgICBkaXNwbGF5T3B0aW9uLFxuICAgICAgcmVtb3ZlLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGxpc3RlbmVycyxcbiAgICAgIHNldE5vZGVSZWYsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB0cmFuc2l0aW9uLFxuICAgICAgaXNEcmFnZ2luZ1xuICAgIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IFtzaG93LCBzZXRTaG93XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCByZWYgPSB1c2VPbkNsaWNrT3V0c2lkZTxIVE1MRGl2RWxlbWVudD4oKCkgPT4gc2V0U2hvdyhmYWxzZSkpO1xuICAgIC8vIGNvbnN0IHtzaG93fSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgdG9vbHRpcEZpZWxkID0gY29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdLmZpbmQoXG4gICAgICBmaWVsZFRvU2hvdyA9PiBmaWVsZFRvU2hvdy5uYW1lID09PSBpdGVtLm5hbWVcbiAgICApO1xuICAgIGlmICghdG9vbHRpcEZpZWxkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gdG9vbHRpcEZpZWxkLm5hbWUpO1xuICAgIGlmICghZmllbGQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmb3JtYXRMYWJlbHMgPSBnZXRGb3JtYXRMYWJlbHMoZmllbGRzLCB0b29sdGlwRmllbGQubmFtZSk7XG4gICAgY29uc3QgaGFzRm9ybWF0ID0gQm9vbGVhbihmaWVsZC5kaXNwbGF5Rm9ybWF0KTtcbiAgICBjb25zdCBzZWxlY3Rpb25JbmRleCA9IGZvcm1hdExhYmVscy5maW5kSW5kZXgoZmwgPT4gZ2V0Rm9ybWF0VmFsdWUoZmwpID09PSBmaWVsZC5kaXNwbGF5Rm9ybWF0KTtcbiAgICBjb25zdCBoYXNoU3R5bGUgPSBzaG93ID8gaGFzaFN0eWxlcy5TSE9XIDogaGFzRm9ybWF0ID8gaGFzaFN0eWxlcy5BQ1RJVkUgOiBudWxsO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTb3J0YWJsZVN0eWxlZEl0ZW1cbiAgICAgICAgcmVmPXtzZXROb2RlUmVmfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ3NvcnRhYmxlLWxheWVyLWl0ZW1zJywge3NvcnRpbmc6IGlzRHJhZ2dpbmd9KX1cbiAgICAgICAgJHRyYW5zZm9ybT17Q1NTLlRyYW5zbGF0ZS50b1N0cmluZyh0cmFuc2Zvcm0pfVxuICAgICAgICAkdHJhbnNpdGlvbj17dHJhbnNpdGlvbiB8fCAnJ31cbiAgICAgICAgey4uLmF0dHJpYnV0ZXN9XG4gICAgICA+XG4gICAgICAgIDxDaGlja2xldEJ1dHRvbj5cbiAgICAgICAgICA8U3R5bGVkRHJhZ0hhbmRsZSB7Li4ubGlzdGVuZXJzfT5cbiAgICAgICAgICAgIDxWZXJ0RG90cyBoZWlnaHQ9XCIxMnB4XCIgLz5cbiAgICAgICAgICA8L1N0eWxlZERyYWdIYW5kbGU+XG4gICAgICAgICAgPFN0eWxlZFRhZyB0aXRsZT17ZGlzcGxheU9wdGlvbihpdGVtKX0+e2Rpc3BsYXlPcHRpb24oaXRlbSl9PC9TdHlsZWRUYWc+XG4gICAgICAgICAge2Zvcm1hdExhYmVscy5sZW5ndGggPiAxICYmIChcbiAgICAgICAgICAgIDxDaGlja2xldEFkZG9uV3JhcHBlcj5cbiAgICAgICAgICAgICAgPFRpcHB5VG9vbHRpcFxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgcmVuZGVyPXsoKSA9PiAoXG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge2hhc0Zvcm1hdCA/IChcbiAgICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXRUb29sdGlwKGZvcm1hdExhYmVscywgZmllbGQuZGlzcGxheU5hbWUpXG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydmaWVsZFNlbGVjdG9yLmZvcm1hdHRpbmcnfSAvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q2hpY2tsZXRBZGRvbj5cbiAgICAgICAgICAgICAgICAgIDxJY29uRGl2ICRzdGF0dXM9e2hhc2hTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxIYXNoXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiOHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93KEJvb2xlYW4oIXNob3cpKTtcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9JY29uRGl2PlxuICAgICAgICAgICAgICAgIDwvQ2hpY2tsZXRBZGRvbj5cbiAgICAgICAgICAgICAgPC9UaXBweVRvb2x0aXA+XG4gICAgICAgICAgICAgIHtzaG93ICYmIChcbiAgICAgICAgICAgICAgICA8U3R5bGVkUG9wb3ZlciByZWY9e3JlZn0+XG4gICAgICAgICAgICAgICAgICA8RHJvcGRvd25MaXN0XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e2Zvcm1hdExhYmVsc31cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXg9e3NlbGVjdGlvbkluZGV4fVxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5T3B0aW9uPXtvcHRpb24gPT4gKG9wdGlvbiBhcyBUb29sdGlwRm9ybWF0KS5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgb25PcHRpb25TZWxlY3RlZD17KHJlc3VsdCwgZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgc2V0U2hvdyhmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gZ2V0Rm9ybWF0VmFsdWUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRGaWVsZHNUb1Nob3cgPSBjb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF07XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRzVG9TaG93ID0gb2xkRmllbGRzVG9TaG93Lm1hcChmaWVsZFRvU2hvdyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRUb1Nob3cubmFtZSA9PT0gdG9vbHRpcEZpZWxkLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0b29sdGlwRmllbGQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGlzcGxheUZvcm1hdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZFRvU2hvdztcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFJZF06IGZpZWxkc1RvU2hvd1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UobmV3Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICBvbkRpc3BsYXlGb3JtYXRDaGFuZ2UoZGF0YUlkLCBmaWVsZC5uYW1lLCBkaXNwbGF5Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRQb3BvdmVyPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9DaGlja2xldEFkZG9uV3JhcHBlcj5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxEZWxldGUgaGVpZ2h0PVwiMTZweFwiIG9uQ2xpY2s9e2Rpc2FibGVkID8gbnVsbCA6IHJlbW92ZX0gLz5cbiAgICAgICAgPC9DaGlja2xldEJ1dHRvbj5cbiAgICAgIDwvU29ydGFibGVTdHlsZWRJdGVtPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFRvb2x0aXBDaGlja2xldDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcENoaWNrbGV0RmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxXQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxnQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sYUFBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsSUFBQSxHQUFBUixPQUFBO0FBRUEsSUFBQVMsS0FBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsYUFBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQVcsa0JBQUEsR0FBQVQsc0JBQUEsQ0FBQUYsT0FBQTtBQUFvRSxJQUFBWSxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFD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