UNPKG

kepler.gl

Version:

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

266 lines (265 loc) 42.3 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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _styledComponents = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _d3Selection = require("d3-selection"); var _d3Brush = require("d3-brush"); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); 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; } 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; })(); } var StyledG = _styledComponents["default"].g(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .selection {\n stroke: none;\n fill: ", ";\n fill-opacity: ", ";\n }\n .handle {\n fill: ", ";\n fill-opacity: 0.3;\n }\n"])), function (props) { return props.$isRanged ? props.theme.rangeBrushBgd : props.theme.BLUE2; }, function (props) { return props.$isRanged ? 0.3 : 1; }, function (props) { return props.theme.BLUE2; }); function moveRight(startSel, selection) { var _startSel = (0, _slicedToArray2["default"])(startSel, 1), startSel0 = _startSel[0]; var _selection = (0, _slicedToArray2["default"])(selection, 1), sel0 = _selection[0]; return Boolean(startSel0 === sel0); } // style brush resize handle // https://github.com/crossfilter/crossfilter/blob/gh-pages/index.html#L466 var getHandlePath = function getHandlePath(props) { return function brushResizePath(d) { var e = Number(d.type === 'e'); var x = e ? 1 : -1; var h = 39; var w = 4.5; var y = (props.height - h) / 2; return "M".concat(0.5 * x, ",").concat(y, "c").concat(2.5 * x, ",0,").concat(w * x, ",2,").concat(w * x, ",").concat(w, "v").concat(h - w * 2, "c0,2.5,").concat(-2 * x, ",").concat(w, ",").concat(-w * x, ",").concat(w, "V").concat(y, "z"); }; }; function RangeBrushFactory() { var RangeBrush = /*#__PURE__*/function (_Component) { function RangeBrush() { var _this; (0, _classCallCheck2["default"])(this, RangeBrush); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, RangeBrush, [].concat(args)); (0, _defineProperty2["default"])(_this, "rootContainer", (0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "brushing", false); (0, _defineProperty2["default"])(_this, "moving", false); (0, _defineProperty2["default"])(_this, "root", _this.rootContainer.current ? (0, _d3Selection.select)(_this.rootContainer.current) : undefined); (0, _defineProperty2["default"])(_this, "brush", void 0); (0, _defineProperty2["default"])(_this, "_startSel", void 0); (0, _defineProperty2["default"])(_this, "_lastSel", void 0); (0, _defineProperty2["default"])(_this, "handle", void 0); (0, _defineProperty2["default"])(_this, "_brushed", function (evt) { var _this2; // Ignore brush events which don't have an underlying sourceEvent if (!evt.sourceEvent) return; var _evt$selection = (0, _slicedToArray2["default"])(evt.selection, 2), sel0 = _evt$selection[0], sel1 = _evt$selection[1]; var right = moveRight(_this._startSel, evt.selection); var _this$props = _this.props, _this$props$range = (0, _slicedToArray2["default"])(_this$props.range, 2), min = _this$props$range[0], max = _this$props$range[1], _this$props$step = _this$props.step, step = _this$props$step === void 0 ? 0 : _this$props$step, width = _this$props.width, marks = _this$props.marks, isRanged = _this$props.isRanged; var invert = function invert(x) { return x * (max - min) / width + min; }; var d0 = invert(sel0); var d1 = invert(sel1); // this makes sure if points are right at the beginning of the domains are displayed correctly // the problem here is bisectLeftx d0 = d0 === min ? d0 : (0, _src.normalizeSliderValue)(d0, min, step, marks); d1 = (0, _src.normalizeSliderValue)(d1, min, step, marks); if (isRanged) _this._move(d0, d1);else (_this2 = _this)._move.apply(_this2, (0, _toConsumableArray2["default"])(right ? [d1, d1] : [d0, d0])); if (isRanged) _this._onBrush(d0, d1);else _this._onBrush(right ? d1 : d0); }); return _this; } (0, _inherits2["default"])(RangeBrush, _Component); return (0, _createClass2["default"])(RangeBrush, [{ key: "componentDidMount", value: function componentDidMount() { var _this3 = this, _this$root, _this$root2; // We want the React app to respond to brush state and vice-versa // but d3-brush fires the same events for both user-initiated brushing // and programmatic brushing (brush.move). We need these flags to // distinguish between the uses. // // We don't use state because that would trigger another `componentDidUpdate` var _this$props2 = this.props, theme = _this$props2.theme, isRanged = _this$props2.isRanged, onMouseoverHandle = _this$props2.onMouseoverHandle, onMouseoutHandle = _this$props2.onMouseoutHandle; this.root = this.rootContainer.current ? (0, _d3Selection.select)(this.rootContainer.current) : undefined; this.brush = (0, _d3Brush.brushX)().handleSize(3).on('start', function (event) { if (typeof _this3.props.onBrushStart === 'function') _this3.props.onBrushStart(); _this3._startSel = event.selection; }).on('brush', function (event) { if (_this3.moving) { return; } if (event.selection) { _this3._lastSel = event.selection; _this3.brushing = true; _this3._brushed(event); } }).on('end', function (event) { if (!event.selection) { if (_this3.brushing) { // handle null selection _this3._click(_this3._lastSel); } else if (_this3._startSel) { // handle click _this3._click(_this3._startSel); } } if (typeof _this3.props.onBrushEnd === 'function') _this3.props.onBrushEnd(); _this3.brushing = false; _this3.moving = false; }); (_this$root = this.root) === null || _this$root === void 0 || _this$root.call(this.brush); var brushResizePath = getHandlePath(this.props); this.handle = (_this$root2 = this.root) === null || _this$root2 === void 0 ? void 0 : _this$root2.selectAll('.handle--custom').data([{ type: 'w' }, { type: 'e' }]).enter().append('path').attr('class', 'handle--custom').attr('display', isRanged ? null : 'none').attr('fill', theme ? theme.sliderHandleColor : '#D3D8E0').attr('cursor', 'ew-resize').attr('d', brushResizePath).on('mouseover', function () { if (onMouseoverHandle) onMouseoverHandle(); }).on('mouseout', function () { if (onMouseoutHandle) onMouseoutHandle(); }); var _this$props$value = (0, _slicedToArray2["default"])(this.props.value, 2), val0 = _this$props$value[0], val1 = _this$props$value[1]; this.moving = true; this._move(val0, val1); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this$props3 = this.props, _this$props3$value = (0, _slicedToArray2["default"])(_this$props3.value, 2), val0 = _this$props3$value[0], val1 = _this$props3$value[1], width = _this$props3.width; var _prevProps$value = (0, _slicedToArray2["default"])(prevProps.value, 2), prevVal0 = _prevProps$value[0], prevVal1 = _prevProps$value[1]; if (prevProps.width !== width || prevProps.range[0] !== this.props.range[0] || prevProps.range[1] !== this.props.range[1]) { var _this$root3; // dimension change should not trigger this._brushed this.moving = true; if (this.brush) (_this$root3 = this.root) === null || _this$root3 === void 0 || _this$root3.call(this.brush); this._move(val0, val1); } if (!this.brushing && !this.moving) { if (prevVal0 !== val0 || prevVal1 !== val1) { this.moving = true; this._move(val0, val1); } } if (!this.props.isRanged && this.handle) { this.handle.attr('display', 'none'); } } }, { key: "_click", value: function _click(selection) { // fake brush this.brushing = true; this._brushed({ sourceEvent: {}, selection: selection }); } }, { key: "_move", value: function _move() { var val0 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var val1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var _this$props4 = this.props, _this$props4$range = (0, _slicedToArray2["default"])(_this$props4.range, 2), min = _this$props4$range[0], max = _this$props4$range[1], width = _this$props4.width, isRanged = _this$props4.isRanged; if (width && max - min && this.brush && this.handle) { var scale = function scale(x) { return (x - min) * width / (max - min); }; if (!isRanged) { // only draw a 1 pixel line if (this.root) this.brush.move(this.root, [scale(val0), scale(val0) + 1]); } else { if (this.root) this.brush.move(this.root, [scale(val0), scale(val1)]); this.handle.attr('display', null).attr('transform', function (d, i) { return "translate(".concat([i === 0 ? scale(val0) : scale(val1), 0], ")"); }); } } } }, { key: "_onBrush", value: function _onBrush() { var val0 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var val1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var _this$props5 = this.props, isRanged = _this$props5.isRanged, _this$props5$value = (0, _slicedToArray2["default"])(_this$props5.value, 2), currentVal0 = _this$props5$value[0], currentVal1 = _this$props5$value[1]; if (currentVal0 === val0 && currentVal1 === val1) { return; } if (isRanged) { this.props.onBrush(val0, val1); } else { this.props.onBrush(val0, val0); } } }, { key: "render", value: function render() { var isRanged = this.props.isRanged; return /*#__PURE__*/_react["default"].createElement(StyledG, { className: "kg-range-slider__brush", $isRanged: isRanged, ref: this.rootContainer }); } }]); }(_react.Component); (0, _defineProperty2["default"])(RangeBrush, "defaultProps", { isRanged: true }); return (0, _styledComponents.withTheme)(RangeBrush); } var _default = exports["default"] = RangeBrushFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9kM1NlbGVjdGlvbiIsIl9kM0JydXNoIiwiX3NyYyIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jYWxsU3VwZXIiLCJvIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiU3R5bGVkRyIsInN0eWxlZCIsImciLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsInByb3BzIiwiJGlzUmFuZ2VkIiwidGhlbWUiLCJyYW5nZUJydXNoQmdkIiwiQkxVRTIiLCJtb3ZlUmlnaHQiLCJzdGFydFNlbCIsInNlbGVjdGlvbiIsIl9zdGFydFNlbCIsIl9zbGljZWRUb0FycmF5MiIsInN0YXJ0U2VsMCIsIl9zZWxlY3Rpb24iLCJzZWwwIiwiZ2V0SGFuZGxlUGF0aCIsImJydXNoUmVzaXplUGF0aCIsImQiLCJOdW1iZXIiLCJ0eXBlIiwieCIsImgiLCJ3IiwieSIsImhlaWdodCIsImNvbmNhdCIsIlJhbmdlQnJ1c2hGYWN0b3J5IiwiUmFuZ2VCcnVzaCIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJjcmVhdGVSZWYiLCJyb290Q29udGFpbmVyIiwiY3VycmVudCIsInNlbGVjdCIsInVuZGVmaW5lZCIsImV2dCIsIl90aGlzMiIsInNvdXJjZUV2ZW50IiwiX2V2dCRzZWxlY3Rpb24iLCJzZWwxIiwicmlnaHQiLCJfdGhpcyRwcm9wcyIsIl90aGlzJHByb3BzJHJhbmdlIiwicmFuZ2UiLCJtaW4iLCJtYXgiLCJfdGhpcyRwcm9wcyRzdGVwIiwic3RlcCIsIndpZHRoIiwibWFya3MiLCJpc1JhbmdlZCIsImludmVydCIsImQwIiwiZDEiLCJub3JtYWxpemVTbGlkZXJWYWx1ZSIsIl9tb3ZlIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIl9vbkJydXNoIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImNvbXBvbmVudERpZE1vdW50IiwiX3RoaXMzIiwiX3RoaXMkcm9vdCIsIl90aGlzJHJvb3QyIiwiX3RoaXMkcHJvcHMyIiwib25Nb3VzZW92ZXJIYW5kbGUiLCJvbk1vdXNlb3V0SGFuZGxlIiwicm9vdCIsImJydXNoIiwiYnJ1c2hYIiwiaGFuZGxlU2l6ZSIsIm9uIiwiZXZlbnQiLCJvbkJydXNoU3RhcnQiLCJtb3ZpbmciLCJfbGFzdFNlbCIsImJydXNoaW5nIiwiX2JydXNoZWQiLCJfY2xpY2siLCJvbkJydXNoRW5kIiwiaGFuZGxlIiwic2VsZWN0QWxsIiwiZGF0YSIsImVudGVyIiwiYXBwZW5kIiwiYXR0ciIsInNsaWRlckhhbmRsZUNvbG9yIiwiX3RoaXMkcHJvcHMkdmFsdWUiLCJ2YWwwIiwidmFsMSIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsIl90aGlzJHByb3BzMyIsIl90aGlzJHByb3BzMyR2YWx1ZSIsIl9wcmV2UHJvcHMkdmFsdWUiLCJwcmV2VmFsMCIsInByZXZWYWwxIiwiX3RoaXMkcm9vdDMiLCJfdGhpcyRwcm9wczQiLCJfdGhpcyRwcm9wczQkcmFuZ2UiLCJzY2FsZSIsIm1vdmUiLCJfdGhpcyRwcm9wczUiLCJfdGhpcyRwcm9wczUkdmFsdWUiLCJjdXJyZW50VmFsMCIsImN1cnJlbnRWYWwxIiwib25CcnVzaCIsInJlbmRlciIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJyZWYiLCJDb21wb25lbnQiLCJ3aXRoVGhlbWUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvY29tbW9uL3JhbmdlLWJydXNoLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIGNyZWF0ZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCwge3dpdGhUaGVtZX0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtzZWxlY3QsIFNlbGVjdGlvbn0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7QnJ1c2hCZWhhdmlvciwgYnJ1c2hYfSBmcm9tICdkMy1icnVzaCc7XG5pbXBvcnQge25vcm1hbGl6ZVNsaWRlclZhbHVlfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW50ZXJmYWNlIFN0eWxlZEdQcm9wcyB7XG4gICRpc1JhbmdlZD86IGJvb2xlYW47XG59XG5cbmNvbnN0IFN0eWxlZEcgPSBzdHlsZWQuZzxTdHlsZWRHUHJvcHM+YFxuICAuc2VsZWN0aW9uIHtcbiAgICBzdHJva2U6IG5vbmU7XG4gICAgZmlsbDogJHtwcm9wcyA9PiAocHJvcHMuJGlzUmFuZ2VkID8gcHJvcHMudGhlbWUucmFuZ2VCcnVzaEJnZCA6IHByb3BzLnRoZW1lLkJMVUUyKX07XG4gICAgZmlsbC1vcGFjaXR5OiAke3Byb3BzID0+IChwcm9wcy4kaXNSYW5nZWQgPyAwLjMgOiAxKX07XG4gIH1cbiAgLmhhbmRsZSB7XG4gICAgZmlsbDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5CTFVFMn07XG4gICAgZmlsbC1vcGFjaXR5OiAwLjM7XG4gIH1cbmA7XG5cbmZ1bmN0aW9uIG1vdmVSaWdodChzdGFydFNlbCwgc2VsZWN0aW9uKSB7XG4gIGNvbnN0IFtzdGFydFNlbDBdID0gc3RhcnRTZWw7XG4gIGNvbnN0IFtzZWwwXSA9IHNlbGVjdGlvbjtcblxuICByZXR1cm4gQm9vbGVhbihzdGFydFNlbDAgPT09IHNlbDApO1xufVxuLy8gc3R5bGUgYnJ1c2ggcmVzaXplIGhhbmRsZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nyb3NzZmlsdGVyL2Nyb3NzZmlsdGVyL2Jsb2IvZ2gtcGFnZXMvaW5kZXguaHRtbCNMNDY2XG5jb25zdCBnZXRIYW5kbGVQYXRoID0gKHByb3BzOiBSYW5nZUJydXNoUHJvcHMpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJydXNoUmVzaXplUGF0aChkKSB7XG4gICAgY29uc3QgZSA9IE51bWJlcihkLnR5cGUgPT09ICdlJyk7XG4gICAgY29uc3QgeCA9IGUgPyAxIDogLTE7XG4gICAgY29uc3QgaCA9IDM5O1xuICAgIGNvbnN0IHcgPSA0LjU7XG4gICAgY29uc3QgeSA9IChwcm9wcy5oZWlnaHQgLSBoKSAvIDI7XG4gICAgcmV0dXJuIGBNJHswLjUgKiB4fSwke3l9YyR7Mi41ICogeH0sMCwke3cgKiB4fSwyLCR7dyAqIHh9LCR7d312JHtoIC0gdyAqIDJ9YzAsMi41LCR7XG4gICAgICAtMiAqIHhcbiAgICB9LCR7d30sJHstdyAqIHh9LCR7d31WJHt5fXpgO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgT25CcnVzaCA9ICh2YWwwOiBudW1iZXIsIHZhbDE6IG51bWJlcikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBSYW5nZUJydXNoUHJvcHMge1xuICBpc1JhbmdlZD86IGJvb2xlYW47XG4gIHRoZW1lPzogYW55O1xuICByYW5nZTogbnVtYmVyW107XG4gIHZhbHVlOiBudW1iZXJbXTtcbiAgb25CcnVzaFN0YXJ0OiAoKSA9PiB2b2lkO1xuICBvbkJydXNoRW5kOiAoKSA9PiB2b2lkO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgb25CcnVzaDogT25CcnVzaDtcbiAgc3RlcD86IG51bWJlcjtcbiAgbWFya3M/OiBudW1iZXJbXTtcbiAgb25Nb3VzZW92ZXJIYW5kbGU6ICgpID0+IHZvaWQ7XG4gIG9uTW91c2VvdXRIYW5kbGU6ICgpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIFJhbmdlQnJ1c2hGYWN0b3J5KCk6IFJlYWN0LkNvbXBvbmVudFR5cGU8UmFuZ2VCcnVzaFByb3BzPiB7XG4gIGNsYXNzIFJhbmdlQnJ1c2ggZXh0ZW5kcyBDb21wb25lbnQ8UmFuZ2VCcnVzaFByb3BzPiB7XG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGlzUmFuZ2VkOiB0cnVlXG4gICAgfTtcblxuICAgIHJvb3RDb250YWluZXIgPSBjcmVhdGVSZWY8U1ZHR0VsZW1lbnQ+KCk7XG5cbiAgICBicnVzaGluZyA9IGZhbHNlO1xuICAgIG1vdmluZyA9IGZhbHNlO1xuXG4gICAgcm9vdCA9IHRoaXMucm9vdENvbnRhaW5lci5jdXJyZW50ID8gc2VsZWN0KHRoaXMucm9vdENvbnRhaW5lci5jdXJyZW50KSA6IHVuZGVmaW5lZDtcbiAgICBicnVzaDogQnJ1c2hCZWhhdmlvcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIF9zdGFydFNlbDogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG4gICAgX2xhc3RTZWw6IG51bWJlcltdIHwgdW5kZWZpbmVkO1xuXG4gICAgaGFuZGxlOiBTZWxlY3Rpb248U1ZHUGF0aEVsZW1lbnQsIHt0eXBlOiBzdHJpbmd9LCBTVkdHRWxlbWVudCB8IG51bGwsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAvLyBXZSB3YW50IHRoZSBSZWFjdCBhcHAgdG8gcmVzcG9uZCB0byBicnVzaCBzdGF0ZSBhbmQgdmljZS12ZXJzYVxuICAgICAgLy8gYnV0IGQzLWJydXNoIGZpcmVzIHRoZSBzYW1lIGV2ZW50cyBmb3IgYm90aCB1c2VyLWluaXRpYXRlZCBicnVzaGluZ1xuICAgICAgLy8gYW5kIHByb2dyYW1tYXRpYyBicnVzaGluZyAoYnJ1c2gubW92ZSkuIFdlIG5lZWQgdGhlc2UgZmxhZ3MgdG9cbiAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHVzZXMuXG4gICAgICAvL1xuICAgICAgLy8gV2UgZG9uJ3QgdXNlIHN0YXRlIGJlY2F1c2UgdGhhdCB3b3VsZCB0cmlnZ2VyIGFub3RoZXIgYGNvbXBvbmVudERpZFVwZGF0ZWBcbiAgICAgIGNvbnN0IHt0aGVtZSwgaXNSYW5nZWQsIG9uTW91c2VvdmVySGFuZGxlLCBvbk1vdXNlb3V0SGFuZGxlfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdENvbnRhaW5lci5jdXJyZW50ID8gc2VsZWN0KHRoaXMucm9vdENvbnRhaW5lci5jdXJyZW50KSA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYnJ1c2ggPSBicnVzaFgoKVxuICAgICAgICAuaGFuZGxlU2l6ZSgzKVxuICAgICAgICAub24oJ3N0YXJ0JywgZXZlbnQgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5vbkJydXNoU3RhcnQgPT09ICdmdW5jdGlvbicpIHRoaXMucHJvcHMub25CcnVzaFN0YXJ0KCk7XG4gICAgICAgICAgdGhpcy5fc3RhcnRTZWwgPSBldmVudC5zZWxlY3Rpb247XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignYnJ1c2gnLCBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubW92aW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChldmVudC5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWwgPSBldmVudC5zZWxlY3Rpb247XG4gICAgICAgICAgICB0aGlzLmJydXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2JydXNoZWQoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlbmQnLCBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKCFldmVudC5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJydXNoaW5nKSB7XG4gICAgICAgICAgICAgIC8vIGhhbmRsZSBudWxsIHNlbGVjdGlvblxuICAgICAgICAgICAgICB0aGlzLl9jbGljayh0aGlzLl9sYXN0U2VsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhcnRTZWwpIHtcbiAgICAgICAgICAgICAgLy8gaGFuZGxlIGNsaWNrXG4gICAgICAgICAgICAgIHRoaXMuX2NsaWNrKHRoaXMuX3N0YXJ0U2VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMub25CcnVzaEVuZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5wcm9wcy5vbkJydXNoRW5kKCk7XG5cbiAgICAgICAgICB0aGlzLmJydXNoaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMucm9vdD8uY2FsbCh0aGlzLmJydXNoKTtcbiAgICAgIGNvbnN0IGJydXNoUmVzaXplUGF0aCA9IGdldEhhbmRsZVBhdGgodGhpcy5wcm9wcyk7XG4gICAgICB0aGlzLmhhbmRsZSA9IHRoaXMucm9vdFxuICAgICAgICA/LnNlbGVjdEFsbCgnLmhhbmRsZS0tY3VzdG9tJylcbiAgICAgICAgLmRhdGEoW3t0eXBlOiAndyd9LCB7dHlwZTogJ2UnfV0pXG4gICAgICAgIC5lbnRlcigpXG4gICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnaGFuZGxlLS1jdXN0b20nKVxuICAgICAgICAuYXR0cignZGlzcGxheScsIGlzUmFuZ2VkID8gbnVsbCA6ICdub25lJylcbiAgICAgICAgLmF0dHIoJ2ZpbGwnLCB0aGVtZSA/IHRoZW1lLnNsaWRlckhhbmRsZUNvbG9yIDogJyNEM0Q4RTAnKVxuICAgICAgICAuYXR0cignY3Vyc29yJywgJ2V3LXJlc2l6ZScpXG4gICAgICAgIC5hdHRyKCdkJywgYnJ1c2hSZXNpemVQYXRoKVxuICAgICAgICAub24oJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgICAgICBpZiAob25Nb3VzZW92ZXJIYW5kbGUpIG9uTW91c2VvdmVySGFuZGxlKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9uTW91c2VvdXRIYW5kbGUpIG9uTW91c2VvdXRIYW5kbGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmFsdWU6IFt2YWwwLCB2YWwxXVxuICAgICAgfSA9IHRoaXMucHJvcHM7XG4gICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9tb3ZlKHZhbDAsIHZhbDEpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmFsdWU6IFt2YWwwLCB2YWwxXSxcbiAgICAgICAgd2lkdGhcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgW3ByZXZWYWwwLCBwcmV2VmFsMV0gPSBwcmV2UHJvcHMudmFsdWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJldlByb3BzLndpZHRoICE9PSB3aWR0aCB8fFxuICAgICAgICBwcmV2UHJvcHMucmFuZ2VbMF0gIT09IHRoaXMucHJvcHMucmFuZ2VbMF0gfHxcbiAgICAgICAgcHJldlByb3BzLnJhbmdlWzFdICE9PSB0aGlzLnByb3BzLnJhbmdlWzFdXG4gICAgICApIHtcbiAgICAgICAgLy8gZGltZW5zaW9uIGNoYW5nZSBzaG91bGQgbm90IHRyaWdnZXIgdGhpcy5fYnJ1c2hlZFxuICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmJydXNoKSB0aGlzLnJvb3Q/LmNhbGwodGhpcy5icnVzaCk7XG4gICAgICAgIHRoaXMuX21vdmUodmFsMCwgdmFsMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5icnVzaGluZyAmJiAhdGhpcy5tb3ZpbmcpIHtcbiAgICAgICAgaWYgKHByZXZWYWwwICE9PSB2YWwwIHx8IHByZXZWYWwxICE9PSB2YWwxKSB7XG4gICAgICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX21vdmUodmFsMCwgdmFsMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnByb3BzLmlzUmFuZ2VkICYmIHRoaXMuaGFuZGxlKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlLmF0dHIoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9jbGljayhzZWxlY3Rpb24pIHtcbiAgICAgIC8vIGZha2UgYnJ1c2hcbiAgICAgIHRoaXMuYnJ1c2hpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fYnJ1c2hlZCh7c291cmNlRXZlbnQ6IHt9LCBzZWxlY3Rpb259KTtcbiAgICB9XG5cbiAgICBfbW92ZSh2YWwwID0gMCwgdmFsMSA9IDApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmFuZ2U6IFttaW4sIG1heF0sXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBpc1JhbmdlZFxuICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIGlmICh3aWR0aCAmJiBtYXggLSBtaW4gJiYgdGhpcy5icnVzaCAmJiB0aGlzLmhhbmRsZSkge1xuICAgICAgICBjb25zdCBzY2FsZSA9ICh4OiBudW1iZXIpID0+ICgoeCAtIG1pbikgKiB3aWR0aCkgLyAobWF4IC0gbWluKTtcbiAgICAgICAgaWYgKCFpc1JhbmdlZCkge1xuICAgICAgICAgIC8vIG9ubHkgZHJhdyBhIDEgcGl4ZWwgbGluZVxuICAgICAgICAgIGlmICh0aGlzLnJvb3QpIHRoaXMuYnJ1c2gubW92ZSh0aGlzLnJvb3QsIFtzY2FsZSh2YWwwKSwgc2NhbGUodmFsMCkgKyAxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMucm9vdCkgdGhpcy5icnVzaC5tb3ZlKHRoaXMucm9vdCwgW3NjYWxlKHZhbDApLCBzY2FsZSh2YWwxKV0pO1xuXG4gICAgICAgICAgdGhpcy5oYW5kbGVcbiAgICAgICAgICAgIC5hdHRyKCdkaXNwbGF5JywgbnVsbClcbiAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCwgaSkgPT4gYHRyYW5zbGF0ZSgke1tpID09PSAwID8gc2NhbGUodmFsMCkgOiBzY2FsZSh2YWwxKSwgMF19KWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2JydXNoZWQgPSAoZXZ0OiB7c291cmNlRXZlbnQ6IGFueTsgc2VsZWN0aW9uOiBudW1iZXJbXX0pID0+IHtcbiAgICAgIC8vIElnbm9yZSBicnVzaCBldmVudHMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiB1bmRlcmx5aW5nIHNvdXJjZUV2ZW50XG4gICAgICBpZiAoIWV2dC5zb3VyY2VFdmVudCkgcmV0dXJuO1xuICAgICAgY29uc3QgW3NlbDAsIHNlbDFdID0gZXZ0LnNlbGVjdGlvbjtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gbW92ZVJpZ2h0KHRoaXMuX3N0YXJ0U2VsLCBldnQuc2VsZWN0aW9uKTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICByYW5nZTogW21pbiwgbWF4XSxcbiAgICAgICAgc3RlcCA9IDAsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBtYXJrcyxcbiAgICAgICAgaXNSYW5nZWRcbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3QgaW52ZXJ0ID0gKHg6IG51bWJlcikgPT4gKHggKiAobWF4IC0gbWluKSkgLyB3aWR0aCArIG1pbjtcbiAgICAgIGxldCBkMCA9IGludmVydChzZWwwKTtcbiAgICAgIGxldCBkMSA9IGludmVydChzZWwxKTtcbiAgICAgIC8vIHRoaXMgbWFrZXMgc3VyZSBpZiBwb2ludHMgYXJlIHJpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvbWFpbnMgYXJlIGRpc3BsYXllZCBjb3JyZWN0bHlcbiAgICAgIC8vIHRoZSBwcm9ibGVtIGhlcmUgaXMgYmlzZWN0TGVmdHhcbiAgICAgIGQwID0gZDAgPT09IG1pbiA/IGQwIDogbm9ybWFsaXplU2xpZGVyVmFsdWUoZDAsIG1pbiwgc3RlcCwgbWFya3MpO1xuICAgICAgZDEgPSBub3JtYWxpemVTbGlkZXJWYWx1ZShkMSwgbWluLCBzdGVwLCBtYXJrcyk7XG5cbiAgICAgIGlmIChpc1JhbmdlZCkgdGhpcy5fbW92ZShkMCwgZDEpO1xuICAgICAgZWxzZSB0aGlzLl9tb3ZlKC4uLihyaWdodCA/IFtkMSwgZDFdIDogW2QwLCBkMF0pKTtcblxuICAgICAgaWYgKGlzUmFuZ2VkKSB0aGlzLl9vbkJydXNoKGQwLCBkMSk7XG4gICAgICBlbHNlIHRoaXMuX29uQnJ1c2gocmlnaHQgPyBkMSA6IGQwKTtcbiAgICB9O1xuXG4gICAgX29uQnJ1c2godmFsMCA9IDAsIHZhbDEgPSAwKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlzUmFuZ2VkLFxuICAgICAgICB2YWx1ZTogW2N1cnJlbnRWYWwwLCBjdXJyZW50VmFsMV1cbiAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBpZiAoY3VycmVudFZhbDAgPT09IHZhbDAgJiYgY3VycmVudFZhbDEgPT09IHZhbDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSYW5nZWQpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkJydXNoKHZhbDAsIHZhbDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkJydXNoKHZhbDAsIHZhbDApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtpc1JhbmdlZH0gPSB0aGlzLnByb3BzO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZEcgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyX19icnVzaFwiICRpc1JhbmdlZD17aXNSYW5nZWR9IHJlZj17dGhpcy5yb290Q29udGFpbmVyfSAvPlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdpdGhUaGVtZShSYW5nZUJydXNoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFuZ2VCcnVzaEZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLElBQUEsR0FBQUosT0FBQTtBQUFzRCxJQUFBSyxlQUFBLEVBUHREO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVIsd0JBQUFRLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FB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