UNPKG

kepler.gl.geoiq

Version:

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

252 lines (210 loc) 29.8 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 _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _sliderHandle = _interopRequireDefault(require("./slider-handle")); var _sliderBarHandle = _interopRequireDefault(require("./slider-bar-handle")); var _dataUtils = require("../../../utils/data-utils"); var _templateObject, _templateObject2; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 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; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function noop() {} var StyledRangeSlider = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n margin-bottom: 12px;\n background-color: ", ";\n ", ";\n ", ";\n"])), function (props) { return props.theme.sliderBarBgd; }, function (props) { return "".concat(props.vertical ? 'width' : 'height', ": ").concat(props.theme.sliderBarHeight, "px"); }, function (props) { return "".concat(props.vertical ? 'height' : 'width', ": 100%"); }); var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n flex-grow: 1;\n margin-top: ", "px;\n"])), function (props) { return props.isRanged ? props.theme.sliderMarginTopIsRange : props.theme.sliderMarginTop; }); var Slider = exports["default"] = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(Slider, _Component); var _super = _createSuper(Slider); function Slider() { var _this; (0, _classCallCheck2["default"])(this, Slider); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "ref", (0, _react.createRef)()); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isVal0InRange", function (val) { var _this$props = _this.props, value1 = _this$props.value1, minValue = _this$props.minValue; return Boolean(val >= minValue && val <= value1); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isVal1InRange", function (val) { var _this$props2 = _this.props, maxValue = _this$props2.maxValue, value0 = _this$props2.value0; return Boolean(val <= maxValue && val >= value0); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slide0Listener", function (x) { var val = _this._getValue(_this.props.value0, x); if (_this._isVal0InRange(val)) { _this.props.onSlider0Change(val); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "slide1Listener", function (x) { var val = _this._getValue(_this.props.value1, x); if (_this._isVal1InRange(val)) { _this.props.onSlider1Change(val); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "sliderBarListener", function (x) { var val0 = _this._getValue(_this.props.value0, x); var val1 = _this._getValue(_this.props.value1, x); if (_this._isVal1InRange(val1) && _this._isVal0InRange(val0)) { _this.props.onSliderBarChange(val0, val1); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "calcHandleLeft0", function (w, l, num) { return w === 0 ? "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)") : "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)"); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "calcHandleLeft1", function (w, l) { return _this.props.isRanged && w === 0 ? "".concat(l, "%") : "calc(".concat(l + w, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)"); }); return _this; } (0, _createClass2["default"])(Slider, [{ key: "_getBaseDistance", value: function _getBaseDistance() { return this.props.vertical ? this.ref.current.offsetHeight : this.ref.current.offsetWidth; } }, { key: "_getValDelta", value: function _getValDelta(x) { var percent = x / this._getBaseDistance(); var maxDelta = this.props.maxValue - this.props.minValue; return percent * maxDelta; } }, { key: "_getValue", value: function _getValue(val, offset) { var delta = this._getValDelta(offset); var rawValue = this.props.vertical ? val - delta : val + delta; return this._roundValToStep(rawValue); } }, { key: "_roundValToStep", value: function _roundValToStep(val) { var _this$props3 = this.props, minValue = _this$props3.minValue, step = _this$props3.step; return (0, _dataUtils.roundValToStep)(minValue, step, val); } }, { key: "render", value: function render() { var _this$props4 = this.props, classSet = _this$props4.classSet, disabled = _this$props4.disabled, isRanged = _this$props4.isRanged, maxValue = _this$props4.maxValue, minValue = _this$props4.minValue, value1 = _this$props4.value1, vertical = _this$props4.vertical, sliderHandleWidth = _this$props4.sliderHandleWidth, showTooltip = _this$props4.showTooltip; var value0 = !isRanged && minValue > 0 ? minValue : this.props.value0; var currValDelta = value1 - value0; var maxDelta = maxValue - minValue; var width = currValDelta / maxDelta * 100; var v0Left = (value0 - minValue) / maxDelta * 100; return (/*#__PURE__*/_react["default"].createElement(SliderWrapper, { className: (0, _classnames["default"])('kg-slider', _objectSpread(_objectSpread({}, classSet), {}, { disabled: disabled })), ref: this.ref, isRanged: isRanged, vertical: vertical }, /*#__PURE__*/_react["default"].createElement(StyledRangeSlider, { className: "kg-range-slider", vertical: vertical }, /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], { className: "kg-range-slider__handle", left: this.calcHandleLeft0(width, v0Left), valueListener: this.slide0Listener, sliderHandleWidth: sliderHandleWidth, display: isRanged, vertical: vertical, showTooltip: showTooltip }), /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], { className: "kg-range-slider__handle", left: this.calcHandleLeft1(width, v0Left), valueListener: this.slide1Listener, sliderHandleWidth: sliderHandleWidth, vertical: vertical, value: value1, showTooltip: showTooltip }), /*#__PURE__*/_react["default"].createElement(_sliderBarHandle["default"], { width: width, v0Left: v0Left, enableBarDrag: this.props.enableBarDrag, sliderBarListener: this.sliderBarListener, vertical: vertical }))) ); } }]); return Slider; }(_react.Component); (0, _defineProperty2["default"])(Slider, "propTypes", { title: _propTypes["default"].string, isRanged: _propTypes["default"].bool, value0: _propTypes["default"].number, value1: _propTypes["default"].number, minValue: _propTypes["default"].number, maxValue: _propTypes["default"].number, sliderHandleWidth: _propTypes["default"].number, onSlider0Change: _propTypes["default"].func, onInput0Change: _propTypes["default"].func, onSlider1Change: _propTypes["default"].func, onInput1Change: _propTypes["default"].func, onSliderBarChange: _propTypes["default"].func, step: _propTypes["default"].number, enableBarDrag: _propTypes["default"].bool, showTooltip: _propTypes["default"].bool }); (0, _defineProperty2["default"])(Slider, "defaultProps", { title: '', isRanged: true, value0: 0, value1: 100, minValue: 0, maxValue: 100, step: 1, sliderHandleWidth: 12, enableBarDrag: false, onSlider0Change: noop, onInput0Change: noop, onSlider1Change: noop, onInput1Change: noop, onSliderBarChange: noop, disabled: false, vertical: false, showTooltip: false }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9zbGlkZXIvc2xpZGVyLmpzIl0sIm5hbWVzIjpbIm5vb3AiLCJTdHlsZWRSYW5nZVNsaWRlciIsInN0eWxlZCIsImRpdiIsInByb3BzIiwidGhlbWUiLCJzbGlkZXJCYXJCZ2QiLCJ2ZXJ0aWNhbCIsInNsaWRlckJhckhlaWdodCIsIlNsaWRlcldyYXBwZXIiLCJpc1JhbmdlZCIsInNsaWRlck1hcmdpblRvcElzUmFuZ2UiLCJzbGlkZXJNYXJnaW5Ub3AiLCJTbGlkZXIiLCJ2YWwiLCJ2YWx1ZTEiLCJtaW5WYWx1ZSIsIkJvb2xlYW4iLCJtYXhWYWx1ZSIsInZhbHVlMCIsIngiLCJfZ2V0VmFsdWUiLCJfaXNWYWwwSW5SYW5nZSIsIm9uU2xpZGVyMENoYW5nZSIsIl9pc1ZhbDFJblJhbmdlIiwib25TbGlkZXIxQ2hhbmdlIiwidmFsMCIsInZhbDEiLCJvblNsaWRlckJhckNoYW5nZSIsInciLCJsIiwibnVtIiwic2xpZGVySGFuZGxlV2lkdGgiLCJyZWYiLCJjdXJyZW50Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0V2lkdGgiLCJwZXJjZW50IiwiX2dldEJhc2VEaXN0YW5jZSIsIm1heERlbHRhIiwib2Zmc2V0IiwiZGVsdGEiLCJfZ2V0VmFsRGVsdGEiLCJyYXdWYWx1ZSIsIl9yb3VuZFZhbFRvU3RlcCIsInN0ZXAiLCJjbGFzc1NldCIsImRpc2FibGVkIiwic2hvd1Rvb2x0aXAiLCJjdXJyVmFsRGVsdGEiLCJ3aWR0aCIsInYwTGVmdCIsImNhbGNIYW5kbGVMZWZ0MCIsInNsaWRlMExpc3RlbmVyIiwiY2FsY0hhbmRsZUxlZnQxIiwic2xpZGUxTGlzdGVuZXIiLCJlbmFibGVCYXJEcmFnIiwic2xpZGVyQmFyTGlzdGVuZXIiLCJDb21wb25lbnQiLCJ0aXRsZSIsIlByb3BUeXBlcyIsInN0cmluZyIsImJvb2wiLCJudW1iZXIiLCJmdW5jIiwib25JbnB1dDBDaGFuZ2UiLCJvbklucHV0MUNoYW5n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aUIsRUFBRTVCLElBZEM7QUFlcEIrQyxFQUFBQSxRQUFRLEVBQUUsS0FmVTtBQWdCcEJ4QyxFQUFBQSxRQUFRLEVBQUUsS0FoQlU7QUFpQnBCeUMsRUFBQUEsV0FBVyxFQUFFO0FBakJPLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIGNyZWF0ZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBTbGlkZXJIYW5kbGUgZnJvbSAnLi9zbGlkZXItaGFuZGxlJztcbmltcG9ydCBTbGlkZXJCYXJIYW5kbGUgZnJvbSAnLi9zbGlkZXItYmFyLWhhbmRsZSc7XG5pbXBvcnQge3JvdW5kVmFsVG9TdGVwfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmNvbnN0IFN0eWxlZFJhbmdlU2xpZGVyID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNsaWRlckJhckJnZH07XG4gICR7cHJvcHMgPT5cbiAgICBgJHtwcm9wcy52ZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0J306ICR7cHJvcHMudGhlbWUuc2xpZGVyQmFySGVpZ2h0fXB4YH07XG4gICR7cHJvcHMgPT4gYCR7cHJvcHMudmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCd9OiAxMDAlYH07XG5gO1xuXG5jb25zdCBTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZmxleC1ncm93OiAxO1xuICBtYXJnaW4tdG9wOiAke3Byb3BzID0+XG4gICAgcHJvcHMuaXNSYW5nZWRcbiAgICAgID8gcHJvcHMudGhlbWUuc2xpZGVyTWFyZ2luVG9wSXNSYW5nZVxuICAgICAgOiBwcm9wcy50aGVtZS5zbGlkZXJNYXJnaW5Ub3B9cHg7XG5gO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGlzUmFuZ2VkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICB2YWx1ZTA6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgdmFsdWUxOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIG1pblZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIG1heFZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHNsaWRlckhhbmRsZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIG9uU2xpZGVyMENoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25JbnB1dDBDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uU2xpZGVyMUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25JbnB1dDFDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uU2xpZGVyQmFyQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzdGVwOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGVuYWJsZUJhckRyYWc6IFByb3BUeXBlcy5ib29sLFxuICAgIHNob3dUb29sdGlwOiBQcm9wVHlwZXMuYm9vbFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdGl0bGU6ICcnLFxuICAgIGlzUmFuZ2VkOiB0cnVlLFxuICAgIHZhbHVlMDogMCxcbiAgICB2YWx1ZTE6IDEwMCxcbiAgICBtaW5WYWx1ZTogMCxcbiAgICBtYXhWYWx1ZTogMTAwLFxuICAgIHN0ZXA6IDEsXG4gICAgc2xpZGVySGFuZGxlV2lkdGg6IDEyLFxuICAgIGVuYWJsZUJhckRyYWc6IGZhbHNlLFxuICAgIG9uU2xpZGVyMENoYW5nZTogbm9vcCxcbiAgICBvbklucHV0MENoYW5nZTogbm9vcCxcbiAgICBvblNsaWRlcjFDaGFuZ2U6IG5vb3AsXG4gICAgb25JbnB1dDFDaGFuZ2U6IG5vb3AsXG4gICAgb25TbGlkZXJCYXJDaGFuZ2U6IG5vb3AsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHZlcnRpY2FsOiBmYWxzZSxcbiAgICBzaG93VG9vbHRpcDogZmFsc2VcbiAgfTtcblxuICByZWYgPSBjcmVhdGVSZWYoKTtcblxuICBfZ2V0QmFzZURpc3RhbmNlKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnZlcnRpY2FsXG4gICAgICA/IHRoaXMucmVmLmN1cnJlbnQub2Zmc2V0SGVpZ2h0XG4gICAgICA6IHRoaXMucmVmLmN1cnJlbnQub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBfZ2V0VmFsRGVsdGEoeCkge1xuICAgIGNvbnN0IHBlcmNlbnQgPSB4IC8gdGhpcy5fZ2V0QmFzZURpc3RhbmNlKCk7XG4gICAgY29uc3QgbWF4RGVsdGEgPSB0aGlzLnByb3BzLm1heFZhbHVlIC0gdGhpcy5wcm9wcy5taW5WYWx1ZTtcbiAgICByZXR1cm4gcGVyY2VudCAqIG1heERlbHRhO1xuICB9XG5cbiAgX2dldFZhbHVlKHZhbCwgb2Zmc2V0KSB7XG4gICAgY29uc3QgZGVsdGEgPSB0aGlzLl9nZXRWYWxEZWx0YShvZmZzZXQpO1xuICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5wcm9wcy52ZXJ0aWNhbCA/IHZhbCAtIGRlbHRhIDogdmFsICsgZGVsdGE7XG5cbiAgICByZXR1cm4gdGhpcy5fcm91bmRWYWxUb1N0ZXAocmF3VmFsdWUpO1xuICB9XG5cbiAgX2lzVmFsMEluUmFuZ2UgPSB2YWwgPT4ge1xuICAgIGNvbnN0IHt2YWx1ZTEsIG1pblZhbHVlfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsID49IG1pblZhbHVlICYmIHZhbCA8PSB2YWx1ZTEpO1xuICB9O1xuXG4gIF9pc1ZhbDFJblJhbmdlID0gdmFsID0+IHtcbiAgICBjb25zdCB7bWF4VmFsdWUsIHZhbHVlMH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBCb29sZWFuKHZhbCA8PSBtYXhWYWx1ZSAmJiB2YWwgPj0gdmFsdWUwKTtcbiAgfTtcblxuICBfcm91bmRWYWxUb1N0ZXAodmFsKSB7XG4gICAgY29uc3Qge21pblZhbHVlLCBzdGVwfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIHJvdW5kVmFsVG9TdGVwKG1pblZhbHVlLCBzdGVwLCB2YWwpO1xuICB9XG5cbiAgc2xpZGUwTGlzdGVuZXIgPSB4ID0+IHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLnByb3BzLnZhbHVlMCwgeCk7XG4gICAgaWYgKHRoaXMuX2lzVmFsMEluUmFuZ2UodmFsKSkge1xuICAgICAgdGhpcy5wcm9wcy5vblNsaWRlcjBDaGFuZ2UodmFsKTtcbiAgICB9XG4gIH07XG5cbiAgc2xpZGUxTGlzdGVuZXIgPSB4ID0+IHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLnByb3BzLnZhbHVlMSwgeCk7XG4gICAgaWYgKHRoaXMuX2lzVmFsMUluUmFuZ2UodmFsKSkge1xuICAgICAgdGhpcy5wcm9wcy5vblNsaWRlcjFDaGFuZ2UodmFsKTtcbiAgICB9XG4gIH07XG5cbiAgc2xpZGVyQmFyTGlzdGVuZXIgPSB4ID0+IHtcbiAgICBjb25zdCB2YWwwID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5wcm9wcy52YWx1ZTAsIHgpO1xuICAgIGNvbnN0IHZhbDEgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLnByb3BzLnZhbHVlMSwgeCk7XG4gICAgaWYgKHRoaXMuX2lzVmFsMUluUmFuZ2UodmFsMSkgJiYgdGhpcy5faXNWYWwwSW5SYW5nZSh2YWwwKSkge1xuICAgICAgdGhpcy5wcm9wcy5vblNsaWRlckJhckNoYW5nZSh2YWwwLCB2YWwxKTtcbiAgICB9XG4gIH07XG5cbiAgY2FsY0hhbmRsZUxlZnQwID0gKHcsIGwsIG51bSkgPT4ge1xuICAgIHJldHVybiB3ID09PSAwXG4gICAgICA/IGBjYWxjKCR7bH0lIC0gJHt0aGlzLnByb3BzLnNsaWRlckhhbmRsZVdpZHRoIC8gMn1weClgXG4gICAgICA6IGBjYWxjKCR7bH0lIC0gJHt0aGlzLnByb3BzLnNsaWRlckhhbmRsZVdpZHRoIC8gMn1weClgO1xuICB9O1xuXG4gIGNhbGNIYW5kbGVMZWZ0MSA9ICh3LCBsKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNSYW5nZWQgJiYgdyA9PT0gMFxuICAgICAgPyBgJHtsfSVgXG4gICAgICA6IGBjYWxjKCR7bCArIHd9JSAtICR7dGhpcy5wcm9wcy5zbGlkZXJIYW5kbGVXaWR0aCAvIDJ9cHgpYDtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NTZXQsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlzUmFuZ2VkLFxuICAgICAgbWF4VmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIHZhbHVlMSxcbiAgICAgIHZlcnRpY2FsLFxuICAgICAgc2xpZGVySGFuZGxlV2lkdGgsXG4gICAgICBzaG93VG9vbHRpcFxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHZhbHVlMCA9ICFpc1JhbmdlZCAmJiBtaW5WYWx1ZSA+IDAgPyBtaW5WYWx1ZSA6IHRoaXMucHJvcHMudmFsdWUwO1xuICAgIGNvbnN0IGN1cnJWYWxEZWx0YSA9IHZhbHVlMSAtIHZhbHVlMDtcbiAgICBjb25zdCBtYXhEZWx0YSA9IG1heFZhbHVlIC0gbWluVmFsdWU7XG4gICAgY29uc3Qgd2lkdGggPSAoY3VyclZhbERlbHRhIC8gbWF4RGVsdGEpICogMTAwO1xuXG4gICAgY29uc3QgdjBMZWZ0ID0gKCh2YWx1ZTAgLSBtaW5WYWx1ZSkgLyBtYXhEZWx0YSkgKiAxMDA7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNsaWRlcldyYXBwZXJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdrZy1zbGlkZXInLCB7Li4uY2xhc3NTZXQsIGRpc2FibGVkfSl9XG4gICAgICAgIHJlZj17dGhpcy5yZWZ9XG4gICAgICAgIGlzUmFuZ2VkPXtpc1JhbmdlZH1cbiAgICAgICAgdmVydGljYWw9e3ZlcnRpY2FsfVxuICAgICAgPlxuICAgICAgICA8U3R5bGVkUmFuZ2VTbGlkZXIgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyXCIgdmVydGljYWw9e3ZlcnRpY2FsfT5cbiAgICAgICAgICA8U2xpZGVySGFuZGxlXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX2hhbmRsZVwiXG4gICAgICAgICAgICBsZWZ0PXt0aGlzLmNhbGNIYW5kbGVMZWZ0MCh3aWR0aCwgdjBMZWZ0KX1cbiAgICAgICAgICAgIHZhbHVlTGlzdGVuZXI9e3RoaXMuc2xpZGUwTGlzdGVuZXJ9XG4gICAgICAgICAgICBzbGlkZXJIYW5kbGVXaWR0aD17c2xpZGVySGFuZGxlV2lkdGh9XG4gICAgICAgICAgICBkaXNwbGF5PXtpc1JhbmdlZH1cbiAgICAgICAgICAgIHZlcnRpY2FsPXt2ZXJ0aWNhbH1cbiAgICAgICAgICAgIHNob3dUb29sdGlwPXtzaG93VG9vbHRpcH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTbGlkZXJIYW5kbGVcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImtnLXJhbmdlLXNsaWRlcl9faGFuZGxlXCJcbiAgICAgICAgICAgIGxlZnQ9e3RoaXMuY2FsY0hhbmRsZUxlZnQxKHdpZHRoLCB2MExlZnQpfVxuICAgICAgICAgICAgdmFsdWVMaXN0ZW5lcj17dGhpcy5zbGlkZTFMaXN0ZW5lcn1cbiAgICAgICAgICAgIHNsaWRlckhhbmRsZVdpZHRoPXtzbGlkZXJIYW5kbGVXaWR0aH1cbiAgICAgICAgICAgIHZlcnRpY2FsPXt2ZXJ0aWNhbH1cbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZTF9XG4gICAgICAgICAgICBzaG93VG9vbHRpcD17c2hvd1Rvb2x0aXB9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8U2xpZGVyQmFySGFuZGxlXG4gICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICB2MExlZnQ9e3YwTGVmdH1cbiAgICAgICAgICAgIGVuYWJsZUJhckRyYWc9e3RoaXMucHJvcHMuZW5hYmxlQmFyRHJhZ31cbiAgICAgICAgICAgIHNsaWRlckJhckxpc3RlbmVyPXt0aGlzLnNsaWRlckJhckxpc3RlbmVyfVxuICAgICAgICAgICAgdmVydGljYWw9e3ZlcnRpY2FsfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVkUmFuZ2VTbGlkZXI+XG4gICAgICA8L1NsaWRlcldyYXBwZXI+XG4gICAgKTtcbiAgfVxufVxuIl19