UNPKG

kepler.gl.geoiq

Version:

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

390 lines (326 loc) 48.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reselect = require("reselect"); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _reactSortableHoc = require("react-sortable-hoc"); var _reactModal = _interopRequireDefault(require("react-modal")); var _styledComponents2 = require("../../common/styled-components"); var _icons = require("../../common/icons"); var _colorPalette = _interopRequireDefault(require("./color-palette")); var _customPicker = _interopRequireDefault(require("./custom-picker")); var _dataUtils = require("../../../utils/data-utils"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9; 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; } } var dragHandleActive = (0, _styledComponents.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .layer__drag-handle {\n color: ", ";\n opacity: 1;\n cursor: move;\n }\n"])), function (props) { return props.theme.textColorHl; }); var StyledSortableItem = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n padding-top: 6px;\n padding-bottom: 6px;\n z-index: ", ";\n\n :not(.sorting) {\n :hover {\n background-color: ", ";\n ", "\n }\n }\n\n &.sorting-colors {\n background-color: ", ";\n ", "\n }\n"])), function (props) { return props.theme.dropdownWrapperZ + 1; }, function (props) { return props.theme.panelBackgroundHover; }, dragHandleActive, function (props) { return props.theme.panelBackgroundHover; }, dragHandleActive); var StyledDragHandle = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n opacity: 0;\n"]))); var StyledTrash = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n svg {\n :hover {\n color: ", ";\n }\n }\n height: 12px;\n margin-left: auto;\n margin-right: 12px;\n :hover {\n cursor: pointer;\n }\n"])), function (props) { return props.theme.textColor; }, function (props) { return props.theme.subtextColorActive; }); var StyledLine = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n width: calc(100% - 16px);\n height: 1px;\n background-color: ", ";\n margin-top: 8px;\n margin-left: 8px;\n"])), function (props) { return props.theme.labelColor; }); var StyledSwatch = _styledComponents["default"].div.attrs({ className: 'custom-palette__swatch' })(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n width: 32px;\n height: 18px;\n display: inline-block;\n :hover {\n box-shadow: ", ";\n cursor: pointer;\n }\n"])), function (props) { return props.color; }, function (props) { return props.theme.boxShadow; }); var StyledColorRange = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0 8px;\n :hover {\n background-color: ", ";\n cursor: pointer;\n }\n"])), function (props) { return props.theme.panelBackgroundHover; }); var StyledButtonContainer = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 11px;\n display: flex;\n direction: rtl;\n"]))); var StyledInlineInput = _styledComponents["default"].div(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 12px;\n input {\n color: ", ";\n font-size: 10px;\n }\n"])), function (props) { return props.theme.textColorHl; }); var SortableItem = (0, _reactSortableHoc.sortableElement)(function (_ref) { var children = _ref.children, isSorting = _ref.isSorting; return (/*#__PURE__*/_react["default"].createElement(StyledSortableItem, { className: (0, _classnames["default"])('custom-palette__sortable-items', { sorting: isSorting }) }, children) ); }); var SortableContainer = (0, _reactSortableHoc.sortableContainer)(function (_ref2) { var children = _ref2.children; return (/*#__PURE__*/_react["default"].createElement("div", null, children) ); }); var DragHandle = (0, _reactSortableHoc.sortableHandle)(function (_ref3) { var className = _ref3.className, children = _ref3.children; return (/*#__PURE__*/_react["default"].createElement(StyledDragHandle, { className: className }, children) ); }); var CustomPalette = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(CustomPalette, _Component); var _super = _createSuper(CustomPalette); function CustomPalette() { var _this; (0, _classCallCheck2["default"])(this, CustomPalette); 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", { // currentSwatchIndex: null, isSorting: false }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "root", (0, _react.createRef)()); // derive sketcher position based on root component (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "showSketcherSelector", function (props) { return props.showSketcher; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "themeSelector", function (props) { return props.theme; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "sketcherPosSelector", (0, _reselect.createSelector)(_this.showSketcherSelector, function (showSketcher) { var theme = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _this$props = _this.props, defaultSketcherPos = _this$props.defaultSketcherPos, bottomBuffer = _this$props.bottomBuffer, sketcherHeight = _this$props.sketcherHeight; if (showSketcher === false || !_this.root || !_this.root.current) return defaultSketcherPos; var _theme$sidePanelInner = theme.sidePanelInnerPadding, sidePanelInnerPadding = _theme$sidePanelInner === void 0 ? 16 : _theme$sidePanelInner, _theme$sidePanel = theme.sidePanel, sidePanel = _theme$sidePanel === void 0 ? {} : _theme$sidePanel, _theme$sidePanelScrol = theme.sidePanelScrollBarWidth, sidePanelScrollBarWidth = _theme$sidePanelScrol === void 0 ? 10 : _theme$sidePanelScrol; var sidePanelLeft = (sidePanel.margin || {}).left || 20; var offsetX = sidePanelInnerPadding + sidePanelLeft + sidePanelScrollBarWidth; // find component Root position var bounding = _this.root.current.getBoundingClientRect(); var x = bounding.x, y = bounding.y, width = bounding.width; // set the top so it won't collide with bottom widget var top = y + sketcherHeight <= window.innerHeight - bottomBuffer ? y : window.innerHeight - bottomBuffer - sketcherHeight; return { top: "".concat(top, "px"), left: "".concat(x + width + offsetX, "px") }; })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "modalStylesSelector", (0, _reselect.createSelector)(_this.themeSelector, _this.sketcherPosSelector, function (theme, sketcherPos) { return { content: { top: 0, left: 0, border: 0, right: 'auto', bottom: 'auto', padding: '0px 0px 0px 0px', borderRadius: theme.panelBorderRadius || '2px' }, overlay: _objectSpread(_objectSpread({}, sketcherPos), {}, { right: 'auto', bottom: 'auto', backgroundColor: 'rgba(0, 0, 0, 0)' }) }; })); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onPickerUpdate", function (color) { var colors = _this.props.customPalette.colors; var newColors = (0, _toConsumableArray2["default"])(colors); newColors[_this.props.showSketcher] = color.hex; _this._setColorPaletteUI(newColors); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onColorDelete", function (index) { var colors = _this.props.customPalette.colors; var newColors = (0, _toConsumableArray2["default"])(colors); if (newColors.length > 1) { newColors.splice(index, 1); } _this._setColorPaletteUI(newColors); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onColorAdd", function () { var colors = _this.props.customPalette.colors; // add the last color var newColors = [].concat((0, _toConsumableArray2["default"])(colors), [colors[colors.length - 1]]); _this._setColorPaletteUI(newColors); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSwatchClick", function (index) { _this.props.onToggleSketcher(index); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSwatchClose", function () { _this.props.onToggleSketcher(false); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onApply", function (event) { event.stopPropagation(); event.preventDefault(); _this.props.onCancel(); _this.props.onApply(_this.props.customPalette, event); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSortEnd", function (_ref4) { var oldIndex = _ref4.oldIndex, newIndex = _ref4.newIndex; var colors = _this.props.customPalette.colors; var newColors = (0, _dataUtils.arrayMove)(colors, oldIndex, newIndex); _this._setColorPaletteUI(newColors); _this.setState({ isSorting: false }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onSortStart", function () { _this.setState({ isSorting: true }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_inputColorHex", function (index, _ref5) { var value = _ref5.target.value; var colors = _this.props.customPalette.colors; var newColors = (0, _toConsumableArray2["default"])(colors); newColors[index] = value.toUpperCase(); _this._setColorPaletteUI(newColors); }); return _this; } (0, _createClass2["default"])(CustomPalette, [{ key: "_setColorPaletteUI", value: function _setColorPaletteUI(colors) { this.props.setCustomPalette({ colors: colors }); } }, { key: "render", value: function render() { var _this2 = this; var colors = this.props.customPalette.colors; var modalStyles = this.modalStylesSelector(this.props); return (/*#__PURE__*/_react["default"].createElement("div", { className: "custom-palette-panel", ref: this.root }, /*#__PURE__*/_react["default"].createElement(StyledColorRange, null, /*#__PURE__*/_react["default"].createElement(_colorPalette["default"], { colors: colors })), /*#__PURE__*/_react["default"].createElement(SortableContainer, { className: "custom-palette-container", onSortEnd: this._onSortEnd, onSortStart: this._onSortStart, lockAxis: "y", helperClass: "sorting-colors", useDragHandle: true }, colors.map(function (color, index) { return (/*#__PURE__*/_react["default"].createElement(SortableItem, { key: index, index: index, isSorting: _this2.state.isSorting }, /*#__PURE__*/_react["default"].createElement(DragHandle, { className: "layer__drag-handle" }, /*#__PURE__*/_react["default"].createElement(_icons.VertDots, { height: "20px" })), /*#__PURE__*/_react["default"].createElement(StyledSwatch, { color: color, onClick: function onClick(e) { return _this2._onSwatchClick(index, e); } }), /*#__PURE__*/_react["default"].createElement(StyledInlineInput, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.InlineInput, { type: "text", className: "custom-palette-hex__input", value: color.toUpperCase(), onClick: function onClick(e) { e.stopPropagation(); }, onChange: function onChange(e) { return _this2._inputColorHex(index, e); }, id: "input-layer-label" })), /*#__PURE__*/_react["default"].createElement(StyledTrash, { onClick: function onClick() { return _this2._onColorDelete(index); } }, /*#__PURE__*/_react["default"].createElement(_icons.Trash, { className: "trashbin" }))) ); })), /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, { className: "add-step__button", link: true, onClick: this._onColorAdd }, "+ Add Step"), /*#__PURE__*/_react["default"].createElement(StyledLine, null), /*#__PURE__*/_react["default"].createElement(StyledButtonContainer, null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, { className: "confirm-apply__button", link: true, onClick: this._onApply }, "Confirm"), /*#__PURE__*/_react["default"].createElement(_styledComponents2.Button, { link: true, onClick: this.props.onCancel }, ' ', "Cancel")), this.props.showSketcher !== false ? /*#__PURE__*/_react["default"].createElement(_reactModal["default"], { isOpen: true, style: modalStyles, ariaHideApp: false, parentSelector: function parentSelector() { // React modal issue: https://github.com/reactjs/react-modal/issues/769 // failed to execute removeChild on parent node when it is already unmounted return _this2.root.current || { removeChild: function removeChild() {}, appendChild: function appendChild() {} }; } }, /*#__PURE__*/_react["default"].createElement(_customPicker["default"], { color: colors[this.props.showSketcher], onChange: this._onPickerUpdate, onSwatchClose: this._onSwatchClose })) : null) ); } }]); return CustomPalette; }(_react.Component); (0, _defineProperty2["default"])(CustomPalette, "propTypes", { customPalette: _propTypes["default"].shape({ name: _propTypes["default"].string, type: _propTypes["default"].string, category: _propTypes["default"].string, colors: _propTypes["default"].arrayOf(_propTypes["default"].string) }), setCustomPalette: _propTypes["default"].func, showSketcher: _propTypes["default"].oneOfType([_propTypes["default"].bool, _propTypes["default"].number]), theme: _propTypes["default"].object, defaultSketcherPos: _propTypes["default"].object, sketcherHeight: _propTypes["default"].number, bottomBuffer: _propTypes["default"].number }); (0, _defineProperty2["default"])(CustomPalette, "defaultProps", { defaultSketcherPos: { top: '320px', left: '320px' }, sketcherHeight: 228, bottomBuffer: 212 }); var _default = exports["default"] = (0, _styledComponents.withTheme)(CustomPalette); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvbGF5ZXItcGFuZWwvY3VzdG9tLXBhbGV0dGUuanMiXSwibmFtZXMiOlsiZHJhZ0hhbmRsZUFjdGl2ZSIsImNzcyIsInByb3BzIiwidGhlbWUiLCJ0ZXh0Q29sb3JIbCIsIlN0eWxlZFNvcnRhYmxlSXRlbSIsInN0eWxlZCIsImRpdiIsImRyb3Bkb3duV3JhcHBlcloiLCJwYW5lbEJhY2tncm91bmRIb3ZlciIsIlN0eWxlZERyYWdIYW5kbGUiLCJTdHlsZWRUcmFzaCIsInRleHRDb2xvciIsInN1YnRleHRDb2xvckFjdGl2ZSIsIlN0eWxlZExpbmUiLCJsYWJlbENvbG9yIiwiU3R5bGVkU3dhdGNoIiwiYXR0cnMiLCJjbGFzc05hbWUiLCJjb2xvciIsImJveFNoYWRvdyIsIlN0eWxlZENvbG9yUmFuZ2UiLCJTdHlsZWRCdXR0b25Db250YWluZXIiLCJTdHlsZWRJbmxpbmVJbnB1dCIsIlNvcnRhYmxlSXRlbSIsImNoaWxkcmVuIiwiaXNTb3J0aW5nIiwic29ydGluZyIsIlNvcnRhYmxlQ29udGFpbmVyIiwiRHJhZ0hhbmRsZSIsIkN1c3RvbVBhbGV0dGUiLCJzaG93U2tldGNoZXIiLCJzaG93U2tldGNoZXJTZWxlY3RvciIsImRlZmF1bHRTa2V0Y2hlclBvcyIsImJvdHRvbUJ1ZmZlciIsInNrZXRjaGVySGVpZ2h0Iiwicm9vdCIsImN1cnJlbnQiLCJzaWRlUGFuZWxJbm5lclBhZGRpbmciLCJzaWRlUGFuZWwiLCJzaWRlUGFuZWxTY3JvbGxCYXJXaWR0aCIsInNpZGVQYW5lbExlZnQiLCJtYXJnaW4iLCJsZWZ0Iiwib2Zmc2V0WCIsImJvdW5kaW5nIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwieCIsInkiLCJ3aWR0aCIsInRvcCIsIndpbmRvdyIsImlubmVySGVpZ2h0IiwidGhlbWVTZWxlY3RvciIsInNrZXRjaGVyUG9zU2VsZWN0b3IiLCJza2V0Y2hlclBvcyIsImNvbnRlbnQiLCJib3JkZXIiLCJyaWdodCIsImJvdHRvbSIsInBhZGRpbmciLCJib3JkZXJSYWRpdXMiLCJwYW5lbEJvcmRlclJhZGl1cyIsIm92ZXJsYXkiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjb2xvcnMiLCJjdXN0b21QYWxldHRlIiwibmV3Q29sb3JzIiwiaGV4IiwiX3NldENvbG9yUGFsZXR0ZVVJIiwiaW5kZXgiLCJsZW5ndGgiLCJzcGxpY2UiLCJvblRvZ2dsZVNrZXRjaGVyIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsIm9uQ2FuY2VsIiwib25BcHBseSIsIm9sZEluZGV4IiwibmV3SW5kZXgiLCJzZXRTdGF0ZSIsInZhbHVlIiwidGFyZ2V0IiwidG9VcHBlckNhc2UiLCJzZXRDdXN0b21QYWxldHRlIiwibW9kYWxTdHlsZXMiLCJtb2RhbFN0eWxlc1NlbGVjdG9yIiwiX29uU29ydEVuZCIsIl9vblNvcnRTdGFydCIsIm1hcCIsInN0YXRlIiwiZSIsIl9vblN3YXRjaENsaWNrIiwiX2lucHV0Q29sb3JIZXgiLCJfb25Db2xvckRlbGV0ZSIsIl9vbkNvbG9yQWRkIiwiX29uQXBwbHkiLCJyZW1vdmVDaGlsZCIsImFwcGVuZENoaWxkIiwiX29uUGlja2VyVXBkYXRlIiwiX29uU3dhdGNoQ2xvc2UiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJzaGFwZSIsIm5hbWUiLCJzdHJpbmciLCJ0eXBlIiwiY2F0ZWdvcnkiLCJhcnJheU9mIiwiZnVuYyIsIm9uZU9mVHlwZSIsImJvb2wiLCJudW1iZXIiLCJvYmplY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsZ0JBQWdCLE9BQUdDLHFCQUFILDhLQUVULFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FB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Q29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBzdHlsZWQsIHt3aXRoVGhlbWUsIGNzc30gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgc29ydGFibGVDb250YWluZXIsXG4gIHNvcnRhYmxlRWxlbWVudCxcbiAgc29ydGFibGVIYW5kbGVcbn0gZnJvbSAncmVhY3Qtc29ydGFibGUtaG9jJztcbmltcG9ydCBNb2RhbCBmcm9tICdyZWFjdC1tb2RhbCc7XG5cbmltcG9ydCB7QnV0dG9uLCBJbmxpbmVJbnB1dH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtWZXJ0RG90cywgVHJhc2h9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCBDb2xvclBhbGV0dGUgZnJvbSAnLi9jb2xvci1wYWxldHRlJztcbmltcG9ydCBDdXN0b21QaWNrZXIgZnJvbSAnLi9jdXN0b20tcGlja2VyJztcbmltcG9ydCB7YXJyYXlNb3ZlfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcblxuY29uc3QgZHJhZ0hhbmRsZUFjdGl2ZSA9IGNzc2BcbiAgLmxheWVyX19kcmFnLWhhbmRsZSB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIG9wYWNpdHk6IDE7XG4gICAgY3Vyc29yOiBtb3ZlO1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRTb3J0YWJsZUl0ZW0gPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nLXRvcDogNnB4O1xuICBwYWRkaW5nLWJvdHRvbTogNnB4O1xuICB6LWluZGV4OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmRyb3Bkb3duV3JhcHBlclogKyAxfTtcblxuICA6bm90KC5zb3J0aW5nKSB7XG4gICAgOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuICAgICAgJHtkcmFnSGFuZGxlQWN0aXZlfVxuICAgIH1cbiAgfVxuXG4gICYuc29ydGluZy1jb2xvcnMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kSG92ZXJ9O1xuICAgICR7ZHJhZ0hhbmRsZUFjdGl2ZX1cbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRHJhZ0hhbmRsZSA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIG9wYWNpdHk6IDA7XG5gO1xuXG5jb25zdCBTdHlsZWRUcmFzaCA9IHN0eWxlZC5kaXZgXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gIHN2ZyB7XG4gICAgOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvckFjdGl2ZX07XG4gICAgfVxuICB9XG4gIGhlaWdodDogMTJweDtcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogMTJweDtcbiAgOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZExpbmUgPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogY2FsYygxMDAlIC0gMTZweCk7XG4gIGhlaWdodDogMXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxhYmVsQ29sb3J9O1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIG1hcmdpbi1sZWZ0OiA4cHg7XG5gO1xuXG5jb25zdCBTdHlsZWRTd2F0Y2ggPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnY3VzdG9tLXBhbGV0dGVfX3N3YXRjaCdcbn0pYFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLmNvbG9yfTtcbiAgd2lkdGg6IDMycHg7XG4gIGhlaWdodDogMThweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICA6aG92ZXIge1xuICAgIGJveC1zaGFkb3c6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYm94U2hhZG93fTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZENvbG9yUmFuZ2UgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nOiAwIDhweDtcbiAgOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZEhvdmVyfTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEJ1dHRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi10b3A6IDExcHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpcmVjdGlvbjogcnRsO1xuYDtcblxuY29uc3QgU3R5bGVkSW5saW5lSW5wdXQgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tbGVmdDogMTJweDtcbiAgaW5wdXQge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckhsfTtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gIH1cbmA7XG5cbmNvbnN0IFNvcnRhYmxlSXRlbSA9IHNvcnRhYmxlRWxlbWVudCgoe2NoaWxkcmVuLCBpc1NvcnRpbmd9KSA9PiAoXG4gIDxTdHlsZWRTb3J0YWJsZUl0ZW1cbiAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ2N1c3RvbS1wYWxldHRlX19zb3J0YWJsZS1pdGVtcycsIHtzb3J0aW5nOiBpc1NvcnRpbmd9KX1cbiAgPlxuICAgIHtjaGlsZHJlbn1cbiAgPC9TdHlsZWRTb3J0YWJsZUl0ZW0+XG4pKTtcblxuY29uc3QgU29ydGFibGVDb250YWluZXIgPSBzb3J0YWJsZUNvbnRhaW5lcigoe2NoaWxkcmVufSkgPT4gKFxuICA8ZGl2PntjaGlsZHJlbn08L2Rpdj5cbikpO1xuXG5jb25zdCBEcmFnSGFuZGxlID0gc29ydGFibGVIYW5kbGUoKHtjbGFzc05hbWUsIGNoaWxkcmVufSkgPT4gKFxuICA8U3R5bGVkRHJhZ0hhbmRsZSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+e2NoaWxkcmVufTwvU3R5bGVkRHJhZ0hhbmRsZT5cbikpO1xuXG5jbGFzcyBDdXN0b21QYWxldHRlIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBjdXN0b21QYWxldHRlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHR5cGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBjYXRlZ29yeTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIGNvbG9yczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZylcbiAgICB9KSxcbiAgICBzZXRDdXN0b21QYWxldHRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBzaG93U2tldGNoZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgdGhlbWU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgZGVmYXVsdFNrZXRjaGVyUG9zOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHNrZXRjaGVySGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIGJvdHRvbUJ1ZmZlcjogUHJvcFR5cGVzLm51bWJlclxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZGVmYXVsdFNrZXRjaGVyUG9zOiB7dG9wOiAnMzIwcHgnLCBsZWZ0OiAnMzIwcHgnfSxcbiAgICBza2V0Y2hlckhlaWdodDogMjI4LFxuICAgIGJvdHRvbUJ1ZmZlcjogMjEyXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgLy8gY3VycmVudFN3YXRjaEluZGV4OiBudWxsLFxuICAgIGlzU29ydGluZzogZmFsc2VcbiAgfTtcblxuICByb290ID0gY3JlYXRlUmVmKCk7XG5cbiAgLy8gZGVyaXZlIHNrZXRjaGVyIHBvc2l0aW9uIGJhc2VkIG9uIHJvb3QgY29tcG9uZW50XG4gIHNob3dTa2V0Y2hlclNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuc2hvd1NrZXRjaGVyO1xuICB0aGVtZVNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMudGhlbWU7XG4gIHNrZXRjaGVyUG9zU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLnNob3dTa2V0Y2hlclNlbGVjdG9yLFxuICAgIChzaG93U2tldGNoZXIsIHRoZW1lID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHtkZWZhdWx0U2tldGNoZXJQb3MsIGJvdHRvbUJ1ZmZlciwgc2tldGNoZXJIZWlnaHR9ID0gdGhpcy5wcm9wcztcbiAgICAgIGlmIChzaG93U2tldGNoZXIgPT09IGZhbHNlIHx8ICF0aGlzLnJvb3QgfHwgIXRoaXMucm9vdC5jdXJyZW50KVxuICAgICAgICByZXR1cm4gZGVmYXVsdFNrZXRjaGVyUG9zO1xuICAgICAgY29uc3Qge3NpZGVQYW5lbElubmVyUGFkZGluZyA9IDE2LCBzaWRlUGFuZWwgPSB7fSwgc2lkZVBhbmVsU2Nyb2xsQmFyV2lkdGggPSAxMH0gPSB0aGVtZTtcbiAgICAgIGNvbnN0IHNpZGVQYW5lbExlZnQgPSAoc2lkZVBhbmVsLm1hcmdpbiB8fCB7fSkubGVmdCB8fCAyMDtcbiAgICAgIGNvbnN0IG9mZnNldFggPSBzaWRlUGFuZWxJbm5lclBhZGRpbmcgKyBzaWRlUGFuZWxMZWZ0ICsgc2lkZVBhbmVsU2Nyb2xsQmFyV2lkdGg7XG4gICAgICAvLyBmaW5kIGNvbXBvbmVudCBSb290IHBvc2l0aW9uXG4gICAgICBjb25zdCBib3VuZGluZyA9IHRoaXMucm9vdC5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qge3gsIHksIHdpZHRofSA9IGJvdW5kaW5nO1xuXG4gICAgICAvLyBzZXQgdGhlIHRvcCBzbyBpdCB3b24ndCBjb2xsaWRlIHdpdGggYm90dG9tIHdpZGdldFxuICAgICAgY29uc3QgdG9wID1cbiAgICAgICAgeSArIHNrZXRjaGVySGVpZ2h0IDw9IHdpbmRvdy5pbm5lckhlaWdodCAtIGJvdHRvbUJ1ZmZlclxuICAgICAgICAgID8geVxuICAgICAgICAgIDogd2luZG93LmlubmVySGVpZ2h0IC0gYm90dG9tQnVmZmVyIC0gc2tldGNoZXJIZWlnaHQ7XG5cbiAgICAgIHJldHVybiB7dG9wOiBgJHt0b3B9cHhgLCBsZWZ0OiBgJHt4ICsgd2lkdGggKyBvZmZzZXRYfXB4YH07XG4gICAgfVxuICApO1xuXG4gIG1vZGFsU3R5bGVzU2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICB0aGlzLnRoZW1lU2VsZWN0b3IsXG4gICAgdGhpcy5za2V0Y2hlclBvc1NlbGVjdG9yLFxuICAgICh0aGVtZSwgc2tldGNoZXJQb3MpID0+ICh7XG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICBib3R0b206ICdhdXRvJyxcbiAgICAgICAgcGFkZGluZzogJzBweCAwcHggMHB4IDBweCcsXG4gICAgICAgIGJvcmRlclJhZGl1czogdGhlbWUucGFuZWxCb3JkZXJSYWRpdXMgfHwgJzJweCdcbiAgICAgIH0sXG4gICAgICBvdmVybGF5OiB7XG4gICAgICAgIC4uLnNrZXRjaGVyUG9zLFxuICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICBib3R0b206ICdhdXRvJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLCAwLCAwLCAwKSdcbiAgICAgIH1cbiAgICB9KVxuICApXG4gIF9zZXRDb2xvclBhbGV0dGVVSShjb2xvcnMpIHtcbiAgICB0aGlzLnByb3BzLnNldEN1c3RvbVBhbGV0dGUoe1xuICAgICAgY29sb3JzXG4gICAgfSk7XG4gIH1cblxuICBfb25QaWNrZXJVcGRhdGUgPSBjb2xvciA9PiB7XG4gICAgY29uc3Qge2NvbG9yc30gPSB0aGlzLnByb3BzLmN1c3RvbVBhbGV0dGU7XG4gICAgY29uc3QgbmV3Q29sb3JzID0gWy4uLmNvbG9yc107XG4gICAgbmV3Q29sb3JzW3RoaXMucHJvcHMuc2hvd1NrZXRjaGVyXSA9IGNvbG9yLmhleDtcbiAgICB0aGlzLl9zZXRDb2xvclBhbGV0dGVVSShuZXdDb2xvcnMpO1xuICB9O1xuXG4gIF9vbkNvbG9yRGVsZXRlID0gaW5kZXggPT4ge1xuICAgIGNvbnN0IHtjb2xvcnN9ID0gdGhpcy5wcm9wcy5jdXN0b21QYWxldHRlO1xuICAgIGNvbnN0IG5ld0NvbG9ycyA9IFsuLi5jb2xvcnNdO1xuICAgIGlmIChuZXdDb2xvcnMubGVuZ3RoID4gMSkge1xuICAgICAgbmV3Q29sb3JzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMuX3NldENvbG9yUGFsZXR0ZVVJKG5ld0NvbG9ycyk7XG4gIH07XG5cbiAgX29uQ29sb3JBZGQgPSAoKSA9PiB7XG4gICAgY29uc3Qge2NvbG9yc30gPSB0aGlzLnByb3BzLmN1c3RvbVBhbGV0dGU7XG4gICAgLy8gYWRkIHRoZSBsYXN0IGNvbG9yXG4gICAgY29uc3QgbmV3Q29sb3JzID0gWy4uLmNvbG9ycywgY29sb3JzW2NvbG9ycy5sZW5ndGggLSAxXV07XG4gICAgdGhpcy5fc2V0Q29sb3JQYWxldHRlVUkobmV3Q29sb3JzKTtcbiAgfTtcblxuICBfb25Td2F0Y2hDbGljayA9IChpbmRleCkgPT4ge1xuICAgIHRoaXMucHJvcHMub25Ub2dnbGVTa2V0Y2hlcihpbmRleCk7XG4gIH07XG5cbiAgX29uU3dhdGNoQ2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5wcm9wcy5vblRvZ2dsZVNrZXRjaGVyKGZhbHNlKTtcbiAgfTtcblxuICBfb25BcHBseSA9IGV2ZW50ID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucHJvcHMub25DYW5jZWwoKTtcbiAgICB0aGlzLnByb3BzLm9uQXBwbHkodGhpcy5wcm9wcy5jdXN0b21QYWxldHRlLCBldmVudCk7XG4gIH07XG5cbiAgX29uU29ydEVuZCA9ICh7b2xkSW5kZXgsIG5ld0luZGV4fSkgPT4ge1xuICAgIGNvbnN0IHtjb2xvcnN9ID0gdGhpcy5wcm9wcy5jdXN0b21QYWxldHRlO1xuICAgIGNvbnN0IG5ld0NvbG9ycyA9IGFycmF5TW92ZShjb2xvcnMsIG9sZEluZGV4LCBuZXdJbmRleCk7XG4gICAgdGhpcy5fc2V0Q29sb3JQYWxldHRlVUkobmV3Q29sb3JzKTtcbiAgICB0aGlzLnNldFN0YXRlKHtpc1NvcnRpbmc6IGZhbHNlfSk7XG4gIH07XG5cbiAgX29uU29ydFN0YXJ0ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe2lzU29ydGluZzogdHJ1ZX0pO1xuICB9O1xuXG4gIF9pbnB1dENvbG9ySGV4ID0gKGluZGV4LCB7dGFyZ2V0OiB7dmFsdWV9fSkgPT4ge1xuICAgIGNvbnN0IHtjb2xvcnN9ID0gdGhpcy5wcm9wcy5jdXN0b21QYWxldHRlO1xuICAgIGNvbnN0IG5ld0NvbG9ycyA9IFsuLi5jb2xvcnNdO1xuICAgIG5ld0NvbG9yc1tpbmRleF0gPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMuX3NldENvbG9yUGFsZXR0ZVVJKG5ld0NvbG9ycyk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtjb2xvcnN9ID0gdGhpcy5wcm9wcy5jdXN0b21QYWxldHRlO1xuICAgIGNvbnN0IG1vZGFsU3R5bGVzID0gdGhpcy5tb2RhbFN0eWxlc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY3VzdG9tLXBhbGV0dGUtcGFuZWxcIiByZWY9e3RoaXMucm9vdH0+XG4gICAgICAgIDxTdHlsZWRDb2xvclJhbmdlPlxuICAgICAgICAgIDxDb2xvclBhbGV0dGUgY29sb3JzPXtjb2xvcnN9IC8+XG4gICAgICAgIDwvU3R5bGVkQ29sb3JSYW5nZT5cbiAgICAgICAgPFNvcnRhYmxlQ29udGFpbmVyXG4gICAgICAgICAgY2xhc3NOYW1lPVwiY3VzdG9tLXBhbGV0dGUtY29udGFpbmVyXCJcbiAgICAgICAgICBvblNvcnRFbmQ9e3RoaXMuX29uU29ydEVuZH1cbiAgICAgICAgICBvblNvcnRTdGFydD17dGhpcy5fb25Tb3J0U3RhcnR9XG4gICAgICAgICAgbG9ja0F4aXM9XCJ5XCJcbiAgICAgICAgICBoZWxwZXJDbGFzcz1cInNvcnRpbmctY29sb3JzXCJcbiAgICAgICAgICB1c2VEcmFnSGFuZGxlXG4gICAgICAgID5cbiAgICAgICAgICB7Y29sb3JzLm1hcCgoY29sb3IsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICA8U29ydGFibGVJdGVtXG4gICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgaXNTb3J0aW5nPXt0aGlzLnN0YXRlLmlzU29ydGluZ31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPERyYWdIYW5kbGUgY2xhc3NOYW1lPVwibGF5ZXJfX2RyYWctaGFuZGxlXCI+XG4gICAgICAgICAgICAgICAgPFZlcnREb3RzIGhlaWdodD1cIjIwcHhcIiAvPlxuICAgICAgICAgICAgICA8L0RyYWdIYW5kbGU+XG4gICAgICAgICAgICAgIDxTdHlsZWRTd2F0Y2hcbiAgICAgICAgICAgICAgICBjb2xvcj17Y29sb3J9XG4gICAgICAgICAgICAgICAgb25DbGljaz17ZSA9PiB0aGlzLl9vblN3YXRjaENsaWNrKGluZGV4LCBlKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPFN0eWxlZElubGluZUlucHV0PlxuICAgICAgICAgICAgICAgIDxJbmxpbmVJbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY3VzdG9tLXBhbGV0dGUtaGV4X19pbnB1dFwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17Y29sb3IudG9VcHBlckNhc2UoKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHRoaXMuX2lucHV0Q29sb3JIZXgoaW5kZXgsIGUpfVxuICAgICAgICAgICAgICAgICAgaWQ9XCJpbnB1dC1sYXllci1sYWJlbFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9TdHlsZWRJbmxpbmVJbnB1dD5cbiAgICAgICAgICAgICAgPFN0eWxlZFRyYXNoIG9uQ2xpY2s9eygpID0+IHRoaXMuX29uQ29sb3JEZWxldGUoaW5kZXgpfT5cbiAgICAgICAgICAgICAgICA8VHJhc2ggY2xhc3NOYW1lPVwidHJhc2hiaW5cIiAvPlxuICAgICAgICAgICAgICA8L1N0eWxlZFRyYXNoPlxuICAgICAgICAgICAgPC9Tb3J0YWJsZUl0ZW0+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvU29ydGFibGVDb250YWluZXI+XG4gICAgICAgIHsvKiBBZGQgU3RlcCBCdXR0b24gKi99XG4gICAgICAgIDxCdXR0b24gY2xhc3NOYW1lPVwiYWRkLXN0ZXBfX2J1dHRvblwiIGxpbmsgb25DbGljaz17dGhpcy5fb25Db2xvckFkZH0+XG4gICAgICAgICAgKyBBZGQgU3RlcFxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPFN0eWxlZExpbmUgLz5cbiAgICAgICAgey8qIENhbmNlbCBvciBDb25maXJtIEJ1dHRvbnMgKi99XG4gICAgICAgIDxTdHlsZWRCdXR0b25Db250YWluZXI+XG4gICAgICAgICAgPEJ1dHRvbiBjbGFzc05hbWU9XCJjb25maXJtLWFwcGx5X19idXR0b25cIiBsaW5rIG9uQ2xpY2s9e3RoaXMuX29uQXBwbHl9PlxuICAgICAgICAgICAgQ29uZmlybVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b24gbGluayBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2FuY2VsfT5cbiAgICAgICAgICAgIHsnICd9XG4gICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9TdHlsZWRCdXR0b25Db250YWluZXI+XG4gICAgICAgIHt0aGlzLnByb3BzLnNob3dTa2V0Y2hlciAhPT0gZmFsc2UgPyAoXG4gICAgICAgICAgPE1vZGFsXG4gICAgICAgICAgICBpc09wZW5cbiAgICAgICAgICAgIHN0eWxlPXttb2RhbFN0eWxlc31cbiAgICAgICAgICAgIGFyaWFIaWRlQXBwPXtmYWxzZX1cbiAgICAgICAgICAgIHBhcmVudFNlbGVjdG9yPXsoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFJlYWN0IG1vZGFsIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1tb2RhbC9pc3N1ZXMvNzY5XG4gICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBleGVjdXRlIHJlbW92ZUNoaWxkIG9uIHBhcmVudCBub2RlIHdoZW4gaXQgaXMgYWxyZWFkeSB1bm1vdW50ZWRcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jdXJyZW50IHx8IHtcbiAgICAgICAgICAgICAgICByZW1vdmVDaGlsZDogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgYXBwZW5kQ2hpbGQ6ICgpID0+IHt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEN1c3RvbVBpY2tlclxuICAgICAgICAgICAgICBjb2xvcj17Y29sb3JzW3RoaXMucHJvcHMuc2hvd1NrZXRjaGVyXX1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX29uUGlja2VyVXBkYXRlfVxuICAgICAgICAgICAgICBvblN3YXRjaENsb3NlPXt0aGlzLl9vblN3YXRjaENsb3NlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L01vZGFsPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFRoZW1lKEN1c3RvbVBhbGV0dGUpO1xuIl19