UNPKG

kepler.gl

Version:

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

215 lines (185 loc) 33.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.FilterAnimationControllerFactory = FilterAnimationControllerFactory; exports.LayerAnimationControllerFactory = LayerAnimationControllerFactory; exports["default"] = BottomWidgetFactory; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _timeWidget = _interopRequireDefault(require("./filters/time-widget")); var _animationControl = _interopRequireDefault(require("./common/animation-control/animation-control")); var _animationController = _interopRequireDefault(require("./common/animation-control/animation-controller")); var _defaultSettings = require("../constants/default-settings"); var _filterUtils = require("../utils/filter-utils"); var _mediaBreakpoints = require("../styles/media-breakpoints"); var _templateObject, _templateObject2; var maxWidth = 1080; var BottomWidgetContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n padding-top: ", "px;\n padding-right: ", "px;\n padding-bottom: ", "px;\n padding-left: ", "px;\n pointer-events: none !important; /* prevent padding from blocking input */\n & > * {\n /* all children should allow input */\n pointer-events: all;\n }\n width: ", "px;\n z-index: 1;\n ", "\n"])), function (props) { return props.hasPadding ? props.theme.bottomWidgetPaddingTop : 0; }, function (props) { return props.hasPadding ? props.theme.bottomWidgetPaddingRight : 0; }, function (props) { return props.hasPadding ? props.theme.bottomWidgetPaddingBottom : 0; }, function (props) { return props.hasPadding ? props.theme.bottomWidgetPaddingLeft : 0; }, function (props) { return props.width; }, _mediaBreakpoints.media.portable(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["padding: 0;"])))); FilterAnimationControllerFactory.deps = [_animationController["default"]]; function FilterAnimationControllerFactory(AnimationController) { var FilterAnimationController = function FilterAnimationController(_ref) { var filter = _ref.filter, filterIdx = _ref.filterIdx, setFilterAnimationTime = _ref.setFilterAnimationTime, children = _ref.children; var intervalBins = (0, _react.useMemo)(function () { return (0, _filterUtils.getIntervalBins)(filter); }, [filter]); var steps = (0, _react.useMemo)(function () { return intervalBins ? intervalBins.map(function (x) { return x.x0; }) : null; }, [intervalBins]); var updateAnimation = (0, _react.useCallback)(function (value) { switch (filter.animationWindow) { case _defaultSettings.ANIMATION_WINDOW.interval: var idx = value[1]; setFilterAnimationTime(filterIdx, 'value', [intervalBins[idx].x0, intervalBins[idx].x1 - 1]); break; default: setFilterAnimationTime(filterIdx, 'value', value); break; } }, [filterIdx, intervalBins, filter.animationWindow, setFilterAnimationTime]); return /*#__PURE__*/_react["default"].createElement(AnimationController, { key: "filter-control", value: filter.value, domain: filter.domain, speed: filter.speed, isAnimating: filter.isAnimating, animationWindow: filter.animationWindow, steps: steps, updateAnimation: updateAnimation, children: children }); }; return FilterAnimationController; } LayerAnimationControllerFactory.deps = [_animationController["default"]]; function LayerAnimationControllerFactory(AnimationController) { var LayerAnimationController = function LayerAnimationController(_ref2) { var animationConfig = _ref2.animationConfig, setLayerAnimationTime = _ref2.setLayerAnimationTime, children = _ref2.children; return /*#__PURE__*/_react["default"].createElement(AnimationController, { key: "layer-control", value: animationConfig.currentTime, domain: animationConfig.domain, speed: animationConfig.speed, isAnimating: animationConfig.isAnimating, updateAnimation: setLayerAnimationTime, steps: animationConfig.timeSteps, animationWindow: animationConfig.timeSteps ? _defaultSettings.ANIMATION_WINDOW.interval : _defaultSettings.ANIMATION_WINDOW.point, children: children }); }; return LayerAnimationController; } BottomWidgetFactory.deps = [_timeWidget["default"], _animationControl["default"], FilterAnimationControllerFactory, LayerAnimationControllerFactory]; /* eslint-disable complexity */ function BottomWidgetFactory(TimeWidget, AnimationControl, FilterAnimationController, LayerAnimationController) { var BottomWidget = function BottomWidget(props) { var datasets = props.datasets, filters = props.filters, animationConfig = props.animationConfig, visStateActions = props.visStateActions, containerW = props.containerW, uiState = props.uiState, sidePanelWidth = props.sidePanelWidth, layers = props.layers; var activeSidePanel = uiState.activeSidePanel, readOnly = uiState.readOnly; var isOpen = Boolean(activeSidePanel); var enlargedFilterIdx = (0, _react.useMemo)(function () { return filters.findIndex(function (f) { return f.enlarged && f.type === _defaultSettings.FILTER_TYPES.timeRange; }); }, [filters]); var animatedFilterIdx = (0, _react.useMemo)(function () { return filters.findIndex(function (f) { return f.isAnimating; }); }, [filters]); var animatedFilter = animatedFilterIdx > -1 ? filters[animatedFilterIdx] : null; var enlargedFilterWidth = isOpen ? containerW - sidePanelWidth : containerW; // show playback control if layers contain trip layer & at least one trip layer is visible var animatableLayer = (0, _react.useMemo)(function () { return layers.filter(function (l) { return l.config.animation && l.config.animation.enabled && l.config.isVisible; }); }, [layers]); var readyToAnimation = Array.isArray(animationConfig.domain) && Number.isFinite(animationConfig.currentTime); // if animation control is showing, hide time display in time slider var showFloatingTimeDisplay = !animatableLayer.length; var showAnimationControl = animatableLayer.length && readyToAnimation && !animationConfig.hideControl; var showTimeWidget = enlargedFilterIdx > -1 && Object.keys(datasets).length > 0; // if filter is not animating, pass in enlarged filter here because // animation controller needs to call reset on it var filter = animatedFilter || filters[enlargedFilterIdx]; return /*#__PURE__*/_react["default"].createElement(BottomWidgetContainer, { width: Math.min(maxWidth, enlargedFilterWidth), className: "bottom-widget--container", hasPadding: showAnimationControl || showTimeWidget }, /*#__PURE__*/_react["default"].createElement(LayerAnimationController, { animationConfig: animationConfig, setLayerAnimationTime: visStateActions.setLayerAnimationTime }, function (isAnimating, start, pause, reset) { return showAnimationControl ? /*#__PURE__*/_react["default"].createElement(AnimationControl, { animationConfig: animationConfig, setLayerAnimationTime: visStateActions.setLayerAnimationTime, updateAnimationSpeed: visStateActions.updateLayerAnimationSpeed, toggleAnimation: visStateActions.toggleLayerAnimation, isAnimatable: !animatedFilter, isAnimating: isAnimating, resetAnimation: reset }) : null; }), filter && /*#__PURE__*/_react["default"].createElement(FilterAnimationController, { filter: filter, filterIdx: animatedFilterIdx > -1 ? animatedFilterIdx : enlargedFilterIdx, setFilterAnimationTime: visStateActions.setFilterAnimationTime }, function (isAnimating, start, pause, resetAnimation) { return showTimeWidget ? /*#__PURE__*/_react["default"].createElement(TimeWidget // TimeWidget uses React.memo, here we pass width // even though it doesnt use it, to force rerender , { width: enlargedFilterWidth, filter: filters[enlargedFilterIdx], index: enlargedFilterIdx, isAnyFilterAnimating: Boolean(animatedFilter), datasets: datasets, readOnly: readOnly, showTimeDisplay: showFloatingTimeDisplay, setFilterPlot: visStateActions.setFilterPlot, setFilter: visStateActions.setFilter, setFilterAnimationTime: visStateActions.setFilterAnimationTime, setFilterAnimationWindow: visStateActions.setFilterAnimationWindow, toggleAnimation: visStateActions.toggleFilterAnimation, updateAnimationSpeed: visStateActions.updateFilterAnimationSpeed, enlargeFilter: visStateActions.enlargeFilter, resetAnimation: resetAnimation, isAnimatable: !animationConfig || !animationConfig.isAnimating }) : null; })); }; /* eslint-disable react/display-name */ // @ts-ignore return /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) { return /*#__PURE__*/_react["default"].createElement(BottomWidget, (0, _extends2["default"])({}, props, { rootRef: ref })); }); /* eslint-enable react/display-name */ } /* eslint-enable complexity */ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2JvdHRvbS13aWRnZXQuanMiXSwibmFtZXMiOlsibWF4V2lkdGgiLCJCb3R0b21XaWRnZXRDb250YWluZXIiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsImhhc1BhZGRpbmciLCJ0aGVtZSIsImJvdHRvbVdpZGdldFBhZGRpbmdUb3AiLCJib3R0b21XaWRnZXRQYWRkaW5nUmlnaHQiLCJib3R0b21XaWRnZXRQYWRkaW5nQm90dG9tIiwiYm90dG9tV2lkZ2V0UGFkZGluZ0xlZnQiLCJ3aWR0aCIsIm1lZGlhIiwicG9ydGFibGUiLCJGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeSIsImRlcHMiLCJBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeSIsIkFuaW1hdGlvbkNvbnRyb2xsZXIiLCJGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyIiwiZmlsdGVyIiwiZmlsdGVySWR4Iiwic2V0RmlsdGVyQW5pbWF0aW9uVGltZSIsImNoaWxkcmVuIiwiaW50ZXJ2YWxCaW5zIiwic3RlcHMiLCJtYXAiLCJ4IiwieDAiLCJ1cGRhdGVBbmltYXRpb24iLCJ2YWx1ZSIsImFuaW1hdGlvbldpbmRvdyIsIkFOSU1BVElPTl9XSU5ET1ciLCJpbnRlcnZhbCIsImlkeCIsIngxIiwiZG9tYWluIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsIkxheWVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkiLCJMYXllckFuaW1hdGlvbkNvbnRyb2xsZXIiLCJhbmltYXRpb25Db25maWciLCJzZXRMYXllckFuaW1hdGlvblRpbWUiLCJjdXJyZW50VGltZSIsInRpbWVTdGVwcyIsInBvaW50IiwiQm90dG9tV2lkZ2V0RmFjdG9yeSIsIlRpbWVXaWRnZXRGYWN0b3J5IiwiQW5pbWF0aW9uQ29udHJvbEZhY3RvcnkiLCJUaW1lV2lkZ2V0IiwiQW5pbWF0aW9uQ29udHJvbCIsIkJvdHRvbVdpZGdldCIsImRhdGFzZXRzIiwiZmlsdGVycyIsInZpc1N0YXRlQWN0aW9ucyIsImNvbnRhaW5lclciLCJ1aVN0YXRlIiwic2lkZVBhbmVsV2lkdGgiLCJsYXllcnMiLCJhY3RpdmVTaWRlUGFuZWwiLCJyZWFkT25seSIsImlzT3BlbiIsIkJvb2xlYW4iLCJlbmxhcmdlZEZpbHRlcklkeCIsImZpbmRJbmRleCIsImYiLCJlbmxhcmdlZCIsInR5cGUiLCJGSUxURVJfVFlQRVMiLCJ0aW1lUmFuZ2UiLCJhbmltYXRlZEZpbHRlcklkeCIsImFuaW1hdGVkRmlsdGVyIiwiZW5sYXJnZWRGaWx0ZXJXaWR0aCIsImFuaW1hdGFibGVMYXllciIsImwiLCJjb25maWciLCJhbmltYXRpb24iLCJlbmFibGVkIiwiaXNWaXNpYmxlIiwicmVhZHlUb0FuaW1hdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsIk51bWJlciIsImlzRmluaXRlIiwic2hvd0Zsb2F0aW5nVGltZURpc3BsYXkiLCJsZW5ndGgiLCJzaG93QW5pbWF0aW9uQ29udHJvbCIsImhpZGVDb250cm9sIiwic2hvd1RpbWVXaWRnZXQiLCJPYmplY3QiLCJrZXlzIiwiTWF0aCIsIm1pbiIsInN0YXJ0IiwicGF1c2UiLCJyZXNldCIsInVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWQiLCJ0b2dnbGVMYXllckFuaW1hdGlvbiIsInJlc2V0QW5pbWF0aW9uIiwic2V0RmlsdGVyUGxvdCIsInNldEZpbHRlciIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvdyIsInRvZ2dsZUZpbHRlckFuaW1hdGlvbiIsInVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkIiwiZW5sYXJnZUZpbHRlciIsInJlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxJQUFNQSxRQUFRLEdBQUcsSUFBakI7O0FBRUEsSUFBTUMscUJBQXFCLEdBQUdDLDZCQUFPQyxHQUFWLHdiQUdWLFVBQUFDLEtBQUs7QUFBQSxTQUFLQSxLQUFLLENBQUNDLFVBQU4sR0FB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QUFELENBTi9CO0FBT0UsUUFBQSxRQUFRLEVBQUVuQixRQVBaO0FBUUUsUUFBQSxRQUFRLEVBQUVRLFFBUlo7QUFTRSxRQUFBLGVBQWUsRUFBRXdCLHVCQVRuQjtBQVVFLFFBQUEsYUFBYSxFQUFFOUIsZUFBZSxDQUFDNkMsYUFWakM7QUFXRSxRQUFBLFNBQVMsRUFBRTdDLGVBQWUsQ0FBQzhDLFNBWDdCO0FBWUUsUUFBQSxzQkFBc0IsRUFBRTlDLGVBQWUsQ0FBQ2hDLHNCQVoxQztBQWFFLFFBQUEsd0JBQXdCLEVBQUVnQyxlQUFlLENBQUMrQyx3QkFiNUM7QUFjRSxRQUFBLGVBQWUsRUFBRS9DLGVBQWUsQ0FBQ2dELHFCQWRuQztBQWVFLFFBQUEsb0JBQW9CLEVBQUVoRCxlQUFlLENBQUNpRCwwQkFmeEM7QUFnQkUsUUFBQSxhQUFhLEVBQUVqRCxlQUFlLENBQUNrRCxhQWhCakM7QUFpQkUsUUFBQSxjQUFjLEVBQUVOLGNBakJsQjtBQWtCRSxRQUFBLFlBQVksRUFBRSxDQUFDekQsZUFBRCxJQUFvQixDQUFDQSxlQUFlLENBQUNIO0FBbEJyRCxRQURZLEdBcUJWLElBdEJMO0FBQUEsS0FMSCxDQXhCSixDQURGO0FBMERELEdBckdEO0FBdUdBO0FBQ0E7OztBQUNBLHNCQUFPLHVCQUFXLFVBQUNqQyxLQUFELEVBQVFvRyxHQUFSO0FBQUEsd0JBQWdCLGdDQUFDLFlBQUQsZ0NBQWtCcEcsS0FBbEI7QUFBeUIsTUFBQSxPQUFPLEVBQUVvRztBQUFsQyxPQUFoQjtBQUFBLEdBQVgsQ0FBUDtBQUNBO0FBQ0Q7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCBmb3J3YXJkUmVmLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBUaW1lV2lkZ2V0RmFjdG9yeSBmcm9tICcuL2ZpbHRlcnMvdGltZS13aWRnZXQnO1xuaW1wb3J0IEFuaW1hdGlvbkNvbnRyb2xGYWN0b3J5IGZyb20gJy4vY29tbW9uL2FuaW1hdGlvbi1jb250cm9sL2FuaW1hdGlvbi1jb250cm9sJztcbmltcG9ydCBBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeSBmcm9tICcuL2NvbW1vbi9hbmltYXRpb24tY29udHJvbC9hbmltYXRpb24tY29udHJvbGxlcic7XG5pbXBvcnQge0FOSU1BVElPTl9XSU5ET1csIEZJTFRFUl9UWVBFU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtnZXRJbnRlcnZhbEJpbnN9IGZyb20gJ3V0aWxzL2ZpbHRlci11dGlscyc7XG5pbXBvcnQge21lZGlhfSBmcm9tICdzdHlsZXMvbWVkaWEtYnJlYWtwb2ludHMnO1xuXG5jb25zdCBtYXhXaWR0aCA9IDEwODA7XG5cbmNvbnN0IEJvdHRvbVdpZGdldENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHBhZGRpbmctdG9wOiAke3Byb3BzID0+IChwcm9wcy5oYXNQYWRkaW5nID8gcHJvcHMudGhlbWUuYm90dG9tV2lkZ2V0UGFkZGluZ1RvcCA6IDApfXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IChwcm9wcy5oYXNQYWRkaW5nID8gcHJvcHMudGhlbWUuYm90dG9tV2lkZ2V0UGFkZGluZ1JpZ2h0IDogMCl9cHg7XG4gIHBhZGRpbmctYm90dG9tOiAke3Byb3BzID0+IChwcm9wcy5oYXNQYWRkaW5nID8gcHJvcHMudGhlbWUuYm90dG9tV2lkZ2V0UGFkZGluZ0JvdHRvbSA6IDApfXB4O1xuICBwYWRkaW5nLWxlZnQ6ICR7cHJvcHMgPT4gKHByb3BzLmhhc1BhZGRpbmcgPyBwcm9wcy50aGVtZS5ib3R0b21XaWRnZXRQYWRkaW5nTGVmdCA6IDApfXB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50OyAvKiBwcmV2ZW50IHBhZGRpbmcgZnJvbSBibG9ja2luZyBpbnB1dCAqL1xuICAmID4gKiB7XG4gICAgLyogYWxsIGNoaWxkcmVuIHNob3VsZCBhbGxvdyBpbnB1dCAqL1xuICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7XG4gIH1cbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMud2lkdGh9cHg7XG4gIHotaW5kZXg6IDE7XG4gICR7bWVkaWEucG9ydGFibGVgcGFkZGluZzogMDtgfVxuYDtcblxuRmlsdGVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkuZGVwcyA9IFtBbmltYXRpb25Db250cm9sbGVyRmFjdG9yeV07XG5leHBvcnQgZnVuY3Rpb24gRmlsdGVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkoQW5pbWF0aW9uQ29udHJvbGxlcikge1xuICBjb25zdCBGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyID0gKHtmaWx0ZXIsIGZpbHRlcklkeCwgc2V0RmlsdGVyQW5pbWF0aW9uVGltZSwgY2hpbGRyZW59KSA9PiB7XG4gICAgY29uc3QgaW50ZXJ2YWxCaW5zID0gdXNlTWVtbygoKSA9PiBnZXRJbnRlcnZhbEJpbnMoZmlsdGVyKSwgW2ZpbHRlcl0pO1xuXG4gICAgY29uc3Qgc3RlcHMgPSB1c2VNZW1vKCgpID0+IChpbnRlcnZhbEJpbnMgPyBpbnRlcnZhbEJpbnMubWFwKHggPT4geC54MCkgOiBudWxsKSwgW1xuICAgICAgaW50ZXJ2YWxCaW5zXG4gICAgXSk7XG5cbiAgICBjb25zdCB1cGRhdGVBbmltYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAgIHZhbHVlID0+IHtcbiAgICAgICAgc3dpdGNoIChmaWx0ZXIuYW5pbWF0aW9uV2luZG93KSB7XG4gICAgICAgICAgY2FzZSBBTklNQVRJT05fV0lORE9XLmludGVydmFsOlxuICAgICAgICAgICAgY29uc3QgaWR4ID0gdmFsdWVbMV07XG4gICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25UaW1lKGZpbHRlcklkeCwgJ3ZhbHVlJywgW1xuICAgICAgICAgICAgICBpbnRlcnZhbEJpbnNbaWR4XS54MCxcbiAgICAgICAgICAgICAgaW50ZXJ2YWxCaW5zW2lkeF0ueDEgLSAxXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25UaW1lKGZpbHRlcklkeCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbZmlsdGVySWR4LCBpbnRlcnZhbEJpbnMsIGZpbHRlci5hbmltYXRpb25XaW5kb3csIHNldEZpbHRlckFuaW1hdGlvblRpbWVdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8QW5pbWF0aW9uQ29udHJvbGxlclxuICAgICAgICBrZXk9XCJmaWx0ZXItY29udHJvbFwiXG4gICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWV9XG4gICAgICAgIGRvbWFpbj17ZmlsdGVyLmRvbWFpbn1cbiAgICAgICAgc3BlZWQ9e2ZpbHRlci5zcGVlZH1cbiAgICAgICAgaXNBbmltYXRpbmc9e2ZpbHRlci5pc0FuaW1hdGluZ31cbiAgICAgICAgYW5pbWF0aW9uV2luZG93PXtmaWx0ZXIuYW5pbWF0aW9uV2luZG93fVxuICAgICAgICBzdGVwcz17c3RlcHN9XG4gICAgICAgIHVwZGF0ZUFuaW1hdGlvbj17dXBkYXRlQW5pbWF0aW9ufVxuICAgICAgICBjaGlsZHJlbj17Y2hpbGRyZW59XG4gICAgICAvPlxuICAgICk7XG4gIH07XG4gIHJldHVybiBGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyO1xufVxuXG5MYXllckFuaW1hdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmRlcHMgPSBbQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnldO1xuZXhwb3J0IGZ1bmN0aW9uIExheWVyQW5pbWF0aW9uQ29udHJvbGxlckZhY3RvcnkoQW5pbWF0aW9uQ29udHJvbGxlcikge1xuICBjb25zdCBMYXllckFuaW1hdGlvbkNvbnRyb2xsZXIgPSAoe2FuaW1hdGlvbkNvbmZpZywgc2V0TGF5ZXJBbmltYXRpb25UaW1lLCBjaGlsZHJlbn0pID0+IChcbiAgICA8QW5pbWF0aW9uQ29udHJvbGxlclxuICAgICAga2V5PVwibGF5ZXItY29udHJvbFwiXG4gICAgICB2YWx1ZT17YW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lfVxuICAgICAgZG9tYWluPXthbmltYXRpb25Db25maWcuZG9tYWlufVxuICAgICAgc3BlZWQ9e2FuaW1hdGlvbkNvbmZpZy5zcGVlZH1cbiAgICAgIGlzQW5pbWF0aW5nPXthbmltYXRpb25Db25maWcuaXNBbmltYXRpbmd9XG4gICAgICB1cGRhdGVBbmltYXRpb249e3NldExheWVyQW5pbWF0aW9uVGltZX1cbiAgICAgIHN0ZXBzPXthbmltYXRpb25Db25maWcudGltZVN0ZXBzfVxuICAgICAgYW5pbWF0aW9uV2luZG93PXtcbiAgICAgICAgYW5pbWF0aW9uQ29uZmlnLnRpbWVTdGVwcyA/IEFOSU1BVElPTl9XSU5ET1cuaW50ZXJ2YWwgOiBBTklNQVRJT05fV0lORE9XLnBvaW50XG4gICAgICB9XG4gICAgICBjaGlsZHJlbj17Y2hpbGRyZW59XG4gICAgLz5cbiAgKTtcbiAgcmV0dXJuIExheWVyQW5pbWF0aW9uQ29udHJvbGxlcjtcbn1cblxuQm90dG9tV2lkZ2V0RmFjdG9yeS5kZXBzID0gW1xuICBUaW1lV2lkZ2V0RmFjdG9yeSxcbiAgQW5pbWF0aW9uQ29udHJvbEZhY3RvcnksXG4gIEZpbHRlckFuaW1hdGlvbkNvbnRyb2xsZXJGYWN0b3J5LFxuICBMYXllckFuaW1hdGlvbkNvbnRyb2xsZXJGYWN0b3J5XG5dO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBCb3R0b21XaWRnZXRGYWN0b3J5KFxuICBUaW1lV2lkZ2V0LFxuICBBbmltYXRpb25Db250cm9sLFxuICBGaWx0ZXJBbmltYXRpb25Db250cm9sbGVyLFxuICBMYXllckFuaW1hdGlvbkNvbnRyb2xsZXJcbikge1xuICBjb25zdCBCb3R0b21XaWRnZXQgPSBwcm9wcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YXNldHMsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgdmlzU3RhdGVBY3Rpb25zLFxuICAgICAgY29udGFpbmVyVyxcbiAgICAgIHVpU3RhdGUsXG4gICAgICBzaWRlUGFuZWxXaWR0aCxcbiAgICAgIGxheWVyc1xuICAgIH0gPSBwcm9wcztcblxuICAgIGNvbnN0IHthY3RpdmVTaWRlUGFuZWwsIHJlYWRPbmx5fSA9IHVpU3RhdGU7XG4gICAgY29uc3QgaXNPcGVuID0gQm9vbGVhbihhY3RpdmVTaWRlUGFuZWwpO1xuXG4gICAgY29uc3QgZW5sYXJnZWRGaWx0ZXJJZHggPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmVubGFyZ2VkICYmIGYudHlwZSA9PT0gRklMVEVSX1RZUEVTLnRpbWVSYW5nZSksXG4gICAgICBbZmlsdGVyc11cbiAgICApO1xuICAgIGNvbnN0IGFuaW1hdGVkRmlsdGVySWR4ID0gdXNlTWVtbygoKSA9PiBmaWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaXNBbmltYXRpbmcpLCBbZmlsdGVyc10pO1xuICAgIGNvbnN0IGFuaW1hdGVkRmlsdGVyID0gYW5pbWF0ZWRGaWx0ZXJJZHggPiAtMSA/IGZpbHRlcnNbYW5pbWF0ZWRGaWx0ZXJJZHhdIDogbnVsbDtcblxuICAgIGNvbnN0IGVubGFyZ2VkRmlsdGVyV2lkdGggPSBpc09wZW4gPyBjb250YWluZXJXIC0gc2lkZVBhbmVsV2lkdGggOiBjb250YWluZXJXO1xuXG4gICAgLy8gc2hvdyBwbGF5YmFjayBjb250cm9sIGlmIGxheWVycyBjb250YWluIHRyaXAgbGF5ZXIgJiBhdCBsZWFzdCBvbmUgdHJpcCBsYXllciBpcyB2aXNpYmxlXG4gICAgY29uc3QgYW5pbWF0YWJsZUxheWVyID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIGxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5hbmltYXRpb24gJiYgbC5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQgJiYgbC5jb25maWcuaXNWaXNpYmxlKSxcbiAgICAgIFtsYXllcnNdXG4gICAgKTtcblxuICAgIGNvbnN0IHJlYWR5VG9BbmltYXRpb24gPVxuICAgICAgQXJyYXkuaXNBcnJheShhbmltYXRpb25Db25maWcuZG9tYWluKSAmJiBOdW1iZXIuaXNGaW5pdGUoYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lKTtcbiAgICAvLyBpZiBhbmltYXRpb24gY29udHJvbCBpcyBzaG93aW5nLCBoaWRlIHRpbWUgZGlzcGxheSBpbiB0aW1lIHNsaWRlclxuICAgIGNvbnN0IHNob3dGbG9hdGluZ1RpbWVEaXNwbGF5ID0gIWFuaW1hdGFibGVMYXllci5sZW5ndGg7XG4gICAgY29uc3Qgc2hvd0FuaW1hdGlvbkNvbnRyb2wgPVxuICAgICAgYW5pbWF0YWJsZUxheWVyLmxlbmd0aCAmJiByZWFkeVRvQW5pbWF0aW9uICYmICFhbmltYXRpb25Db25maWcuaGlkZUNvbnRyb2w7XG4gICAgY29uc3Qgc2hvd1RpbWVXaWRnZXQgPSBlbmxhcmdlZEZpbHRlcklkeCA+IC0xICYmIE9iamVjdC5rZXlzKGRhdGFzZXRzKS5sZW5ndGggPiAwO1xuXG4gICAgLy8gaWYgZmlsdGVyIGlzIG5vdCBhbmltYXRpbmcsIHBhc3MgaW4gZW5sYXJnZWQgZmlsdGVyIGhlcmUgYmVjYXVzZVxuICAgIC8vIGFuaW1hdGlvbiBjb250cm9sbGVyIG5lZWRzIHRvIGNhbGwgcmVzZXQgb24gaXRcbiAgICBjb25zdCBmaWx0ZXIgPSBhbmltYXRlZEZpbHRlciB8fCBmaWx0ZXJzW2VubGFyZ2VkRmlsdGVySWR4XTtcblxuICAgIHJldHVybiAoXG4gICAgICA8Qm90dG9tV2lkZ2V0Q29udGFpbmVyXG4gICAgICAgIHdpZHRoPXtNYXRoLm1pbihtYXhXaWR0aCwgZW5sYXJnZWRGaWx0ZXJXaWR0aCl9XG4gICAgICAgIGNsYXNzTmFtZT1cImJvdHRvbS13aWRnZXQtLWNvbnRhaW5lclwiXG4gICAgICAgIGhhc1BhZGRpbmc9e3Nob3dBbmltYXRpb25Db250cm9sIHx8IHNob3dUaW1lV2lkZ2V0fVxuICAgICAgPlxuICAgICAgICA8TGF5ZXJBbmltYXRpb25Db250cm9sbGVyXG4gICAgICAgICAgYW5pbWF0aW9uQ29uZmlnPXthbmltYXRpb25Db25maWd9XG4gICAgICAgICAgc2V0TGF5ZXJBbmltYXRpb25UaW1lPXt2aXNTdGF0ZUFjdGlvbnMuc2V0TGF5ZXJBbmltYXRpb25UaW1lfVxuICAgICAgICA+XG4gICAgICAgICAgeyhpc0FuaW1hdGluZywgc3RhcnQsIHBhdXNlLCByZXNldCkgPT5cbiAgICAgICAgICAgIHNob3dBbmltYXRpb25Db250cm9sID8gKFxuICAgICAgICAgICAgICA8QW5pbWF0aW9uQ29udHJvbFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbkNvbmZpZz17YW5pbWF0aW9uQ29uZmlnfVxuICAgICAgICAgICAgICAgIHNldExheWVyQW5pbWF0aW9uVGltZT17dmlzU3RhdGVBY3Rpb25zLnNldExheWVyQW5pbWF0aW9uVGltZX1cbiAgICAgICAgICAgICAgICB1cGRhdGVBbmltYXRpb25TcGVlZD17dmlzU3RhdGVBY3Rpb25zLnVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWR9XG4gICAgICAgICAgICAgICAgdG9nZ2xlQW5pbWF0aW9uPXt2aXNTdGF0ZUFjdGlvbnMudG9nZ2xlTGF5ZXJBbmltYXRpb259XG4gICAgICAgICAgICAgICAgaXNBbmltYXRhYmxlPXshYW5pbWF0ZWRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgaXNBbmltYXRpbmc9e2lzQW5pbWF0aW5nfVxuICAgICAgICAgICAgICAgIHJlc2V0QW5pbWF0aW9uPXtyZXNldH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICA8L0xheWVyQW5pbWF0aW9uQ29udHJvbGxlcj5cbiAgICAgICAge2ZpbHRlciAmJiAoXG4gICAgICAgICAgPEZpbHRlckFuaW1hdGlvbkNvbnRyb2xsZXJcbiAgICAgICAgICAgIGZpbHRlcj17ZmlsdGVyfVxuICAgICAgICAgICAgZmlsdGVySWR4PXthbmltYXRlZEZpbHRlcklkeCA+IC0xID8gYW5pbWF0ZWRGaWx0ZXJJZHggOiBlbmxhcmdlZEZpbHRlcklkeH1cbiAgICAgICAgICAgIHNldEZpbHRlckFuaW1hdGlvblRpbWU9e3Zpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJBbmltYXRpb25UaW1lfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsoaXNBbmltYXRpbmcsIHN0YXJ0LCBwYXVzZSwgcmVzZXRBbmltYXRpb24pID0+XG4gICAgICAgICAgICAgIHNob3dUaW1lV2lkZ2V0ID8gKFxuICAgICAgICAgICAgICAgIDxUaW1lV2lkZ2V0XG4gICAgICAgICAgICAgICAgICAvLyBUaW1lV2lkZ2V0IHVzZXMgUmVhY3QubWVtbywgaGVyZSB3ZSBwYXNzIHdpZHRoXG4gICAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCBpdCBkb2VzbnQgdXNlIGl0LCB0byBmb3JjZSByZXJlbmRlclxuICAgICAgICAgICAgICAgICAgd2lkdGg9e2VubGFyZ2VkRmlsdGVyV2lkdGh9XG4gICAgICAgICAgICAgICAgICBmaWx0ZXI9e2ZpbHRlcnNbZW5sYXJnZWRGaWx0ZXJJZHhdfVxuICAgICAgICAgICAgICAgICAgaW5kZXg9e2VubGFyZ2VkRmlsdGVySWR4fVxuICAgICAgICAgICAgICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc9e0Jvb2xlYW4oYW5pbWF0ZWRGaWx0ZXIpfVxuICAgICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAgICAgICAgICAgICAgICAgcmVhZE9ubHk9e3JlYWRPbmx5fVxuICAgICAgICAgICAgICAgICAgc2hvd1RpbWVEaXNwbGF5PXtzaG93RmxvYXRpbmdUaW1lRGlzcGxheX1cbiAgICAgICAgICAgICAgICAgIHNldEZpbHRlclBsb3Q9e3Zpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJQbG90fVxuICAgICAgICAgICAgICAgICAgc2V0RmlsdGVyPXt2aXNTdGF0ZUFjdGlvbnMuc2V0RmlsdGVyfVxuICAgICAgICAgICAgICAgICAgc2V0RmlsdGVyQW5pbWF0aW9uVGltZT17dmlzU3RhdGVBY3Rpb25zLnNldEZpbHRlckFuaW1hdGlvblRpbWV9XG4gICAgICAgICAgICAgICAgICBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3c9e3Zpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJBbmltYXRpb25XaW5kb3d9XG4gICAgICAgICAgICAgICAgICB0b2dnbGVBbmltYXRpb249e3Zpc1N0YXRlQWN0aW9ucy50b2dnbGVGaWx0ZXJBbmltYXRpb259XG4gICAgICAgICAgICAgICAgICB1cGRhdGVBbmltYXRpb25TcGVlZD17dmlzU3RhdGVBY3Rpb25zLnVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkfVxuICAgICAgICAgICAgICAgICAgZW5sYXJnZUZpbHRlcj17dmlzU3RhdGVBY3Rpb25zLmVubGFyZ2VGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICByZXNldEFuaW1hdGlvbj17cmVzZXRBbmltYXRpb259XG4gICAgICAgICAgICAgICAgICBpc0FuaW1hdGFibGU9eyFhbmltYXRpb25Db25maWcgfHwgIWFuaW1hdGlvbkNvbmZpZy5pc0FuaW1hdGluZ31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApIDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvRmlsdGVyQW5pbWF0aW9uQ29udHJvbGxlcj5cbiAgICAgICAgKX1cbiAgICAgIDwvQm90dG9tV2lkZ2V0Q29udGFpbmVyPlxuICAgICk7XG4gIH07XG5cbiAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZGlzcGxheS1uYW1lICovXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIGZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IDxCb3R0b21XaWRnZXQgey4uLnByb3BzfSByb290UmVmPXtyZWZ9IC8+KTtcbiAgLyogZXNsaW50LWVuYWJsZSByZWFjdC9kaXNwbGF5LW5hbWUgKi9cbn1cbi8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuIl19