kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
303 lines (258 loc) • 32.8 kB
JavaScript
"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 _styledComponents = _interopRequireDefault(require("styled-components"));
var _rangePlot = _interopRequireDefault(require("./range-plot"));
var _slider = _interopRequireDefault(require("./slider/slider"));
var _styledComponents2 = require("./styled-components");
var _dataUtils = require("../../utils/data-utils");
var _templateObject, _templateObject2, _templateObject3;
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 _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; } }
var SliderInput = (0, _styledComponents["default"])(_styledComponents2.Input)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n margin-left: ", "px;\n"])), function (props) {
return props.theme.sliderInputWidth;
}, function (props) {
return props.flush ? 0 : props.size === 'tiny' ? 12 : 18;
});
var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n align-items: center;\n"])));
var RangeInputWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 6px;\n display: flex;\n justify-content: space-between;\n"])));
var RangeSlider = exports["default"] = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(RangeSlider, _Component);
var _super = _createSuper(RangeSlider);
function RangeSlider() {
var _this;
(0, _classCallCheck2["default"])(this, RangeSlider);
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), "state", {
value0: 0,
value1: 1,
width: 288
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "sliderContainer", (0, _react.createRef)());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "inputValue0", (0, _react.createRef)());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "inputValue1", (0, _react.createRef)());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setValueFromProps", function (props) {
var value0 = props.value0,
value1 = props.value1;
if (!isNaN(value0) && !isNaN(value1)) {
_this.setState({
value0: value0,
value1: value1
});
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isVal0InRange", function (val) {
var _this$props = _this.props,
value1 = _this$props.value1,
range = _this$props.range;
return Boolean(val >= range[0] && val <= value1);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isVal1InRange", function (val) {
var _this$props2 = _this.props,
range = _this$props2.range,
value0 = _this$props2.value0;
return Boolean(val <= range[1] && val >= value0);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_roundValToStep", function (val) {
var _this$props3 = _this.props,
range = _this$props3.range,
step = _this$props3.step;
return (0, _dataUtils.roundValToStep)(range[0], step, val);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setRangeVal1", function (val) {
var _this$props4 = _this.props,
value0 = _this$props4.value0,
onChange = _this$props4.onChange;
val = Number(val);
if (_this._isVal1InRange(val)) {
onChange([value0, _this._roundValToStep(val)]);
return true;
}
return false;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setRangeVal0", function (val) {
var _this$props5 = _this.props,
value1 = _this$props5.value1,
onChange = _this$props5.onChange;
val = Number(val);
if (_this._isVal0InRange(val)) {
onChange([_this._roundValToStep(val), value1]);
return true;
}
return false;
});
return _this;
}
(0, _createClass2["default"])(RangeSlider, [{
key: "componentDidMount",
value: function componentDidMount() {
this._setValueFromProps(this.props);
this._resize();
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
this._setValueFromProps(nextProps);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this._resize();
}
}, {
key: "_resize",
value: function _resize() {
var width = this.sliderContainer.current.offsetWidth;
if (width !== this.state.width) {
this.setState({
width: width
});
}
}
}, {
key: "_renderInput",
value: function _renderInput(key) {
var _this2 = this;
var setRange = key === 'value0' ? this._setRangeVal0 : this._setRangeVal1;
var ref = key === 'value0' ? this.inputValue0 : this.inputValue1;
var update = function update(e) {
if (!setRange(e.target.value)) {
_this2.setState((0, _defineProperty2["default"])({}, key, _this2.state[key]));
}
};
return (/*#__PURE__*/_react["default"].createElement(SliderInput, {
className: "kg-range-slider__input",
type: "number",
ref: ref,
id: "slider-input-".concat(key),
key: key,
value: this.state[key],
onChange: function onChange(e) {
_this2.setState((0, _defineProperty2["default"])({}, key, e.target.value));
},
onKeyPress: function onKeyPress(e) {
if (e.key === 'Enter') {
update(e);
ref.current.blur();
}
},
onBlur: update,
flush: key === 'value0',
size: this.props.inputSize,
secondary: this.props.inputTheme === 'secondary'
})
);
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _this$props6 = this.props,
isRanged = _this$props6.isRanged,
showInput = _this$props6.showInput,
histogram = _this$props6.histogram,
lineChart = _this$props6.lineChart,
plotType = _this$props6.plotType,
isEnlarged = _this$props6.isEnlarged,
range = _this$props6.range,
onChange = _this$props6.onChange,
value0 = _this$props6.value0,
value1 = _this$props6.value1,
sliderHandleWidth = _this$props6.sliderHandleWidth,
step = _this$props6.step;
var height = isRanged && showInput ? '16px' : '24px';
var width = this.state.width;
var plotWidth = Math.max(width - sliderHandleWidth, 0);
return (/*#__PURE__*/_react["default"].createElement("div", {
className: "kg-range-slider",
style: {
width: '100%',
padding: "0 ".concat(sliderHandleWidth / 2, "px")
},
ref: this.sliderContainer
}, histogram && histogram.length ? /*#__PURE__*/_react["default"].createElement(_rangePlot["default"], {
histogram: histogram,
lineChart: lineChart,
plotType: plotType,
isEnlarged: isEnlarged,
onBrush: function onBrush(val0, val1) {
onChange([_this3._roundValToStep(val0), _this3._roundValToStep(val1)]);
},
range: range,
value: [value0, value1],
width: plotWidth
}) : null, /*#__PURE__*/_react["default"].createElement(SliderWrapper, {
style: {
height: height
},
className: "kg-range-slider__slider"
}, this.props.xAxis ? /*#__PURE__*/_react["default"].createElement(this.props.xAxis, {
width: plotWidth,
domain: range
}) : null, /*#__PURE__*/_react["default"].createElement(_slider["default"], {
showValues: false,
isRanged: isRanged,
minValue: range[0],
maxValue: range[1],
value0: value0,
value1: value1,
step: step,
handleWidth: sliderHandleWidth,
onSlider0Change: this._setRangeVal0,
onSlider1Change: this._setRangeVal1,
onSliderBarChange: function onSliderBarChange(val0, val1) {
onChange([val0, val1]);
},
enableBarDrag: true
}), !isRanged && showInput ? this._renderInput('value1') : null), isRanged && showInput ? /*#__PURE__*/_react["default"].createElement(RangeInputWrapper, {
className: "range-slider__input-group"
}, this._renderInput('value0'), this._renderInput('value1')) : null)
);
}
}]);
return RangeSlider;
}(_react.Component);
(0, _defineProperty2["default"])(RangeSlider, "propTypes", {
range: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired,
value0: _propTypes["default"].number.isRequired,
value1: _propTypes["default"].number.isRequired,
onChange: _propTypes["default"].func.isRequired,
histogram: _propTypes["default"].arrayOf(_propTypes["default"].any),
isRanged: _propTypes["default"].bool,
isEnlarged: _propTypes["default"].bool,
showInput: _propTypes["default"].bool,
inputTheme: _propTypes["default"].string,
inputSize: _propTypes["default"].string,
step: _propTypes["default"].number,
sliderHandleWidth: _propTypes["default"].number,
xAxis: _propTypes["default"].func
});
(0, _defineProperty2["default"])(RangeSlider, "defaultProps", {
isEnlarged: false,
isRanged: true,
showInput: true,
sliderHandleWidth: 12,
inputTheme: '',
inputSize: 'small',
onChange: function onChange() {}
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9yYW5nZS1zbGlkZXIuanMiXSwibmFtZXMiOlsiU2xpZGVySW5wdXQiLCJJbnB1dCIsInByb3BzIiwidGhlbWUiLCJzbGlkZXJJbnB1dFdpZHRoIiwiZmx1c2giLCJzaXplIiwiU2xpZGVyV3JhcHBlciIsInN0eWxlZCIsImRpdiIsIlJhbmdlSW5wdXRXcmFwcGVyIiwiUmFuZ2VTbGlkZXIiLCJ2YWx1ZTAiLCJ2YWx1ZTEiLCJ3aWR0aCIsImlzTmFOIiwic2V0U3RhdGUiLCJ2YWwiLCJyYW5nZSIsIkJvb2xlYW4iLCJzdGVwIiwib25DaGFuZ2UiLCJOdW1iZXIiLCJfaXNWYWwxSW5SYW5nZSIsIl9yb3VuZFZhbFRvU3RlcCIsIl9pc1ZhbDBJblJhbmdlIiwiX3NldFZhbHVlRnJvbVByb3BzIiwiX3Jlc2l6ZSIsIm5leHRQcm9wcyIsInNsaWRlckNvbnRhaW5lciIsImN1cnJlbnQiLCJvZmZzZXRXaWR0aCIsInN0YXRlIiwia2V5Iiwic2V0UmFuZ2UiLCJfc2V0UmFuZ2VWYWwwIiwiX3NldFJhbmdlVmFsMSIsInJlZiIsImlucHV0VmFsdWUwIiwiaW5wdXRWYWx1ZTEiLCJ1cGRhdGUiLCJlIiwidGFyZ2V0IiwidmFsdWUiLCJibHVyIiwiaW5wdXRTaXplIiwiaW5wdXRUaGVtZSIsImlzUmFuZ2VkIiwic2hvd0lucHV0IiwiaGlzdG9ncmFtIiwibGluZUNoYXJ0IiwicGxvdFR5cGUiLCJpc0VubGFyZ2VkIiwic2xpZGVySGFuZGxlV2lkdGgiLCJoZWlnaHQiLCJwbG90V2lkdGgiLCJNYXRoIiwibWF4IiwicGFkZGluZyIsImxlbmd0aCIsInZhbDAiLCJ2YWwxIiwieEF4aXMiLCJfcmVuZGVySW5wdXQiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJhcnJheU9mIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJhbnkiLCJib29sIiwic3RyaW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7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QkssRUFBQUEsaUJBQWlCLEVBQUUsRUFKQztBQUtwQlAsRUFBQUEsVUFBVSxFQUFFLEVBTFE7QUFNcEJELEVBQUFBLFNBQVMsRUFBRSxPQU5TO0FBT3BCeEIsRUFBQUEsUUFBUSxFQUFFLG9CQUFNLENBQUU7QUFQRSxDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IFJhbmdlUGxvdCBmcm9tICcuL3JhbmdlLXBsb3QnO1xuaW1wb3J0IFNsaWRlciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zbGlkZXIvc2xpZGVyJztcbmltcG9ydCB7SW5wdXR9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtyb3VuZFZhbFRvU3RlcH0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5cbmNvbnN0IFNsaWRlcklucHV0ID0gc3R5bGVkKElucHV0KWBcbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVySW5wdXRXaWR0aH1weDtcbiAgbWFyZ2luLWxlZnQ6ICR7cHJvcHMgPT4gKHByb3BzLmZsdXNoID8gMCA6IHByb3BzLnNpemUgPT09ICd0aW55JyA/IDEyIDogMTgpfXB4O1xuYDtcblxuY29uc3QgU2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5cbmNvbnN0IFJhbmdlSW5wdXRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLXRvcDogNnB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5gO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYW5nZVNsaWRlciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgcmFuZ2U6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgdmFsdWUwOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgdmFsdWUxOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgaGlzdG9ncmFtOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KSxcbiAgICBpc1JhbmdlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgaXNFbmxhcmdlZDogUHJvcFR5cGVzLmJvb2wsXG4gICAgc2hvd0lucHV0OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBpbnB1dFRoZW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGlucHV0U2l6ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzdGVwOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHNsaWRlckhhbmRsZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHhBeGlzOiBQcm9wVHlwZXMuZnVuY1xuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgaXNFbmxhcmdlZDogZmFsc2UsXG4gICAgaXNSYW5nZWQ6IHRydWUsXG4gICAgc2hvd0lucHV0OiB0cnVlLFxuICAgIHNsaWRlckhhbmRsZVdpZHRoOiAxMixcbiAgICBpbnB1dFRoZW1lOiAnJyxcbiAgICBpbnB1dFNpemU6ICdzbWFsbCcsXG4gICAgb25DaGFuZ2U6ICgpID0+IHt9XG4gIH07XG5cbiAgc3RhdGUgPSB7dmFsdWUwOiAwLCB2YWx1ZTE6IDEsIHdpZHRoOiAyODh9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMuX3NldFZhbHVlRnJvbVByb3BzKHRoaXMucHJvcHMpO1xuICAgIHRoaXMuX3Jlc2l6ZSgpO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB0aGlzLl9zZXRWYWx1ZUZyb21Qcm9wcyhuZXh0UHJvcHMpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHRoaXMuX3Jlc2l6ZSgpO1xuICB9XG5cbiAgc2xpZGVyQ29udGFpbmVyID0gY3JlYXRlUmVmKCk7XG4gIGlucHV0VmFsdWUwID0gY3JlYXRlUmVmKCk7XG4gIGlucHV0VmFsdWUxID0gY3JlYXRlUmVmKCk7XG5cbiAgX3NldFZhbHVlRnJvbVByb3BzID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHt2YWx1ZTAsIHZhbHVlMX0gPSBwcm9wcztcblxuICAgIGlmICghaXNOYU4odmFsdWUwKSAmJiAhaXNOYU4odmFsdWUxKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7dmFsdWUwLCB2YWx1ZTF9KTtcbiAgICB9XG4gIH07XG5cbiAgX2lzVmFsMEluUmFuZ2UgPSB2YWwgPT4ge1xuICAgIGNvbnN0IHt2YWx1ZTEsIHJhbmdlfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gQm9vbGVhbih2YWwgPj0gcmFuZ2VbMF0gJiYgdmFsIDw9IHZhbHVlMSk7XG4gIH07XG5cbiAgX2lzVmFsMUluUmFuZ2UgPSB2YWwgPT4ge1xuICAgIGNvbnN0IHtyYW5nZSwgdmFsdWUwfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gQm9vbGVhbih2YWwgPD0gcmFuZ2VbMV0gJiYgdmFsID49IHZhbHVlMCk7XG4gIH07XG5cbiAgX3JvdW5kVmFsVG9TdGVwID0gdmFsID0+IHtcbiAgICBjb25zdCB7cmFuZ2UsIHN0ZXB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiByb3VuZFZhbFRvU3RlcChyYW5nZVswXSwgc3RlcCwgdmFsKTtcbiAgfTtcblxuICBfc2V0UmFuZ2VWYWwxID0gdmFsID0+IHtcbiAgICBjb25zdCB7dmFsdWUwLCBvbkNoYW5nZX0gPSB0aGlzLnByb3BzO1xuICAgIHZhbCA9IE51bWJlcih2YWwpO1xuXG4gICAgaWYgKHRoaXMuX2lzVmFsMUluUmFuZ2UodmFsKSkge1xuICAgICAgb25DaGFuZ2UoW3ZhbHVlMCwgdGhpcy5fcm91bmRWYWxUb1N0ZXAodmFsKV0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfc2V0UmFuZ2VWYWwwID0gdmFsID0+IHtcbiAgICBjb25zdCB7dmFsdWUxLCBvbkNoYW5nZX0gPSB0aGlzLnByb3BzO1xuICAgIHZhbCA9IE51bWJlcih2YWwpO1xuXG4gICAgaWYgKHRoaXMuX2lzVmFsMEluUmFuZ2UodmFsKSkge1xuICAgICAgb25DaGFuZ2UoW3RoaXMuX3JvdW5kVmFsVG9TdGVwKHZhbCksIHZhbHVlMV0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfcmVzaXplKCkge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5zbGlkZXJDb250YWluZXIuY3VycmVudC5vZmZzZXRXaWR0aDtcbiAgICBpZiAod2lkdGggIT09IHRoaXMuc3RhdGUud2lkdGgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3dpZHRofSk7XG4gICAgfVxuICB9XG5cbiAgX3JlbmRlcklucHV0KGtleSkge1xuICAgIGNvbnN0IHNldFJhbmdlID0ga2V5ID09PSAndmFsdWUwJyA/IHRoaXMuX3NldFJhbmdlVmFsMCA6IHRoaXMuX3NldFJhbmdlVmFsMTtcbiAgICBjb25zdCByZWYgPSBrZXkgPT09ICd2YWx1ZTAnID8gdGhpcy5pbnB1dFZhbHVlMCA6IHRoaXMuaW5wdXRWYWx1ZTE7XG4gICAgY29uc3QgdXBkYXRlID0gZSA9PiB7XG4gICAgICBpZiAoIXNldFJhbmdlKGUudGFyZ2V0LnZhbHVlKSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtba2V5XTogdGhpcy5zdGF0ZVtrZXldfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U2xpZGVySW5wdXRcbiAgICAgICAgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyX19pbnB1dFwiXG4gICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgaWQ9e2BzbGlkZXItaW5wdXQtJHtrZXl9YH1cbiAgICAgICAga2V5PXtrZXl9XG4gICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlW2tleV19XG4gICAgICAgIG9uQ2hhbmdlPXtlID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtba2V5XTogZS50YXJnZXQudmFsdWV9KTtcbiAgICAgICAgfX1cbiAgICAgICAgb25LZXlQcmVzcz17ZSA9PiB7XG4gICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICB1cGRhdGUoZSk7XG4gICAgICAgICAgICByZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBvbkJsdXI9e3VwZGF0ZX1cbiAgICAgICAgZmx1c2g9e2tleSA9PT0gJ3ZhbHVlMCd9XG4gICAgICAgIHNpemU9e3RoaXMucHJvcHMuaW5wdXRTaXplfVxuICAgICAgICBzZWNvbmRhcnk9e3RoaXMucHJvcHMuaW5wdXRUaGVtZSA9PT0gJ3NlY29uZGFyeSd9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNSYW5nZWQsXG4gICAgICBzaG93SW5wdXQsXG4gICAgICBoaXN0b2dyYW0sXG4gICAgICBsaW5lQ2hhcnQsXG4gICAgICBwbG90VHlwZSxcbiAgICAgIGlzRW5sYXJnZWQsXG4gICAgICByYW5nZSxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgdmFsdWUwLFxuICAgICAgdmFsdWUxLFxuICAgICAgc2xpZGVySGFuZGxlV2lkdGgsXG4gICAgICBzdGVwXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBjb25zdCBoZWlnaHQgPSBpc1JhbmdlZCAmJiBzaG93SW5wdXQgPyAnMTZweCcgOiAnMjRweCc7XG4gICAgY29uc3Qge3dpZHRofSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgcGxvdFdpZHRoID0gTWF0aC5tYXgod2lkdGggLSBzbGlkZXJIYW5kbGVXaWR0aCwgMCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJcIlxuICAgICAgICBzdHlsZT17e3dpZHRoOiAnMTAwJScsIHBhZGRpbmc6IGAwICR7c2xpZGVySGFuZGxlV2lkdGggLyAyfXB4YH19XG4gICAgICAgIHJlZj17dGhpcy5zbGlkZXJDb250YWluZXJ9XG4gICAgICA+XG4gICAgICAgIHtoaXN0b2dyYW0gJiYgaGlzdG9ncmFtLmxlbmd0aCA/IChcbiAgICAgICAgICA8UmFuZ2VQbG90XG4gICAgICAgICAgICBoaXN0b2dyYW09e2hpc3RvZ3JhbX1cbiAgICAgICAgICAgIGxpbmVDaGFydD17bGluZUNoYXJ0fVxuICAgICAgICAgICAgcGxvdFR5cGU9e3Bsb3RUeXBlfVxuICAgICAgICAgICAgaXNFbmxhcmdlZD17aXNFbmxhcmdlZH1cbiAgICAgICAgICAgIG9uQnJ1c2g9eyh2YWwwLCB2YWwxKSA9PiB7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKFt0aGlzLl9yb3VuZFZhbFRvU3RlcCh2YWwwKSwgdGhpcy5fcm91bmRWYWxUb1N0ZXAodmFsMSldKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICByYW5nZT17cmFuZ2V9XG4gICAgICAgICAgICB2YWx1ZT17W3ZhbHVlMCwgdmFsdWUxXX1cbiAgICAgICAgICAgIHdpZHRoPXtwbG90V2lkdGh9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxTbGlkZXJXcmFwcGVyIHN0eWxlPXt7aGVpZ2h0fX0gY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyX19zbGlkZXJcIj5cbiAgICAgICAgICB7dGhpcy5wcm9wcy54QXhpcyA/IChcbiAgICAgICAgICAgIDx0aGlzLnByb3BzLnhBeGlzIHdpZHRoPXtwbG90V2lkdGh9IGRvbWFpbj17cmFuZ2V9IC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPFNsaWRlclxuICAgICAgICAgICAgc2hvd1ZhbHVlcz17ZmFsc2V9XG4gICAgICAgICAgICBpc1JhbmdlZD17aXNSYW5nZWR9XG4gICAgICAgICAgICBtaW5WYWx1ZT17cmFuZ2VbMF19XG4gICAgICAgICAgICBtYXhWYWx1ZT17cmFuZ2VbMV19XG4gICAgICAgICAgICB2YWx1ZTA9e3ZhbHVlMH1cbiAgICAgICAgICAgIHZhbHVlMT17dmFsdWUxfVxuICAgICAgICAgICAgc3RlcD17c3RlcH1cbiAgICAgICAgICAgIGhhbmRsZVdpZHRoPXtzbGlkZXJIYW5kbGVXaWR0aH1cbiAgICAgICAgICAgIG9uU2xpZGVyMENoYW5nZT17dGhpcy5fc2V0UmFuZ2VWYWwwfVxuICAgICAgICAgICAgb25TbGlkZXIxQ2hhbmdlPXt0aGlzLl9zZXRSYW5nZVZhbDF9XG4gICAgICAgICAgICBvblNsaWRlckJhckNoYW5nZT17KHZhbDAsIHZhbDEpID0+IHtcbiAgICAgICAgICAgICAgb25DaGFuZ2UoW3ZhbDAsIHZhbDFdKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBlbmFibGVCYXJEcmFnXG4gICAgICAgICAgLz5cbiAgICAgICAgICB7IWlzUmFuZ2VkICYmIHNob3dJbnB1dCA/IHRoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTEnKSA6IG51bGx9XG4gICAgICAgIDwvU2xpZGVyV3JhcHBlcj5cbiAgICAgICAge2lzUmFuZ2VkICYmIHNob3dJbnB1dCA/IChcbiAgICAgICAgICA8UmFuZ2VJbnB1dFdyYXBwZXIgY2xhc3NOYW1lPVwicmFuZ2Utc2xpZGVyX19pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAge3RoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTAnKX1cbiAgICAgICAgICAgIHt0aGlzLl9yZW5kZXJJbnB1dCgndmFsdWUxJyl9XG4gICAgICAgICAgPC9SYW5nZUlucHV0V3JhcHBlcj5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG4iXX0=