UNPKG

kepler.gl

Version:

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

162 lines (160 loc) 27.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"] = void 0; 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 _classnames = _interopRequireDefault(require("classnames")); var _icons = require("../icons"); var _constants = require("@kepler.gl/constants"); var _animationSpeedSlider = _interopRequireDefault(require("./animation-speed-slider")); var _windowActionControl = _interopRequireDefault(require("./window-action-control")); var _animationWindowControl = _interopRequireDefault(require("./animation-window-control")); var _resetControl = _interopRequireDefault(require("./reset-control")); var _playControl = _interopRequireDefault(require("./play-control")); var _speedControl = _interopRequireDefault(require("./speed-control")); var _templateObject; // 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 DEFAULT_BUTTON_HEIGHT = '20px'; var StyledAnimationControls = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n width: ", "px;\n &.disabled {\n opacity: 0.4;\n pointer-events: none;\n }\n"])), function (props) { return props.width; }); var DEFAULT_ICONS = { /* eslint-disable react/display-name */ reset: function reset() { return /*#__PURE__*/_react["default"].createElement(_icons.Reset, { height: "16px" }); }, play: function play() { return /*#__PURE__*/_react["default"].createElement(_icons.Play, { height: "16px" }); }, pause: function pause() { return /*#__PURE__*/_react["default"].createElement(_icons.Pause, { height: "16px" }); }, "export": function _export() { return /*#__PURE__*/_react["default"].createElement(_icons.Save, { height: "16px" }); }, /* eslint-enable react/display-name */ speed: function speed() { return /*#__PURE__*/_react["default"].createElement(_icons.Speed, { height: "16px" }); }, animationFree: _icons.FreeWindow, animationIncremental: _icons.AnchorWindow }; function nop() { return; } var DEFAULT_ANIMATE_ITEMS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.ANIMATION_WINDOW.free, { id: _constants.ANIMATION_WINDOW.free, icon: DEFAULT_ICONS.animationFree, tooltip: 'tooltip.animationByWindow' }), _constants.ANIMATION_WINDOW.incremental, { id: _constants.ANIMATION_WINDOW.incremental, icon: DEFAULT_ICONS.animationIncremental, tooltip: 'tooltip.animationByIncremental' }); PlaybackControlsFactory.deps = [ // keeping this for backwards compatibility but we can decide to drop it later _animationSpeedSlider["default"], _windowActionControl["default"], _animationWindowControl["default"], _resetControl["default"], _playControl["default"]]; function PlaybackControlsFactory(AnimationSpeedSlider, WindowActionControl, AnimationWindowControl, ResetControl, PlayControl) { var PLAYBACK_CONTROLS_DEFAULT_ACTION_COMPONENTS = [PlayControl, (0, _speedControl["default"])(AnimationSpeedSlider), ResetControl, WindowActionControl, AnimationWindowControl]; // eslint-disable-next-line complexity var PlaybackControls = function PlaybackControls(_ref) { var filter = _ref.filter, _ref$isAnimatable = _ref.isAnimatable, isAnimatable = _ref$isAnimatable === void 0 ? true : _ref$isAnimatable, isAnimating = _ref.isAnimating, width = _ref.width, speed = _ref.speed, _ref$animationWindow = _ref.animationWindow, animationWindow = _ref$animationWindow === void 0 ? _constants.ANIMATION_WINDOW.free : _ref$animationWindow, setFilterAnimationWindow = _ref.setFilterAnimationWindow, updateAnimationSpeed = _ref.updateAnimationSpeed, _ref$pauseAnimation = _ref.pauseAnimation, pauseAnimation = _ref$pauseAnimation === void 0 ? nop : _ref$pauseAnimation, _ref$resetAnimation = _ref.resetAnimation, resetAnimation = _ref$resetAnimation === void 0 ? nop : _ref$resetAnimation, _ref$startAnimation = _ref.startAnimation, startAnimation = _ref$startAnimation === void 0 ? nop : _ref$startAnimation, _ref$playbackIcons = _ref.playbackIcons, playbackIcons = _ref$playbackIcons === void 0 ? DEFAULT_ICONS : _ref$playbackIcons, _ref$animationItems = _ref.animationItems, animationItems = _ref$animationItems === void 0 ? DEFAULT_ANIMATE_ITEMS : _ref$animationItems, _ref$buttonStyle = _ref.buttonStyle, buttonStyle = _ref$buttonStyle === void 0 ? 'secondary' : _ref$buttonStyle, _ref$buttonHeight = _ref.buttonHeight, buttonHeight = _ref$buttonHeight === void 0 ? DEFAULT_BUTTON_HEIGHT : _ref$buttonHeight, _ref$playbackActionIt = _ref.playbackActionItems, playbackActionItems = _ref$playbackActionIt === void 0 ? PLAYBACK_CONTROLS_DEFAULT_ACTION_COMPONENTS : _ref$playbackActionIt; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), isSpeedControlVisible = _useState2[0], toggleSpeedControl = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), showAnimationWindowControl = _useState4[0], setShowAnimationWindowControl = _useState4[1]; var toggleAnimationWindowControl = (0, _react.useCallback)(function () { setShowAnimationWindowControl(!showAnimationWindowControl); }, [showAnimationWindowControl, setShowAnimationWindowControl]); var btnStyle = buttonStyle ? (0, _defineProperty2["default"])({}, buttonStyle, true) : {}; var hideAndShowSpeedControl = (0, _react.useCallback)(function () { if (!isSpeedControlVisible) { toggleSpeedControl(true); } else { // TODO: A HACK to allow input onblur get triggered before the input is unmounted // A better solution should be invested, see https://github.com/facebook/react/issues/12363 window.setTimeout(function () { return toggleSpeedControl(false); }, 200); } }, [isSpeedControlVisible, toggleSpeedControl]); return /*#__PURE__*/_react["default"].createElement(StyledAnimationControls, { className: (0, _classnames["default"])('playback-controls', { disabled: !isAnimatable }), width: width }, playbackActionItems.map(function (ActionComponent, index) { return /*#__PURE__*/_react["default"].createElement(ActionComponent, { key: index, toggleAnimationWindowControl: toggleAnimationWindowControl, showAnimationWindowControl: showAnimationWindowControl, btnStyle: btnStyle, hideAndShowSpeedControl: hideAndShowSpeedControl, animationItems: animationItems, animationWindow: animationWindow, buttonHeight: buttonHeight, filter: filter, setFilterAnimationWindow: setFilterAnimationWindow, updateAnimationSpeed: updateAnimationSpeed, isAnimating: isAnimating, pauseAnimation: pauseAnimation, resetAnimation: resetAnimation, startAnimation: startAnimation, playbackIcons: playbackIcons, isSpeedControlVisible: isSpeedControlVisible, speed: speed }); })); }; return PlaybackControls; } var _default = exports["default"] = PlaybackControlsFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY2xhc3NuYW1lcyIsIl9pY29ucyIsIl9jb25zdGFudHMiLCJfYW5pbWF0aW9uU3BlZWRTbGlkZXIiLCJfd2luZG93QWN0aW9uQ29udHJvbCIsIl9hbmltYXRpb25XaW5kb3dDb250cm9sIiwiX3Jlc2V0Q29udHJvbCIsIl9wbGF5Q29udHJvbCIsIl9zcGVlZENvbnRyb2wiLCJfdGVtcGxhdGVPYmplY3QiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJERUZBVUxUX0JVVFRPTl9IRUlHSFQiLCJTdHlsZWRBbmltYXRpb25Db250cm9scyIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ3aWR0aCIsIkRFRkFVTFRfSUNPTlMiLCJyZXNldCIsImNyZWF0ZUVsZW1lbnQiLCJSZXNldCIsImhlaWdodCIsInBsYXkiLCJQbGF5IiwicGF1c2UiLCJQYXVzZSIsImV4cG9ydCIsIlNhdmUiLCJzcGVlZCIsIlNwZWVkIiwiYW5pbWF0aW9uRnJlZSIsIkZyZWVXaW5kb3ciLCJhbmltYXRpb25JbmNyZW1lbnRhbCIsIkFuY2hvcldpbmRvdyIsIm5vcCIsIkRFRkFVTFRfQU5JTUFURV9JVEVNUyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJBTklNQVRJT05fV0lORE9XIiwiZnJlZSIsImlkIiwiaWNvbiIsInRvb2x0aXAiLCJpbmNyZW1lbnRhbCIsIlBsYXliYWNrQ29udHJvbHNGYWN0b3J5IiwiZGVwcyIsIkFuaW1hdGlvblNwZWVkU2xpZGVyRmFjdG9yeSIsIldpbmRvd0FjdGlvbkNvbnRyb2xGYWN0b3J5IiwiQW5pbWF0aW9uV2luZG93Q29udHJvbEZhY3RvcnkiLCJSZXNldENvbnRyb2xGYWN0b3J5IiwiUGxheUNvbnRyb2xGYWN0b3J5IiwiQW5pbWF0aW9uU3BlZWRTbGlkZXIiLCJXaW5kb3dBY3Rpb25Db250cm9sIiwiQW5pbWF0aW9uV2luZG93Q29udHJvbCIsIlJlc2V0Q29udHJvbCIsIlBsYXlDb250cm9sIiwiUExBWUJBQ0tfQ09OVFJPTFNfREVGQVVMVF9BQ1RJT05fQ09NUE9ORU5UUyIsIlNwZWVkQ29udHJvbEZhY3RvcnkiLCJQbGF5YmFja0NvbnRyb2xzIiwiX3JlZiIsImZpbHRlciIsIl9yZWYkaXNBbmltYXRhYmxlIiwiaXNBbmltYXRhYmxlIiwiaXNBbmltYXRpbmciLCJfcmVmJGFuaW1hdGlvbldpbmRvdyIsImFuaW1hdGlvbldpbmRvdyIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvdyIsInVwZGF0ZUFuaW1hdGlvblNwZWVkIiwiX3JlZiRwYXVzZUFuaW1hdGlvbiIsInBhdXNlQW5pbWF0aW9uIiwiX3JlZiRyZXNldEFuaW1hdGlvbiIsInJlc2V0QW5pbWF0aW9uIiwiX3JlZiRzdGFydEFuaW1hdGlvbiIsInN0YXJ0QW5pbWF0aW9uIiwiX3JlZiRwbGF5YmFja0ljb25zIiwicGxheWJhY2tJY29ucyIsIl9yZWYkYW5pbWF0aW9uSXRlbXMiLCJhbmltYXRpb25JdGVtcyIsIl9yZWYkYnV0dG9uU3R5bGUiLCJidXR0b25TdHlsZSIsIl9yZWYkYnV0dG9uSGVpZ2h0IiwiYnV0dG9uSGVpZ2h0IiwiX3JlZiRwbGF5YmFja0FjdGlvbkl0IiwicGxheWJhY2tBY3Rpb25JdGVtcyIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsImlzU3BlZWRDb250cm9sVmlzaWJsZSIsInRvZ2dsZVNwZWVkQ29udHJvbCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0Iiwic2hvd0FuaW1hdGlvbldpbmRvd0NvbnRyb2wiLCJzZXRTaG93QW5pbWF0aW9uV2luZG93Q29udHJvbCIsInRvZ2dsZUFuaW1hdGlvbldpbmRvd0NvbnRyb2wiLCJ1c2VDYWxsYmFjayIsImJ0blN0eWxlIiwiaGlkZUFuZFNob3dTcGVlZENvbnRyb2wiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiY2xhc3NOYW1lIiwiY2xhc3NuYW1lcyIsImRpc2FibGVkIiwibWFwIiwiQWN0aW9uQ29tcG9uZW50IiwiaW5kZXgiLCJrZXkiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL2FuaW1hdGlvbi1jb250cm9sL3BsYXliYWNrLWNvbnRyb2xzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VTdGF0ZSwgdXNlQ2FsbGJhY2t9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQsIHtJU3R5bGVkQ29tcG9uZW50fSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7UmVzZXQsIFBsYXksIFBhdXNlLCBTYXZlLCBTcGVlZCwgQW5jaG9yV2luZG93LCBGcmVlV2luZG93fSBmcm9tICcuLi9pY29ucyc7XG5pbXBvcnQge0FOSU1BVElPTl9XSU5ET1d9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7RmlsdGVyLCBUaW1lUmFuZ2VGaWx0ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IEFuaW1hdGlvblNwZWVkU2xpZGVyRmFjdG9yeSBmcm9tICcuL2FuaW1hdGlvbi1zcGVlZC1zbGlkZXInO1xuaW1wb3J0IFdpbmRvd0FjdGlvbkNvbnRyb2xGYWN0b3J5IGZyb20gJy4vd2luZG93LWFjdGlvbi1jb250cm9sJztcbmltcG9ydCBBbmltYXRpb25XaW5kb3dDb250cm9sRmFjdG9yeSwge0FuaW1hdGlvbkl0ZW19IGZyb20gJy4vYW5pbWF0aW9uLXdpbmRvdy1jb250cm9sJztcbmltcG9ydCBSZXNldENvbnRyb2xGYWN0b3J5IGZyb20gJy4vcmVzZXQtY29udHJvbCc7XG5pbXBvcnQgUGxheUNvbnRyb2xGYWN0b3J5IGZyb20gJy4vcGxheS1jb250cm9sJztcbmltcG9ydCBTcGVlZENvbnRyb2xGYWN0b3J5IGZyb20gJy4vc3BlZWQtY29udHJvbCc7XG5pbXBvcnQge0Jhc2VDb21wb25lbnRQcm9wc30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5jb25zdCBERUZBVUxUX0JVVFRPTl9IRUlHSFQgPSAnMjBweCc7XG5cbmV4cG9ydCB0eXBlIFN0eWxlZEFuaW1hdGlvbkNvbnRyb2xzUHJvcHMgPSBCYXNlQ29tcG9uZW50UHJvcHMgJiB7XG4gIHdpZHRoPzogbnVtYmVyO1xufTtcblxuY29uc3QgU3R5bGVkQW5pbWF0aW9uQ29udHJvbHM6IElTdHlsZWRDb21wb25lbnQ8XG4gICd3ZWInLFxuICBTdHlsZWRBbmltYXRpb25Db250cm9sc1Byb3BzXG4+ID0gc3R5bGVkLmRpdjxTdHlsZWRBbmltYXRpb25Db250cm9sc1Byb3BzPmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogJHtwcm9wcyA9PiBwcm9wcy53aWR0aH1weDtcbiAgJi5kaXNhYmxlZCB7XG4gICAgb3BhY2l0eTogMC40O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5gO1xuXG5jb25zdCBERUZBVUxUX0lDT05TID0ge1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9kaXNwbGF5LW5hbWUgKi9cbiAgcmVzZXQ6ICgpID0+IDxSZXNldCBoZWlnaHQ9XCIxNnB4XCIgLz4sXG4gIHBsYXk6ICgpID0+IDxQbGF5IGhlaWdodD1cIjE2cHhcIiAvPixcbiAgcGF1c2U6ICgpID0+IDxQYXVzZSBoZWlnaHQ9XCIxNnB4XCIgLz4sXG4gIGV4cG9ydDogKCkgPT4gPFNhdmUgaGVpZ2h0PVwiMTZweFwiIC8+LFxuICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0L2Rpc3BsYXktbmFtZSAqL1xuICBzcGVlZDogKCkgPT4gPFNwZWVkIGhlaWdodD1cIjE2cHhcIiAvPixcbiAgYW5pbWF0aW9uRnJlZTogRnJlZVdpbmRvdyxcbiAgYW5pbWF0aW9uSW5jcmVtZW50YWw6IEFuY2hvcldpbmRvd1xufTtcblxuZnVuY3Rpb24gbm9wKCkge1xuICByZXR1cm47XG59XG5cbmNvbnN0IERFRkFVTFRfQU5JTUFURV9JVEVNUyA9IHtcbiAgW0FOSU1BVElPTl9XSU5ET1cuZnJlZV06IHtcbiAgICBpZDogQU5JTUFUSU9OX1dJTkRPVy5mcmVlLFxuICAgIGljb246IERFRkFVTFRfSUNPTlMuYW5pbWF0aW9uRnJlZSxcbiAgICB0b29sdGlwOiAndG9vbHRpcC5hbmltYXRpb25CeVdpbmRvdydcbiAgfSxcbiAgW0FOSU1BVElPTl9XSU5ET1cuaW5jcmVtZW50YWxdOiB7XG4gICAgaWQ6IEFOSU1BVElPTl9XSU5ET1cuaW5jcmVtZW50YWwsXG4gICAgaWNvbjogREVGQVVMVF9JQ09OUy5hbmltYXRpb25JbmNyZW1lbnRhbCxcbiAgICB0b29sdGlwOiAndG9vbHRpcC5hbmltYXRpb25CeUluY3JlbWVudGFsJ1xuICB9XG59O1xuZXhwb3J0IGludGVyZmFjZSBQbGF5YmFja0NvbnRyb2xzUHJvcHMge1xuICBmaWx0ZXI/OiBGaWx0ZXI7XG4gIGlzQW5pbWF0YWJsZT86IGJvb2xlYW47XG4gIGlzQW5pbWF0aW5nPzogYm9vbGVhbjtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIHNwZWVkOiBudW1iZXI7XG4gIGFuaW1hdGlvbldpbmRvdz86IG51bGwgfCBUaW1lUmFuZ2VGaWx0ZXJbJ2FuaW1hdGlvbldpbmRvdyddO1xuICBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3c/OiAoaWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgdXBkYXRlQW5pbWF0aW9uU3BlZWQ/OiAoaWR4OiBudW1iZXIsIHNwZWVkOiBudW1iZXIpID0+IHZvaWQ7XG4gIHBhdXNlQW5pbWF0aW9uPzogKCkgPT4gdm9pZDtcbiAgcmVzZXRBbmltYXRpb24/OiAoKSA9PiB2b2lkO1xuICBzdGFydEFuaW1hdGlvbjogKCkgPT4gdm9pZDtcbiAgcGxheWJhY2tJY29ucz86IFJlY29yZDxzdHJpbmcsIFJlYWN0LkZDPHtoZWlnaHQ6IG51bWJlcn0+PjtcbiAgYW5pbWF0aW9uSXRlbXM/OiB7W2tleTogc3RyaW5nXTogQW5pbWF0aW9uSXRlbX07XG4gIGJ1dHRvblN0eWxlPzogc3RyaW5nO1xuICBidXR0b25IZWlnaHQ/OiBzdHJpbmc7XG4gIHBsYXliYWNrQWN0aW9uSXRlbXM/OiBSZWFjdC5GQ1tdO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cblBsYXliYWNrQ29udHJvbHNGYWN0b3J5LmRlcHMgPSBbXG4gIC8vIGtlZXBpbmcgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnV0IHdlIGNhbiBkZWNpZGUgdG8gZHJvcCBpdCBsYXRlclxuICBBbmltYXRpb25TcGVlZFNsaWRlckZhY3RvcnksXG4gIFdpbmRvd0FjdGlvbkNvbnRyb2xGYWN0b3J5LFxuICBBbmltYXRpb25XaW5kb3dDb250cm9sRmFjdG9yeSxcbiAgUmVzZXRDb250cm9sRmFjdG9yeSxcbiAgUGxheUNvbnRyb2xGYWN0b3J5XG5dO1xuXG5mdW5jdGlvbiBQbGF5YmFja0NvbnRyb2xzRmFjdG9yeShcbiAgQW5pbWF0aW9uU3BlZWRTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIEFuaW1hdGlvblNwZWVkU2xpZGVyRmFjdG9yeT4sXG4gIFdpbmRvd0FjdGlvbkNvbnRyb2wsXG4gIEFuaW1hdGlvbldpbmRvd0NvbnRyb2wsXG4gIFJlc2V0Q29udHJvbCxcbiAgUGxheUNvbnRyb2xcbikge1xuICBjb25zdCBQTEFZQkFDS19DT05UUk9MU19ERUZBVUxUX0FDVElPTl9DT01QT05FTlRTID0gW1xuICAgIFBsYXlDb250cm9sLFxuICAgIFNwZWVkQ29udHJvbEZhY3RvcnkoQW5pbWF0aW9uU3BlZWRTbGlkZXIpLFxuICAgIFJlc2V0Q29udHJvbCxcbiAgICBXaW5kb3dBY3Rpb25Db250cm9sLFxuICAgIEFuaW1hdGlvbldpbmRvd0NvbnRyb2xcbiAgXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBjb25zdCBQbGF5YmFja0NvbnRyb2xzOiBSZWFjdC5GQzxQbGF5YmFja0NvbnRyb2xzUHJvcHM+ID0gKHtcbiAgICBmaWx0ZXIsXG4gICAgaXNBbmltYXRhYmxlID0gdHJ1ZSxcbiAgICBpc0FuaW1hdGluZyxcbiAgICB3aWR0aCxcbiAgICBzcGVlZCxcbiAgICBhbmltYXRpb25XaW5kb3cgPSBBTklNQVRJT05fV0lORE9XLmZyZWUsXG4gICAgc2V0RmlsdGVyQW5pbWF0aW9uV2luZG93LFxuICAgIHVwZGF0ZUFuaW1hdGlvblNwZWVkLFxuICAgIHBhdXNlQW5pbWF0aW9uID0gbm9wLFxuICAgIHJlc2V0QW5pbWF0aW9uID0gbm9wLFxuICAgIHN0YXJ0QW5pbWF0aW9uID0gbm9wLFxuICAgIHBsYXliYWNrSWNvbnMgPSBERUZBVUxUX0lDT05TLFxuICAgIGFuaW1hdGlvbkl0ZW1zID0gREVGQVVMVF9BTklNQVRFX0lURU1TLFxuICAgIGJ1dHRvblN0eWxlID0gJ3NlY29uZGFyeScsXG4gICAgYnV0dG9uSGVpZ2h0ID0gREVGQVVMVF9CVVRUT05fSEVJR0hULFxuICAgIHBsYXliYWNrQWN0aW9uSXRlbXMgPSBQTEFZQkFDS19DT05UUk9MU19ERUZBVUxUX0FDVElPTl9DT01QT05FTlRTXG4gIH0pID0+IHtcbiAgICBjb25zdCBbaXNTcGVlZENvbnRyb2xWaXNpYmxlLCB0b2dnbGVTcGVlZENvbnRyb2xdID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtzaG93QW5pbWF0aW9uV2luZG93Q29udHJvbCwgc2V0U2hvd0FuaW1hdGlvbldpbmRvd0NvbnRyb2xdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgdG9nZ2xlQW5pbWF0aW9uV2luZG93Q29udHJvbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHNldFNob3dBbmltYXRpb25XaW5kb3dDb250cm9sKCFzaG93QW5pbWF0aW9uV2luZG93Q29udHJvbCk7XG4gICAgfSwgW3Nob3dBbmltYXRpb25XaW5kb3dDb250cm9sLCBzZXRTaG93QW5pbWF0aW9uV2luZG93Q29udHJvbF0pO1xuICAgIGNvbnN0IGJ0blN0eWxlID0gYnV0dG9uU3R5bGUgPyB7W2J1dHRvblN0eWxlXTogdHJ1ZX0gOiB7fTtcblxuICAgIGNvbnN0IGhpZGVBbmRTaG93U3BlZWRDb250cm9sID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKCFpc1NwZWVkQ29udHJvbFZpc2libGUpIHtcbiAgICAgICAgdG9nZ2xlU3BlZWRDb250cm9sKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogQSBIQUNLIHRvIGFsbG93IGlucHV0IG9uYmx1ciBnZXQgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgaW5wdXQgaXMgdW5tb3VudGVkXG4gICAgICAgIC8vIEEgYmV0dGVyIHNvbHV0aW9uIHNob3VsZCBiZSBpbnZlc3RlZCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTIzNjNcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdG9nZ2xlU3BlZWRDb250cm9sKGZhbHNlKSwgMjAwKTtcbiAgICAgIH1cbiAgICB9LCBbaXNTcGVlZENvbnRyb2xWaXNpYmxlLCB0b2dnbGVTcGVlZENvbnRyb2xdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkQW5pbWF0aW9uQ29udHJvbHNcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdwbGF5YmFjay1jb250cm9scycsIHtcbiAgICAgICAgICBkaXNhYmxlZDogIWlzQW5pbWF0YWJsZVxuICAgICAgICB9KX1cbiAgICAgICAgd2lkdGg9e3dpZHRofVxuICAgICAgPlxuICAgICAgICB7LyoqIFdpbmRvdyAqL31cbiAgICAgICAge3BsYXliYWNrQWN0aW9uSXRlbXMubWFwKChBY3Rpb25Db21wb25lbnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgPEFjdGlvbkNvbXBvbmVudFxuICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgIHRvZ2dsZUFuaW1hdGlvbldpbmRvd0NvbnRyb2w9e3RvZ2dsZUFuaW1hdGlvbldpbmRvd0NvbnRyb2x9XG4gICAgICAgICAgICBzaG93QW5pbWF0aW9uV2luZG93Q29udHJvbD17c2hvd0FuaW1hdGlvbldpbmRvd0NvbnRyb2x9XG4gICAgICAgICAgICBidG5TdHlsZT17YnRuU3R5bGV9XG4gICAgICAgICAgICBoaWRlQW5kU2hvd1NwZWVkQ29udHJvbD17aGlkZUFuZFNob3dTcGVlZENvbnRyb2x9XG4gICAgICAgICAgICBhbmltYXRpb25JdGVtcz17YW5pbWF0aW9uSXRlbXN9XG4gICAgICAgICAgICBhbmltYXRpb25XaW5kb3c9e2FuaW1hdGlvbldpbmRvd31cbiAgICAgICAgICAgIGJ1dHRvbkhlaWdodD17YnV0dG9uSGVpZ2h0fVxuICAgICAgICAgICAgZmlsdGVyPXtmaWx0ZXJ9XG4gICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3c9e3NldEZpbHRlckFuaW1hdGlvbldpbmRvd31cbiAgICAgICAgICAgIHVwZGF0ZUFuaW1hdGlvblNwZWVkPXt1cGRhdGVBbmltYXRpb25TcGVlZH1cbiAgICAgICAgICAgIGlzQW5pbWF0aW5nPXtpc0FuaW1hdGluZ31cbiAgICAgICAgICAgIHBhdXNlQW5pbWF0aW9uPXtwYXVzZUFuaW1hdGlvbn1cbiAgICAgICAgICAgIHJlc2V0QW5pbWF0aW9uPXtyZXNldEFuaW1hdGlvbn1cbiAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uPXtzdGFydEFuaW1hdGlvbn1cbiAgICAgICAgICAgIHBsYXliYWNrSWNvbnM9e3BsYXliYWNrSWNvbnN9XG4gICAgICAgICAgICBpc1NwZWVkQ29udHJvbFZpc2libGU9e2lzU3BlZWRDb250cm9sVmlzaWJsZX1cbiAgICAgICAgICAgIHNwZWVkPXtzcGVlZH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvU3R5bGVkQW5pbWF0aW9uQ29udHJvbHM+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGxheWJhY2tDb250cm9scztcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxheWJhY2tDb250cm9sc0ZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLHFCQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxvQkFBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsdUJBQUEsR0FBQU4sc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFTLGFBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLFlBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLGFBQUEsR0FBQVQsc0JBQUEsQ0FBQUYsT0FBQTtBQUFrRCxJQUFBWSxlQUFBLEVBZGxEO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FB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