UNPKG

kepler.gl

Version:

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

288 lines (286 loc) 41.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getChildPos = exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _exenv = require("exenv"); var _styledComponents = require("styled-components"); var _context = require("../context"); var _reactModal = _interopRequireDefault(require("react-modal")); var _window = _interopRequireDefault(require("global/window")); var _styles = require("@kepler.gl/styles"); 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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 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; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project var listeners = {}; var startListening = function startListening() { return Object.keys(listeners).forEach(function (key) { return listeners[key](); }); }; var getPageOffset = function getPageOffset() { return { x: _window["default"].pageXOffset !== undefined ? _window["default"].pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft, y: _window["default"].pageYOffset !== undefined ? _window["default"].pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop }; }; var addEventListeners = function addEventListeners() { if (document && document.body) document.body.addEventListener('mousewheel', (0, _debounce["default"])(startListening, 100, { leading: true })); _window["default"].addEventListener('resize', (0, _debounce["default"])(startListening, 50, { leading: true })); }; var getChildPos = exports.getChildPos = function getChildPos(_ref) { var offsets = _ref.offsets, rect = _ref.rect, childRect = _ref.childRect, pageOffset = _ref.pageOffset, padding = _ref.padding; var topOffset = offsets.topOffset, leftOffset = offsets.leftOffset, rightOffset = offsets.rightOffset; var anchorLeft = leftOffset !== undefined; var pos = _objectSpread({ top: pageOffset.y + rect.top + (topOffset || 0) }, anchorLeft ? { left: pageOffset.x + rect.left + (leftOffset || 0) } : { right: _window["default"].innerWidth - rect.right - pageOffset.x + (rightOffset || 0) }); var leftOrRight = anchorLeft ? 'left' : 'right'; if (pos[leftOrRight] && pos[leftOrRight] < 0) { pos[leftOrRight] = padding; } else if (pos[leftOrRight] && pos[leftOrRight] + childRect.width > _window["default"].innerWidth) { pos[leftOrRight] = _window["default"].innerWidth - childRect.width - padding; } if (pos.top < 0) { pos.top = padding; } else if (pos.top + childRect.height > _window["default"].innerHeight) { pos.top = _window["default"].innerHeight - childRect.height - padding; } return pos; }; if (_exenv.canUseDOM) { if (document.body) { addEventListeners(); } else { document.addEventListener('DOMContentLoaded', addEventListeners); } } var listenerIdCounter = 0; function subscribe(fn) { listenerIdCounter += 1; var id = listenerIdCounter; listeners[id] = fn; return function () { return delete listeners[id]; }; } var defaultModalStyle = { content: { top: 0, left: 0, border: 0, right: 'auto', bottom: 'auto', padding: '0px 0px 0px 0px' }, overlay: { right: 'auto', bottom: 'auto', width: '100vw', height: '100vh', backgroundColor: 'rgba(0, 0, 0, 0)' } }; var WINDOW_PAD = 40; var noop = function noop() { return; }; var DefaultComponent = 'div'; var Portaled = /*#__PURE__*/function (_Component) { function Portaled() { var _this; (0, _classCallCheck2["default"])(this, Portaled); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, Portaled, [].concat(args)); (0, _defineProperty2["default"])(_this, "state", { pos: null, isVisible: false }); (0, _defineProperty2["default"])(_this, "unsubscribe", undefined); (0, _defineProperty2["default"])(_this, "_unmounted", false); (0, _defineProperty2["default"])(_this, "element", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "child", /*#__PURE__*/(0, _react.createRef)()); // eslint-disable-next-line complexity (0, _defineProperty2["default"])(_this, "handleScroll", function () { if (_this.child.current && _this.element.current) { var rect = _this.element.current.getBoundingClientRect(); var childRect = _this.child.current.getBoundingClientRect(); var pageOffset = getPageOffset(); var _this$props = _this.props, topOffset = _this$props.top, _this$props$left = _this$props.left, leftOffset = _this$props$left === void 0 ? 0 : _this$props$left, rightOffset = _this$props.right; var pos = getChildPos({ offsets: { topOffset: topOffset, leftOffset: leftOffset, rightOffset: rightOffset }, rect: rect, childRect: childRect, pageOffset: pageOffset, padding: WINDOW_PAD }); if (!(0, _isEqual["default"])(pos, _this.state.pos)) { _this.setState({ pos: pos }); } } }); return _this; } (0, _inherits2["default"])(Portaled, _Component); return (0, _createClass2["default"])(Portaled, [{ key: "componentDidMount", value: function componentDidMount() { this._unmounted = false; // relative this.unsubscribe = subscribe(this.handleScroll); this.handleScroll(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this2 = this; var didOpen = this.props.isOpened && !prevProps.isOpened; var didClose = !this.props.isOpened && prevProps.isOpened; if (didOpen || didClose) { _window["default"].requestAnimationFrame(function () { if (_this2._unmounted) return; _this2.setState({ isVisible: Boolean(didOpen) }); }); } this.handleScroll(); } // ColorPicker will throw a cross-origin error when it is closed // when the app is within an iframe. // This is a known issue of react-color component: // see: https://github.com/casesandberg/react-color/issues/806 }, { key: "componentDidCatch", value: function componentDidCatch() { // Do nothing here, since React will try to recreate this component // tree from scratch using the error boundary, which is this component // itself. This is a temporal fix for a crash. } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this._unmounted = true; // @ts-ignore this.unsubscribe(); } }, { key: "render", value: function render() { var _this3 = this; var _this$props2 = this.props, _this$props2$componen = _this$props2.component, component = _this$props2$componen === void 0 ? DefaultComponent : _this$props2$componen, overlayZIndex = _this$props2.overlayZIndex, isOpened = _this$props2.isOpened, onClose = _this$props2.onClose, children = _this$props2.children, modalProps = _this$props2.modalProps, _this$props2$modalSty = _this$props2.modalStyle, modalStyle = _this$props2$modalSty === void 0 ? {} : _this$props2$modalSty; var _this$state = this.state, isVisible = _this$state.isVisible, pos = _this$state.pos; var newModalStyle = _objectSpread(_objectSpread({}, defaultModalStyle), {}, { content: _objectSpread({}, modalStyle.content || {}), overlay: _objectSpread(_objectSpread(_objectSpread({}, defaultModalStyle.overlay), modalStyle.overlay || {}), {}, { // needs to be on top of existing modal zIndex: overlayZIndex || 9999 }) }); var Comp = component; return /*#__PURE__*/_react["default"].createElement(_context.RootContext.Consumer, null, function (context) { return /*#__PURE__*/_react["default"].createElement(Comp, { ref: _this3.element }, isOpened ? /*#__PURE__*/_react["default"].createElement(_reactModal["default"], (0, _extends2["default"])({ className: "modal-portal" }, modalProps, { ariaHideApp: false, isOpen: true, style: newModalStyle, parentSelector: function parentSelector() { // React modal issue: https://github.com/reactjs/react-modal/issues/769 // failed to execute removeChild on parent node when it is already unmounted return context && context.current || document.body; }, onRequestClose: onClose }), /*#__PURE__*/_react["default"].createElement("div", { className: "portaled-content", key: "item", style: _objectSpread({ position: 'fixed', opacity: isVisible ? 1 : 0, transition: _this3.props.theme.transitionFast, marginTop: isVisible ? '0px' : '14px' }, pos) }, /*#__PURE__*/_react["default"].createElement("div", { ref: _this3.child, style: { position: 'absolute', zIndex: overlayZIndex ? overlayZIndex + 1 : 10000 } }, children))) : null); }); } }], [{ key: "getDerivedStateFromError", value: // Make Portaled a component with Error Boundary, so React can recreate // this component if the child 'ColorPicker' throws cross-origin error. // see function componentDidCatch() function getDerivedStateFromError() { return { hasError: true }; } }]); }(_react.Component); (0, _defineProperty2["default"])(Portaled, "defaultProps", { component: DefaultComponent, onClose: noop, theme: _styles.theme }); var _default = exports["default"] = (0, _styledComponents.withTheme)(Portaled); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfZGVib3VuY2UiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2lzRXF1YWwiLCJfZXhlbnYiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb250ZXh0IiwiX3JlYWN0TW9kYWwiLCJfd2luZG93IiwiX3N0eWxlcyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jYWxsU3VwZXIiLCJvIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwibGlzdGVuZXJzIiwic3RhcnRMaXN0ZW5pbmciLCJrZXkiLCJnZXRQYWdlT2Zmc2V0IiwieCIsIldpbmRvdyIsInBhZ2VYT2Zmc2V0IiwidW5kZWZpbmVkIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJib2R5IiwicGFyZW50Tm9kZSIsInNjcm9sbExlZnQiLCJ5IiwicGFnZVlPZmZzZXQiLCJzY3JvbGxUb3AiLCJhZGRFdmVudExpc3RlbmVycyIsImFkZEV2ZW50TGlzdGVuZXIiLCJkZWJvdW5jZSIsImxlYWRpbmciLCJnZXRDaGlsZFBvcyIsImV4cG9ydHMiLCJfcmVmIiwib2Zmc2V0cyIsInJlY3QiLCJjaGlsZFJlY3QiLCJwYWdlT2Zmc2V0IiwicGFkZGluZyIsInRvcE9mZnNldCIsImxlZnRPZmZzZXQiLCJyaWdodE9mZnNldCIsImFuY2hvckxlZnQiLCJwb3MiLCJ0b3AiLCJsZWZ0IiwicmlnaHQiLCJpbm5lcldpZHRoIiwibGVmdE9yUmlnaHQiLCJ3aWR0aCIsImhlaWdodCIsImlubmVySGVpZ2h0IiwiY2FuVXNlRE9NIiwibGlzdGVuZXJJZENvdW50ZXIiLCJzdWJzY3JpYmUiLCJmbiIsImlkIiwiZGVmYXVsdE1vZGFsU3R5bGUiLCJjb250ZW50IiwiYm9yZGVyIiwiYm90dG9tIiwib3ZlcmxheSIsImJhY2tncm91bmRDb2xvciIsIldJTkRPV19QQUQiLCJub29wIiwiRGVmYXVsdENvbXBvbmVudCIsIlBvcnRhbGVkIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY29uY2F0IiwiaXNWaXNpYmxlIiwiY3JlYXRlUmVmIiwiY2hpbGQiLCJjdXJyZW50IiwiZWxlbWVudCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIl90aGlzJHByb3BzIiwicHJvcHMiLCJfdGhpcyRwcm9wcyRsZWZ0IiwiaXNFcXVhbCIsInN0YXRlIiwic2V0U3RhdGUiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwiY29tcG9uZW50RGlkTW91bnQiLCJfdW5tb3VudGVkIiwidW5zdWJzY3JpYmUiLCJoYW5kbGVTY3JvbGwiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJfdGhpczIiLCJkaWRPcGVuIiwiaXNPcGVuZWQiLCJkaWRDbG9zZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNvbXBvbmVudERpZENhdGNoIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW5kZXIiLCJfdGhpczMiLCJfdGhpcyRwcm9wczIiLCJfdGhpcyRwcm9wczIkY29tcG9uZW4iLCJjb21wb25lbnQiLCJvdmVybGF5WkluZGV4Iiwib25DbG9zZSIsImNoaWxkcmVuIiwibW9kYWxQcm9wcyIsIl90aGlzJHByb3BzMiRtb2RhbFN0eSIsIm1vZGFsU3R5bGUiLCJfdGhpcyRzdGF0ZSIsIm5ld01vZGFsU3R5bGUiLCJ6SW5kZXgiLCJDb21wIiwiY3JlYXRlRWxlbWVudCIsIlJvb3RDb250ZXh0IiwiQ29uc3VtZXIiLCJjb250ZXh0IiwicmVmIiwiX2V4dGVuZHMyIiwiY2xhc3NOYW1lIiwiYXJpYUhpZGVBcHAiLCJpc09wZW4iLCJzdHlsZSIsInBhcmVudFNlbGVjdG9yIiwib25SZXF1ZXN0Q2xvc2UiLCJwb3NpdGlvbiIsIm9wYWNpdHkiLCJ0cmFuc2l0aW9uIiwidGhlbWUiLCJ0cmFuc2l0aW9uRmFzdCIsIm1hcmdpblRvcCIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsImhhc0Vycm9yIiwiQ29tcG9uZW50IiwiX2RlZmF1bHQiLCJ3aXRoVGhlbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbW9uL3BvcnRhbGVkLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIGNyZWF0ZVJlZiwgUHJvcHNXaXRoQ2hpbGRyZW59IGZyb20gJ3JlYWN0JztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuXG5pbXBvcnQge2NhblVzZURPTX0gZnJvbSAnZXhlbnYnO1xuaW1wb3J0IHt3aXRoVGhlbWV9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Um9vdENvbnRleHR9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IE1vZGFsIGZyb20gJ3JlYWN0LW1vZGFsJztcbmltcG9ydCBXaW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge3RoZW1lfSBmcm9tICdAa2VwbGVyLmdsL3N0eWxlcyc7XG5cbmNvbnN0IGxpc3RlbmVycyA9IHt9O1xuXG5jb25zdCBzdGFydExpc3RlbmluZyA9ICgpID0+IE9iamVjdC5rZXlzKGxpc3RlbmVycykuZm9yRWFjaChrZXkgPT4gbGlzdGVuZXJzW2tleV0oKSk7XG5cbmNvbnN0IGdldFBhZ2VPZmZzZXQgPSAoKSA9PiAoe1xuICB4OlxuICAgIFdpbmRvdy5wYWdlWE9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IFdpbmRvdy5wYWdlWE9mZnNldFxuICAgICAgOiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LFxuICB5OlxuICAgIFdpbmRvdy5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IFdpbmRvdy5wYWdlWU9mZnNldFxuICAgICAgOiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3Bcbn0pO1xuXG5jb25zdCBhZGRFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LmJvZHkpXG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgZGVib3VuY2Uoc3RhcnRMaXN0ZW5pbmcsIDEwMCwge2xlYWRpbmc6IHRydWV9KSk7XG4gIFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBkZWJvdW5jZShzdGFydExpc3RlbmluZywgNTAsIHtsZWFkaW5nOiB0cnVlfSkpO1xufTtcblxuaW50ZXJmYWNlIEdldENoaWxkUG9zUHJvcHMge1xuICBvZmZzZXRzOiBQYXJ0aWFsPHtcbiAgICB0b3BPZmZzZXQ6IG51bWJlcjtcbiAgICBsZWZ0T2Zmc2V0OiBudW1iZXI7XG4gICAgcmlnaHRPZmZzZXQ6IG51bWJlcjtcbiAgfT47XG4gIHJlY3Q6IERPTVJlY3Q7XG4gIGNoaWxkUmVjdDogRE9NUmVjdDtcbiAgcGFnZU9mZnNldDoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH07XG4gIHBhZGRpbmc6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENoaWxkUG9zID0gKHtvZmZzZXRzLCByZWN0LCBjaGlsZFJlY3QsIHBhZ2VPZmZzZXQsIHBhZGRpbmd9OiBHZXRDaGlsZFBvc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHt0b3BPZmZzZXQsIGxlZnRPZmZzZXQsIHJpZ2h0T2Zmc2V0fSA9IG9mZnNldHM7XG5cbiAgY29uc3QgYW5jaG9yTGVmdCA9IGxlZnRPZmZzZXQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcG9zID0ge1xuICAgIHRvcDogcGFnZU9mZnNldC55ICsgcmVjdC50b3AgKyAodG9wT2Zmc2V0IHx8IDApLFxuICAgIC4uLihhbmNob3JMZWZ0XG4gICAgICA/IHtsZWZ0OiBwYWdlT2Zmc2V0LnggKyByZWN0LmxlZnQgKyAobGVmdE9mZnNldCB8fCAwKX1cbiAgICAgIDoge3JpZ2h0OiBXaW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QucmlnaHQgLSBwYWdlT2Zmc2V0LnggKyAocmlnaHRPZmZzZXQgfHwgMCl9KVxuICB9O1xuXG4gIGNvbnN0IGxlZnRPclJpZ2h0ID0gYW5jaG9yTGVmdCA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cbiAgaWYgKHBvc1tsZWZ0T3JSaWdodF0gJiYgcG9zW2xlZnRPclJpZ2h0XSA8IDApIHtcbiAgICBwb3NbbGVmdE9yUmlnaHRdID0gcGFkZGluZztcbiAgfSBlbHNlIGlmIChwb3NbbGVmdE9yUmlnaHRdICYmIHBvc1tsZWZ0T3JSaWdodF0gKyBjaGlsZFJlY3Qud2lkdGggPiBXaW5kb3cuaW5uZXJXaWR0aCkge1xuICAgIHBvc1tsZWZ0T3JSaWdodF0gPSBXaW5kb3cuaW5uZXJXaWR0aCAtIGNoaWxkUmVjdC53aWR0aCAtIHBhZGRpbmc7XG4gIH1cblxuICBpZiAocG9zLnRvcCA8IDApIHtcbiAgICBwb3MudG9wID0gcGFkZGluZztcbiAgfSBlbHNlIGlmIChwb3MudG9wICsgY2hpbGRSZWN0LmhlaWdodCA+IFdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgIHBvcy50b3AgPSBXaW5kb3cuaW5uZXJIZWlnaHQgLSBjaGlsZFJlY3QuaGVpZ2h0IC0gcGFkZGluZztcbiAgfVxuXG4gIHJldHVybiBwb3M7XG59O1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIGlmIChkb2N1bWVudC5ib2R5KSB7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgYWRkRXZlbnRMaXN0ZW5lcnMpO1xuICB9XG59XG5cbmxldCBsaXN0ZW5lcklkQ291bnRlciA9IDA7XG5mdW5jdGlvbiBzdWJzY3JpYmUoZm4pIHtcbiAgbGlzdGVuZXJJZENvdW50ZXIgKz0gMTtcbiAgY29uc3QgaWQgPSBsaXN0ZW5lcklkQ291bnRlcjtcbiAgbGlzdGVuZXJzW2lkXSA9IGZuO1xuICByZXR1cm4gKCkgPT4gZGVsZXRlIGxpc3RlbmVyc1tpZF07XG59XG5cbmNvbnN0IGRlZmF1bHRNb2RhbFN0eWxlID0ge1xuICBjb250ZW50OiB7XG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgYm90dG9tOiAnYXV0bycsXG4gICAgcGFkZGluZzogJzBweCAwcHggMHB4IDBweCdcbiAgfSxcbiAgb3ZlcmxheToge1xuICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgYm90dG9tOiAnYXV0bycsXG4gICAgd2lkdGg6ICcxMDB2dycsXG4gICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMCknXG4gIH1cbn07XG5cbmNvbnN0IFdJTkRPV19QQUQgPSA0MDtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbiAgcmV0dXJuO1xufTtcblxudHlwZSBQb3J0YWxlZFByb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48e1xuICByaWdodD86IG51bWJlcjtcbiAgbGVmdD86IG51bWJlcjtcbiAgdG9wPzogbnVtYmVyO1xuICBjb21wb25lbnQ/OiBSZWFjdC5FbGVtZW50VHlwZTxhbnk+O1xuICBvbkNsb3NlPzogKFxuICAgIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEVsZW1lbnQsIGdsb2JhbFRoaXMuTW91c2VFdmVudD4gfCBSZWFjdC5LZXlib2FyZEV2ZW50PEVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgdG9wT2Zmc2V0PzogbnVtYmVyO1xuICBsZWZ0T2Zmc2V0PzogbnVtYmVyO1xuICByaWdodE9mZnNldD86IG51bWJlcjtcbiAgb3ZlcmxheVpJbmRleD86IG51bWJlcjtcbiAgaXNPcGVuZWQ/OiBib29sZWFuO1xuICBtb2RhbFByb3BzPzogUGFydGlhbDxSZWFjdE1vZGFsLlByb3BzPjtcbiAgbW9kYWxTdHlsZT86IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRNb2RhbFN0eWxlPjtcbiAgdGhlbWU/OiBhbnk7XG59PjtcblxuaW50ZXJmYWNlIFBvcnRhbGVkU3RhdGUge1xuICBwb3M6XG4gICAgfCB7XG4gICAgICAgIGxlZnQ6IG51bWJlcjtcbiAgICAgICAgdG9wOiBudW1iZXI7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHJpZ2h0OiBudW1iZXI7XG4gICAgICAgIHRvcDogbnVtYmVyO1xuICAgICAgfVxuICAgIHwgbnVsbDtcbiAgaXNWaXNpYmxlOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0Q29tcG9uZW50ID0gJ2Rpdic7XG5cbmNsYXNzIFBvcnRhbGVkIGV4dGVuZHMgQ29tcG9uZW50PFBvcnRhbGVkUHJvcHMsIFBvcnRhbGVkU3RhdGU+IHtcbiAgLy8gTWFrZSBQb3J0YWxlZCBhIGNvbXBvbmVudCB3aXRoIEVycm9yIEJvdW5kYXJ5LCBzbyBSZWFjdCBjYW4gcmVjcmVhdGVcbiAgLy8gdGhpcyBjb21wb25lbnQgaWYgdGhlIGNoaWxkICdDb2xvclBpY2tlcicgdGhyb3dzIGNyb3NzLW9yaWdpbiBlcnJvci5cbiAgLy8gc2VlIGZ1bmN0aW9uIGNvbXBvbmVudERpZENhdGNoKClcbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpOiB7aGFzRXJyb3I6IGJvb2xlYW59IHtcbiAgICByZXR1cm4ge2hhc0Vycm9yOiB0cnVlfTtcbiAgfVxuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBvcnRhbGVkUHJvcHMgPSB7XG4gICAgY29tcG9uZW50OiBEZWZhdWx0Q29tcG9uZW50LFxuICAgIG9uQ2xvc2U6IG5vb3AsXG4gICAgdGhlbWVcbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBwb3M6IG51bGwsXG4gICAgaXNWaXNpYmxlOiBmYWxzZVxuICB9O1xuXG4gIHVuc3Vic2NyaWJlOiAoKCkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIF91bm1vdW50ZWQgPSBmYWxzZTtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLl91bm1vdW50ZWQgPSBmYWxzZTtcbiAgICAvLyByZWxhdGl2ZVxuICAgIHRoaXMudW5zdWJzY3JpYmUgPSBzdWJzY3JpYmUodGhpcy5oYW5kbGVTY3JvbGwpO1xuICAgIHRoaXMuaGFuZGxlU2Nyb2xsKCk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBQb3J0YWxlZFByb3BzKSB7XG4gICAgY29uc3QgZGlkT3BlbiA9IHRoaXMucHJvcHMuaXNPcGVuZWQgJiYgIXByZXZQcm9wcy5pc09wZW5lZDtcbiAgICBjb25zdCBkaWRDbG9zZSA9ICF0aGlzLnByb3BzLmlzT3BlbmVkICYmIHByZXZQcm9wcy5pc09wZW5lZDtcbiAgICBpZiAoZGlkT3BlbiB8fCBkaWRDbG9zZSkge1xuICAgICAgV2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNWaXNpYmxlOiBCb29sZWFuKGRpZE9wZW4pfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuICB9XG5cbiAgLy8gQ29sb3JQaWNrZXIgd2lsbCB0aHJvdyBhIGNyb3NzLW9yaWdpbiBlcnJvciB3aGVuIGl0IGlzIGNsb3NlZFxuICAvLyB3aGVuIHRoZSBhcHAgaXMgd2l0aGluIGFuIGlmcmFtZS5cbiAgLy8gVGhpcyBpcyBhIGtub3duIGlzc3VlIG9mIHJlYWN0LWNvbG9yIGNvbXBvbmVudDpcbiAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vY2FzZXNhbmRiZXJnL3JlYWN0LWNvbG9yL2lzc3Vlcy84MDZcbiAgY29tcG9uZW50RGlkQ2F0Y2goKSB7XG4gICAgLy8gRG8gbm90aGluZyBoZXJlLCBzaW5jZSBSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudFxuICAgIC8vIHRyZWUgZnJvbSBzY3JhdGNoIHVzaW5nIHRoZSBlcnJvciBib3VuZGFyeSwgd2hpY2ggaXMgdGhpcyBjb21wb25lbnRcbiAgICAvLyBpdHNlbGYuIFRoaXMgaXMgYSB0ZW1wb3JhbCBmaXggZm9yIGEgY3Jhc2guXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLl91bm1vdW50ZWQgPSB0cnVlO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBlbGVtZW50ID0gY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICBjaGlsZCA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBoYW5kbGVTY3JvbGwgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuY2hpbGQuY3VycmVudCAmJiB0aGlzLmVsZW1lbnQuY3VycmVudCkge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudC5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgY2hpbGRSZWN0ID0gdGhpcy5jaGlsZC5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcGFnZU9mZnNldCA9IGdldFBhZ2VPZmZzZXQoKTtcbiAgICAgIGNvbnN0IHt0b3A6IHRvcE9mZnNldCwgbGVmdDogbGVmdE9mZnNldCA9IDAsIHJpZ2h0OiByaWdodE9mZnNldH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBjb25zdCBwb3MgPSBnZXRDaGlsZFBvcyh7XG4gICAgICAgIG9mZnNldHM6IHt0b3BPZmZzZXQsIGxlZnRPZmZzZXQsIHJpZ2h0T2Zmc2V0fSxcbiAgICAgICAgcmVjdCxcbiAgICAgICAgY2hpbGRSZWN0LFxuICAgICAgICBwYWdlT2Zmc2V0LFxuICAgICAgICBwYWRkaW5nOiBXSU5ET1dfUEFEXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFpc0VxdWFsKHBvcywgdGhpcy5zdGF0ZS5wb3MpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3Bvc30pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIC8vIHJlbGF0aXZlXG4gICAgICBjb21wb25lbnQgPSBEZWZhdWx0Q29tcG9uZW50LFxuICAgICAgb3ZlcmxheVpJbmRleCxcbiAgICAgIGlzT3BlbmVkLFxuICAgICAgb25DbG9zZSxcblxuICAgICAgLy8gTW9kYWxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbW9kYWxQcm9wcyxcbiAgICAgIG1vZGFsU3R5bGUgPSB7fVxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3Qge2lzVmlzaWJsZSwgcG9zfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBjb25zdCBuZXdNb2RhbFN0eWxlID0ge1xuICAgICAgLi4uZGVmYXVsdE1vZGFsU3R5bGUsXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIC4uLihtb2RhbFN0eWxlLmNvbnRlbnQgfHwge30pXG4gICAgICB9LFxuICAgICAgb3ZlcmxheToge1xuICAgICAgICAuLi5kZWZhdWx0TW9kYWxTdHlsZS5vdmVybGF5LFxuICAgICAgICAuLi4obW9kYWxTdHlsZS5vdmVybGF5IHx8IHt9KSxcbiAgICAgICAgLy8gbmVlZHMgdG8gYmUgb24gdG9wIG9mIGV4aXN0aW5nIG1vZGFsXG4gICAgICAgIHpJbmRleDogb3ZlcmxheVpJbmRleCB8fCA5OTk5XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IENvbXAgPSBjb21wb25lbnQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFJvb3RDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICB7Y29udGV4dCA9PiAoXG4gICAgICAgICAgPENvbXAgcmVmPXt0aGlzLmVsZW1lbnR9PlxuICAgICAgICAgICAge2lzT3BlbmVkID8gKFxuICAgICAgICAgICAgICA8TW9kYWxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtb2RhbC1wb3J0YWxcIlxuICAgICAgICAgICAgICAgIHsuLi5tb2RhbFByb3BzfVxuICAgICAgICAgICAgICAgIGFyaWFIaWRlQXBwPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBpc09wZW5cbiAgICAgICAgICAgICAgICBzdHlsZT17bmV3TW9kYWxTdHlsZX1cbiAgICAgICAgICAgICAgICBwYXJlbnRTZWxlY3Rvcj17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gUmVhY3QgbW9kYWwgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlYWN0LW1vZGFsL2lzc3Vlcy83NjlcbiAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBleGVjdXRlIHJlbW92ZUNoaWxkIG9uIHBhcmVudCBub2RlIHdoZW4gaXQgaXMgYWxyZWFkeSB1bm1vdW50ZWRcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoY29udGV4dCAmJiBjb250ZXh0LmN1cnJlbnQpIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBvblJlcXVlc3RDbG9zZT17b25DbG9zZX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInBvcnRhbGVkLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAga2V5PVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogaXNWaXNpYmxlID8gMSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMucHJvcHMudGhlbWUudHJhbnNpdGlvbkZhc3QsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogaXNWaXNpYmxlID8gJzBweCcgOiAnMTRweCcsXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgLi4ucG9zXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgcmVmPXt0aGlzLmNoaWxkfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICAgIHpJbmRleDogb3ZlcmxheVpJbmRleCA/IG92ZXJsYXlaSW5kZXggKyAxIDogMTAwMDBcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvTW9kYWw+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L0NvbXA+XG4gICAgICAgICl9XG4gICAgICA8L1Jvb3RDb250ZXh0LkNvbnN1bWVyPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFRoZW1lKFBvcnRhbGVkKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssaUJBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLE9BQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLE9BQUEsR0FBQVQsT0FBQTtBQUF3QyxTQUFBVSx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVosd0JBQUFZLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFB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