UNPKG

kepler.gl

Version:

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

187 lines (185 loc) 35.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.InputBoxContainer = exports.ColorSelectorInput = exports.ColorBlock = void 0; 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 _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _reactIntl = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-intl"); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _react2 = require("@floating-ui/react"); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _rangeSlider = _interopRequireDefault(require("../../common/range-slider")); var _styledComponents2 = require("../../common/styled-components"); var _colorPalette = _interopRequireDefault(require("./color-palette")); var _colorRangeSelector = _interopRequireDefault(require("./color-range-selector")); var _singleColorPalette = _interopRequireDefault(require("./single-color-palette")); 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; } var OpacitySliderWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0px 12px 12px 12px;\n"]))); var OPACITY_SLIDER_PROPS = { type: 'number', range: [0, 1], value0: 0, step: 0.01, isRanged: false, label: 'Opacity', showInput: true }; var ColorBlock = exports.ColorBlock = _styledComponents["default"].div.withConfig({ shouldForwardProp: _styledComponents2.shouldForwardProp })(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: 32px;\n height: 18px;\n border-radius: 1px;\n background-color: ", ";\n"])), function (props) { return Array.isArray(props.backgroundcolor) ? "rgb(".concat(props.backgroundcolor.slice(0, 3).join(','), ")") : 'transparent'; }); var StyledColorSelectorWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n .selector__dropdown {\n max-height: 600px; /* increase from the default 500px defined by StyledPanelDropdown */\n }\n"]))); var ColorSelectorInput = exports.ColorSelectorInput = _styledComponents["default"].div.withConfig({ shouldForwardProp: _styledComponents2.shouldForwardProp })(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n height: ", ";\n\n .color-selector__selector__label {\n text-transform: capitalize;\n font-size: 12px;\n text-align: center;\n color: ", ";\n }\n"])), function (props) { return props.inputTheme === 'secondary' ? props.theme.secondaryInput : props.theme.input; }, function (props) { return props.theme.inputBoxHeight; }, function (props) { return props.theme.inputPlaceholderColor; }); var InputBoxContainer = exports.InputBoxContainer = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n\n .color-select__input-group {\n flex-grow: 1;\n }\n .color-select__input-group:nth-child(2) {\n margin-left: 12px;\n }\n"]))); ColorSelectorFactory.deps = [_colorRangeSelector["default"], _rangeSlider["default"]]; function ColorSelectorFactory(ColorRangeSelector, RangeSlider) { var ColorSelector = function ColorSelector(_ref) { var _ref$colorSets = _ref.colorSets, colorSets = _ref$colorSets === void 0 ? [] : _ref$colorSets, colorUI = _ref.colorUI, inputTheme = _ref.inputTheme, disabled = _ref.disabled, useOpacity = _ref.useOpacity, setColorUI = _ref.setColorUI; var _useState = (0, _react.useState)(colorUI ? colorUI.showDropdown : false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), showDropdown = _useState2[0], setShowDropdown = _useState2[1]; var showSketcher = colorUI ? colorUI.showSketcher : false; var editingLookup = colorUI ? colorUI.showDropdown : showDropdown; var editingColorSet = typeof editingLookup === 'number' && colorSets[editingLookup] ? colorSets[editingLookup] : false; var closePanelDropdown = (0, _react.useCallback)(function () { if (editingLookup === false) { return; } if (setColorUI) { setColorUI({ showDropdown: false, showSketcher: false }); } else { setShowDropdown(false); } }, [editingLookup, setColorUI, setShowDropdown]); var handleClickOutside = (0, _react.useCallback)(function () { if (Number.isInteger(showSketcher)) { // if sketcher is open, let sketch to close itself first return; } closePanelDropdown(); }, [showSketcher, closePanelDropdown]); // floating-ui boilerplate to establish close on outside click var _useFloating = (0, _react2.useFloating)({ open: true, onOpenChange: function onOpenChange(v) { if (!v) { handleClickOutside(); } } }), refs = _useFloating.refs, context = _useFloating.context; var dismiss = (0, _react2.useDismiss)(context); var _useInteractions = (0, _react2.useInteractions)([dismiss]), getFloatingProps = _useInteractions.getFloatingProps; var setColor = (0, _react.useCallback)(function (colorSet, color, opacity) { var _ref2 = colorSet || {}, setColor = _ref2.setColor; if (!setColor) { return; } if (useOpacity && Array.isArray(color)) { setColor([].concat((0, _toConsumableArray2["default"])(color.slice(0, 3)), [opacity])); } else { setColor(color); } }, [useOpacity]); var onSelectColor = (0, _react.useCallback)(function (color, e) { if (e) e.stopPropagation(); var colorSet = editingColorSet; if (colorSet) { setColor(colorSet, color, colorSet.selectedColor[3]); } }, [editingColorSet, setColor]); var onSelectOpacity = (0, _react.useCallback)(function (opacity, e) { if (e) e.stopPropagation(); var colorSet = editingColorSet; if (colorSet) { setColor(colorSet, colorSet.selectedColor, Math.round(opacity[1] * 255)); } }, [editingColorSet, setColor]); var onToggleDropdown = (0, _react.useCallback)(function (e, i) { e.stopPropagation(); e.preventDefault(); var showDropdownValue = editingLookup === false ? i // open it for the specific color set index : false; // close it if (setColorUI) { setColorUI({ showDropdown: showDropdownValue }); } else { setShowDropdown(showDropdownValue); } }, [editingLookup, setColorUI, setShowDropdown]); return /*#__PURE__*/_react["default"].createElement(StyledColorSelectorWrapper, (0, _extends2["default"])({ className: "color-selector", ref: refs.setFloating }, getFloatingProps()), /*#__PURE__*/_react["default"].createElement(InputBoxContainer, null, colorSets.map(function (cSet, i) { return /*#__PURE__*/_react["default"].createElement("div", { className: "color-select__input-group", key: i }, /*#__PURE__*/_react["default"].createElement(ColorSelectorInput, { className: "color-selector__selector", active: editingLookup === i, disabled: disabled, inputTheme: inputTheme, onClick: function onClick(e) { return onToggleDropdown(e, i); } }, cSet.isRange ? /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], { colors: cSet.selectedColor.colors }) : /*#__PURE__*/_react["default"].createElement(ColorBlock, { className: "color-selector__selector__block", backgroundcolor: cSet.selectedColor }), cSet.label ? /*#__PURE__*/_react["default"].createElement("div", { className: "color-selector__selector__label" }, cSet.label) : null)); })), editingColorSet ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledPanelDropdown, { className: "color-selector__dropdown" }, editingColorSet.isRange && colorUI && setColorUI ? /*#__PURE__*/_react["default"].createElement(ColorRangeSelector, { selectedColorRange: editingColorSet.selectedColor, onSelectColorRange: onSelectColor, setColorPaletteUI: setColorUI, colorPaletteUI: colorUI }) : /*#__PURE__*/_react["default"].createElement(_singleColorPalette["default"], { selectedColor: (0, _src.rgbToHex)(editingColorSet.selectedColor), onSelectColor: onSelectColor }), useOpacity ? /*#__PURE__*/_react["default"].createElement(OpacitySliderWrapper, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.PanelLabel, null, /*#__PURE__*/_react["default"].createElement(_reactIntl.FormattedMessage, { id: "color.opacity" })), /*#__PURE__*/_react["default"].createElement(RangeSlider, (0, _extends2["default"])({}, OPACITY_SLIDER_PROPS, { value1: editingColorSet.selectedColor[3] / 255, onChange: onSelectOpacity }))) : null) : null); }; return ColorSelector; } var _default = exports["default"] = ColorSelectorFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RJbnRsIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3JlYWN0MiIsIl9zcmMiLCJfcmFuZ2VTbGlkZXIiLCJfc3R5bGVkQ29tcG9uZW50czIiLCJfY29sb3JQYWxldHRlIiwiX2NvbG9yUmFuZ2VTZWxlY3RvciIsIl9zaW5nbGVDb2xvclBhbGV0dGUiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiT3BhY2l0eVNsaWRlcldyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIk9QQUNJVFlfU0xJREVSX1BST1BTIiwidHlwZSIsInJhbmdlIiwidmFsdWUwIiwic3RlcCIsImlzUmFuZ2VkIiwibGFiZWwiLCJzaG93SW5wdXQiLCJDb2xvckJsb2NrIiwiZXhwb3J0cyIsIndpdGhDb25maWciLCJzaG91bGRGb3J3YXJkUHJvcCIsInByb3BzIiwiQXJyYXkiLCJpc0FycmF5IiwiYmFja2dyb3VuZGNvbG9yIiwiY29uY2F0Iiwic2xpY2UiLCJqb2luIiwiU3R5bGVkQ29sb3JTZWxlY3RvcldyYXBwZXIiLCJDb2xvclNlbGVjdG9ySW5wdXQiLCJpbnB1dFRoZW1lIiwidGhlbWUiLCJzZWNvbmRhcnlJbnB1dCIsImlucHV0IiwiaW5wdXRCb3hIZWlnaHQiLCJpbnB1dFBsYWNlaG9sZGVyQ29sb3IiLCJJbnB1dEJveENvbnRhaW5lciIsIkNvbG9yU2VsZWN0b3JGYWN0b3J5IiwiZGVwcyIsIkNvbG9yUmFuZ2VTZWxlY3RvckZhY3RvcnkiLCJSYW5nZVNsaWRlckZhY3RvcnkiLCJDb2xvclJhbmdlU2VsZWN0b3IiLCJSYW5nZVNsaWRlciIsIkNvbG9yU2VsZWN0b3IiLCJfcmVmIiwiX3JlZiRjb2xvclNldHMiLCJjb2xvclNldHMiLCJjb2xvclVJIiwiZGlzYWJsZWQiLCJ1c2VPcGFjaXR5Iiwic2V0Q29sb3JVSSIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwic2hvd0Ryb3Bkb3duIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsInNldFNob3dEcm9wZG93biIsInNob3dTa2V0Y2hlciIsImVkaXRpbmdMb29rdXAiLCJlZGl0aW5nQ29sb3JTZXQiLCJjbG9zZVBhbmVsRHJvcGRvd24iLCJ1c2VDYWxsYmFjayIsImhhbmRsZUNsaWNrT3V0c2lkZSIsIk51bWJlciIsImlzSW50ZWdlciIsIl91c2VGbG9hdGluZyIsInVzZUZsb2F0aW5nIiwib3BlbiIsIm9uT3BlbkNoYW5nZSIsInYiLCJyZWZzIiwiY29udGV4dCIsImRpc21pc3MiLCJ1c2VEaXNtaXNzIiwiX3VzZUludGVyYWN0aW9ucyIsInVzZUludGVyYWN0aW9ucyIsImdldEZsb2F0aW5nUHJvcHMiLCJzZXRDb2xvciIsImNvbG9yU2V0IiwiY29sb3IiLCJvcGFjaXR5IiwiX3JlZjIiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwib25TZWxlY3RDb2xvciIsInN0b3BQcm9wYWdhdGlvbiIsInNlbGVjdGVkQ29sb3IiLCJvblNlbGVjdE9wYWNpdHkiLCJNYXRoIiwicm91bmQiLCJvblRvZ2dsZURyb3Bkb3duIiwicHJldmVudERlZmF1bHQiLCJzaG93RHJvcGRvd25WYWx1ZSIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJjbGFzc05hbWUiLCJyZWYiLCJzZXRGbG9hdGluZyIsIm1hcCIsImNTZXQiLCJrZXkiLCJhY3RpdmUiLCJvbkNsaWNrIiwiaXNSYW5nZSIsImNvbG9ycyIsIlN0eWxlZFBhbmVsRHJvcGRvd24iLCJzZWxlY3RlZENvbG9yUmFuZ2UiLCJvblNlbGVjdENvbG9yUmFuZ2UiLCJzZXRDb2xvclBhbGV0dGVVSSIsImNvbG9yUGFsZXR0ZVVJIiwicmdiVG9IZXgiLCJQYW5lbExhYmVsIiwiRm9ybWF0dGVkTWVzc2FnZSIsImlkIiwidmFsdWUxIiwib25DaGFuZ2UiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NyYy9zaWRlLXBhbmVsL2xheWVyLXBhbmVsL2NvbG9yLXNlbGVjdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlU3RhdGUsIE1vdXNlRXZlbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7Rm9ybWF0dGVkTWVzc2FnZX0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7dXNlRGlzbWlzcywgdXNlRmxvYXRpbmcsIHVzZUludGVyYWN0aW9uc30gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0JztcblxuaW1wb3J0IHtDb2xvclJhbmdlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7Q29sb3JVSSwgTmVzdGVkUGFydGlhbCwgUkdCQUNvbG9yLCBSR0JDb2xvcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge3JnYlRvSGV4fSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW1wb3J0IFJhbmdlU2xpZGVyRmFjdG9yeSBmcm9tICcuLi8uLi9jb21tb24vcmFuZ2Utc2xpZGVyJztcbmltcG9ydCB7UGFuZWxMYWJlbCwgc2hvdWxkRm9yd2FyZFByb3AsIFN0eWxlZFBhbmVsRHJvcGRvd259IGZyb20gJy4uLy4uL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgQ29sb3JQYWxldHRlIGZyb20gJy4vY29sb3ItcGFsZXR0ZSc7XG5pbXBvcnQgQ29sb3JSYW5nZVNlbGVjdG9yRmFjdG9yeSBmcm9tICcuL2NvbG9yLXJhbmdlLXNlbGVjdG9yJztcbmltcG9ydCBTaW5nbGVDb2xvclBhbGV0dGUgZnJvbSAnLi9zaW5nbGUtY29sb3ItcGFsZXR0ZSc7XG5cbnR5cGUgQ29sb3JTZWxlY3RvcklucHV0UHJvcHMgPSB7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBpbnB1dFRoZW1lPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ29sb3JTZXQgPSB7XG4gIHNlbGVjdGVkQ29sb3I6IFJHQkNvbG9yIHwgUkdCQUNvbG9yIHwgQ29sb3JSYW5nZTtcbiAgc2V0Q29sb3I6ICh2OiBSR0JDb2xvciB8IFJHQkFDb2xvciB8IENvbG9yUmFuZ2UpID0+IHZvaWQ7XG4gIGlzUmFuZ2U/OiBib29sZWFuO1xuICBsYWJlbD86IHN0cmluZztcbn07XG5cbnR5cGUgQ29sb3JTZWxlY3RvclByb3BzID0ge1xuICBjb2xvclNldHM6IENvbG9yU2V0W107XG4gIGNvbG9yVUk/OiBDb2xvclVJO1xuICBpbnB1dFRoZW1lPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHVzZU9wYWNpdHk/OiBib29sZWFuO1xuICBzZXRDb2xvclVJPzogKG5ld0NvbmZpZzogTmVzdGVkUGFydGlhbDxDb2xvclVJPikgPT4gdm9pZDtcbn07XG5cbmNvbnN0IE9wYWNpdHlTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgcGFkZGluZzogMHB4IDEycHggMTJweCAxMnB4O1xuYDtcblxuY29uc3QgT1BBQ0lUWV9TTElERVJfUFJPUFMgPSB7XG4gIHR5cGU6ICdudW1iZXInLFxuICByYW5nZTogWzAsIDFdLFxuICB2YWx1ZTA6IDAsXG4gIHN0ZXA6IDAuMDEsXG4gIGlzUmFuZ2VkOiBmYWxzZSxcbiAgbGFiZWw6ICdPcGFjaXR5JyxcbiAgc2hvd0lucHV0OiB0cnVlXG59O1xuXG5leHBvcnQgY29uc3QgQ29sb3JCbG9jayA9IHN0eWxlZC5kaXYud2l0aENvbmZpZyh7XG4gIHNob3VsZEZvcndhcmRQcm9wXG59KTx7YmFja2dyb3VuZGNvbG9yOiBSR0JDb2xvcn0+YFxuICB3aWR0aDogMzJweDtcbiAgaGVpZ2h0OiAxOHB4O1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT5cbiAgICBBcnJheS5pc0FycmF5KHByb3BzLmJhY2tncm91bmRjb2xvcilcbiAgICAgID8gYHJnYigke3Byb3BzLmJhY2tncm91bmRjb2xvci5zbGljZSgwLCAzKS5qb2luKCcsJyl9KWBcbiAgICAgIDogJ3RyYW5zcGFyZW50J307XG5gO1xuXG5jb25zdCBTdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIC5zZWxlY3Rvcl9fZHJvcGRvd24ge1xuICAgIG1heC1oZWlnaHQ6IDYwMHB4OyAvKiBpbmNyZWFzZSBmcm9tIHRoZSBkZWZhdWx0IDUwMHB4IGRlZmluZWQgYnkgU3R5bGVkUGFuZWxEcm9wZG93biAqL1xuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgQ29sb3JTZWxlY3RvcklucHV0ID0gc3R5bGVkLmRpdi53aXRoQ29uZmlnKHtcbiAgc2hvdWxkRm9yd2FyZFByb3Bcbn0pPENvbG9yU2VsZWN0b3JJbnB1dFByb3BzPmBcbiAgJHtwcm9wcyA9PiAocHJvcHMuaW5wdXRUaGVtZSA9PT0gJ3NlY29uZGFyeScgPyBwcm9wcy50aGVtZS5zZWNvbmRhcnlJbnB1dCA6IHByb3BzLnRoZW1lLmlucHV0KX07XG4gIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5pbnB1dEJveEhlaWdodH07XG5cbiAgLmNvbG9yLXNlbGVjdG9yX19zZWxlY3Rvcl9fbGFiZWwge1xuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaW5wdXRQbGFjZWhvbGRlckNvbG9yfTtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IElucHV0Qm94Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG4gIC5jb2xvci1zZWxlY3RfX2lucHV0LWdyb3VwIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gIH1cbiAgLmNvbG9yLXNlbGVjdF9faW5wdXQtZ3JvdXA6bnRoLWNoaWxkKDIpIHtcbiAgICBtYXJnaW4tbGVmdDogMTJweDtcbiAgfVxuYDtcblxuQ29sb3JTZWxlY3RvckZhY3RvcnkuZGVwcyA9IFtDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5LCBSYW5nZVNsaWRlckZhY3RvcnldO1xuXG5mdW5jdGlvbiBDb2xvclNlbGVjdG9yRmFjdG9yeShcbiAgQ29sb3JSYW5nZVNlbGVjdG9yOiBSZXR1cm5UeXBlPHR5cGVvZiBDb2xvclJhbmdlU2VsZWN0b3JGYWN0b3J5PixcbiAgUmFuZ2VTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyRmFjdG9yeT5cbik6IFJlYWN0LkZDPENvbG9yU2VsZWN0b3JQcm9wcz4ge1xuICBjb25zdCBDb2xvclNlbGVjdG9yOiBSZWFjdC5GQzxDb2xvclNlbGVjdG9yUHJvcHM+ID0gKHtcbiAgICBjb2xvclNldHMgPSBbXSxcbiAgICBjb2xvclVJLFxuICAgIGlucHV0VGhlbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgdXNlT3BhY2l0eSxcbiAgICBzZXRDb2xvclVJXG4gIH06IENvbG9yU2VsZWN0b3JQcm9wcykgPT4ge1xuICAgIGNvbnN0IFtzaG93RHJvcGRvd24sIHNldFNob3dEcm9wZG93bl0gPSB1c2VTdGF0ZShjb2xvclVJID8gY29sb3JVSS5zaG93RHJvcGRvd24gOiBmYWxzZSk7XG4gICAgY29uc3Qgc2hvd1NrZXRjaGVyID0gY29sb3JVSSA/IGNvbG9yVUkuc2hvd1NrZXRjaGVyIDogZmFsc2U7XG4gICAgY29uc3QgZWRpdGluZ0xvb2t1cCA9IGNvbG9yVUkgPyBjb2xvclVJLnNob3dEcm9wZG93biA6IHNob3dEcm9wZG93bjtcbiAgICBjb25zdCBlZGl0aW5nQ29sb3JTZXQ6IENvbG9yU2V0IHwgZmFsc2UgPVxuICAgICAgdHlwZW9mIGVkaXRpbmdMb29rdXAgPT09ICdudW1iZXInICYmIGNvbG9yU2V0c1tlZGl0aW5nTG9va3VwXVxuICAgICAgICA/IGNvbG9yU2V0c1tlZGl0aW5nTG9va3VwXVxuICAgICAgICA6IGZhbHNlO1xuXG4gICAgY29uc3QgY2xvc2VQYW5lbERyb3Bkb3duID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKGVkaXRpbmdMb29rdXAgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzZXRDb2xvclVJKSB7XG4gICAgICAgIHNldENvbG9yVUkoe3Nob3dEcm9wZG93bjogZmFsc2UsIHNob3dTa2V0Y2hlcjogZmFsc2V9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNob3dEcm9wZG93bihmYWxzZSk7XG4gICAgICB9XG4gICAgfSwgW2VkaXRpbmdMb29rdXAsIHNldENvbG9yVUksIHNldFNob3dEcm9wZG93bl0pO1xuXG4gICAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoc2hvd1NrZXRjaGVyKSkge1xuICAgICAgICAvLyBpZiBza2V0Y2hlciBpcyBvcGVuLCBsZXQgc2tldGNoIHRvIGNsb3NlIGl0c2VsZiBmaXJzdFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjbG9zZVBhbmVsRHJvcGRvd24oKTtcbiAgICB9LCBbc2hvd1NrZXRjaGVyLCBjbG9zZVBhbmVsRHJvcGRvd25dKTtcblxuICAgIC8vIGZsb2F0aW5nLXVpIGJvaWxlcnBsYXRlIHRvIGVzdGFibGlzaCBjbG9zZSBvbiBvdXRzaWRlIGNsaWNrXG4gICAgY29uc3Qge3JlZnMsIGNvbnRleHR9ID0gdXNlRmxvYXRpbmcoe1xuICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgIG9uT3BlbkNoYW5nZTogdiA9PiB7XG4gICAgICAgIGlmICghdikge1xuICAgICAgICAgIGhhbmRsZUNsaWNrT3V0c2lkZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZGlzbWlzcyA9IHVzZURpc21pc3MoY29udGV4dCk7XG4gICAgY29uc3Qge2dldEZsb2F0aW5nUHJvcHN9ID0gdXNlSW50ZXJhY3Rpb25zKFtkaXNtaXNzXSk7XG5cbiAgICBjb25zdCBzZXRDb2xvciA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGNvbG9yU2V0OiBDb2xvclNldCwgY29sb3I6IFJHQkNvbG9yIHwgUkdCQUNvbG9yIHwgQ29sb3JSYW5nZSwgb3BhY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHtzZXRDb2xvcn0gPSBjb2xvclNldCB8fCB7fTtcbiAgICAgICAgaWYgKCFzZXRDb2xvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlT3BhY2l0eSAmJiBBcnJheS5pc0FycmF5KGNvbG9yKSkge1xuICAgICAgICAgIHNldENvbG9yKFsuLi5jb2xvci5zbGljZSgwLCAzKSwgb3BhY2l0eV0gYXMgUkdCQUNvbG9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDb2xvcihjb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbdXNlT3BhY2l0eV1cbiAgICApO1xuXG4gICAgY29uc3Qgb25TZWxlY3RDb2xvciA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGNvbG9yOiBSR0JDb2xvciB8IENvbG9yUmFuZ2UsIGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGUpIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNvbG9yU2V0ID0gZWRpdGluZ0NvbG9yU2V0O1xuICAgICAgICBpZiAoY29sb3JTZXQpIHtcbiAgICAgICAgICBzZXRDb2xvcihjb2xvclNldCwgY29sb3IsIGNvbG9yU2V0LnNlbGVjdGVkQ29sb3JbM10pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2VkaXRpbmdDb2xvclNldCwgc2V0Q29sb3JdXG4gICAgKTtcblxuICAgIGNvbnN0IG9uU2VsZWN0T3BhY2l0eSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKG9wYWNpdHk6IG51bWJlcltdLCBlOiBFdmVudCB8IG51bGwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKGUpIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNvbG9yU2V0ID0gZWRpdGluZ0NvbG9yU2V0O1xuICAgICAgICBpZiAoY29sb3JTZXQpIHtcbiAgICAgICAgICBzZXRDb2xvcihjb2xvclNldCwgY29sb3JTZXQuc2VsZWN0ZWRDb2xvciwgTWF0aC5yb3VuZChvcGFjaXR5WzFdICogMjU1KSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbZWRpdGluZ0NvbG9yU2V0LCBzZXRDb2xvcl1cbiAgICApO1xuXG4gICAgY29uc3Qgb25Ub2dnbGVEcm9wZG93biA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGUsIGkpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBzaG93RHJvcGRvd25WYWx1ZSA9XG4gICAgICAgICAgZWRpdGluZ0xvb2t1cCA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gaSAvLyBvcGVuIGl0IGZvciB0aGUgc3BlY2lmaWMgY29sb3Igc2V0IGluZGV4XG4gICAgICAgICAgICA6IGZhbHNlOyAvLyBjbG9zZSBpdFxuICAgICAgICBpZiAoc2V0Q29sb3JVSSkge1xuICAgICAgICAgIHNldENvbG9yVUkoe3Nob3dEcm9wZG93bjogc2hvd0Ryb3Bkb3duVmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRTaG93RHJvcGRvd24oc2hvd0Ryb3Bkb3duVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2VkaXRpbmdMb29rdXAsIHNldENvbG9yVUksIHNldFNob3dEcm9wZG93bl1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlclxuICAgICAgICBjbGFzc05hbWU9XCJjb2xvci1zZWxlY3RvclwiXG4gICAgICAgIHJlZj17cmVmcy5zZXRGbG9hdGluZ31cbiAgICAgICAgey4uLmdldEZsb2F0aW5nUHJvcHMoKX1cbiAgICAgID5cbiAgICAgICAgPElucHV0Qm94Q29udGFpbmVyPlxuICAgICAgICAgIHtjb2xvclNldHMubWFwKChjU2V0LCBpKSA9PiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbG9yLXNlbGVjdF9faW5wdXQtZ3JvdXBcIiBrZXk9e2l9PlxuICAgICAgICAgICAgICA8Q29sb3JTZWxlY3RvcklucHV0XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY29sb3Itc2VsZWN0b3JfX3NlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICBhY3RpdmU9e2VkaXRpbmdMb29rdXAgPT09IGl9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgIGlucHV0VGhlbWU9e2lucHV0VGhlbWV9XG4gICAgICAgICAgICAgICAgb25DbGljaz17ZSA9PiBvblRvZ2dsZURyb3Bkb3duKGUsIGkpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2NTZXQuaXNSYW5nZSA/IChcbiAgICAgICAgICAgICAgICAgIDxDb2xvclBhbGV0dGUgY29sb3JzPXsoY1NldC5zZWxlY3RlZENvbG9yIGFzIENvbG9yUmFuZ2UpLmNvbG9yc30gLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPENvbG9yQmxvY2tcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY29sb3Itc2VsZWN0b3JfX3NlbGVjdG9yX19ibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRjb2xvcj17Y1NldC5zZWxlY3RlZENvbG9yIGFzIFJHQkNvbG9yfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHtjU2V0LmxhYmVsID8gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2xvci1zZWxlY3Rvcl9fc2VsZWN0b3JfX2xhYmVsXCI+e2NTZXQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvQ29sb3JTZWxlY3RvcklucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvSW5wdXRCb3hDb250YWluZXI+XG4gICAgICAgIHtlZGl0aW5nQ29sb3JTZXQgPyAoXG4gICAgICAgICAgPFN0eWxlZFBhbmVsRHJvcGRvd24gY2xhc3NOYW1lPVwiY29sb3Itc2VsZWN0b3JfX2Ryb3Bkb3duXCI+XG4gICAgICAgICAgICB7ZWRpdGluZ0NvbG9yU2V0LmlzUmFuZ2UgJiYgY29sb3JVSSAmJiBzZXRDb2xvclVJID8gKFxuICAgICAgICAgICAgICA8Q29sb3JSYW5nZVNlbGVjdG9yXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2xvclJhbmdlPXtlZGl0aW5nQ29sb3JTZXQuc2VsZWN0ZWRDb2xvciBhcyBDb2xvclJhbmdlfVxuICAgICAgICAgICAgICAgIG9uU2VsZWN0Q29sb3JSYW5nZT17b25TZWxlY3RDb2xvcn1cbiAgICAgICAgICAgICAgICBzZXRDb2xvclBhbGV0dGVVST17c2V0Q29sb3JVSX1cbiAgICAgICAgICAgICAgICBjb2xvclBhbGV0dGVVST17Y29sb3JVSSBhcyBDb2xvclVJfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFNpbmdsZUNvbG9yUGFsZXR0ZVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sb3I9e3JnYlRvSGV4KGVkaXRpbmdDb2xvclNldC5zZWxlY3RlZENvbG9yIGFzIFJHQkNvbG9yKX1cbiAgICAgICAgICAgICAgICBvblNlbGVjdENvbG9yPXtvblNlbGVjdENvbG9yfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt1c2VPcGFjaXR5ID8gKFxuICAgICAgICAgICAgICA8T3BhY2l0eVNsaWRlcldyYXBwZXI+XG4gICAgICAgICAgICAgICAgPFBhbmVsTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD1cImNvbG9yLm9wYWNpdHlcIiAvPlxuICAgICAgICAgICAgICAgIDwvUGFuZWxMYWJlbD5cbiAgICAgICAgICAgICAgICA8UmFuZ2VTbGlkZXJcbiAgICAgICAgICAgICAgICAgIHsuLi5PUEFDSVRZX1NMSURFUl9QUk9QU31cbiAgICAgICAgICAgICAgICAgIHZhbHVlMT17ZWRpdGluZ0NvbG9yU2V0LnNlbGVjdGVkQ29sb3JbM10gLyAyNTV9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17b25TZWxlY3RPcGFjaXR5fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvT3BhY2l0eVNsaWRlcldyYXBwZXI+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L1N0eWxlZFBhbmVsRHJvcGRvd24+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TdHlsZWRDb2xvclNlbGVjdG9yV3JhcHBlcj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBDb2xvclNlbGVjdG9yO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xvclNlbGVjdG9yRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUlBLElBQUFLLElBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLFlBQUEsR0FBQUgsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFPLGtCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxhQUFBLEdBQUFMLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUyxtQkFBQSxHQUFBTixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVUsbUJBQUEsR0FBQVAsc0JBQUEsQ0FBQUgsT0FBQTtBQUF3RCxJQUFBVyxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBaEJ4RDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFsQix3QkFBQWtCLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVB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