"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_recharts_es6_component_Cell_js-node_modules_recharts_es6_component_Curso-e8e03b"],{ /***/ "../../../node_modules/recharts/es6/component/Cell.js": /*!************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Cell.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cell: () => (/* binding */ Cell) /* harmony export */ }); /** * @fileOverview Cross */ var Cell = function Cell(_props) { return null; }; Cell.displayName = 'Cell'; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Cursor.js": /*!**************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Cursor.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Cursor: () => (/* binding */ Cursor) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _shape_Curve__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shape/Curve */ "../../../node_modules/recharts/es6/shape/Curve.js"); /* harmony import */ var _shape_Cross__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shape/Cross */ "../../../node_modules/recharts/es6/shape/Cross.js"); /* harmony import */ var _util_cursor_getCursorRectangle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/cursor/getCursorRectangle */ "../../../node_modules/recharts/es6/util/cursor/getCursorRectangle.js"); /* harmony import */ var _shape_Rectangle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shape/Rectangle */ "../../../node_modules/recharts/es6/shape/Rectangle.js"); /* harmony import */ var _util_cursor_getRadialCursorPoints__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/cursor/getRadialCursorPoints */ "../../../node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js"); /* harmony import */ var _shape_Sector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../shape/Sector */ "../../../node_modules/recharts/es6/shape/Sector.js"); /* harmony import */ var _util_cursor_getCursorPoints__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/cursor/getCursorPoints */ "../../../node_modules/recharts/es6/util/cursor/getCursorPoints.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 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) { _defineProperty(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 _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* * Cursor is the background, or a highlight, * that shows when user mouses over or activates * an area. * * It usually shows together with a tooltip * to emphasise which part of the chart does the tooltip refer to. */ function Cursor(props) { var _element$props$cursor, _defaultProps; var element = props.element, tooltipEventType = props.tooltipEventType, isActive = props.isActive, activeCoordinate = props.activeCoordinate, activePayload = props.activePayload, offset = props.offset, activeTooltipIndex = props.activeTooltipIndex, tooltipAxisBandSize = props.tooltipAxisBandSize, layout = props.layout, chartName = props.chartName; var elementPropsCursor = (_element$props$cursor = element.props.cursor) !== null && _element$props$cursor !== void 0 ? _element$props$cursor : (_defaultProps = element.type.defaultProps) === null || _defaultProps === void 0 ? void 0 : _defaultProps.cursor; if (!element || !elementPropsCursor || !isActive || !activeCoordinate || chartName !== 'ScatterChart' && tooltipEventType !== 'axis') { return null; } var restProps; var cursorComp = _shape_Curve__WEBPACK_IMPORTED_MODULE_2__.Curve; if (chartName === 'ScatterChart') { restProps = activeCoordinate; cursorComp = _shape_Cross__WEBPACK_IMPORTED_MODULE_3__.Cross; } else if (chartName === 'BarChart') { restProps = (0,_util_cursor_getCursorRectangle__WEBPACK_IMPORTED_MODULE_4__.getCursorRectangle)(layout, activeCoordinate, offset, tooltipAxisBandSize); cursorComp = _shape_Rectangle__WEBPACK_IMPORTED_MODULE_5__.Rectangle; } else if (layout === 'radial') { var _getRadialCursorPoint = (0,_util_cursor_getRadialCursorPoints__WEBPACK_IMPORTED_MODULE_6__.getRadialCursorPoints)(activeCoordinate), cx = _getRadialCursorPoint.cx, cy = _getRadialCursorPoint.cy, radius = _getRadialCursorPoint.radius, startAngle = _getRadialCursorPoint.startAngle, endAngle = _getRadialCursorPoint.endAngle; restProps = { cx: cx, cy: cy, startAngle: startAngle, endAngle: endAngle, innerRadius: radius, outerRadius: radius }; cursorComp = _shape_Sector__WEBPACK_IMPORTED_MODULE_7__.Sector; } else { restProps = { points: (0,_util_cursor_getCursorPoints__WEBPACK_IMPORTED_MODULE_8__.getCursorPoints)(layout, activeCoordinate, offset) }; cursorComp = _shape_Curve__WEBPACK_IMPORTED_MODULE_2__.Curve; } var cursorProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({ stroke: '#ccc', pointerEvents: 'none' }, offset), restProps), (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_9__.filterProps)(elementPropsCursor, false)), {}, { payload: activePayload, payloadIndex: activeTooltipIndex, className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-tooltip-cursor', elementPropsCursor.className) }); return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(elementPropsCursor) ? /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(elementPropsCursor, cursorProps) : /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(cursorComp, cursorProps); } /***/ }), /***/ "../../../node_modules/recharts/es6/component/DefaultLegendContent.js": /*!****************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/DefaultLegendContent.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DefaultLegendContent: () => (/* binding */ DefaultLegendContent) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _container_Surface__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../container/Surface */ "../../../node_modules/recharts/es6/container/Surface.js"); /* harmony import */ var _shape_Symbols__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shape/Symbols */ "../../../node_modules/recharts/es6/shape/Symbols.js"); /* harmony import */ var _util_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/types */ "../../../node_modules/recharts/es6/util/types.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 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) { _defineProperty(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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @fileOverview Default Legend Content */ var SIZE = 32; var DefaultLegendContent = /*#__PURE__*/function (_PureComponent) { function DefaultLegendContent() { _classCallCheck(this, DefaultLegendContent); return _callSuper(this, DefaultLegendContent, arguments); } _inherits(DefaultLegendContent, _PureComponent); return _createClass(DefaultLegendContent, [{ key: "renderIcon", value: /** * Render the path of icon * @param {Object} data Data of each legend item * @return {String} Path element */ function renderIcon(data) { var inactiveColor = this.props.inactiveColor; var halfSize = SIZE / 2; var sixthSize = SIZE / 6; var thirdSize = SIZE / 3; var color = data.inactive ? inactiveColor : data.color; if (data.type === 'plainline') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("line", { strokeWidth: 4, fill: "none", stroke: color, strokeDasharray: data.payload.strokeDasharray, x1: 0, y1: halfSize, x2: SIZE, y2: halfSize, className: "recharts-legend-icon" }); } if (data.type === 'line') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { strokeWidth: 4, fill: "none", stroke: color, d: "M0,".concat(halfSize, "h").concat(thirdSize, "\n A").concat(sixthSize, ",").concat(sixthSize, ",0,1,1,").concat(2 * thirdSize, ",").concat(halfSize, "\n H").concat(SIZE, "M").concat(2 * thirdSize, ",").concat(halfSize, "\n A").concat(sixthSize, ",").concat(sixthSize, ",0,1,1,").concat(thirdSize, ",").concat(halfSize), className: "recharts-legend-icon" }); } if (data.type === 'rect') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { stroke: "none", fill: color, d: "M0,".concat(SIZE / 8, "h").concat(SIZE, "v").concat(SIZE * 3 / 4, "h").concat(-SIZE, "z"), className: "recharts-legend-icon" }); } if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(data.legendIcon)) { var iconProps = _objectSpread({}, data); delete iconProps.legendIcon; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(data.legendIcon, iconProps); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_shape_Symbols__WEBPACK_IMPORTED_MODULE_3__.Symbols, { fill: color, cx: halfSize, cy: halfSize, size: SIZE, sizeType: "diameter", type: data.type }); } /** * Draw items of legend * @return {ReactElement} Items */ }, { key: "renderItems", value: function renderItems() { var _this = this; var _this$props = this.props, payload = _this$props.payload, iconSize = _this$props.iconSize, layout = _this$props.layout, formatter = _this$props.formatter, inactiveColor = _this$props.inactiveColor; var viewBox = { x: 0, y: 0, width: SIZE, height: SIZE }; var itemStyle = { display: layout === 'horizontal' ? 'inline-block' : 'block', marginRight: 10 }; var svgStyle = { display: 'inline-block', verticalAlign: 'middle', marginRight: 4 }; return payload.map(function (entry, i) { var finalFormatter = entry.formatter || formatter; var className = (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(_defineProperty(_defineProperty({ 'recharts-legend-item': true }, "legend-item-".concat(i), true), "inactive", entry.inactive)); if (entry.type === 'none') { return null; } // Do not render entry.value as functions. Always require static string properties. var entryValue = !lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(entry.value) ? entry.value : null; (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_4__.warn)(!lodash_isFunction__WEBPACK_IMPORTED_MODULE_1___default()(entry.value), "The name property is also required when using a function for the dataKey of a chart's cartesian components. Ex: " // eslint-disable-line max-len ); var color = entry.inactive ? inactiveColor : entry.color; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", _extends({ className: className, style: itemStyle // eslint-disable-next-line react/no-array-index-key , key: "legend-item-".concat(i) }, (0,_util_types__WEBPACK_IMPORTED_MODULE_5__.adaptEventsOfChild)(_this.props, entry, i)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Surface__WEBPACK_IMPORTED_MODULE_6__.Surface, { width: iconSize, height: iconSize, viewBox: viewBox, style: svgStyle }, _this.renderIcon(entry)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-legend-item-text", style: { color: color } }, finalFormatter ? finalFormatter(entryValue, entry, i) : entryValue)); }); } }, { key: "render", value: function render() { var _this$props2 = this.props, payload = _this$props2.payload, layout = _this$props2.layout, align = _this$props2.align; if (!payload || !payload.length) { return null; } var finalStyle = { padding: 0, margin: 0, textAlign: layout === 'horizontal' ? align : 'left' }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "recharts-default-legend", style: finalStyle }, this.renderItems()); } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(DefaultLegendContent, "displayName", 'Legend'); _defineProperty(DefaultLegendContent, "defaultProps", { iconSize: 14, layout: 'horizontal', align: 'center', verticalAlign: 'middle', inactiveColor: '#ccc' }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/DefaultTooltipContent.js": /*!*****************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/DefaultTooltipContent.js ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DefaultTooltipContent: () => (/* binding */ DefaultTooltipContent) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/sortBy */ "../../../node_modules/lodash/sortBy.js"); /* harmony import */ var lodash_sortBy__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_sortBy__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 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) { _defineProperty(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 _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @fileOverview Default Tooltip Content */ function defaultFormatter(value) { return Array.isArray(value) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(value[0]) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(value[1]) ? value.join(' ~ ') : value; } var DefaultTooltipContent = function DefaultTooltipContent(props) { var _props$separator = props.separator, separator = _props$separator === void 0 ? ' : ' : _props$separator, _props$contentStyle = props.contentStyle, contentStyle = _props$contentStyle === void 0 ? {} : _props$contentStyle, _props$itemStyle = props.itemStyle, itemStyle = _props$itemStyle === void 0 ? {} : _props$itemStyle, _props$labelStyle = props.labelStyle, labelStyle = _props$labelStyle === void 0 ? {} : _props$labelStyle, payload = props.payload, formatter = props.formatter, itemSorter = props.itemSorter, wrapperClassName = props.wrapperClassName, labelClassName = props.labelClassName, label = props.label, labelFormatter = props.labelFormatter, _props$accessibilityL = props.accessibilityLayer, accessibilityLayer = _props$accessibilityL === void 0 ? false : _props$accessibilityL; var renderContent = function renderContent() { if (payload && payload.length) { var listStyle = { padding: 0, margin: 0 }; var items = (itemSorter ? lodash_sortBy__WEBPACK_IMPORTED_MODULE_1___default()(payload, itemSorter) : payload).map(function (entry, i) { if (entry.type === 'none') { return null; } var finalItemStyle = _objectSpread({ display: 'block', paddingTop: 4, paddingBottom: 4, color: entry.color || '#000' }, itemStyle); var finalFormatter = entry.formatter || formatter || defaultFormatter; var value = entry.value, name = entry.name; var finalValue = value; var finalName = name; if (finalFormatter && finalValue != null && finalName != null) { var formatted = finalFormatter(value, name, entry, i, payload); if (Array.isArray(formatted)) { var _formatted = _slicedToArray(formatted, 2); finalValue = _formatted[0]; finalName = _formatted[1]; } else { finalValue = formatted; } } return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", { className: "recharts-tooltip-item", key: "tooltip-item-".concat(i), style: finalItemStyle }, (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(finalName) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-name" }, finalName) : null, (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(finalName) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-separator" }, separator) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-value" }, finalValue), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "recharts-tooltip-item-unit" }, entry.unit || '')) ); }); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", { className: "recharts-tooltip-item-list", style: listStyle }, items); } return null; }; var finalStyle = _objectSpread({ margin: 0, padding: 10, backgroundColor: '#fff', border: '1px solid #ccc', whiteSpace: 'nowrap' }, contentStyle); var finalLabelStyle = _objectSpread({ margin: 0 }, labelStyle); var hasLabel = !lodash_isNil__WEBPACK_IMPORTED_MODULE_2___default()(label); var finalLabel = hasLabel ? label : ''; var wrapperCN = (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-default-tooltip', wrapperClassName); var labelCN = (0,clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('recharts-tooltip-label', labelClassName); if (hasLabel && labelFormatter && payload !== undefined && payload !== null) { finalLabel = labelFormatter(label, payload); } var accessibilityAttributes = accessibilityLayer ? { role: 'status', 'aria-live': 'assertive' } : {}; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", _extends({ className: wrapperCN, style: finalStyle }, accessibilityAttributes), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: labelCN, style: finalLabelStyle }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(finalLabel) ? finalLabel : "".concat(finalLabel)), renderContent()); }; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Label.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Label.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Label: () => (/* binding */ Label) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isObject */ "../../../node_modules/lodash/isObject.js"); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isObject__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _Text__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Text */ "../../../node_modules/recharts/es6/component/Text.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/PolarUtils */ "../../../node_modules/recharts/es6/util/PolarUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var _excluded = ["offset"]; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } 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) { _defineProperty(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 _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var getLabel = function getLabel(props) { var value = props.value, formatter = props.formatter; var label = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(props.children) ? value : props.children; if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(formatter)) { return formatter(label); } return label; }; var getDeltaAngle = function getDeltaAngle(startAngle, endAngle) { var sign = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.mathSign)(endAngle - startAngle); var deltaAngle = Math.min(Math.abs(endAngle - startAngle), 360); return sign * deltaAngle; }; var renderRadialLabel = function renderRadialLabel(labelProps, label, attrs) { var position = labelProps.position, viewBox = labelProps.viewBox, offset = labelProps.offset, className = labelProps.className; var _ref = viewBox, cx = _ref.cx, cy = _ref.cy, innerRadius = _ref.innerRadius, outerRadius = _ref.outerRadius, startAngle = _ref.startAngle, endAngle = _ref.endAngle, clockWise = _ref.clockWise; var radius = (innerRadius + outerRadius) / 2; var deltaAngle = getDeltaAngle(startAngle, endAngle); var sign = deltaAngle >= 0 ? 1 : -1; var labelAngle, direction; if (position === 'insideStart') { labelAngle = startAngle + sign * offset; direction = clockWise; } else if (position === 'insideEnd') { labelAngle = endAngle - sign * offset; direction = !clockWise; } else if (position === 'end') { labelAngle = endAngle + sign * offset; direction = clockWise; } direction = deltaAngle <= 0 ? direction : !direction; var startPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, radius, labelAngle); var endPoint = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, radius, labelAngle + (direction ? 1 : -1) * 359); var path = "M".concat(startPoint.x, ",").concat(startPoint.y, "\n A").concat(radius, ",").concat(radius, ",0,1,").concat(direction ? 0 : 1, ",\n ").concat(endPoint.x, ",").concat(endPoint.y); var id = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(labelProps.id) ? (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.uniqueId)('recharts-radial-line-') : labelProps.id; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("text", _extends({}, attrs, { dominantBaseline: "central", className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('recharts-radial-bar-label', className) }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("defs", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("path", { id: id, d: path })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textPath", { xlinkHref: "#".concat(id) }, label)); }; var getAttrsOfPolarLabel = function getAttrsOfPolarLabel(props) { var viewBox = props.viewBox, offset = props.offset, position = props.position; var _ref2 = viewBox, cx = _ref2.cx, cy = _ref2.cy, innerRadius = _ref2.innerRadius, outerRadius = _ref2.outerRadius, startAngle = _ref2.startAngle, endAngle = _ref2.endAngle; var midAngle = (startAngle + endAngle) / 2; if (position === 'outside') { var _polarToCartesian = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, outerRadius + offset, midAngle), _x = _polarToCartesian.x, _y = _polarToCartesian.y; return { x: _x, y: _y, textAnchor: _x >= cx ? 'start' : 'end', verticalAnchor: 'middle' }; } if (position === 'center') { return { x: cx, y: cy, textAnchor: 'middle', verticalAnchor: 'middle' }; } if (position === 'centerTop') { return { x: cx, y: cy, textAnchor: 'middle', verticalAnchor: 'start' }; } if (position === 'centerBottom') { return { x: cx, y: cy, textAnchor: 'middle', verticalAnchor: 'end' }; } var r = (innerRadius + outerRadius) / 2; var _polarToCartesian2 = (0,_util_PolarUtils__WEBPACK_IMPORTED_MODULE_6__.polarToCartesian)(cx, cy, r, midAngle), x = _polarToCartesian2.x, y = _polarToCartesian2.y; return { x: x, y: y, textAnchor: 'middle', verticalAnchor: 'middle' }; }; var getAttrsOfCartesianLabel = function getAttrsOfCartesianLabel(props) { var viewBox = props.viewBox, parentViewBox = props.parentViewBox, offset = props.offset, position = props.position; var _ref3 = viewBox, x = _ref3.x, y = _ref3.y, width = _ref3.width, height = _ref3.height; // Define vertical offsets and position inverts based on the value being positive or negative var verticalSign = height >= 0 ? 1 : -1; var verticalOffset = verticalSign * offset; var verticalEnd = verticalSign > 0 ? 'end' : 'start'; var verticalStart = verticalSign > 0 ? 'start' : 'end'; // Define horizontal offsets and position inverts based on the value being positive or negative var horizontalSign = width >= 0 ? 1 : -1; var horizontalOffset = horizontalSign * offset; var horizontalEnd = horizontalSign > 0 ? 'end' : 'start'; var horizontalStart = horizontalSign > 0 ? 'start' : 'end'; if (position === 'top') { var attrs = { x: x + width / 2, y: y - verticalSign * offset, textAnchor: 'middle', verticalAnchor: verticalEnd }; return _objectSpread(_objectSpread({}, attrs), parentViewBox ? { height: Math.max(y - parentViewBox.y, 0), width: width } : {}); } if (position === 'bottom') { var _attrs = { x: x + width / 2, y: y + height + verticalOffset, textAnchor: 'middle', verticalAnchor: verticalStart }; return _objectSpread(_objectSpread({}, _attrs), parentViewBox ? { height: Math.max(parentViewBox.y + parentViewBox.height - (y + height), 0), width: width } : {}); } if (position === 'left') { var _attrs2 = { x: x - horizontalOffset, y: y + height / 2, textAnchor: horizontalEnd, verticalAnchor: 'middle' }; return _objectSpread(_objectSpread({}, _attrs2), parentViewBox ? { width: Math.max(_attrs2.x - parentViewBox.x, 0), height: height } : {}); } if (position === 'right') { var _attrs3 = { x: x + width + horizontalOffset, y: y + height / 2, textAnchor: horizontalStart, verticalAnchor: 'middle' }; return _objectSpread(_objectSpread({}, _attrs3), parentViewBox ? { width: Math.max(parentViewBox.x + parentViewBox.width - _attrs3.x, 0), height: height } : {}); } var sizeAttrs = parentViewBox ? { width: width, height: height } : {}; if (position === 'insideLeft') { return _objectSpread({ x: x + horizontalOffset, y: y + height / 2, textAnchor: horizontalStart, verticalAnchor: 'middle' }, sizeAttrs); } if (position === 'insideRight') { return _objectSpread({ x: x + width - horizontalOffset, y: y + height / 2, textAnchor: horizontalEnd, verticalAnchor: 'middle' }, sizeAttrs); } if (position === 'insideTop') { return _objectSpread({ x: x + width / 2, y: y + verticalOffset, textAnchor: 'middle', verticalAnchor: verticalStart }, sizeAttrs); } if (position === 'insideBottom') { return _objectSpread({ x: x + width / 2, y: y + height - verticalOffset, textAnchor: 'middle', verticalAnchor: verticalEnd }, sizeAttrs); } if (position === 'insideTopLeft') { return _objectSpread({ x: x + horizontalOffset, y: y + verticalOffset, textAnchor: horizontalStart, verticalAnchor: verticalStart }, sizeAttrs); } if (position === 'insideTopRight') { return _objectSpread({ x: x + width - horizontalOffset, y: y + verticalOffset, textAnchor: horizontalEnd, verticalAnchor: verticalStart }, sizeAttrs); } if (position === 'insideBottomLeft') { return _objectSpread({ x: x + horizontalOffset, y: y + height - verticalOffset, textAnchor: horizontalStart, verticalAnchor: verticalEnd }, sizeAttrs); } if (position === 'insideBottomRight') { return _objectSpread({ x: x + width - horizontalOffset, y: y + height - verticalOffset, textAnchor: horizontalEnd, verticalAnchor: verticalEnd }, sizeAttrs); } if (lodash_isObject__WEBPACK_IMPORTED_MODULE_3___default()(position) && ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(position.x) || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isPercent)(position.x)) && ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(position.y) || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isPercent)(position.y))) { return _objectSpread({ x: x + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getPercentValue)(position.x, width), y: y + (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getPercentValue)(position.y, height), textAnchor: 'end', verticalAnchor: 'end' }, sizeAttrs); } return _objectSpread({ x: x + width / 2, y: y + height / 2, textAnchor: 'middle', verticalAnchor: 'middle' }, sizeAttrs); }; var isPolar = function isPolar(viewBox) { return 'cx' in viewBox && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(viewBox.cx); }; function Label(_ref4) { var _ref4$offset = _ref4.offset, offset = _ref4$offset === void 0 ? 5 : _ref4$offset, restProps = _objectWithoutProperties(_ref4, _excluded); var props = _objectSpread({ offset: offset }, restProps); var viewBox = props.viewBox, position = props.position, value = props.value, children = props.children, content = props.content, _props$className = props.className, className = _props$className === void 0 ? '' : _props$className, textBreakAll = props.textBreakAll; if (!viewBox || lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(value) && lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(children) && ! /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(content) && !lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(content)) { return null; } if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(content)) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(content, props); } var label; if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(content)) { label = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(content, props); if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(label)) { return label; } } else { label = getLabel(props); } var isPolarLabel = isPolar(viewBox); var attrs = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(props, true); if (isPolarLabel && (position === 'insideStart' || position === 'insideEnd' || position === 'end')) { return renderRadialLabel(props, label, attrs); } var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Text__WEBPACK_IMPORTED_MODULE_8__.Text, _extends({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('recharts-label', className) }, attrs, positionAttrs, { breakAll: textBreakAll }), label); } Label.displayName = 'Label'; var parseViewBox = function parseViewBox(props) { var cx = props.cx, cy = props.cy, angle = props.angle, startAngle = props.startAngle, endAngle = props.endAngle, r = props.r, radius = props.radius, innerRadius = props.innerRadius, outerRadius = props.outerRadius, x = props.x, y = props.y, top = props.top, left = props.left, width = props.width, height = props.height, clockWise = props.clockWise, labelViewBox = props.labelViewBox; if (labelViewBox) { return labelViewBox; } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(width) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(height)) { if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(x) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(y)) { return { x: x, y: y, width: width, height: height }; } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(top) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(left)) { return { x: top, y: left, width: width, height: height }; } } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(x) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(y)) { return { x: x, y: y, width: 0, height: 0 }; } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(cx) && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumber)(cy)) { return { cx: cx, cy: cy, startAngle: startAngle || angle || 0, endAngle: endAngle || angle || 0, innerRadius: innerRadius || 0, outerRadius: outerRadius || radius || r || 0, clockWise: clockWise }; } if (props.viewBox) { return props.viewBox; } return {}; }; var parseLabel = function parseLabel(label, viewBox) { if (!label) { return null; } if (label === true) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", viewBox: viewBox }); } if ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.isNumOrStr)(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", viewBox: viewBox, value: label }); } if ( /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.isValidElement)(label)) { if (label.type === Label) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(label, { key: 'label-implicit', viewBox: viewBox }); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", content: label, viewBox: viewBox }); } if (lodash_isFunction__WEBPACK_IMPORTED_MODULE_2___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, { key: "label-implicit", content: label, viewBox: viewBox }); } if (lodash_isObject__WEBPACK_IMPORTED_MODULE_3___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Label, _extends({ viewBox: viewBox }, label, { key: "label-implicit" })); } return null; }; var renderCallByParent = function renderCallByParent(parentProps, viewBox) { var checkPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (!parentProps || !parentProps.children && checkPropsLabel && !parentProps.label) { return null; } var children = parentProps.children; var parentViewBox = parseViewBox(parentProps); var explicitChildren = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.findAllByType)(children, Label).map(function (child, index) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(child, { viewBox: viewBox || parentViewBox, // eslint-disable-next-line react/no-array-index-key key: "label-".concat(index) }); }); if (!checkPropsLabel) { return explicitChildren; } var implicitLabel = parseLabel(parentProps.label, viewBox || parentViewBox); return [implicitLabel].concat(_toConsumableArray(explicitChildren)); }; Label.parseViewBox = parseViewBox; Label.renderCallByParent = renderCallByParent; /***/ }), /***/ "../../../node_modules/recharts/es6/component/LabelList.js": /*!*****************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/LabelList.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ LabelList: () => (/* binding */ LabelList) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/isObject */ "../../../node_modules/lodash/isObject.js"); /* harmony import */ var lodash_isObject__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_isObject__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/isFunction */ "../../../node_modules/lodash/isFunction.js"); /* harmony import */ var lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_isFunction__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var lodash_last__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash/last */ "../../../node_modules/lodash/last.js"); /* harmony import */ var lodash_last__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_last__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Label */ "../../../node_modules/recharts/es6/component/Label.js"); /* harmony import */ var _container_Layer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../container/Layer */ "../../../node_modules/recharts/es6/container/Layer.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_ChartUtils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/ChartUtils */ "../../../node_modules/recharts/es6/util/ChartUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var _excluded = ["valueAccessor"], _excluded2 = ["data", "dataKey", "clockWise", "id", "textBreakAll"]; function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 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) { _defineProperty(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 _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } var defaultAccessor = function defaultAccessor(entry) { return Array.isArray(entry.value) ? lodash_last__WEBPACK_IMPORTED_MODULE_4___default()(entry.value) : entry.value; }; function LabelList(_ref) { var _ref$valueAccessor = _ref.valueAccessor, valueAccessor = _ref$valueAccessor === void 0 ? defaultAccessor : _ref$valueAccessor, restProps = _objectWithoutProperties(_ref, _excluded); var data = restProps.data, dataKey = restProps.dataKey, clockWise = restProps.clockWise, id = restProps.id, textBreakAll = restProps.textBreakAll, others = _objectWithoutProperties(restProps, _excluded2); if (!data || !data.length) { return null; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_container_Layer__WEBPACK_IMPORTED_MODULE_5__.Layer, { className: "recharts-label-list" }, data.map(function (entry, index) { var value = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(dataKey) ? valueAccessor(entry, index) : (0,_util_ChartUtils__WEBPACK_IMPORTED_MODULE_6__.getValueByDataKey)(entry && entry.payload, dataKey); var idProps = lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(id) ? {} : { id: "".concat(id, "-").concat(index) }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Label__WEBPACK_IMPORTED_MODULE_7__.Label, _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__.filterProps)(entry, true), others, idProps, { parentViewBox: entry.parentViewBox, value: value, textBreakAll: textBreakAll, viewBox: _Label__WEBPACK_IMPORTED_MODULE_7__.Label.parseViewBox(lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(clockWise) ? entry : _objectSpread(_objectSpread({}, entry), {}, { clockWise: clockWise })), key: "label-".concat(index) // eslint-disable-line react/no-array-index-key , index: index })); })); } LabelList.displayName = 'LabelList'; function parseLabelList(label, data) { if (!label) { return null; } if (label === true) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LabelList, { key: "labelList-implicit", data: data }); } if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(label) || lodash_isFunction__WEBPACK_IMPORTED_MODULE_3___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LabelList, { key: "labelList-implicit", data: data, content: label }); } if (lodash_isObject__WEBPACK_IMPORTED_MODULE_2___default()(label)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(LabelList, _extends({ data: data }, label, { key: "labelList-implicit" })); } return null; } function renderCallByParent(parentProps, data) { var checkPropsLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (!parentProps || !parentProps.children && checkPropsLabel && !parentProps.label) { return null; } var children = parentProps.children; var explicitChildren = (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_8__.findAllByType)(children, LabelList).map(function (child, index) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.cloneElement)(child, { data: data, // eslint-disable-next-line react/no-array-index-key key: "labelList-".concat(index) }); }); if (!checkPropsLabel) { return explicitChildren; } var implicitLabelList = parseLabelList(parentProps.label, data); return [implicitLabelList].concat(_toConsumableArray(explicitChildren)); } LabelList.renderCallByParent = renderCallByParent; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Legend.js": /*!**************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Legend.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Legend: () => (/* binding */ Legend) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _DefaultLegendContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DefaultLegendContent */ "../../../node_modules/recharts/es6/component/DefaultLegendContent.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/payload/getUniqPayload */ "../../../node_modules/recharts/es6/util/payload/getUniqPayload.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var _excluded = ["ref"]; 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) { _defineProperty(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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } /** * @fileOverview Legend */ function defaultUniqBy(entry) { return entry.value; } function renderContent(content, props) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(content)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(content, props); } if (typeof content === 'function') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(content, props); } var ref = props.ref, otherProps = _objectWithoutProperties(props, _excluded); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_DefaultLegendContent__WEBPACK_IMPORTED_MODULE_1__.DefaultLegendContent, otherProps); } var EPS = 1; var Legend = /*#__PURE__*/function (_PureComponent) { function Legend() { var _this; _classCallCheck(this, Legend); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, Legend, [].concat(args)); _defineProperty(_this, "lastBoundingBox", { width: -1, height: -1 }); return _this; } _inherits(Legend, _PureComponent); return _createClass(Legend, [{ key: "componentDidMount", value: function componentDidMount() { this.updateBBox(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.updateBBox(); } }, { key: "getBBox", value: function getBBox() { if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) { var box = this.wrapperNode.getBoundingClientRect(); box.height = this.wrapperNode.offsetHeight; box.width = this.wrapperNode.offsetWidth; return box; } return null; } }, { key: "updateBBox", value: function updateBBox() { var onBBoxUpdate = this.props.onBBoxUpdate; var box = this.getBBox(); if (box) { if (Math.abs(box.width - this.lastBoundingBox.width) > EPS || Math.abs(box.height - this.lastBoundingBox.height) > EPS) { this.lastBoundingBox.width = box.width; this.lastBoundingBox.height = box.height; if (onBBoxUpdate) { onBBoxUpdate(box); } } } else if (this.lastBoundingBox.width !== -1 || this.lastBoundingBox.height !== -1) { this.lastBoundingBox.width = -1; this.lastBoundingBox.height = -1; if (onBBoxUpdate) { onBBoxUpdate(null); } } } }, { key: "getBBoxSnapshot", value: function getBBoxSnapshot() { if (this.lastBoundingBox.width >= 0 && this.lastBoundingBox.height >= 0) { return _objectSpread({}, this.lastBoundingBox); } return { width: 0, height: 0 }; } }, { key: "getDefaultPosition", value: function getDefaultPosition(style) { var _this$props = this.props, layout = _this$props.layout, align = _this$props.align, verticalAlign = _this$props.verticalAlign, margin = _this$props.margin, chartWidth = _this$props.chartWidth, chartHeight = _this$props.chartHeight; var hPos, vPos; if (!style || (style.left === undefined || style.left === null) && (style.right === undefined || style.right === null)) { if (align === 'center' && layout === 'vertical') { var box = this.getBBoxSnapshot(); hPos = { left: ((chartWidth || 0) - box.width) / 2 }; } else { hPos = align === 'right' ? { right: margin && margin.right || 0 } : { left: margin && margin.left || 0 }; } } if (!style || (style.top === undefined || style.top === null) && (style.bottom === undefined || style.bottom === null)) { if (verticalAlign === 'middle') { var _box = this.getBBoxSnapshot(); vPos = { top: ((chartHeight || 0) - _box.height) / 2 }; } else { vPos = verticalAlign === 'bottom' ? { bottom: margin && margin.bottom || 0 } : { top: margin && margin.top || 0 }; } } return _objectSpread(_objectSpread({}, hPos), vPos); } }, { key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, content = _this$props2.content, width = _this$props2.width, height = _this$props2.height, wrapperStyle = _this$props2.wrapperStyle, payloadUniqBy = _this$props2.payloadUniqBy, payload = _this$props2.payload; var outerStyle = _objectSpread(_objectSpread({ position: 'absolute', width: width || 'auto', height: height || 'auto' }, this.getDefaultPosition(wrapperStyle)), wrapperStyle); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "recharts-legend-wrapper", style: outerStyle, ref: function ref(node) { _this2.wrapperNode = node; } }, renderContent(content, _objectSpread(_objectSpread({}, this.props), {}, { payload: (0,_util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__.getUniqPayload)(payload, payloadUniqBy, defaultUniqBy) }))); } }], [{ key: "getWithHeight", value: function getWithHeight(item, chartWidth) { var _this$defaultProps$it = _objectSpread(_objectSpread({}, this.defaultProps), item.props), layout = _this$defaultProps$it.layout; if (layout === 'vertical' && (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_3__.isNumber)(item.props.height)) { return { height: item.props.height }; } if (layout === 'horizontal') { return { width: item.props.width || chartWidth }; } return null; } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(Legend, "displayName", 'Legend'); _defineProperty(Legend, "defaultProps", { iconSize: 14, layout: 'horizontal', align: 'center', verticalAlign: 'bottom' }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/ResponsiveContainer.js": /*!***************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/ResponsiveContainer.js ***! \***************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ResponsiveContainer: () => (/* binding */ ResponsiveContainer) /* harmony export */ }); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/throttle */ "../../../node_modules/lodash/throttle.js"); /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_LogUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/LogUtils */ "../../../node_modules/recharts/es6/util/LogUtils.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 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) { _defineProperty(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 _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } /** * @fileOverview Wrapper component to make charts adapt to the size of parent * DOM */ var ResponsiveContainer = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.forwardRef)(function (_ref, ref) { var aspect = _ref.aspect, _ref$initialDimension = _ref.initialDimension, initialDimension = _ref$initialDimension === void 0 ? { width: -1, height: -1 } : _ref$initialDimension, _ref$width = _ref.width, width = _ref$width === void 0 ? '100%' : _ref$width, _ref$height = _ref.height, height = _ref$height === void 0 ? '100%' : _ref$height, _ref$minWidth = _ref.minWidth, minWidth = _ref$minWidth === void 0 ? 0 : _ref$minWidth, minHeight = _ref.minHeight, maxHeight = _ref.maxHeight, children = _ref.children, _ref$debounce = _ref.debounce, debounce = _ref$debounce === void 0 ? 0 : _ref$debounce, id = _ref.id, className = _ref.className, onResize = _ref.onResize, _ref$style = _ref.style, style = _ref$style === void 0 ? {} : _ref$style; var containerRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); var onResizeRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(); onResizeRef.current = onResize; (0,react__WEBPACK_IMPORTED_MODULE_1__.useImperativeHandle)(ref, function () { return Object.defineProperty(containerRef.current, 'current', { get: function get() { // eslint-disable-next-line no-console console.warn('The usage of ref.current.current is deprecated and will no longer be supported.'); return containerRef.current; }, configurable: true }); }); var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({ containerWidth: initialDimension.width, containerHeight: initialDimension.height }), _useState2 = _slicedToArray(_useState, 2), sizes = _useState2[0], setSizes = _useState2[1]; var setContainerSize = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(function (newWidth, newHeight) { setSizes(function (prevState) { var roundedWidth = Math.round(newWidth); var roundedHeight = Math.round(newHeight); if (prevState.containerWidth === roundedWidth && prevState.containerHeight === roundedHeight) { return prevState; } return { containerWidth: roundedWidth, containerHeight: roundedHeight }; }); }, []); (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { var callback = function callback(entries) { var _onResizeRef$current; var _entries$0$contentRec = entries[0].contentRect, containerWidth = _entries$0$contentRec.width, containerHeight = _entries$0$contentRec.height; setContainerSize(containerWidth, containerHeight); (_onResizeRef$current = onResizeRef.current) === null || _onResizeRef$current === void 0 || _onResizeRef$current.call(onResizeRef, containerWidth, containerHeight); }; if (debounce > 0) { callback = lodash_throttle__WEBPACK_IMPORTED_MODULE_2___default()(callback, debounce, { trailing: true, leading: false }); } var observer = new ResizeObserver(callback); var _containerRef$current = containerRef.current.getBoundingClientRect(), containerWidth = _containerRef$current.width, containerHeight = _containerRef$current.height; setContainerSize(containerWidth, containerHeight); observer.observe(containerRef.current); return function () { observer.disconnect(); }; }, [setContainerSize, debounce]); var chartContent = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(function () { var containerWidth = sizes.containerWidth, containerHeight = sizes.containerHeight; if (containerWidth < 0 || containerHeight < 0) { return null; } (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_3__.warn)((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(width) || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(height), "The width(%s) and height(%s) are both fixed numbers,\n maybe you don't need to use a ResponsiveContainer.", width, height); (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_3__.warn)(!aspect || aspect > 0, 'The aspect(%s) must be greater than zero.', aspect); var calculatedWidth = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(width) ? containerWidth : width; var calculatedHeight = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isPercent)(height) ? containerHeight : height; if (aspect && aspect > 0) { // Preserve the desired aspect ratio if (calculatedWidth) { // Will default to using width for aspect ratio calculatedHeight = calculatedWidth / aspect; } else if (calculatedHeight) { // But we should also take height into consideration calculatedWidth = calculatedHeight * aspect; } // if maxHeight is set, overwrite if calculatedHeight is greater than maxHeight if (maxHeight && calculatedHeight > maxHeight) { calculatedHeight = maxHeight; } } (0,_util_LogUtils__WEBPACK_IMPORTED_MODULE_3__.warn)(calculatedWidth > 0 || calculatedHeight > 0, "The width(%s) and height(%s) of chart should be greater than 0,\n please check the style of container, or the props width(%s) and height(%s),\n or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the\n height and width.", calculatedWidth, calculatedHeight, width, height, minWidth, minHeight, aspect); var isCharts = !Array.isArray(children) && (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_5__.getDisplayName)(children.type).endsWith('Chart'); return react__WEBPACK_IMPORTED_MODULE_1___default().Children.map(children, function (child) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().isValidElement(child)) { return /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_1__.cloneElement)(child, _objectSpread({ width: calculatedWidth, height: calculatedHeight }, isCharts ? { style: _objectSpread({ height: '100%', width: '100%', maxHeight: calculatedHeight, maxWidth: calculatedWidth }, child.props.style) } : {})); } return child; }); }, [aspect, children, height, maxHeight, minHeight, minWidth, sizes, width]); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", { id: id ? "".concat(id) : undefined, className: (0,clsx__WEBPACK_IMPORTED_MODULE_0__["default"])('recharts-responsive-container', className), style: _objectSpread(_objectSpread({}, style), {}, { width: width, height: height, minWidth: minWidth, minHeight: minHeight, maxHeight: maxHeight }), ref: containerRef }, chartContent); }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/Text.js": /*!************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Text.js ***! \************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Text: () => (/* binding */ Text) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/isNil */ "../../../node_modules/lodash/isNil.js"); /* harmony import */ var lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_isNil__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); /* harmony import */ var _util_Global__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/Global */ "../../../node_modules/recharts/es6/util/Global.js"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); /* harmony import */ var _util_DOMUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/DOMUtils */ "../../../node_modules/recharts/es6/util/DOMUtils.js"); /* harmony import */ var _util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/ReduceCSSCalc */ "../../../node_modules/recharts/es6/util/ReduceCSSCalc.js"); var _excluded = ["x", "y", "lineHeight", "capHeight", "scaleToFit", "textAnchor", "verticalAnchor", "fill"], _excluded2 = ["dx", "dy", "angle", "className", "breakAll"]; function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var BREAKING_SPACES = /[ \f\n\r\t\v\u2028\u2029]+/; var calculateWordWidths = function calculateWordWidths(_ref) { var children = _ref.children, breakAll = _ref.breakAll, style = _ref.style; try { var words = []; if (!lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(children)) { if (breakAll) { words = children.toString().split(''); } else { words = children.toString().split(BREAKING_SPACES); } } var wordsWithComputedWidth = words.map(function (word) { return { word: word, width: (0,_util_DOMUtils__WEBPACK_IMPORTED_MODULE_3__.getStringSize)(word, style).width }; }); var spaceWidth = breakAll ? 0 : (0,_util_DOMUtils__WEBPACK_IMPORTED_MODULE_3__.getStringSize)("\xA0", style).width; return { wordsWithComputedWidth: wordsWithComputedWidth, spaceWidth: spaceWidth }; } catch (e) { return null; } }; var calculateWordsByLines = function calculateWordsByLines(_ref2, initialWordsWithComputedWith, spaceWidth, lineWidth, scaleToFit) { var maxLines = _ref2.maxLines, children = _ref2.children, style = _ref2.style, breakAll = _ref2.breakAll; var shouldLimitLines = (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(maxLines); var text = children; var calculate = function calculate() { var words = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return words.reduce(function (result, _ref3) { var word = _ref3.word, width = _ref3.width; var currentLine = result[result.length - 1]; if (currentLine && (lineWidth == null || scaleToFit || currentLine.width + width + spaceWidth < Number(lineWidth))) { // Word can be added to an existing line currentLine.words.push(word); currentLine.width += width + spaceWidth; } else { // Add first word to line or word is too long to scaleToFit on existing line var newLine = { words: [word], width: width }; result.push(newLine); } return result; }, []); }; var originalResult = calculate(initialWordsWithComputedWith); var findLongestLine = function findLongestLine(words) { return words.reduce(function (a, b) { return a.width > b.width ? a : b; }); }; if (!shouldLimitLines) { return originalResult; } var suffix = '…'; var checkOverflow = function checkOverflow(index) { var tempText = text.slice(0, index); var words = calculateWordWidths({ breakAll: breakAll, style: style, children: tempText + suffix }).wordsWithComputedWidth; var result = calculate(words); var doesOverflow = result.length > maxLines || findLongestLine(result).width > Number(lineWidth); return [doesOverflow, result]; }; var start = 0; var end = text.length - 1; var iterations = 0; var trimmedResult; while (start <= end && iterations <= text.length - 1) { var middle = Math.floor((start + end) / 2); var prev = middle - 1; var _checkOverflow = checkOverflow(prev), _checkOverflow2 = _slicedToArray(_checkOverflow, 2), doesPrevOverflow = _checkOverflow2[0], result = _checkOverflow2[1]; var _checkOverflow3 = checkOverflow(middle), _checkOverflow4 = _slicedToArray(_checkOverflow3, 1), doesMiddleOverflow = _checkOverflow4[0]; if (!doesPrevOverflow && !doesMiddleOverflow) { start = middle + 1; } if (doesPrevOverflow && doesMiddleOverflow) { end = middle - 1; } if (!doesPrevOverflow && doesMiddleOverflow) { trimmedResult = result; break; } iterations++; } // Fallback to originalResult (result without trimming) if we cannot find the // where to trim. This should not happen :tm: return trimmedResult || originalResult; }; var getWordsWithoutCalculate = function getWordsWithoutCalculate(children) { var words = !lodash_isNil__WEBPACK_IMPORTED_MODULE_1___default()(children) ? children.toString().split(BREAKING_SPACES) : []; return [{ words: words }]; }; var getWordsByLines = function getWordsByLines(_ref4) { var width = _ref4.width, scaleToFit = _ref4.scaleToFit, children = _ref4.children, style = _ref4.style, breakAll = _ref4.breakAll, maxLines = _ref4.maxLines; // Only perform calculations if using features that require them (multiline, scaleToFit) if ((width || scaleToFit) && !_util_Global__WEBPACK_IMPORTED_MODULE_5__.Global.isSsr) { var wordsWithComputedWidth, spaceWidth; var wordWidths = calculateWordWidths({ breakAll: breakAll, children: children, style: style }); if (wordWidths) { var wcw = wordWidths.wordsWithComputedWidth, sw = wordWidths.spaceWidth; wordsWithComputedWidth = wcw; spaceWidth = sw; } else { return getWordsWithoutCalculate(children); } return calculateWordsByLines({ breakAll: breakAll, children: children, maxLines: maxLines, style: style }, wordsWithComputedWidth, spaceWidth, width, scaleToFit); } return getWordsWithoutCalculate(children); }; var DEFAULT_FILL = '#808080'; var Text = function Text(_ref5) { var _ref5$x = _ref5.x, propsX = _ref5$x === void 0 ? 0 : _ref5$x, _ref5$y = _ref5.y, propsY = _ref5$y === void 0 ? 0 : _ref5$y, _ref5$lineHeight = _ref5.lineHeight, lineHeight = _ref5$lineHeight === void 0 ? '1em' : _ref5$lineHeight, _ref5$capHeight = _ref5.capHeight, capHeight = _ref5$capHeight === void 0 ? '0.71em' : _ref5$capHeight, _ref5$scaleToFit = _ref5.scaleToFit, scaleToFit = _ref5$scaleToFit === void 0 ? false : _ref5$scaleToFit, _ref5$textAnchor = _ref5.textAnchor, textAnchor = _ref5$textAnchor === void 0 ? 'start' : _ref5$textAnchor, _ref5$verticalAnchor = _ref5.verticalAnchor, verticalAnchor = _ref5$verticalAnchor === void 0 ? 'end' : _ref5$verticalAnchor, _ref5$fill = _ref5.fill, fill = _ref5$fill === void 0 ? DEFAULT_FILL : _ref5$fill, props = _objectWithoutProperties(_ref5, _excluded); var wordsByLines = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(function () { return getWordsByLines({ breakAll: props.breakAll, children: props.children, maxLines: props.maxLines, scaleToFit: scaleToFit, style: props.style, width: props.width }); }, [props.breakAll, props.children, props.maxLines, scaleToFit, props.style, props.width]); var dx = props.dx, dy = props.dy, angle = props.angle, className = props.className, breakAll = props.breakAll, textProps = _objectWithoutProperties(props, _excluded2); if (!(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(propsX) || !(0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumOrStr)(propsY)) { return null; } var x = propsX + ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(dx) ? dx : 0); var y = propsY + ((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(dy) ? dy : 0); var startDy; switch (verticalAnchor) { case 'start': startDy = (0,_util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__.reduceCSSCalc)("calc(".concat(capHeight, ")")); break; case 'middle': startDy = (0,_util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__.reduceCSSCalc)("calc(".concat((wordsByLines.length - 1) / 2, " * -").concat(lineHeight, " + (").concat(capHeight, " / 2))")); break; default: startDy = (0,_util_ReduceCSSCalc__WEBPACK_IMPORTED_MODULE_6__.reduceCSSCalc)("calc(".concat(wordsByLines.length - 1, " * -").concat(lineHeight, ")")); break; } var transforms = []; if (scaleToFit) { var lineWidth = wordsByLines[0].width; var width = props.width; transforms.push("scale(".concat(((0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_4__.isNumber)(width) ? width / lineWidth : 1) / lineWidth, ")")); } if (angle) { transforms.push("rotate(".concat(angle, ", ").concat(x, ", ").concat(y, ")")); } if (transforms.length) { textProps.transform = transforms.join(' '); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("text", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_7__.filterProps)(textProps, true), { x: x, y: y, className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('recharts-text', className), textAnchor: textAnchor, fill: fill.includes('url') ? DEFAULT_FILL : fill }), wordsByLines.map(function (line, index) { var words = line.words.join(breakAll ? '' : ' '); return ( /*#__PURE__*/ // duplicate words will cause duplicate keys // eslint-disable-next-line react/no-array-index-key react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tspan", { x: x, dy: index === 0 ? startDy : lineHeight, key: "".concat(words, "-").concat(index) }, words) ); })); }; /***/ }), /***/ "../../../node_modules/recharts/es6/component/Tooltip.js": /*!***************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/Tooltip.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Tooltip: () => (/* binding */ Tooltip) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _DefaultTooltipContent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DefaultTooltipContent */ "../../../node_modules/recharts/es6/component/DefaultTooltipContent.js"); /* harmony import */ var _TooltipBoundingBox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./TooltipBoundingBox */ "../../../node_modules/recharts/es6/component/TooltipBoundingBox.js"); /* harmony import */ var _util_Global__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/Global */ "../../../node_modules/recharts/es6/util/Global.js"); /* harmony import */ var _util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/payload/getUniqPayload */ "../../../node_modules/recharts/es6/util/payload/getUniqPayload.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 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) { _defineProperty(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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @fileOverview Tooltip */ function defaultUniqBy(entry) { return entry.dataKey; } function renderContent(content, props) { if ( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(content)) { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(content, props); } if (typeof content === 'function') { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(content, props); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_DefaultTooltipContent__WEBPACK_IMPORTED_MODULE_1__.DefaultTooltipContent, props); } var Tooltip = /*#__PURE__*/function (_PureComponent) { function Tooltip() { _classCallCheck(this, Tooltip); return _callSuper(this, Tooltip, arguments); } _inherits(Tooltip, _PureComponent); return _createClass(Tooltip, [{ key: "render", value: function render() { var _this = this; var _this$props = this.props, active = _this$props.active, allowEscapeViewBox = _this$props.allowEscapeViewBox, animationDuration = _this$props.animationDuration, animationEasing = _this$props.animationEasing, content = _this$props.content, coordinate = _this$props.coordinate, filterNull = _this$props.filterNull, isAnimationActive = _this$props.isAnimationActive, offset = _this$props.offset, payload = _this$props.payload, payloadUniqBy = _this$props.payloadUniqBy, position = _this$props.position, reverseDirection = _this$props.reverseDirection, useTranslate3d = _this$props.useTranslate3d, viewBox = _this$props.viewBox, wrapperStyle = _this$props.wrapperStyle; var finalPayload = payload !== null && payload !== void 0 ? payload : []; if (filterNull && finalPayload.length) { finalPayload = (0,_util_payload_getUniqPayload__WEBPACK_IMPORTED_MODULE_2__.getUniqPayload)(payload.filter(function (entry) { return entry.value != null && (entry.hide !== true || _this.props.includeHidden); }), payloadUniqBy, defaultUniqBy); } var hasPayload = finalPayload.length > 0; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TooltipBoundingBox__WEBPACK_IMPORTED_MODULE_3__.TooltipBoundingBox, { allowEscapeViewBox: allowEscapeViewBox, animationDuration: animationDuration, animationEasing: animationEasing, isAnimationActive: isAnimationActive, active: active, coordinate: coordinate, hasPayload: hasPayload, offset: offset, position: position, reverseDirection: reverseDirection, useTranslate3d: useTranslate3d, viewBox: viewBox, wrapperStyle: wrapperStyle }, renderContent(content, _objectSpread(_objectSpread({}, this.props), {}, { payload: finalPayload }))); } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); _defineProperty(Tooltip, "displayName", 'Tooltip'); _defineProperty(Tooltip, "defaultProps", { accessibilityLayer: false, allowEscapeViewBox: { x: false, y: false }, animationDuration: 400, animationEasing: 'ease', contentStyle: {}, coordinate: { x: 0, y: 0 }, cursor: true, cursorStyle: {}, filterNull: true, isAnimationActive: !_util_Global__WEBPACK_IMPORTED_MODULE_4__.Global.isSsr, itemStyle: {}, labelStyle: {}, offset: 10, reverseDirection: { x: false, y: false }, separator: ' : ', trigger: 'hover', useTranslate3d: false, viewBox: { x: 0, y: 0, height: 0, width: 0 }, wrapperStyle: {} }); /***/ }), /***/ "../../../node_modules/recharts/es6/component/TooltipBoundingBox.js": /*!**************************************************************************!*\ !*** ../../../node_modules/recharts/es6/component/TooltipBoundingBox.js ***! \**************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TooltipBoundingBox: () => (/* binding */ TooltipBoundingBox) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _util_tooltip_translate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/tooltip/translate */ "../../../node_modules/recharts/es6/util/tooltip/translate.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 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) { _defineProperty(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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var EPSILON = 1; var TooltipBoundingBox = /*#__PURE__*/function (_PureComponent) { function TooltipBoundingBox() { var _this; _classCallCheck(this, TooltipBoundingBox); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, TooltipBoundingBox, [].concat(args)); _defineProperty(_this, "state", { dismissed: false, dismissedAtCoordinate: { x: 0, y: 0 }, lastBoundingBox: { width: -1, height: -1 } }); _defineProperty(_this, "handleKeyDown", function (event) { if (event.key === 'Escape') { var _this$props$coordinat, _this$props$coordinat2, _this$props$coordinat3, _this$props$coordinat4; _this.setState({ dismissed: true, dismissedAtCoordinate: { x: (_this$props$coordinat = (_this$props$coordinat2 = _this.props.coordinate) === null || _this$props$coordinat2 === void 0 ? void 0 : _this$props$coordinat2.x) !== null && _this$props$coordinat !== void 0 ? _this$props$coordinat : 0, y: (_this$props$coordinat3 = (_this$props$coordinat4 = _this.props.coordinate) === null || _this$props$coordinat4 === void 0 ? void 0 : _this$props$coordinat4.y) !== null && _this$props$coordinat3 !== void 0 ? _this$props$coordinat3 : 0 } }); } }); return _this; } _inherits(TooltipBoundingBox, _PureComponent); return _createClass(TooltipBoundingBox, [{ key: "updateBBox", value: function updateBBox() { if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) { var box = this.wrapperNode.getBoundingClientRect(); if (Math.abs(box.width - this.state.lastBoundingBox.width) > EPSILON || Math.abs(box.height - this.state.lastBoundingBox.height) > EPSILON) { this.setState({ lastBoundingBox: { width: box.width, height: box.height } }); } } else if (this.state.lastBoundingBox.width !== -1 || this.state.lastBoundingBox.height !== -1) { this.setState({ lastBoundingBox: { width: -1, height: -1 } }); } } }, { key: "componentDidMount", value: function componentDidMount() { document.addEventListener('keydown', this.handleKeyDown); this.updateBBox(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { document.removeEventListener('keydown', this.handleKeyDown); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { var _this$props$coordinat5, _this$props$coordinat6; if (this.props.active) { this.updateBBox(); } if (!this.state.dismissed) { return; } if (((_this$props$coordinat5 = this.props.coordinate) === null || _this$props$coordinat5 === void 0 ? void 0 : _this$props$coordinat5.x) !== this.state.dismissedAtCoordinate.x || ((_this$props$coordinat6 = this.props.coordinate) === null || _this$props$coordinat6 === void 0 ? void 0 : _this$props$coordinat6.y) !== this.state.dismissedAtCoordinate.y) { this.state.dismissed = false; } } }, { key: "render", value: function render() { var _this2 = this; var _this$props = this.props, active = _this$props.active, allowEscapeViewBox = _this$props.allowEscapeViewBox, animationDuration = _this$props.animationDuration, animationEasing = _this$props.animationEasing, children = _this$props.children, coordinate = _this$props.coordinate, hasPayload = _this$props.hasPayload, isAnimationActive = _this$props.isAnimationActive, offset = _this$props.offset, position = _this$props.position, reverseDirection = _this$props.reverseDirection, useTranslate3d = _this$props.useTranslate3d, viewBox = _this$props.viewBox, wrapperStyle = _this$props.wrapperStyle; var _getTooltipTranslate = (0,_util_tooltip_translate__WEBPACK_IMPORTED_MODULE_1__.getTooltipTranslate)({ allowEscapeViewBox: allowEscapeViewBox, coordinate: coordinate, offsetTopLeft: offset, position: position, reverseDirection: reverseDirection, tooltipBox: this.state.lastBoundingBox, useTranslate3d: useTranslate3d, viewBox: viewBox }), cssClasses = _getTooltipTranslate.cssClasses, cssProperties = _getTooltipTranslate.cssProperties; var outerStyle = _objectSpread(_objectSpread({ transition: isAnimationActive && active ? "transform ".concat(animationDuration, "ms ").concat(animationEasing) : undefined }, cssProperties), {}, { pointerEvents: 'none', visibility: !this.state.dismissed && active && hasPayload ? 'visible' : 'hidden', position: 'absolute', top: 0, left: 0 }, wrapperStyle); return ( /*#__PURE__*/ // This element allow listening to the `Escape` key. // See https://github.com/recharts/recharts/pull/2925 react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { tabIndex: -1, className: cssClasses, style: outerStyle, ref: function ref(node) { _this2.wrapperNode = node; } }, children) ); } }]); }(react__WEBPACK_IMPORTED_MODULE_0__.PureComponent); /***/ }), /***/ "../../../node_modules/recharts/es6/container/Layer.js": /*!*************************************************************!*\ !*** ../../../node_modules/recharts/es6/container/Layer.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Layer: () => (/* binding */ Layer) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); var _excluded = ["children", "className"]; function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } var Layer = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().forwardRef(function (props, ref) { var children = props.children, className = props.className, others = _objectWithoutProperties(props, _excluded); var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-layer', className); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("g", _extends({ className: layerClass }, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true), { ref: ref }), children); }); /***/ }), /***/ "../../../node_modules/recharts/es6/container/Surface.js": /*!***************************************************************!*\ !*** ../../../node_modules/recharts/es6/container/Surface.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Surface: () => (/* binding */ Surface) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.mjs"); /* harmony import */ var _util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/ReactUtils */ "../../../node_modules/recharts/es6/util/ReactUtils.js"); var _excluded = ["children", "width", "height", "viewBox", "className", "style", "title", "desc"]; function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; } /** * @fileOverview Surface */ function Surface(props) { var children = props.children, width = props.width, height = props.height, viewBox = props.viewBox, className = props.className, style = props.style, title = props.title, desc = props.desc, others = _objectWithoutProperties(props, _excluded); var svgView = viewBox || { width: width, height: height, x: 0, y: 0 }; var layerClass = (0,clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('recharts-surface', className); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", _extends({}, (0,_util_ReactUtils__WEBPACK_IMPORTED_MODULE_2__.filterProps)(others, true, 'svg'), { className: layerClass, width: width, height: height, style: style, viewBox: "".concat(svgView.x, " ").concat(svgView.y, " ").concat(svgView.width, " ").concat(svgView.height) }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("title", null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("desc", null, desc), children); } /***/ }), /***/ "../../../node_modules/recharts/es6/context/chartLayoutContext.js": /*!************************************************************************!*\ !*** ../../../node_modules/recharts/es6/context/chartLayoutContext.js ***! \************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ChartHeightContext: () => (/* binding */ ChartHeightContext), /* harmony export */ ChartLayoutContextProvider: () => (/* binding */ ChartLayoutContextProvider), /* harmony export */ ChartWidthContext: () => (/* binding */ ChartWidthContext), /* harmony export */ ClipPathIdContext: () => (/* binding */ ClipPathIdContext), /* harmony export */ OffsetContext: () => (/* binding */ OffsetContext), /* harmony export */ ViewBoxContext: () => (/* binding */ ViewBoxContext), /* harmony export */ XAxisContext: () => (/* binding */ XAxisContext), /* harmony export */ YAxisContext: () => (/* binding */ YAxisContext), /* harmony export */ useArbitraryXAxis: () => (/* binding */ useArbitraryXAxis), /* harmony export */ useArbitraryYAxis: () => (/* binding */ useArbitraryYAxis), /* harmony export */ useChartHeight: () => (/* binding */ useChartHeight), /* harmony export */ useChartWidth: () => (/* binding */ useChartWidth), /* harmony export */ useClipPathId: () => (/* binding */ useClipPathId), /* harmony export */ useOffset: () => (/* binding */ useOffset), /* harmony export */ useViewBox: () => (/* binding */ useViewBox), /* harmony export */ useXAxisOrThrow: () => (/* binding */ useXAxisOrThrow), /* harmony export */ useYAxisOrThrow: () => (/* binding */ useYAxisOrThrow), /* harmony export */ useYAxisWithFiniteDomainOrRandom: () => (/* binding */ useYAxisWithFiniteDomainOrRandom) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var tiny_invariant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tiny-invariant */ "../../../node_modules/tiny-invariant/dist/esm/tiny-invariant.js"); /* harmony import */ var lodash_find__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash/find */ "../../../node_modules/lodash/find.js"); /* harmony import */ var lodash_find__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_find__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var lodash_every__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash/every */ "../../../node_modules/lodash/every.js"); /* harmony import */ var lodash_every__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_every__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _util_calculateViewBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/calculateViewBox */ "../../../node_modules/recharts/es6/util/calculateViewBox.js"); /* harmony import */ var _util_DataUtils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/DataUtils */ "../../../node_modules/recharts/es6/util/DataUtils.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var XAxisContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var YAxisContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var ViewBoxContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var OffsetContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({}); var ClipPathIdContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(undefined); var ChartHeightContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(0); var ChartWidthContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(0); /** * Will add all the properties required to render all individual Recharts components into a React Context. * * If you want to read these properties, see the collection of hooks exported from this file. * * @param {object} props CategoricalChartState, plus children * @returns {ReactElement} React Context Provider */ var ChartLayoutContextProvider = function ChartLayoutContextProvider(props) { var _props$state = props.state, xAxisMap = _props$state.xAxisMap, yAxisMap = _props$state.yAxisMap, offset = _props$state.offset, clipPathId = props.clipPathId, children = props.children, width = props.width, height = props.height; /** * Perhaps we should compute this property when reading? Let's see what is more often used */ var viewBox = (0,_util_calculateViewBox__WEBPACK_IMPORTED_MODULE_4__.calculateViewBox)(offset); /* * This pretends to be a single context but actually is split into multiple smaller ones. * Why? * Because one React Context only allows to set one value. * But we need to set multiple values. * If we do that with one context, then we force re-render on components that might not even be interested * in the part of the state that has changed. * * By splitting into smaller contexts, we allow each components to be optimized and only re-render when its dependencies change. * * To actually achieve the optimal re-render, it is necessary to use React.memo(). * See the test file for details. */ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(XAxisContext.Provider, { value: xAxisMap }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(YAxisContext.Provider, { value: yAxisMap }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(OffsetContext.Provider, { value: offset }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ViewBoxContext.Provider, { value: viewBox }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ClipPathIdContext.Provider, { value: clipPathId }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ChartHeightContext.Provider, { value: height }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ChartWidthContext.Provider, { value: width }, children))))))); }; var useClipPathId = function useClipPathId() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ClipPathIdContext); }; function getKeysForDebug(object) { var keys = Object.keys(object); if (keys.length === 0) { return 'There are no available ids.'; } return "Available ids are: ".concat(keys, "."); } /** * This either finds and returns Axis by the specified ID, or throws an exception if an axis with this ID does not exist. * * @param xAxisId identifier of the axis - it's either autogenerated ('0'), or passed via `id` prop as * @returns axis configuration object * @throws Error if no axis with this ID exists */ var useXAxisOrThrow = function useXAxisOrThrow(xAxisId) { var xAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(XAxisContext); !(xAxisMap != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, 'Could not find Recharts context; are you sure this is rendered inside a Recharts wrapper component?') : 0 : void 0; var xAxis = xAxisMap[xAxisId]; !(xAxis != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, "Could not find xAxis by id \"".concat(xAxisId, "\" [").concat(_typeof(xAxisId), "]. ").concat(getKeysForDebug(xAxisMap))) : 0 : void 0; return xAxis; }; /** * This will find an arbitrary first XAxis. If there's exactly one it always returns that one * - but if there are multiple then it can return any of those. * * If you want specific XAxis out of multiple then prefer using useXAxisOrThrow * * @returns X axisOptions, or undefined - if there are no X axes */ var useArbitraryXAxis = function useArbitraryXAxis() { var xAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(XAxisContext); return (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getAnyElementOfObject)(xAxisMap); }; /** * This will find an arbitrary first YAxis. If there's exactly one it always returns that one * - but if there are multiple then it can return any of those. * * If you want specific YAxis out of multiple then prefer using useXAxisOrThrow * * @returns Y axisOptions, or undefined - if there are no Y axes */ var useArbitraryYAxis = function useArbitraryYAxis() { var yAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(YAxisContext); return (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getAnyElementOfObject)(yAxisMap); }; /** * This hooks will: * 1st attempt to find an YAxis that has all elements in its domain finite * If no such axis exists, it will return an arbitrary YAxis * if there are no Y axes then it returns undefined * * @returns Either Y axisOptions, or undefined if there are no Y axes */ var useYAxisWithFiniteDomainOrRandom = function useYAxisWithFiniteDomainOrRandom() { var yAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(YAxisContext); var yAxisWithFiniteDomain = lodash_find__WEBPACK_IMPORTED_MODULE_2___default()(yAxisMap, function (axis) { return lodash_every__WEBPACK_IMPORTED_MODULE_3___default()(axis.domain, Number.isFinite); }); return yAxisWithFiniteDomain || (0,_util_DataUtils__WEBPACK_IMPORTED_MODULE_5__.getAnyElementOfObject)(yAxisMap); }; /** * This either finds and returns Axis by the specified ID, or throws an exception if an axis with this ID does not exist. * * @param yAxisId identifier of the axis - it's either autogenerated ('0'), or passed via `id` prop as * @returns axis configuration object * @throws Error if no axis with this ID exists */ var useYAxisOrThrow = function useYAxisOrThrow(yAxisId) { var yAxisMap = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(YAxisContext); !(yAxisMap != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, 'Could not find Recharts context; are you sure this is rendered inside a Recharts wrapper component?') : 0 : void 0; var yAxis = yAxisMap[yAxisId]; !(yAxis != null) ? true ? (0,tiny_invariant__WEBPACK_IMPORTED_MODULE_1__["default"])(false, "Could not find yAxis by id \"".concat(yAxisId, "\" [").concat(_typeof(yAxisId), "]. ").concat(getKeysForDebug(yAxisMap))) : 0 : void 0; return yAxis; }; var useViewBox = function useViewBox() { var viewBox = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ViewBoxContext); return viewBox; }; var useOffset = function useOffset() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(OffsetContext); }; var useChartWidth = function useChartWidth() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ChartWidthContext); }; var useChartHeight = function useChartHeight() { return (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ChartHeightContext); }; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmVjaGFydHNfZXM2X2NvbXBvbmVudF9DZWxsX2pzLW5vZGVfbW9kdWxlc19yZWNoYXJ0c19lczZfY29tcG9uZW50X0N1cnNvLWU4ZTAzYi52b2x1bnRlZXJhcGkuMWRhYjlmYzUwNGIzOWIxNjhmMGIuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsMEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQQSxzQkFBc0IsMkJBQTJCLG9HQUFvRyxtQkFBbUIsaUJBQWlCLHNIQUFzSDtBQUMvUyx5QkFBeUIsd0JBQXdCLG9DQUFvQyx5Q0FBeUMsa0NBQWtDLDBEQUEwRCwwQkFBMEI7QUFDcFAsNEJBQTRCLGdCQUFnQixzQkFBc0IsT0FBTyxrREFBa0Qsc0RBQXNELDhCQUE4QixtSkFBbUoscUVBQXFFLEtBQUs7QUFDNWEsNENBQTRDLDJCQUEyQixrQkFBa0Isa0NBQWtDLG9FQUFvRSxLQUFLLE9BQU8sb0JBQW9CO0FBQy9OLDZCQUE2QixtQ0FBbUM7QUFDaEUsOEJBQThCLDRDQUE0QywrQkFBK0Isb0JBQW9CLG1DQUFtQyxzQ0FBc0MsdUVBQXVFO0FBQ3pNO0FBQzVDO0FBQ2U7QUFDQTtBQUNnQztBQUN4QjtBQUM4QjtBQUNwQztBQUN3QjtBQUNoQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwrQ0FBSztBQUN4QjtBQUNBO0FBQ0EsaUJBQWlCLCtDQUFLO0FBQ3RCLElBQUk7QUFDSixnQkFBZ0IsbUZBQWtCO0FBQ2xDLGlCQUFpQix1REFBUztBQUMxQixJQUFJO0FBQ0osZ0NBQWdDLHlGQUFxQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNB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LHFCQUFxQixLQUFxQyxHQUFHLDBEQUFTLHFJQUFxSSxDQUFnQjtBQUMzTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGlCQUFpQixpREFBVTtBQUMzQixTQUFTLHNFQUFxQjtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxpQkFBaUIsaURBQVU7QUFDM0IsU0FBUyxzRUFBcUI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsaUJBQWlCLGlEQUFVO0FBQzNCLDhCQUE4QixrREFBSTtBQUNsQyxXQUFXLG1EQUFLO0FBQ2hCLEdBQUc7QUFDSCxrQ0FBa0Msc0VBQXFCO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxpQkFBaUIsaURBQVU7QUFDM0Isd0JBQXdCLEtBQXFDLEdBQUcsMERBQVMsMENBQTBDLHVFQUF1RSxDQUFnQjtBQUMxTTtBQUNBLHFCQUFxQixLQUFxQyxHQUFHLDBEQUFTLHFJQUFxSSxDQUFnQjtBQUMzTjtBQUNBO0FBQ087QUFDUCxnQkFBZ0IsaURBQVU7QUFDMUI7QUFDQTtBQUNPO0FBQ1AsU0FBUyxpREFBVTtBQUNuQjtBQUNPO0FBQ1AsU0FBUyxpREFBVTtBQUNuQjtBQUNPO0FBQ1AsU0FBUyxpREFBVTtBQUNuQixFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbXBvbmVudC9DZWxsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb21wb25lbnQvQ3Vyc29yLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb21wb25lbnQvRGVmYXVsdExlZ2VuZENvbnRlbnQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbXBvbmVudC9EZWZhdWx0VG9vbHRpcENvbnRlbnQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbXBvbmVudC9MYWJlbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L0xhYmVsTGlzdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L0xlZ2VuZC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L1Jlc3BvbnNpdmVDb250YWluZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmVjaGFydHMvZXM2L2NvbXBvbmVudC9UZXh0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb21wb25lbnQvVG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29tcG9uZW50L1Rvb2x0aXBCb3VuZGluZ0JveC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29udGFpbmVyL0xheWVyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlY2hhcnRzL2VzNi9jb250YWluZXIvU3VyZmFjZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yZWNoYXJ0cy9lczYvY29udGV4dC9jaGFydExheW91dENvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IENyb3NzXG4gKi9cblxuZXhwb3J0IHZhciBDZWxsID0gZnVuY3Rpb24gQ2VsbChfcHJvcHMpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuQ2VsbC5kaXNwbGF5TmFtZSA9ICdDZWxsJzsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCBjcmVhdGVFbGVtZW50LCBpc1ZhbGlkRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgQ3VydmUgfSBmcm9tICcuLi9zaGFwZS9DdXJ2ZSc7XG5pbXBvcnQgeyBDcm9zcyB9IGZyb20gJy4uL3NoYXBlL0Nyb3NzJztcbmltcG9ydCB7IGdldEN1cnNvclJlY3RhbmdsZSB9IGZyb20gJy4uL3V0aWwvY3Vyc29yL2dldEN1cnNvclJlY3RhbmdsZSc7XG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICcuLi9zaGFwZS9SZWN0YW5nbGUnO1xuaW1wb3J0IHsgZ2V0UmFkaWFsQ3Vyc29yUG9pbnRzIH0gZnJvbSAnLi4vdXRpbC9jdXJzb3IvZ2V0UmFkaWFsQ3Vyc29yUG9pbnRzJztcbmltcG9ydCB7IFNlY3RvciB9IGZyb20gJy4uL3NoYXBlL1NlY3Rvcic7XG5pbXBvcnQgeyBnZXRDdXJzb3JQb2ludHMgfSBmcm9tICcuLi91dGlsL2N1cnNvci9nZXRDdXJzb3JQb2ludHMnO1xuaW1wb3J0IHsgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuLypcbiAqIEN1cnNvciBpcyB0aGUgYmFja2dyb3VuZCwgb3IgYSBoaWdobGlnaHQsXG4gKiB0aGF0IHNob3dzIHdoZW4gdXNlciBtb3VzZXMgb3ZlciBvciBhY3RpdmF0ZXNcbiAqIGFuIGFyZWEuXG4gKlxuICogSXQgdXN1YWxseSBzaG93cyB0b2dldGhlciB3aXRoIGEgdG9vbHRpcFxuICogdG8gZW1waGFzaXNlIHdoaWNoIHBhcnQgb2YgdGhlIGNoYXJ0IGRvZXMgdGhlIHRvb2x0aXAgcmVmZXIgdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDdXJzb3IocHJvcHMpIHtcbiAgdmFyIF9lbGVtZW50JHByb3BzJGN1cnNvciwgX2RlZmF1bHRQcm9wcztcbiAgdmFyIGVsZW1lbnQgPSBwcm9wcy5lbGVtZW50LFxuICAgIHRvb2x0aXBFdmVudFR5cGUgPSBwcm9wcy50b29sdGlwRXZlbnRUeXBlLFxuICAgIGlzQWN0aXZlID0gcHJvcHMuaXNBY3RpdmUsXG4gICAgYWN0aXZlQ29vcmRpbmF0ZSA9IHByb3BzLmFjdGl2ZUNvb3JkaW5hdGUsXG4gICAgYWN0aXZlUGF5bG9hZCA9IHByb3BzLmFjdGl2ZVBheWxvYWQsXG4gICAgb2Zmc2V0ID0gcHJvcHMub2Zmc2V0LFxuICAgIGFjdGl2ZVRvb2x0aXBJbmRleCA9IHByb3BzLmFjdGl2ZVRvb2x0aXBJbmRleCxcbiAgICB0b29sdGlwQXhpc0JhbmRTaXplID0gcHJvcHMudG9vbHRpcEF4aXNCYW5kU2l6ZSxcbiAgICBsYXlvdXQgPSBwcm9wcy5sYXlvdXQsXG4gICAgY2hhcnROYW1lID0gcHJvcHMuY2hhcnROYW1lO1xuICB2YXIgZWxlbWVudFByb3BzQ3Vyc29yID0gKF9lbGVtZW50JHByb3BzJGN1cnNvciA9IGVsZW1lbnQucHJvcHMuY3Vyc29yKSAhPT0gbnVsbCAmJiBfZWxlbWVudCRwcm9wcyRjdXJzb3IgIT09IHZvaWQgMCA/IF9lbGVtZW50JHByb3BzJGN1cnNvciA6IChfZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykgPT09IG51bGwgfHwgX2RlZmF1bHRQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RlZmF1bHRQcm9wcy5jdXJzb3I7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudFByb3BzQ3Vyc29yIHx8ICFpc0FjdGl2ZSB8fCAhYWN0aXZlQ29vcmRpbmF0ZSB8fCBjaGFydE5hbWUgIT09ICdTY2F0dGVyQ2hhcnQnICYmIHRvb2x0aXBFdmVudFR5cGUgIT09ICdheGlzJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciByZXN0UHJvcHM7XG4gIHZhciBjdXJzb3JDb21wID0gQ3VydmU7XG4gIGlmIChjaGFydE5hbWUgPT09ICdTY2F0dGVyQ2hhcnQnKSB7XG4gICAgcmVzdFByb3BzID0gYWN0aXZlQ29vcmRpbmF0ZTtcbiAgICBjdXJzb3JDb21wID0gQ3Jvc3M7XG4gIH0gZWxzZSBpZiAoY2hhcnROYW1lID09PSAnQmFyQ2hhcnQnKSB7XG4gICAgcmVzdFByb3BzID0gZ2V0Q3Vyc29yUmVjdGFuZ2xlKGxheW91dCwgYWN0aXZlQ29vcmRpbmF0ZSwgb2Zmc2V0LCB0b29sdGlwQXhpc0JhbmRTaXplKTtcbiAgICBjdXJzb3JDb21wID0gUmVjdGFuZ2xlO1xuICB9IGVsc2UgaWYgKGxheW91dCA9PT0gJ3JhZGlhbCcpIHtcbiAgICB2YXIgX2dldFJhZGlhbEN1cnNvclBvaW50ID0gZ2V0UmFkaWFsQ3Vyc29yUG9pbnRzKGFjdGl2ZUNvb3JkaW5hdGUpLFxuICAgICAgY3ggPSBfZ2V0UmFkaWFsQ3Vyc29yUG9pbnQuY3gsXG4gICAgICBjeSA9IF9nZXRSYWRpYWxDdXJzb3JQb2ludC5jeSxcbiAgICAgIHJhZGl1cyA9IF9nZXRSYWRpYWxDdXJzb3JQb2ludC5yYWRpdXMsXG4gICAgICBzdGFydEFuZ2xlID0gX2dldFJhZGlhbEN1cnNvclBvaW50LnN0YXJ0QW5nbGUsXG4gICAgICBlbmRBbmdsZSA9IF9nZXRSYWRpYWxDdXJzb3JQb2ludC5lbmRBbmdsZTtcbiAgICByZXN0UHJvcHMgPSB7XG4gICAgICBjeDogY3gsXG4gICAgICBjeTogY3ksXG4gICAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGU6IGVuZEFuZ2xlLFxuICAgICAgaW5uZXJSYWRpdXM6IHJhZGl1cyxcbiAgICAgIG91dGVyUmFkaXVzOiByYWRpdXNcbiAgICB9O1xuICAgIGN1cnNvckNvbXAgPSBTZWN0b3I7XG4gIH0gZWxzZSB7XG4gICAgcmVzdFByb3BzID0ge1xuICAgICAgcG9pbnRzOiBnZXRDdXJzb3JQb2ludHMobGF5b3V0LCBhY3RpdmVDb29yZGluYXRlLCBvZmZzZXQpXG4gICAgfTtcbiAgICBjdXJzb3JDb21wID0gQ3VydmU7XG4gIH1cbiAgdmFyIGN1cnNvclByb3BzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgc3Ryb2tlOiAnI2NjYycsXG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gIH0sIG9mZnNldCksIHJlc3RQcm9wcyksIGZpbHRlclByb3BzKGVsZW1lbnRQcm9wc0N1cnNvciwgZmFsc2UpKSwge30sIHtcbiAgICBwYXlsb2FkOiBhY3RpdmVQYXlsb2FkLFxuICAgIHBheWxvYWRJbmRleDogYWN0aXZlVG9vbHRpcEluZGV4LFxuICAgIGNsYXNzTmFtZTogY2xzeCgncmVjaGFydHMtdG9vbHRpcC1jdXJzb3InLCBlbGVtZW50UHJvcHNDdXJzb3IuY2xhc3NOYW1lKVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChlbGVtZW50UHJvcHNDdXJzb3IpID8gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChlbGVtZW50UHJvcHNDdXJzb3IsIGN1cnNvclByb3BzKSA6IC8qI19fUFVSRV9fKi9jcmVhdGVFbGVtZW50KGN1cnNvckNvbXAsIGN1cnNvclByb3BzKTtcbn0iLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7IHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7IH1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyB0cnkgeyB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IH0gY2F0Y2ggKHQpIHt9IHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHJldHVybiAhIXQ7IH0pKCk7IH1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IERlZmF1bHQgTGVnZW5kIENvbnRlbnRcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICdsb2Rhc2gvaXNGdW5jdGlvbic7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi91dGlsL0xvZ1V0aWxzJztcbmltcG9ydCB7IFN1cmZhY2UgfSBmcm9tICcuLi9jb250YWluZXIvU3VyZmFjZSc7XG5pbXBvcnQgeyBTeW1ib2xzIH0gZnJvbSAnLi4vc2hhcGUvU3ltYm9scyc7XG5pbXBvcnQgeyBhZGFwdEV2ZW50c09mQ2hpbGQgfSBmcm9tICcuLi91dGlsL3R5cGVzJztcbnZhciBTSVpFID0gMzI7XG5leHBvcnQgdmFyIERlZmF1bHRMZWdlbmRDb250ZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICBmdW5jdGlvbiBEZWZhdWx0TGVnZW5kQ29udGVudCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVmYXVsdExlZ2VuZENvbnRlbnQpO1xuICAgIHJldHVybiBfY2FsbFN1cGVyKHRoaXMsIERlZmF1bHRMZWdlbmRDb250ZW50LCBhcmd1bWVudHMpO1xuICB9XG4gIF9pbmhlcml0cyhEZWZhdWx0TGVnZW5kQ29udGVudCwgX1B1cmVDb21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKERlZmF1bHRMZWdlbmRDb250ZW50LCBbe1xuICAgIGtleTogXCJyZW5kZXJJY29uXCIsXG4gICAgdmFsdWU6XG4gICAgLyoqXG4gICAgICogUmVuZGVyIHRoZSBwYXRoIG9mIGljb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBEYXRhIG9mIGVhY2ggbGVnZW5kIGl0ZW1cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFBhdGggZWxlbWVudFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbmRlckljb24oZGF0YSkge1xuICAgICAgdmFyIGluYWN0aXZlQ29sb3IgPSB0aGlzLnByb3BzLmluYWN0aXZlQ29sb3I7XG4gICAgICB2YXIgaGFsZlNpemUgPSBTSVpFIC8gMjtcbiAgICAgIHZhciBzaXh0aFNpemUgPSBTSVpFIC8gNjtcbiAgICAgIHZhciB0aGlyZFNpemUgPSBTSVpFIC8gMztcbiAgICAgIHZhciBjb2xvciA9IGRhdGEuaW5hY3RpdmUgPyBpbmFjdGl2ZUNvbG9yIDogZGF0YS5jb2xvcjtcbiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdwbGFpbmxpbmUnKSB7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpbmVcIiwge1xuICAgICAgICAgIHN0cm9rZVdpZHRoOiA0LFxuICAgICAgICAgIGZpbGw6IFwibm9uZVwiLFxuICAgICAgICAgIHN0cm9rZTogY29sb3IsXG4gICAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiBkYXRhLnBheWxvYWQuc3Ryb2tlRGFzaGFycmF5LFxuICAgICAgICAgIHgxOiAwLFxuICAgICAgICAgIHkxOiBoYWxmU2l6ZSxcbiAgICAgICAgICB4MjogU0laRSxcbiAgICAgICAgICB5MjogaGFsZlNpemUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWxlZ2VuZC1pY29uXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgICAgICAgZmlsbDogXCJub25lXCIsXG4gICAgICAgICAgc3Ryb2tlOiBjb2xvcixcbiAgICAgICAgICBkOiBcIk0wLFwiLmNvbmNhdChoYWxmU2l6ZSwgXCJoXCIpLmNvbmNhdCh0aGlyZFNpemUsIFwiXFxuICAgICAgICAgICAgQVwiKS5jb25jYXQoc2l4dGhTaXplLCBcIixcIikuY29uY2F0KHNpeHRoU2l6ZSwgXCIsMCwxLDEsXCIpLmNvbmNhdCgyICogdGhpcmRTaXplLCBcIixcIikuY29uY2F0KGhhbGZTaXplLCBcIlxcbiAgICAgICAgICAgIEhcIikuY29uY2F0KFNJWkUsIFwiTVwiKS5jb25jYXQoMiAqIHRoaXJkU2l6ZSwgXCIsXCIpLmNvbmNhdChoYWxmU2l6ZSwgXCJcXG4gICAgICAgICAgICBBXCIpLmNvbmNhdChzaXh0aFNpemUsIFwiLFwiKS5jb25jYXQoc2l4dGhTaXplLCBcIiwwLDEsMSxcIikuY29uY2F0KHRoaXJkU2l6ZSwgXCIsXCIpLmNvbmNhdChoYWxmU2l6ZSksXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWxlZ2VuZC1pY29uXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS50eXBlID09PSAncmVjdCcpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICAgICAgc3Ryb2tlOiBcIm5vbmVcIixcbiAgICAgICAgICBmaWxsOiBjb2xvcixcbiAgICAgICAgICBkOiBcIk0wLFwiLmNvbmNhdChTSVpFIC8gOCwgXCJoXCIpLmNvbmNhdChTSVpFLCBcInZcIikuY29uY2F0KFNJWkUgKiAzIC8gNCwgXCJoXCIpLmNvbmNhdCgtU0laRSwgXCJ6XCIpLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1sZWdlbmQtaWNvblwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZGF0YS5sZWdlbmRJY29uKSkge1xuICAgICAgICB2YXIgaWNvblByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgZGF0YSk7XG4gICAgICAgIGRlbGV0ZSBpY29uUHJvcHMubGVnZW5kSWNvbjtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoZGF0YS5sZWdlbmRJY29uLCBpY29uUHJvcHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN5bWJvbHMsIHtcbiAgICAgICAgZmlsbDogY29sb3IsXG4gICAgICAgIGN4OiBoYWxmU2l6ZSxcbiAgICAgICAgY3k6IGhhbGZTaXplLFxuICAgICAgICBzaXplOiBTSVpFLFxuICAgICAgICBzaXplVHlwZTogXCJkaWFtZXRlclwiLFxuICAgICAgICB0eXBlOiBkYXRhLnR5cGVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXcgaXRlbXMgb2YgbGVnZW5kXG4gICAgICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBJdGVtc1xuICAgICAqL1xuICB9LCB7XG4gICAga2V5OiBcInJlbmRlckl0ZW1zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckl0ZW1zKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHBheWxvYWQgPSBfdGhpcyRwcm9wcy5wYXlsb2FkLFxuICAgICAgICBpY29uU2l6ZSA9IF90aGlzJHByb3BzLmljb25TaXplLFxuICAgICAgICBsYXlvdXQgPSBfdGhpcyRwcm9wcy5sYXlvdXQsXG4gICAgICAgIGZvcm1hdHRlciA9IF90aGlzJHByb3BzLmZvcm1hdHRlcixcbiAgICAgICAgaW5hY3RpdmVDb2xvciA9IF90aGlzJHByb3BzLmluYWN0aXZlQ29sb3I7XG4gICAgICB2YXIgdmlld0JveCA9IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgd2lkdGg6IFNJWkUsXG4gICAgICAgIGhlaWdodDogU0laRVxuICAgICAgfTtcbiAgICAgIHZhciBpdGVtU3R5bGUgPSB7XG4gICAgICAgIGRpc3BsYXk6IGxheW91dCA9PT0gJ2hvcml6b250YWwnID8gJ2lubGluZS1ibG9jaycgOiAnYmxvY2snLFxuICAgICAgICBtYXJnaW5SaWdodDogMTBcbiAgICAgIH07XG4gICAgICB2YXIgc3ZnU3R5bGUgPSB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IDRcbiAgICAgIH07XG4gICAgICByZXR1cm4gcGF5bG9hZC5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpKSB7XG4gICAgICAgIHZhciBmaW5hbEZvcm1hdHRlciA9IGVudHJ5LmZvcm1hdHRlciB8fCBmb3JtYXR0ZXI7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBjbHN4KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe1xuICAgICAgICAgICdyZWNoYXJ0cy1sZWdlbmQtaXRlbSc6IHRydWVcbiAgICAgICAgfSwgXCJsZWdlbmQtaXRlbS1cIi5jb25jYXQoaSksIHRydWUpLCBcImluYWN0aXZlXCIsIGVudHJ5LmluYWN0aXZlKSk7XG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSAnbm9uZScpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvIG5vdCByZW5kZXIgZW50cnkudmFsdWUgYXMgZnVuY3Rpb25zLiBBbHdheXMgcmVxdWlyZSBzdGF0aWMgc3RyaW5nIHByb3BlcnRpZXMuXG4gICAgICAgIHZhciBlbnRyeVZhbHVlID0gIWlzRnVuY3Rpb24oZW50cnkudmFsdWUpID8gZW50cnkudmFsdWUgOiBudWxsO1xuICAgICAgICB3YXJuKCFpc0Z1bmN0aW9uKGVudHJ5LnZhbHVlKSwgXCJUaGUgbmFtZSBwcm9wZXJ0eSBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gdXNpbmcgYSBmdW5jdGlvbiBmb3IgdGhlIGRhdGFLZXkgb2YgYSBjaGFydCdzIGNhcnRlc2lhbiBjb21wb25lbnRzLiBFeDogPEJhciBuYW1lPVxcXCJOYW1lIG9mIG15IERhdGFcXFwiLz5cIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGNvbG9yID0gZW50cnkuaW5hY3RpdmUgPyBpbmFjdGl2ZUNvbG9yIDogZW50cnkuY29sb3I7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIF9leHRlbmRzKHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZTogaXRlbVN0eWxlXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgICAgICxcbiAgICAgICAgICBrZXk6IFwibGVnZW5kLWl0ZW0tXCIuY29uY2F0KGkpXG4gICAgICAgIH0sIGFkYXB0RXZlbnRzT2ZDaGlsZChfdGhpcy5wcm9wcywgZW50cnksIGkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3VyZmFjZSwge1xuICAgICAgICAgIHdpZHRoOiBpY29uU2l6ZSxcbiAgICAgICAgICBoZWlnaHQ6IGljb25TaXplLFxuICAgICAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICAgICAgc3R5bGU6IHN2Z1N0eWxlXG4gICAgICAgIH0sIF90aGlzLnJlbmRlckljb24oZW50cnkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtbGVnZW5kLWl0ZW0tdGV4dFwiLFxuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBjb2xvcjogY29sb3JcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGZpbmFsRm9ybWF0dGVyID8gZmluYWxGb3JtYXR0ZXIoZW50cnlWYWx1ZSwgZW50cnksIGkpIDogZW50cnlWYWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcGF5bG9hZCA9IF90aGlzJHByb3BzMi5wYXlsb2FkLFxuICAgICAgICBsYXlvdXQgPSBfdGhpcyRwcm9wczIubGF5b3V0LFxuICAgICAgICBhbGlnbiA9IF90aGlzJHByb3BzMi5hbGlnbjtcbiAgICAgIGlmICghcGF5bG9hZCB8fCAhcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgZmluYWxTdHlsZSA9IHtcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICB0ZXh0QWxpZ246IGxheW91dCA9PT0gJ2hvcml6b250YWwnID8gYWxpZ24gOiAnbGVmdCdcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1kZWZhdWx0LWxlZ2VuZFwiLFxuICAgICAgICBzdHlsZTogZmluYWxTdHlsZVxuICAgICAgfSwgdGhpcy5yZW5kZXJJdGVtcygpKTtcbiAgICB9XG4gIH1dKTtcbn0oUHVyZUNvbXBvbmVudCk7XG5fZGVmaW5lUHJvcGVydHkoRGVmYXVsdExlZ2VuZENvbnRlbnQsIFwiZGlzcGxheU5hbWVcIiwgJ0xlZ2VuZCcpO1xuX2RlZmluZVByb3BlcnR5KERlZmF1bHRMZWdlbmRDb250ZW50LCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGljb25TaXplOiAxNCxcbiAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXG4gIGFsaWduOiAnY2VudGVyJyxcbiAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gIGluYWN0aXZlQ29sb3I6ICcjY2NjJ1xufSk7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gdCkgeyB2YXIgZSwgbiwgaSwgdSwgYSA9IFtdLCBmID0gITAsIG8gPSAhMTsgdHJ5IHsgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkgeyBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47IGYgPSAhMTsgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApOyB9IGNhdGNoIChyKSB7IG8gPSAhMCwgbiA9IHI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKG8pIHRocm93IG47IH0gfSByZXR1cm4gYTsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgRGVmYXVsdCBUb29sdGlwIENvbnRlbnRcbiAqL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHNvcnRCeSBmcm9tICdsb2Rhc2gvc29ydEJ5JztcbmltcG9ydCBpc05pbCBmcm9tICdsb2Rhc2gvaXNOaWwnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBpc051bU9yU3RyIH0gZnJvbSAnLi4vdXRpbC9EYXRhVXRpbHMnO1xuZnVuY3Rpb24gZGVmYXVsdEZvcm1hdHRlcih2YWx1ZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgaXNOdW1PclN0cih2YWx1ZVswXSkgJiYgaXNOdW1PclN0cih2YWx1ZVsxXSkgPyB2YWx1ZS5qb2luKCcgfiAnKSA6IHZhbHVlO1xufVxuZXhwb3J0IHZhciBEZWZhdWx0VG9vbHRpcENvbnRlbnQgPSBmdW5jdGlvbiBEZWZhdWx0VG9vbHRpcENvbnRlbnQocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRzZXBhcmF0b3IgPSBwcm9wcy5zZXBhcmF0b3IsXG4gICAgc2VwYXJhdG9yID0gX3Byb3BzJHNlcGFyYXRvciA9PT0gdm9pZCAwID8gJyA6ICcgOiBfcHJvcHMkc2VwYXJhdG9yLFxuICAgIF9wcm9wcyRjb250ZW50U3R5bGUgPSBwcm9wcy5jb250ZW50U3R5bGUsXG4gICAgY29udGVudFN0eWxlID0gX3Byb3BzJGNvbnRlbnRTdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkY29udGVudFN0eWxlLFxuICAgIF9wcm9wcyRpdGVtU3R5bGUgPSBwcm9wcy5pdGVtU3R5bGUsXG4gICAgaXRlbVN0eWxlID0gX3Byb3BzJGl0ZW1TdHlsZSA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkaXRlbVN0eWxlLFxuICAgIF9wcm9wcyRsYWJlbFN0eWxlID0gcHJvcHMubGFiZWxTdHlsZSxcbiAgICBsYWJlbFN0eWxlID0gX3Byb3BzJGxhYmVsU3R5bGUgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGxhYmVsU3R5bGUsXG4gICAgcGF5bG9hZCA9IHByb3BzLnBheWxvYWQsXG4gICAgZm9ybWF0dGVyID0gcHJvcHMuZm9ybWF0dGVyLFxuICAgIGl0ZW1Tb3J0ZXIgPSBwcm9wcy5pdGVtU29ydGVyLFxuICAgIHdyYXBwZXJDbGFzc05hbWUgPSBwcm9wcy53cmFwcGVyQ2xhc3NOYW1lLFxuICAgIGxhYmVsQ2xhc3NOYW1lID0gcHJvcHMubGFiZWxDbGFzc05hbWUsXG4gICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICBsYWJlbEZvcm1hdHRlciA9IHByb3BzLmxhYmVsRm9ybWF0dGVyLFxuICAgIF9wcm9wcyRhY2Nlc3NpYmlsaXR5TCA9IHByb3BzLmFjY2Vzc2liaWxpdHlMYXllcixcbiAgICBhY2Nlc3NpYmlsaXR5TGF5ZXIgPSBfcHJvcHMkYWNjZXNzaWJpbGl0eUwgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGFjY2Vzc2liaWxpdHlMO1xuICB2YXIgcmVuZGVyQ29udGVudCA9IGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgaWYgKHBheWxvYWQgJiYgcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgIHZhciBsaXN0U3R5bGUgPSB7XG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIG1hcmdpbjogMFxuICAgICAgfTtcbiAgICAgIHZhciBpdGVtcyA9IChpdGVtU29ydGVyID8gc29ydEJ5KHBheWxvYWQsIGl0ZW1Tb3J0ZXIpIDogcGF5bG9hZCkubWFwKGZ1bmN0aW9uIChlbnRyeSwgaSkge1xuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpbmFsSXRlbVN0eWxlID0gX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICBwYWRkaW5nVG9wOiA0LFxuICAgICAgICAgIHBhZGRpbmdCb3R0b206IDQsXG4gICAgICAgICAgY29sb3I6IGVudHJ5LmNvbG9yIHx8ICcjMDAwJ1xuICAgICAgICB9LCBpdGVtU3R5bGUpO1xuICAgICAgICB2YXIgZmluYWxGb3JtYXR0ZXIgPSBlbnRyeS5mb3JtYXR0ZXIgfHwgZm9ybWF0dGVyIHx8IGRlZmF1bHRGb3JtYXR0ZXI7XG4gICAgICAgIHZhciB2YWx1ZSA9IGVudHJ5LnZhbHVlLFxuICAgICAgICAgIG5hbWUgPSBlbnRyeS5uYW1lO1xuICAgICAgICB2YXIgZmluYWxWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB2YXIgZmluYWxOYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKGZpbmFsRm9ybWF0dGVyICYmIGZpbmFsVmFsdWUgIT0gbnVsbCAmJiBmaW5hbE5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmb3JtYXR0ZWQgPSBmaW5hbEZvcm1hdHRlcih2YWx1ZSwgbmFtZSwgZW50cnksIGksIHBheWxvYWQpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1hdHRlZCkpIHtcbiAgICAgICAgICAgIHZhciBfZm9ybWF0dGVkID0gX3NsaWNlZFRvQXJyYXkoZm9ybWF0dGVkLCAyKTtcbiAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBfZm9ybWF0dGVkWzBdO1xuICAgICAgICAgICAgZmluYWxOYW1lID0gX2Zvcm1hdHRlZFsxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxWYWx1ZSA9IGZvcm1hdHRlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtdG9vbHRpcC1pdGVtXCIsXG4gICAgICAgICAgICBrZXk6IFwidG9vbHRpcC1pdGVtLVwiLmNvbmNhdChpKSxcbiAgICAgICAgICAgIHN0eWxlOiBmaW5hbEl0ZW1TdHlsZVxuICAgICAgICAgIH0sIGlzTnVtT3JTdHIoZmluYWxOYW1lKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtdG9vbHRpcC1pdGVtLW5hbWVcIlxuICAgICAgICAgIH0sIGZpbmFsTmFtZSkgOiBudWxsLCBpc051bU9yU3RyKGZpbmFsTmFtZSkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXRvb2x0aXAtaXRlbS1zZXBhcmF0b3JcIlxuICAgICAgICAgIH0sIHNlcGFyYXRvcikgOiBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLXRvb2x0aXAtaXRlbS12YWx1ZVwiXG4gICAgICAgICAgfSwgZmluYWxWYWx1ZSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwicmVjaGFydHMtdG9vbHRpcC1pdGVtLXVuaXRcIlxuICAgICAgICAgIH0sIGVudHJ5LnVuaXQgfHwgJycpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy10b29sdGlwLWl0ZW0tbGlzdFwiLFxuICAgICAgICBzdHlsZTogbGlzdFN0eWxlXG4gICAgICB9LCBpdGVtcyk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuICB2YXIgZmluYWxTdHlsZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAxMCxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmJyxcbiAgICBib3JkZXI6ICcxcHggc29saWQgI2NjYycsXG4gICAgd2hpdGVTcGFjZTogJ25vd3JhcCdcbiAgfSwgY29udGVudFN0eWxlKTtcbiAgdmFyIGZpbmFsTGFiZWxTdHlsZSA9IF9vYmplY3RTcHJlYWQoe1xuICAgIG1hcmdpbjogMFxuICB9LCBsYWJlbFN0eWxlKTtcbiAgdmFyIGhhc0xhYmVsID0gIWlzTmlsKGxhYmVsKTtcbiAgdmFyIGZpbmFsTGFiZWwgPSBoYXNMYWJlbCA/IGxhYmVsIDogJyc7XG4gIHZhciB3cmFwcGVyQ04gPSBjbHN4KCdyZWNoYXJ0cy1kZWZhdWx0LXRvb2x0aXAnLCB3cmFwcGVyQ2xhc3NOYW1lKTtcbiAgdmFyIGxhYmVsQ04gPSBjbHN4KCdyZWNoYXJ0cy10b29sdGlwLWxhYmVsJywgbGFiZWxDbGFzc05hbWUpO1xuICBpZiAoaGFzTGFiZWwgJiYgbGFiZWxGb3JtYXR0ZXIgJiYgcGF5bG9hZCAhPT0gdW5kZWZpbmVkICYmIHBheWxvYWQgIT09IG51bGwpIHtcbiAgICBmaW5hbExhYmVsID0gbGFiZWxGb3JtYXR0ZXIobGFiZWwsIHBheWxvYWQpO1xuICB9XG4gIHZhciBhY2Nlc3NpYmlsaXR5QXR0cmlidXRlcyA9IGFjY2Vzc2liaWxpdHlMYXllciA/IHtcbiAgICByb2xlOiAnc3RhdHVzJyxcbiAgICAnYXJpYS1saXZlJzogJ2Fzc2VydGl2ZSdcbiAgfSA6IHt9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogd3JhcHBlckNOLFxuICAgIHN0eWxlOiBmaW5hbFN0eWxlXG4gIH0sIGFjY2Vzc2liaWxpdHlBdHRyaWJ1dGVzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIHtcbiAgICBjbGFzc05hbWU6IGxhYmVsQ04sXG4gICAgc3R5bGU6IGZpbmFsTGFiZWxTdHlsZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZmluYWxMYWJlbCkgPyBmaW5hbExhYmVsIDogXCJcIi5jb25jYXQoZmluYWxMYWJlbCkpLCByZW5kZXJDb250ZW50KCkpO1xufTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG52YXIgX2V4Y2x1ZGVkID0gW1wib2Zmc2V0XCJdO1xuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgUmVhY3QsIHsgY2xvbmVFbGVtZW50LCBpc1ZhbGlkRWxlbWVudCwgY3JlYXRlRWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc05pbCBmcm9tICdsb2Rhc2gvaXNOaWwnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnbG9kYXNoL2lzRnVuY3Rpb24nO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJ2xvZGFzaC9pc09iamVjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IFRleHQgfSBmcm9tICcuL1RleHQnO1xuaW1wb3J0IHsgZmluZEFsbEJ5VHlwZSwgZmlsdGVyUHJvcHMgfSBmcm9tICcuLi91dGlsL1JlYWN0VXRpbHMnO1xuaW1wb3J0IHsgaXNOdW1PclN0ciwgaXNOdW1iZXIsIGlzUGVyY2VudCwgZ2V0UGVyY2VudFZhbHVlLCB1bmlxdWVJZCwgbWF0aFNpZ24gfSBmcm9tICcuLi91dGlsL0RhdGFVdGlscyc7XG5pbXBvcnQgeyBwb2xhclRvQ2FydGVzaWFuIH0gZnJvbSAnLi4vdXRpbC9Qb2xhclV0aWxzJztcbnZhciBnZXRMYWJlbCA9IGZ1bmN0aW9uIGdldExhYmVsKHByb3BzKSB7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGZvcm1hdHRlciA9IHByb3BzLmZvcm1hdHRlcjtcbiAgdmFyIGxhYmVsID0gaXNOaWwocHJvcHMuY2hpbGRyZW4pID8gdmFsdWUgOiBwcm9wcy5jaGlsZHJlbjtcbiAgaWYgKGlzRnVuY3Rpb24oZm9ybWF0dGVyKSkge1xuICAgIHJldHVybiBmb3JtYXR0ZXIobGFiZWwpO1xuICB9XG4gIHJldHVybiBsYWJlbDtcbn07XG52YXIgZ2V0RGVsdGFBbmdsZSA9IGZ1bmN0aW9uIGdldERlbHRhQW5nbGUoc3RhcnRBbmdsZSwgZW5kQW5nbGUpIHtcbiAgdmFyIHNpZ24gPSBtYXRoU2lnbihlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpO1xuICB2YXIgZGVsdGFBbmdsZSA9IE1hdGgubWluKE1hdGguYWJzKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSksIDM2MCk7XG4gIHJldHVybiBzaWduICogZGVsdGFBbmdsZTtcbn07XG52YXIgcmVuZGVyUmFkaWFsTGFiZWwgPSBmdW5jdGlvbiByZW5kZXJSYWRpYWxMYWJlbChsYWJlbFByb3BzLCBsYWJlbCwgYXR0cnMpIHtcbiAgdmFyIHBvc2l0aW9uID0gbGFiZWxQcm9wcy5wb3NpdGlvbixcbiAgICB2aWV3Qm94ID0gbGFiZWxQcm9wcy52aWV3Qm94LFxuICAgIG9mZnNldCA9IGxhYmVsUHJvcHMub2Zmc2V0LFxuICAgIGNsYXNzTmFtZSA9IGxhYmVsUHJvcHMuY2xhc3NOYW1lO1xuICB2YXIgX3JlZiA9IHZpZXdCb3gsXG4gICAgY3ggPSBfcmVmLmN4LFxuICAgIGN5ID0gX3JlZi5jeSxcbiAgICBpbm5lclJhZGl1cyA9IF9yZWYuaW5uZXJSYWRpdXMsXG4gICAgb3V0ZXJSYWRpdXMgPSBfcmVmLm91dGVyUmFkaXVzLFxuICAgIHN0YXJ0QW5nbGUgPSBfcmVmLnN0YXJ0QW5nbGUsXG4gICAgZW5kQW5nbGUgPSBfcmVmLmVuZEFuZ2xlLFxuICAgIGNsb2NrV2lzZSA9IF9yZWYuY2xvY2tXaXNlO1xuICB2YXIgcmFkaXVzID0gKGlubmVyUmFkaXVzICsgb3V0ZXJSYWRpdXMpIC8gMjtcbiAgdmFyIGRlbHRhQW5nbGUgPSBnZXREZWx0YUFuZ2xlKHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKTtcbiAgdmFyIHNpZ24gPSBkZWx0YUFuZ2xlID49IDAgPyAxIDogLTE7XG4gIHZhciBsYWJlbEFuZ2xlLCBkaXJlY3Rpb247XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZVN0YXJ0Jykge1xuICAgIGxhYmVsQW5nbGUgPSBzdGFydEFuZ2xlICsgc2lnbiAqIG9mZnNldDtcbiAgICBkaXJlY3Rpb24gPSBjbG9ja1dpc2U7XG4gIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdpbnNpZGVFbmQnKSB7XG4gICAgbGFiZWxBbmdsZSA9IGVuZEFuZ2xlIC0gc2lnbiAqIG9mZnNldDtcbiAgICBkaXJlY3Rpb24gPSAhY2xvY2tXaXNlO1xuICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnZW5kJykge1xuICAgIGxhYmVsQW5nbGUgPSBlbmRBbmdsZSArIHNpZ24gKiBvZmZzZXQ7XG4gICAgZGlyZWN0aW9uID0gY2xvY2tXaXNlO1xuICB9XG4gIGRpcmVjdGlvbiA9IGRlbHRhQW5nbGUgPD0gMCA/IGRpcmVjdGlvbiA6ICFkaXJlY3Rpb247XG4gIHZhciBzdGFydFBvaW50ID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIHJhZGl1cywgbGFiZWxBbmdsZSk7XG4gIHZhciBlbmRQb2ludCA9IHBvbGFyVG9DYXJ0ZXNpYW4oY3gsIGN5LCByYWRpdXMsIGxhYmVsQW5nbGUgKyAoZGlyZWN0aW9uID8gMSA6IC0xKSAqIDM1OSk7XG4gIHZhciBwYXRoID0gXCJNXCIuY29uY2F0KHN0YXJ0UG9pbnQueCwgXCIsXCIpLmNvbmNhdChzdGFydFBvaW50LnksIFwiXFxuICAgIEFcIikuY29uY2F0KHJhZGl1cywgXCIsXCIpLmNvbmNhdChyYWRpdXMsIFwiLDAsMSxcIikuY29uY2F0KGRpcmVjdGlvbiA/IDAgOiAxLCBcIixcXG4gICAgXCIpLmNvbmNhdChlbmRQb2ludC54LCBcIixcIikuY29uY2F0KGVuZFBvaW50LnkpO1xuICB2YXIgaWQgPSBpc05pbChsYWJlbFByb3BzLmlkKSA/IHVuaXF1ZUlkKCdyZWNoYXJ0cy1yYWRpYWwtbGluZS0nKSA6IGxhYmVsUHJvcHMuaWQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRleHRcIiwgX2V4dGVuZHMoe30sIGF0dHJzLCB7XG4gICAgZG9taW5hbnRCYXNlbGluZTogXCJjZW50cmFsXCIsXG4gICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1yYWRpYWwtYmFyLWxhYmVsJywgY2xhc3NOYW1lKVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgaWQ6IGlkLFxuICAgIGQ6IHBhdGhcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRleHRQYXRoXCIsIHtcbiAgICB4bGlua0hyZWY6IFwiI1wiLmNvbmNhdChpZClcbiAgfSwgbGFiZWwpKTtcbn07XG52YXIgZ2V0QXR0cnNPZlBvbGFyTGFiZWwgPSBmdW5jdGlvbiBnZXRBdHRyc09mUG9sYXJMYWJlbChwcm9wcykge1xuICB2YXIgdmlld0JveCA9IHByb3BzLnZpZXdCb3gsXG4gICAgb2Zmc2V0ID0gcHJvcHMub2Zmc2V0LFxuICAgIHBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gIHZhciBfcmVmMiA9IHZpZXdCb3gsXG4gICAgY3ggPSBfcmVmMi5jeCxcbiAgICBjeSA9IF9yZWYyLmN5LFxuICAgIGlubmVyUmFkaXVzID0gX3JlZjIuaW5uZXJSYWRpdXMsXG4gICAgb3V0ZXJSYWRpdXMgPSBfcmVmMi5vdXRlclJhZGl1cyxcbiAgICBzdGFydEFuZ2xlID0gX3JlZjIuc3RhcnRBbmdsZSxcbiAgICBlbmRBbmdsZSA9IF9yZWYyLmVuZEFuZ2xlO1xuICB2YXIgbWlkQW5nbGUgPSAoc3RhcnRBbmdsZSArIGVuZEFuZ2xlKSAvIDI7XG4gIGlmIChwb3NpdGlvbiA9PT0gJ291dHNpZGUnKSB7XG4gICAgdmFyIF9wb2xhclRvQ2FydGVzaWFuID0gcG9sYXJUb0NhcnRlc2lhbihjeCwgY3ksIG91dGVyUmFkaXVzICsgb2Zmc2V0LCBtaWRBbmdsZSksXG4gICAgICBfeCA9IF9wb2xhclRvQ2FydGVzaWFuLngsXG4gICAgICBfeSA9IF9wb2xhclRvQ2FydGVzaWFuLnk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IF94LFxuICAgICAgeTogX3ksXG4gICAgICB0ZXh0QW5jaG9yOiBfeCA+PSBjeCA/ICdzdGFydCcgOiAnZW5kJyxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJ1xuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjeCxcbiAgICAgIHk6IGN5LFxuICAgICAgdGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogJ21pZGRsZSdcbiAgICB9O1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2NlbnRlclRvcCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogY3gsXG4gICAgICB5OiBjeSxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgICAgdmVydGljYWxBbmNob3I6ICdzdGFydCdcbiAgICB9O1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2NlbnRlckJvdHRvbScpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogY3gsXG4gICAgICB5OiBjeSxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgICAgdmVydGljYWxBbmNob3I6ICdlbmQnXG4gICAgfTtcbiAgfVxuICB2YXIgciA9IChpbm5lclJhZGl1cyArIG91dGVyUmFkaXVzKSAvIDI7XG4gIHZhciBfcG9sYXJUb0NhcnRlc2lhbjIgPSBwb2xhclRvQ2FydGVzaWFuKGN4LCBjeSwgciwgbWlkQW5nbGUpLFxuICAgIHggPSBfcG9sYXJUb0NhcnRlc2lhbjIueCxcbiAgICB5ID0gX3BvbGFyVG9DYXJ0ZXNpYW4yLnk7XG4gIHJldHVybiB7XG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJ1xuICB9O1xufTtcbnZhciBnZXRBdHRyc09mQ2FydGVzaWFuTGFiZWwgPSBmdW5jdGlvbiBnZXRBdHRyc09mQ2FydGVzaWFuTGFiZWwocHJvcHMpIHtcbiAgdmFyIHZpZXdCb3ggPSBwcm9wcy52aWV3Qm94LFxuICAgIHBhcmVudFZpZXdCb3ggPSBwcm9wcy5wYXJlbnRWaWV3Qm94LFxuICAgIG9mZnNldCA9IHByb3BzLm9mZnNldCxcbiAgICBwb3NpdGlvbiA9IHByb3BzLnBvc2l0aW9uO1xuICB2YXIgX3JlZjMgPSB2aWV3Qm94LFxuICAgIHggPSBfcmVmMy54LFxuICAgIHkgPSBfcmVmMy55LFxuICAgIHdpZHRoID0gX3JlZjMud2lkdGgsXG4gICAgaGVpZ2h0ID0gX3JlZjMuaGVpZ2h0O1xuXG4gIC8vIERlZmluZSB2ZXJ0aWNhbCBvZmZzZXRzIGFuZCBwb3NpdGlvbiBpbnZlcnRzIGJhc2VkIG9uIHRoZSB2YWx1ZSBiZWluZyBwb3NpdGl2ZSBvciBuZWdhdGl2ZVxuICB2YXIgdmVydGljYWxTaWduID0gaGVpZ2h0ID49IDAgPyAxIDogLTE7XG4gIHZhciB2ZXJ0aWNhbE9mZnNldCA9IHZlcnRpY2FsU2lnbiAqIG9mZnNldDtcbiAgdmFyIHZlcnRpY2FsRW5kID0gdmVydGljYWxTaWduID4gMCA/ICdlbmQnIDogJ3N0YXJ0JztcbiAgdmFyIHZlcnRpY2FsU3RhcnQgPSB2ZXJ0aWNhbFNpZ24gPiAwID8gJ3N0YXJ0JyA6ICdlbmQnO1xuXG4gIC8vIERlZmluZSBob3Jpem9udGFsIG9mZnNldHMgYW5kIHBvc2l0aW9uIGludmVydHMgYmFzZWQgb24gdGhlIHZhbHVlIGJlaW5nIHBvc2l0aXZlIG9yIG5lZ2F0aXZlXG4gIHZhciBob3Jpem9udGFsU2lnbiA9IHdpZHRoID49IDAgPyAxIDogLTE7XG4gIHZhciBob3Jpem9udGFsT2Zmc2V0ID0gaG9yaXpvbnRhbFNpZ24gKiBvZmZzZXQ7XG4gIHZhciBob3Jpem9udGFsRW5kID0gaG9yaXpvbnRhbFNpZ24gPiAwID8gJ2VuZCcgOiAnc3RhcnQnO1xuICB2YXIgaG9yaXpvbnRhbFN0YXJ0ID0gaG9yaXpvbnRhbFNpZ24gPiAwID8gJ3N0YXJ0JyA6ICdlbmQnO1xuICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgdmFyIGF0dHJzID0ge1xuICAgICAgeDogeCArIHdpZHRoIC8gMixcbiAgICAgIHk6IHkgLSB2ZXJ0aWNhbFNpZ24gKiBvZmZzZXQsXG4gICAgICB0ZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiB2ZXJ0aWNhbEVuZFxuICAgIH07XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYXR0cnMpLCBwYXJlbnRWaWV3Qm94ID8ge1xuICAgICAgaGVpZ2h0OiBNYXRoLm1heCh5IC0gcGFyZW50Vmlld0JveC55LCAwKSxcbiAgICAgIHdpZHRoOiB3aWR0aFxuICAgIH0gOiB7fSk7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgIHZhciBfYXR0cnMgPSB7XG4gICAgICB4OiB4ICsgd2lkdGggLyAyLFxuICAgICAgeTogeSArIGhlaWdodCArIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgdGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxTdGFydFxuICAgIH07XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX2F0dHJzKSwgcGFyZW50Vmlld0JveCA/IHtcbiAgICAgIGhlaWdodDogTWF0aC5tYXgocGFyZW50Vmlld0JveC55ICsgcGFyZW50Vmlld0JveC5oZWlnaHQgLSAoeSArIGhlaWdodCksIDApLFxuICAgICAgd2lkdGg6IHdpZHRoXG4gICAgfSA6IHt9KTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgIHZhciBfYXR0cnMyID0ge1xuICAgICAgeDogeCAtIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB5ICsgaGVpZ2h0IC8gMixcbiAgICAgIHRleHRBbmNob3I6IGhvcml6b250YWxFbmQsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogJ21pZGRsZSdcbiAgICB9O1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9hdHRyczIpLCBwYXJlbnRWaWV3Qm94ID8ge1xuICAgICAgd2lkdGg6IE1hdGgubWF4KF9hdHRyczIueCAtIHBhcmVudFZpZXdCb3gueCwgMCksXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0gOiB7fSk7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgdmFyIF9hdHRyczMgPSB7XG4gICAgICB4OiB4ICsgd2lkdGggKyBob3Jpem9udGFsT2Zmc2V0LFxuICAgICAgeTogeSArIGhlaWdodCAvIDIsXG4gICAgICB0ZXh0QW5jaG9yOiBob3Jpem9udGFsU3RhcnQsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogJ21pZGRsZSdcbiAgICB9O1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9hdHRyczMpLCBwYXJlbnRWaWV3Qm94ID8ge1xuICAgICAgd2lkdGg6IE1hdGgubWF4KHBhcmVudFZpZXdCb3gueCArIHBhcmVudFZpZXdCb3gud2lkdGggLSBfYXR0cnMzLngsIDApLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9IDoge30pO1xuICB9XG4gIHZhciBzaXplQXR0cnMgPSBwYXJlbnRWaWV3Qm94ID8ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9IDoge307XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZUxlZnQnKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB5ICsgaGVpZ2h0IC8gMixcbiAgICAgIHRleHRBbmNob3I6IGhvcml6b250YWxTdGFydCxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJ1xuICAgIH0sIHNpemVBdHRycyk7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnaW5zaWRlUmlnaHQnKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIHdpZHRoIC0gaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgIHk6IHkgKyBoZWlnaHQgLyAyLFxuICAgICAgdGV4dEFuY2hvcjogaG9yaXpvbnRhbEVuZCxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiAnbWlkZGxlJ1xuICAgIH0sIHNpemVBdHRycyk7XG4gIH1cbiAgaWYgKHBvc2l0aW9uID09PSAnaW5zaWRlVG9wJykge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHg6IHggKyB3aWR0aCAvIDIsXG4gICAgICB5OiB5ICsgdmVydGljYWxPZmZzZXQsXG4gICAgICB0ZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiB2ZXJ0aWNhbFN0YXJ0XG4gICAgfSwgc2l6ZUF0dHJzKTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdpbnNpZGVCb3R0b20nKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIHdpZHRoIC8gMixcbiAgICAgIHk6IHkgKyBoZWlnaHQgLSB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgIHRleHRBbmNob3I6ICdtaWRkbGUnLFxuICAgICAgdmVydGljYWxBbmNob3I6IHZlcnRpY2FsRW5kXG4gICAgfSwgc2l6ZUF0dHJzKTtcbiAgfVxuICBpZiAocG9zaXRpb24gPT09ICdpbnNpZGVUb3BMZWZ0Jykge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHg6IHggKyBob3Jpem9udGFsT2Zmc2V0LFxuICAgICAgeTogeSArIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgdGV4dEFuY2hvcjogaG9yaXpvbnRhbFN0YXJ0LFxuICAgICAgdmVydGljYWxBbmNob3I6IHZlcnRpY2FsU3RhcnRcbiAgICB9LCBzaXplQXR0cnMpO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZVRvcFJpZ2h0Jykge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHg6IHggKyB3aWR0aCAtIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB5ICsgdmVydGljYWxPZmZzZXQsXG4gICAgICB0ZXh0QW5jaG9yOiBob3Jpem9udGFsRW5kLFxuICAgICAgdmVydGljYWxBbmNob3I6IHZlcnRpY2FsU3RhcnRcbiAgICB9LCBzaXplQXR0cnMpO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZUJvdHRvbUxlZnQnKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB5ICsgaGVpZ2h0IC0gdmVydGljYWxPZmZzZXQsXG4gICAgICB0ZXh0QW5jaG9yOiBob3Jpem9udGFsU3RhcnQsXG4gICAgICB2ZXJ0aWNhbEFuY2hvcjogdmVydGljYWxFbmRcbiAgICB9LCBzaXplQXR0cnMpO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2luc2lkZUJvdHRvbVJpZ2h0Jykge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgIHg6IHggKyB3aWR0aCAtIGhvcml6b250YWxPZmZzZXQsXG4gICAgICB5OiB5ICsgaGVpZ2h0IC0gdmVydGljYWxPZmZzZXQsXG4gICAgICB0ZXh0QW5jaG9yOiBob3Jpem9udGFsRW5kLFxuICAgICAgdmVydGljYWxBbmNob3I6IHZlcnRpY2FsRW5kXG4gICAgfSwgc2l6ZUF0dHJzKTtcbiAgfVxuICBpZiAoaXNPYmplY3QocG9zaXRpb24pICYmIChpc051bWJlcihwb3NpdGlvbi54KSB8fCBpc1BlcmNlbnQocG9zaXRpb24ueCkpICYmIChpc051bWJlcihwb3NpdGlvbi55KSB8fCBpc1BlcmNlbnQocG9zaXRpb24ueSkpKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgeDogeCArIGdldFBlcmNlbnRWYWx1ZShwb3NpdGlvbi54LCB3aWR0aCksXG4gICAgICB5OiB5ICsgZ2V0UGVyY2VudFZhbHVlKHBvc2l0aW9uLnksIGhlaWdodCksXG4gICAgICB0ZXh0QW5jaG9yOiAnZW5kJyxcbiAgICAgIHZlcnRpY2FsQW5jaG9yOiAnZW5kJ1xuICAgIH0sIHNpemVBdHRycyk7XG4gIH1cbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgIHg6IHggKyB3aWR0aCAvIDIsXG4gICAgeTogeSArIGhlaWdodCAvIDIsXG4gICAgdGV4dEFuY2hvcjogJ21pZGRsZScsXG4gICAgdmVydGljYWxBbmNob3I6ICdtaWRkbGUnXG4gIH0sIHNpemVBdHRycyk7XG59O1xudmFyIGlzUG9sYXIgPSBmdW5jdGlvbiBpc1BvbGFyKHZpZXdCb3gpIHtcbiAgcmV0dXJuICdjeCcgaW4gdmlld0JveCAmJiBpc051bWJlcih2aWV3Qm94LmN4KTtcbn07XG5leHBvcnQgZnVuY3Rpb24gTGFiZWwoX3JlZjQpIHtcbiAgdmFyIF9yZWY0JG9mZnNldCA9IF9yZWY0Lm9mZnNldCxcbiAgICBvZmZzZXQgPSBfcmVmNCRvZmZzZXQgPT09IHZvaWQgMCA/IDUgOiBfcmVmNCRvZmZzZXQsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY0LCBfZXhjbHVkZWQpO1xuICB2YXIgcHJvcHMgPSBfb2JqZWN0U3ByZWFkKHtcbiAgICBvZmZzZXQ6IG9mZnNldFxuICB9LCByZXN0UHJvcHMpO1xuICB2YXIgdmlld0JveCA9IHByb3BzLnZpZXdCb3gsXG4gICAgcG9zaXRpb24gPSBwcm9wcy5wb3NpdGlvbixcbiAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgX3Byb3BzJGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBfcHJvcHMkY2xhc3NOYW1lID09PSB2b2lkIDAgPyAnJyA6IF9wcm9wcyRjbGFzc05hbWUsXG4gICAgdGV4dEJyZWFrQWxsID0gcHJvcHMudGV4dEJyZWFrQWxsO1xuICBpZiAoIXZpZXdCb3ggfHwgaXNOaWwodmFsdWUpICYmIGlzTmlsKGNoaWxkcmVuKSAmJiAhIC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChjb250ZW50KSAmJiAhaXNGdW5jdGlvbihjb250ZW50KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICggLyojX19QVVJFX18qL2lzVmFsaWRFbGVtZW50KGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQoY29udGVudCwgcHJvcHMpO1xuICB9XG4gIHZhciBsYWJlbDtcbiAgaWYgKGlzRnVuY3Rpb24oY29udGVudCkpIHtcbiAgICBsYWJlbCA9IC8qI19fUFVSRV9fKi9jcmVhdGVFbGVtZW50KGNvbnRlbnQsIHByb3BzKTtcbiAgICBpZiAoIC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChsYWJlbCkpIHtcbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGFiZWwgPSBnZXRMYWJlbChwcm9wcyk7XG4gIH1cbiAgdmFyIGlzUG9sYXJMYWJlbCA9IGlzUG9sYXIodmlld0JveCk7XG4gIHZhciBhdHRycyA9IGZpbHRlclByb3BzKHByb3BzLCB0cnVlKTtcbiAgaWYgKGlzUG9sYXJMYWJlbCAmJiAocG9zaXRpb24gPT09ICdpbnNpZGVTdGFydCcgfHwgcG9zaXRpb24gPT09ICdpbnNpZGVFbmQnIHx8IHBvc2l0aW9uID09PSAnZW5kJykpIHtcbiAgICByZXR1cm4gcmVuZGVyUmFkaWFsTGFiZWwocHJvcHMsIGxhYmVsLCBhdHRycyk7XG4gIH1cbiAgdmFyIHBvc2l0aW9uQXR0cnMgPSBpc1BvbGFyTGFiZWwgPyBnZXRBdHRyc09mUG9sYXJMYWJlbChwcm9wcykgOiBnZXRBdHRyc09mQ2FydGVzaWFuTGFiZWwocHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGV4dCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeCgncmVjaGFydHMtbGFiZWwnLCBjbGFzc05hbWUpXG4gIH0sIGF0dHJzLCBwb3NpdGlvbkF0dHJzLCB7XG4gICAgYnJlYWtBbGw6IHRleHRCcmVha0FsbFxuICB9KSwgbGFiZWwpO1xufVxuTGFiZWwuZGlzcGxheU5hbWUgPSAnTGFiZWwnO1xudmFyIHBhcnNlVmlld0JveCA9IGZ1bmN0aW9uIHBhcnNlVmlld0JveChwcm9wcykge1xuICB2YXIgY3ggPSBwcm9wcy5jeCxcbiAgICBjeSA9IHByb3BzLmN5LFxuICAgIGFuZ2xlID0gcHJvcHMuYW5nbGUsXG4gICAgc3RhcnRBbmdsZSA9IHByb3BzLnN0YXJ0QW5nbGUsXG4gICAgZW5kQW5nbGUgPSBwcm9wcy5lbmRBbmdsZSxcbiAgICByID0gcHJvcHMucixcbiAgICByYWRpdXMgPSBwcm9wcy5yYWRpdXMsXG4gICAgaW5uZXJSYWRpdXMgPSBwcm9wcy5pbm5lclJhZGl1cyxcbiAgICBvdXRlclJhZGl1cyA9IHByb3BzLm91dGVyUmFkaXVzLFxuICAgIHggPSBwcm9wcy54LFxuICAgIHkgPSBwcm9wcy55LFxuICAgIHRvcCA9IHByb3BzLnRvcCxcbiAgICBsZWZ0ID0gcHJvcHMubGVmdCxcbiAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBjbG9ja1dpc2UgPSBwcm9wcy5jbG9ja1dpc2UsXG4gICAgbGFiZWxWaWV3Qm94ID0gcHJvcHMubGFiZWxWaWV3Qm94O1xuICBpZiAobGFiZWxWaWV3Qm94KSB7XG4gICAgcmV0dXJuIGxhYmVsVmlld0JveDtcbiAgfVxuICBpZiAoaXNOdW1iZXIod2lkdGgpICYmIGlzTnVtYmVyKGhlaWdodCkpIHtcbiAgICBpZiAoaXNOdW1iZXIoeCkgJiYgaXNOdW1iZXIoeSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc051bWJlcih0b3ApICYmIGlzTnVtYmVyKGxlZnQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB0b3AsXG4gICAgICAgIHk6IGxlZnQsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChpc051bWJlcih4KSAmJiBpc051bWJlcih5KSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeSxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgfVxuICBpZiAoaXNOdW1iZXIoY3gpICYmIGlzTnVtYmVyKGN5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBjeDogY3gsXG4gICAgICBjeTogY3ksXG4gICAgICBzdGFydEFuZ2xlOiBzdGFydEFuZ2xlIHx8IGFuZ2xlIHx8IDAsXG4gICAgICBlbmRBbmdsZTogZW5kQW5nbGUgfHwgYW5nbGUgfHwgMCxcbiAgICAgIGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyB8fCAwLFxuICAgICAgb3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzIHx8IHJhZGl1cyB8fCByIHx8IDAsXG4gICAgICBjbG9ja1dpc2U6IGNsb2NrV2lzZVxuICAgIH07XG4gIH1cbiAgaWYgKHByb3BzLnZpZXdCb3gpIHtcbiAgICByZXR1cm4gcHJvcHMudmlld0JveDtcbiAgfVxuICByZXR1cm4ge307XG59O1xudmFyIHBhcnNlTGFiZWwgPSBmdW5jdGlvbiBwYXJzZUxhYmVsKGxhYmVsLCB2aWV3Qm94KSB7XG4gIGlmICghbGFiZWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAobGFiZWwgPT09IHRydWUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWwsIHtcbiAgICAgIGtleTogXCJsYWJlbC1pbXBsaWNpdFwiLFxuICAgICAgdmlld0JveDogdmlld0JveFxuICAgIH0pO1xuICB9XG4gIGlmIChpc051bU9yU3RyKGxhYmVsKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbCwge1xuICAgICAga2V5OiBcImxhYmVsLWltcGxpY2l0XCIsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgICAgdmFsdWU6IGxhYmVsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQobGFiZWwpKSB7XG4gICAgaWYgKGxhYmVsLnR5cGUgPT09IExhYmVsKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChsYWJlbCwge1xuICAgICAgICBrZXk6ICdsYWJlbC1pbXBsaWNpdCcsXG4gICAgICAgIHZpZXdCb3g6IHZpZXdCb3hcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWwsIHtcbiAgICAgIGtleTogXCJsYWJlbC1pbXBsaWNpdFwiLFxuICAgICAgY29udGVudDogbGFiZWwsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94XG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24obGFiZWwpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExhYmVsLCB7XG4gICAgICBrZXk6IFwibGFiZWwtaW1wbGljaXRcIixcbiAgICAgIGNvbnRlbnQ6IGxhYmVsLFxuICAgICAgdmlld0JveDogdmlld0JveFxuICAgIH0pO1xuICB9XG4gIGlmIChpc09iamVjdChsYWJlbCkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWwsIF9leHRlbmRzKHtcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3hcbiAgICB9LCBsYWJlbCwge1xuICAgICAga2V5OiBcImxhYmVsLWltcGxpY2l0XCJcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xudmFyIHJlbmRlckNhbGxCeVBhcmVudCA9IGZ1bmN0aW9uIHJlbmRlckNhbGxCeVBhcmVudChwYXJlbnRQcm9wcywgdmlld0JveCkge1xuICB2YXIgY2hlY2tQcm9wc0xhYmVsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICBpZiAoIXBhcmVudFByb3BzIHx8ICFwYXJlbnRQcm9wcy5jaGlsZHJlbiAmJiBjaGVja1Byb3BzTGFiZWwgJiYgIXBhcmVudFByb3BzLmxhYmVsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGNoaWxkcmVuID0gcGFyZW50UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwYXJlbnRWaWV3Qm94ID0gcGFyc2VWaWV3Qm94KHBhcmVudFByb3BzKTtcbiAgdmFyIGV4cGxpY2l0Q2hpbGRyZW4gPSBmaW5kQWxsQnlUeXBlKGNoaWxkcmVuLCBMYWJlbCkubWFwKGZ1bmN0aW9uIChjaGlsZCwgaW5kZXgpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgdmlld0JveDogdmlld0JveCB8fCBwYXJlbnRWaWV3Qm94LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAga2V5OiBcImxhYmVsLVwiLmNvbmNhdChpbmRleClcbiAgICB9KTtcbiAgfSk7XG4gIGlmICghY2hlY2tQcm9wc0xhYmVsKSB7XG4gICAgcmV0dXJuIGV4cGxpY2l0Q2hpbGRyZW47XG4gIH1cbiAgdmFyIGltcGxpY2l0TGFiZWwgPSBwYXJzZUxhYmVsKHBhcmVudFByb3BzLmxhYmVsLCB2aWV3Qm94IHx8IHBhcmVudFZpZXdCb3gpO1xuICByZXR1cm4gW2ltcGxpY2l0TGFiZWxdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZXhwbGljaXRDaGlsZHJlbikpO1xufTtcbkxhYmVsLnBhcnNlVmlld0JveCA9IHBhcnNlVmlld0JveDtcbkxhYmVsLnJlbmRlckNhbGxCeVBhcmVudCA9IHJlbmRlckNhbGxCeVBhcmVudDsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbzsgfSA6IGZ1bmN0aW9uIChvKSB7IHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvOyB9LCBfdHlwZW9mKG8pOyB9XG52YXIgX2V4Y2x1ZGVkID0gW1widmFsdWVBY2Nlc3NvclwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcImRhdGFcIiwgXCJkYXRhS2V5XCIsIFwiY2xvY2tXaXNlXCIsIFwiaWRcIiwgXCJ0ZXh0QnJlYWtBbGxcIl07XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7IGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBvd25LZXlzKGUsIHIpIHsgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOyByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTsgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7IH0gcmV0dXJuIHQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQoZSkgeyBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgeyB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307IHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTsgfSk7IH0gcmV0dXJuIGU7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmltcG9ydCBSZWFjdCwgeyBjbG9uZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaXNOaWwgZnJvbSAnbG9kYXNoL2lzTmlsJztcbmltcG9ydCBpc09iamVjdCBmcm9tICdsb2Rhc2gvaXNPYmplY3QnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnbG9kYXNoL2lzRnVuY3Rpb24nO1xuaW1wb3J0IGxhc3QgZnJvbSAnbG9kYXNoL2xhc3QnO1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICcuL0xhYmVsJztcbmltcG9ydCB7IExheWVyIH0gZnJvbSAnLi4vY29udGFpbmVyL0xheWVyJztcbmltcG9ydCB7IGZpbmRBbGxCeVR5cGUsIGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmltcG9ydCB7IGdldFZhbHVlQnlEYXRhS2V5IH0gZnJvbSAnLi4vdXRpbC9DaGFydFV0aWxzJztcbnZhciBkZWZhdWx0QWNjZXNzb3IgPSBmdW5jdGlvbiBkZWZhdWx0QWNjZXNzb3IoZW50cnkpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZW50cnkudmFsdWUpID8gbGFzdChlbnRyeS52YWx1ZSkgOiBlbnRyeS52YWx1ZTtcbn07XG5leHBvcnQgZnVuY3Rpb24gTGFiZWxMaXN0KF9yZWYpIHtcbiAgdmFyIF9yZWYkdmFsdWVBY2Nlc3NvciA9IF9yZWYudmFsdWVBY2Nlc3NvcixcbiAgICB2YWx1ZUFjY2Vzc29yID0gX3JlZiR2YWx1ZUFjY2Vzc29yID09PSB2b2lkIDAgPyBkZWZhdWx0QWNjZXNzb3IgOiBfcmVmJHZhbHVlQWNjZXNzb3IsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIHZhciBkYXRhID0gcmVzdFByb3BzLmRhdGEsXG4gICAgZGF0YUtleSA9IHJlc3RQcm9wcy5kYXRhS2V5LFxuICAgIGNsb2NrV2lzZSA9IHJlc3RQcm9wcy5jbG9ja1dpc2UsXG4gICAgaWQgPSByZXN0UHJvcHMuaWQsXG4gICAgdGV4dEJyZWFrQWxsID0gcmVzdFByb3BzLnRleHRCcmVha0FsbCxcbiAgICBvdGhlcnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocmVzdFByb3BzLCBfZXhjbHVkZWQyKTtcbiAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwge1xuICAgIGNsYXNzTmFtZTogXCJyZWNoYXJ0cy1sYWJlbC1saXN0XCJcbiAgfSwgZGF0YS5tYXAoZnVuY3Rpb24gKGVudHJ5LCBpbmRleCkge1xuICAgIHZhciB2YWx1ZSA9IGlzTmlsKGRhdGFLZXkpID8gdmFsdWVBY2Nlc3NvcihlbnRyeSwgaW5kZXgpIDogZ2V0VmFsdWVCeURhdGFLZXkoZW50cnkgJiYgZW50cnkucGF5bG9hZCwgZGF0YUtleSk7XG4gICAgdmFyIGlkUHJvcHMgPSBpc05pbChpZCkgPyB7fSA6IHtcbiAgICAgIGlkOiBcIlwiLmNvbmNhdChpZCwgXCItXCIpLmNvbmNhdChpbmRleClcbiAgICB9O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbCwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKGVudHJ5LCB0cnVlKSwgb3RoZXJzLCBpZFByb3BzLCB7XG4gICAgICBwYXJlbnRWaWV3Qm94OiBlbnRyeS5wYXJlbnRWaWV3Qm94LFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgdGV4dEJyZWFrQWxsOiB0ZXh0QnJlYWtBbGwsXG4gICAgICB2aWV3Qm94OiBMYWJlbC5wYXJzZVZpZXdCb3goaXNOaWwoY2xvY2tXaXNlKSA/IGVudHJ5IDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBlbnRyeSksIHt9LCB7XG4gICAgICAgIGNsb2NrV2lzZTogY2xvY2tXaXNlXG4gICAgICB9KSksXG4gICAgICBrZXk6IFwibGFiZWwtXCIuY29uY2F0KGluZGV4KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleVxuICAgICAgLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfSkpO1xuICB9KSk7XG59XG5MYWJlbExpc3QuZGlzcGxheU5hbWUgPSAnTGFiZWxMaXN0JztcbmZ1bmN0aW9uIHBhcnNlTGFiZWxMaXN0KGxhYmVsLCBkYXRhKSB7XG4gIGlmICghbGFiZWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAobGFiZWwgPT09IHRydWUpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWxMaXN0LCB7XG4gICAgICBrZXk6IFwibGFiZWxMaXN0LWltcGxpY2l0XCIsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH1cbiAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQobGFiZWwpIHx8IGlzRnVuY3Rpb24obGFiZWwpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExhYmVsTGlzdCwge1xuICAgICAga2V5OiBcImxhYmVsTGlzdC1pbXBsaWNpdFwiLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGNvbnRlbnQ6IGxhYmVsXG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGxhYmVsKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbExpc3QsIF9leHRlbmRzKHtcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9LCBsYWJlbCwge1xuICAgICAga2V5OiBcImxhYmVsTGlzdC1pbXBsaWNpdFwiXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmVuZGVyQ2FsbEJ5UGFyZW50KHBhcmVudFByb3BzLCBkYXRhKSB7XG4gIHZhciBjaGVja1Byb3BzTGFiZWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIGlmICghcGFyZW50UHJvcHMgfHwgIXBhcmVudFByb3BzLmNoaWxkcmVuICYmIGNoZWNrUHJvcHNMYWJlbCAmJiAhcGFyZW50UHJvcHMubGFiZWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgY2hpbGRyZW4gPSBwYXJlbnRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGV4cGxpY2l0Q2hpbGRyZW4gPSBmaW5kQWxsQnlUeXBlKGNoaWxkcmVuLCBMYWJlbExpc3QpLm1hcChmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICBrZXk6IFwibGFiZWxMaXN0LVwiLmNvbmNhdChpbmRleClcbiAgICB9KTtcbiAgfSk7XG4gIGlmICghY2hlY2tQcm9wc0xhYmVsKSB7XG4gICAgcmV0dXJuIGV4cGxpY2l0Q2hpbGRyZW47XG4gIH1cbiAgdmFyIGltcGxpY2l0TGFiZWxMaXN0ID0gcGFyc2VMYWJlbExpc3QocGFyZW50UHJvcHMubGFiZWwsIGRhdGEpO1xuICByZXR1cm4gW2ltcGxpY2l0TGFiZWxMaXN0XS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGV4cGxpY2l0Q2hpbGRyZW4pKTtcbn1cbkxhYmVsTGlzdC5yZW5kZXJDYWxsQnlQYXJlbnQgPSByZW5kZXJDYWxsQnlQYXJlbnQ7IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxudmFyIF9leGNsdWRlZCA9IFtcInJlZlwiXTtcbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7IHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7IH1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyB0cnkgeyB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IH0gY2F0Y2ggKHQpIHt9IHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHJldHVybiAhIXQ7IH0pKCk7IH1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBMZWdlbmRcbiAqL1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBEZWZhdWx0TGVnZW5kQ29udGVudCB9IGZyb20gJy4vRGVmYXVsdExlZ2VuZENvbnRlbnQnO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcuLi91dGlsL0RhdGFVdGlscyc7XG5pbXBvcnQgeyBnZXRVbmlxUGF5bG9hZCB9IGZyb20gJy4uL3V0aWwvcGF5bG9hZC9nZXRVbmlxUGF5bG9hZCc7XG5mdW5jdGlvbiBkZWZhdWx0VW5pcUJ5KGVudHJ5KSB7XG4gIHJldHVybiBlbnRyeS52YWx1ZTtcbn1cbmZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoY29udGVudCwgcHJvcHMpIHtcbiAgaWYgKCAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY29udGVudCkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChjb250ZW50LCBwcm9wcyk7XG4gIH1cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRlbnQsIHByb3BzKTtcbiAgfVxuICB2YXIgcmVmID0gcHJvcHMucmVmLFxuICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIF9leGNsdWRlZCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEZWZhdWx0TGVnZW5kQ29udGVudCwgb3RoZXJQcm9wcyk7XG59XG52YXIgRVBTID0gMTtcbmV4cG9ydCB2YXIgTGVnZW5kID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICBmdW5jdGlvbiBMZWdlbmQoKSB7XG4gICAgdmFyIF90aGlzO1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMZWdlbmQpO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgX3RoaXMgPSBfY2FsbFN1cGVyKHRoaXMsIExlZ2VuZCwgW10uY29uY2F0KGFyZ3MpKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwibGFzdEJvdW5kaW5nQm94XCIsIHtcbiAgICAgIHdpZHRoOiAtMSxcbiAgICAgIGhlaWdodDogLTFcbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2luaGVyaXRzKExlZ2VuZCwgX1B1cmVDb21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKExlZ2VuZCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnVwZGF0ZUJCb3goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMudXBkYXRlQkJveCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRCQm94XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEJCb3goKSB7XG4gICAgICBpZiAodGhpcy53cmFwcGVyTm9kZSAmJiB0aGlzLndyYXBwZXJOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgICB2YXIgYm94ID0gdGhpcy53cmFwcGVyTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgYm94LmhlaWdodCA9IHRoaXMud3JhcHBlck5vZGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBib3gud2lkdGggPSB0aGlzLndyYXBwZXJOb2RlLm9mZnNldFdpZHRoO1xuICAgICAgICByZXR1cm4gYm94O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZUJCb3hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlQkJveCgpIHtcbiAgICAgIHZhciBvbkJCb3hVcGRhdGUgPSB0aGlzLnByb3BzLm9uQkJveFVwZGF0ZTtcbiAgICAgIHZhciBib3ggPSB0aGlzLmdldEJCb3goKTtcbiAgICAgIGlmIChib3gpIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGJveC53aWR0aCAtIHRoaXMubGFzdEJvdW5kaW5nQm94LndpZHRoKSA+IEVQUyB8fCBNYXRoLmFicyhib3guaGVpZ2h0IC0gdGhpcy5sYXN0Qm91bmRpbmdCb3guaGVpZ2h0KSA+IEVQUykge1xuICAgICAgICAgIHRoaXMubGFzdEJvdW5kaW5nQm94LndpZHRoID0gYm94LndpZHRoO1xuICAgICAgICAgIHRoaXMubGFzdEJvdW5kaW5nQm94LmhlaWdodCA9IGJveC5oZWlnaHQ7XG4gICAgICAgICAgaWYgKG9uQkJveFVwZGF0ZSkge1xuICAgICAgICAgICAgb25CQm94VXBkYXRlKGJveCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdEJvdW5kaW5nQm94LndpZHRoICE9PSAtMSB8fCB0aGlzLmxhc3RCb3VuZGluZ0JveC5oZWlnaHQgIT09IC0xKSB7XG4gICAgICAgIHRoaXMubGFzdEJvdW5kaW5nQm94LndpZHRoID0gLTE7XG4gICAgICAgIHRoaXMubGFzdEJvdW5kaW5nQm94LmhlaWdodCA9IC0xO1xuICAgICAgICBpZiAob25CQm94VXBkYXRlKSB7XG4gICAgICAgICAgb25CQm94VXBkYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEJCb3hTbmFwc2hvdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCQm94U25hcHNob3QoKSB7XG4gICAgICBpZiAodGhpcy5sYXN0Qm91bmRpbmdCb3gud2lkdGggPj0gMCAmJiB0aGlzLmxhc3RCb3VuZGluZ0JveC5oZWlnaHQgPj0gMCkge1xuICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgdGhpcy5sYXN0Qm91bmRpbmdCb3gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMFxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RGVmYXVsdFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlZmF1bHRQb3NpdGlvbihzdHlsZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgbGF5b3V0ID0gX3RoaXMkcHJvcHMubGF5b3V0LFxuICAgICAgICBhbGlnbiA9IF90aGlzJHByb3BzLmFsaWduLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduID0gX3RoaXMkcHJvcHMudmVydGljYWxBbGlnbixcbiAgICAgICAgbWFyZ2luID0gX3RoaXMkcHJvcHMubWFyZ2luLFxuICAgICAgICBjaGFydFdpZHRoID0gX3RoaXMkcHJvcHMuY2hhcnRXaWR0aCxcbiAgICAgICAgY2hhcnRIZWlnaHQgPSBfdGhpcyRwcm9wcy5jaGFydEhlaWdodDtcbiAgICAgIHZhciBoUG9zLCB2UG9zO1xuICAgICAgaWYgKCFzdHlsZSB8fCAoc3R5bGUubGVmdCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlLmxlZnQgPT09IG51bGwpICYmIChzdHlsZS5yaWdodCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlLnJpZ2h0ID09PSBudWxsKSkge1xuICAgICAgICBpZiAoYWxpZ24gPT09ICdjZW50ZXInICYmIGxheW91dCA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgIHZhciBib3ggPSB0aGlzLmdldEJCb3hTbmFwc2hvdCgpO1xuICAgICAgICAgIGhQb3MgPSB7XG4gICAgICAgICAgICBsZWZ0OiAoKGNoYXJ0V2lkdGggfHwgMCkgLSBib3gud2lkdGgpIC8gMlxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaFBvcyA9IGFsaWduID09PSAncmlnaHQnID8ge1xuICAgICAgICAgICAgcmlnaHQ6IG1hcmdpbiAmJiBtYXJnaW4ucmlnaHQgfHwgMFxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBsZWZ0OiBtYXJnaW4gJiYgbWFyZ2luLmxlZnQgfHwgMFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3R5bGUgfHwgKHN0eWxlLnRvcCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlLnRvcCA9PT0gbnVsbCkgJiYgKHN0eWxlLmJvdHRvbSA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlLmJvdHRvbSA9PT0gbnVsbCkpIHtcbiAgICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgICAgdmFyIF9ib3ggPSB0aGlzLmdldEJCb3hTbmFwc2hvdCgpO1xuICAgICAgICAgIHZQb3MgPSB7XG4gICAgICAgICAgICB0b3A6ICgoY2hhcnRIZWlnaHQgfHwgMCkgLSBfYm94LmhlaWdodCkgLyAyXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2UG9zID0gdmVydGljYWxBbGlnbiA9PT0gJ2JvdHRvbScgPyB7XG4gICAgICAgICAgICBib3R0b206IG1hcmdpbiAmJiBtYXJnaW4uYm90dG9tIHx8IDBcbiAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgdG9wOiBtYXJnaW4gJiYgbWFyZ2luLnRvcCB8fCAwXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaFBvcyksIHZQb3MpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY29udGVudCA9IF90aGlzJHByb3BzMi5jb250ZW50LFxuICAgICAgICB3aWR0aCA9IF90aGlzJHByb3BzMi53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX3RoaXMkcHJvcHMyLmhlaWdodCxcbiAgICAgICAgd3JhcHBlclN0eWxlID0gX3RoaXMkcHJvcHMyLndyYXBwZXJTdHlsZSxcbiAgICAgICAgcGF5bG9hZFVuaXFCeSA9IF90aGlzJHByb3BzMi5wYXlsb2FkVW5pcUJ5LFxuICAgICAgICBwYXlsb2FkID0gX3RoaXMkcHJvcHMyLnBheWxvYWQ7XG4gICAgICB2YXIgb3V0ZXJTdHlsZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB3aWR0aDogd2lkdGggfHwgJ2F1dG8nLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCB8fCAnYXV0bydcbiAgICAgIH0sIHRoaXMuZ2V0RGVmYXVsdFBvc2l0aW9uKHdyYXBwZXJTdHlsZSkpLCB3cmFwcGVyU3R5bGUpO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJlY2hhcnRzLWxlZ2VuZC13cmFwcGVyXCIsXG4gICAgICAgIHN0eWxlOiBvdXRlclN0eWxlLFxuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihub2RlKSB7XG4gICAgICAgICAgX3RoaXMyLndyYXBwZXJOb2RlID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfSwgcmVuZGVyQ29udGVudChjb250ZW50LCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMucHJvcHMpLCB7fSwge1xuICAgICAgICBwYXlsb2FkOiBnZXRVbmlxUGF5bG9hZChwYXlsb2FkLCBwYXlsb2FkVW5pcUJ5LCBkZWZhdWx0VW5pcUJ5KVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJnZXRXaXRoSGVpZ2h0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFdpdGhIZWlnaHQoaXRlbSwgY2hhcnRXaWR0aCkge1xuICAgICAgdmFyIF90aGlzJGRlZmF1bHRQcm9wcyRpdCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5kZWZhdWx0UHJvcHMpLCBpdGVtLnByb3BzKSxcbiAgICAgICAgbGF5b3V0ID0gX3RoaXMkZGVmYXVsdFByb3BzJGl0LmxheW91dDtcbiAgICAgIGlmIChsYXlvdXQgPT09ICd2ZXJ0aWNhbCcgJiYgaXNOdW1iZXIoaXRlbS5wcm9wcy5oZWlnaHQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGVpZ2h0OiBpdGVtLnByb3BzLmhlaWdodFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGxheW91dCA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2lkdGg6IGl0ZW0ucHJvcHMud2lkdGggfHwgY2hhcnRXaWR0aFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG59KFB1cmVDb21wb25lbnQpO1xuX2RlZmluZVByb3BlcnR5KExlZ2VuZCwgXCJkaXNwbGF5TmFtZVwiLCAnTGVnZW5kJyk7XG5fZGVmaW5lUHJvcGVydHkoTGVnZW5kLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGljb25TaXplOiAxNCxcbiAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXG4gIGFsaWduOiAnY2VudGVyJyxcbiAgdmVydGljYWxBbGlnbjogJ2JvdHRvbSdcbn0pOyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSBhcnIyW2ldID0gYXJyW2ldOyByZXR1cm4gYXJyMjsgfVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTsgaWYgKG51bGwgIT0gdCkgeyB2YXIgZSwgbiwgaSwgdSwgYSA9IFtdLCBmID0gITAsIG8gPSAhMTsgdHJ5IHsgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkgeyBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47IGYgPSAhMTsgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApOyB9IGNhdGNoIChyKSB7IG8gPSAhMCwgbiA9IHI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjsgfSBmaW5hbGx5IHsgaWYgKG8pIHRocm93IG47IH0gfSByZXR1cm4gYTsgfSB9XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cbi8qKlxuICogQGZpbGVPdmVydmlldyBXcmFwcGVyIGNvbXBvbmVudCB0byBtYWtlIGNoYXJ0cyBhZGFwdCB0byB0aGUgc2l6ZSBvZiBwYXJlbnQgKiBET01cbiAqL1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgY2xvbmVFbGVtZW50LCB1c2VTdGF0ZSwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHRocm90dGxlIGZyb20gJ2xvZGFzaC90aHJvdHRsZSc7XG5pbXBvcnQgeyBpc1BlcmNlbnQgfSBmcm9tICcuLi91dGlsL0RhdGFVdGlscyc7XG5pbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi4vdXRpbC9Mb2dVdGlscyc7XG5pbXBvcnQgeyBnZXREaXNwbGF5TmFtZSB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG5leHBvcnQgdmFyIFJlc3BvbnNpdmVDb250YWluZXIgPSAvKiNfX1BVUkVfXyovZm9yd2FyZFJlZihmdW5jdGlvbiAoX3JlZiwgcmVmKSB7XG4gIHZhciBhc3BlY3QgPSBfcmVmLmFzcGVjdCxcbiAgICBfcmVmJGluaXRpYWxEaW1lbnNpb24gPSBfcmVmLmluaXRpYWxEaW1lbnNpb24sXG4gICAgaW5pdGlhbERpbWVuc2lvbiA9IF9yZWYkaW5pdGlhbERpbWVuc2lvbiA9PT0gdm9pZCAwID8ge1xuICAgICAgd2lkdGg6IC0xLFxuICAgICAgaGVpZ2h0OiAtMVxuICAgIH0gOiBfcmVmJGluaXRpYWxEaW1lbnNpb24sXG4gICAgX3JlZiR3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgd2lkdGggPSBfcmVmJHdpZHRoID09PSB2b2lkIDAgPyAnMTAwJScgOiBfcmVmJHdpZHRoLFxuICAgIF9yZWYkaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgaGVpZ2h0ID0gX3JlZiRoZWlnaHQgPT09IHZvaWQgMCA/ICcxMDAlJyA6IF9yZWYkaGVpZ2h0LFxuICAgIF9yZWYkbWluV2lkdGggPSBfcmVmLm1pbldpZHRoLFxuICAgIG1pbldpZHRoID0gX3JlZiRtaW5XaWR0aCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkbWluV2lkdGgsXG4gICAgbWluSGVpZ2h0ID0gX3JlZi5taW5IZWlnaHQsXG4gICAgbWF4SGVpZ2h0ID0gX3JlZi5tYXhIZWlnaHQsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIF9yZWYkZGVib3VuY2UgPSBfcmVmLmRlYm91bmNlLFxuICAgIGRlYm91bmNlID0gX3JlZiRkZWJvdW5jZSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkZGVib3VuY2UsXG4gICAgaWQgPSBfcmVmLmlkLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIG9uUmVzaXplID0gX3JlZi5vblJlc2l6ZSxcbiAgICBfcmVmJHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICBzdHlsZSA9IF9yZWYkc3R5bGUgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRzdHlsZTtcbiAgdmFyIGNvbnRhaW5lclJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIG9uUmVzaXplUmVmID0gdXNlUmVmKCk7XG4gIG9uUmVzaXplUmVmLmN1cnJlbnQgPSBvblJlc2l6ZTtcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRhaW5lclJlZi5jdXJyZW50LCAnY3VycmVudCcsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSB1c2FnZSBvZiByZWYuY3VycmVudC5jdXJyZW50IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZC4nKTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9KTtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKHtcbiAgICAgIGNvbnRhaW5lcldpZHRoOiBpbml0aWFsRGltZW5zaW9uLndpZHRoLFxuICAgICAgY29udGFpbmVySGVpZ2h0OiBpbml0aWFsRGltZW5zaW9uLmhlaWdodFxuICAgIH0pLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIHNpemVzID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRTaXplcyA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciBzZXRDb250YWluZXJTaXplID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5ld1dpZHRoLCBuZXdIZWlnaHQpIHtcbiAgICBzZXRTaXplcyhmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICB2YXIgcm91bmRlZFdpZHRoID0gTWF0aC5yb3VuZChuZXdXaWR0aCk7XG4gICAgICB2YXIgcm91bmRlZEhlaWdodCA9IE1hdGgucm91bmQobmV3SGVpZ2h0KTtcbiAgICAgIGlmIChwcmV2U3RhdGUuY29udGFpbmVyV2lkdGggPT09IHJvdW5kZWRXaWR0aCAmJiBwcmV2U3RhdGUuY29udGFpbmVySGVpZ2h0ID09PSByb3VuZGVkSGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250YWluZXJXaWR0aDogcm91bmRlZFdpZHRoLFxuICAgICAgICBjb250YWluZXJIZWlnaHQ6IHJvdW5kZWRIZWlnaHRcbiAgICAgIH07XG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhlbnRyaWVzKSB7XG4gICAgICB2YXIgX29uUmVzaXplUmVmJGN1cnJlbnQ7XG4gICAgICB2YXIgX2VudHJpZXMkMCRjb250ZW50UmVjID0gZW50cmllc1swXS5jb250ZW50UmVjdCxcbiAgICAgICAgY29udGFpbmVyV2lkdGggPSBfZW50cmllcyQwJGNvbnRlbnRSZWMud2lkdGgsXG4gICAgICAgIGNvbnRhaW5lckhlaWdodCA9IF9lbnRyaWVzJDAkY29udGVudFJlYy5oZWlnaHQ7XG4gICAgICBzZXRDb250YWluZXJTaXplKGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQpO1xuICAgICAgKF9vblJlc2l6ZVJlZiRjdXJyZW50ID0gb25SZXNpemVSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX29uUmVzaXplUmVmJGN1cnJlbnQgPT09IHZvaWQgMCB8fCBfb25SZXNpemVSZWYkY3VycmVudC5jYWxsKG9uUmVzaXplUmVmLCBjb250YWluZXJXaWR0aCwgY29udGFpbmVySGVpZ2h0KTtcbiAgICB9O1xuICAgIGlmIChkZWJvdW5jZSA+IDApIHtcbiAgICAgIGNhbGxiYWNrID0gdGhyb3R0bGUoY2FsbGJhY2ssIGRlYm91bmNlLCB7XG4gICAgICAgIHRyYWlsaW5nOiB0cnVlLFxuICAgICAgICBsZWFkaW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihjYWxsYmFjayk7XG4gICAgdmFyIF9jb250YWluZXJSZWYkY3VycmVudCA9IGNvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgY29udGFpbmVyV2lkdGggPSBfY29udGFpbmVyUmVmJGN1cnJlbnQud2lkdGgsXG4gICAgICBjb250YWluZXJIZWlnaHQgPSBfY29udGFpbmVyUmVmJGN1cnJlbnQuaGVpZ2h0O1xuICAgIHNldENvbnRhaW5lclNpemUoY29udGFpbmVyV2lkdGgsIGNvbnRhaW5lckhlaWdodCk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbc2V0Q29udGFpbmVyU2l6ZSwgZGVib3VuY2VdKTtcbiAgdmFyIGNoYXJ0Q29udGVudCA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250YWluZXJXaWR0aCA9IHNpemVzLmNvbnRhaW5lcldpZHRoLFxuICAgICAgY29udGFpbmVySGVpZ2h0ID0gc2l6ZXMuY29udGFpbmVySGVpZ2h0O1xuICAgIGlmIChjb250YWluZXJXaWR0aCA8IDAgfHwgY29udGFpbmVySGVpZ2h0IDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHdhcm4oaXNQZXJjZW50KHdpZHRoKSB8fCBpc1BlcmNlbnQoaGVpZ2h0KSwgXCJUaGUgd2lkdGgoJXMpIGFuZCBoZWlnaHQoJXMpIGFyZSBib3RoIGZpeGVkIG51bWJlcnMsXFxuICAgICAgIG1heWJlIHlvdSBkb24ndCBuZWVkIHRvIHVzZSBhIFJlc3BvbnNpdmVDb250YWluZXIuXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHdhcm4oIWFzcGVjdCB8fCBhc3BlY3QgPiAwLCAnVGhlIGFzcGVjdCglcykgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nLCBhc3BlY3QpO1xuICAgIHZhciBjYWxjdWxhdGVkV2lkdGggPSBpc1BlcmNlbnQod2lkdGgpID8gY29udGFpbmVyV2lkdGggOiB3aWR0aDtcbiAgICB2YXIgY2FsY3VsYXRlZEhlaWdodCA9IGlzUGVyY2VudChoZWlnaHQpID8gY29udGFpbmVySGVpZ2h0IDogaGVpZ2h0O1xuICAgIGlmIChhc3BlY3QgJiYgYXNwZWN0ID4gMCkge1xuICAgICAgLy8gUHJlc2VydmUgdGhlIGRlc2lyZWQgYXNwZWN0IHJhdGlvXG4gICAgICBpZiAoY2FsY3VsYXRlZFdpZHRoKSB7XG4gICAgICAgIC8vIFdpbGwgZGVmYXVsdCB0byB1c2luZyB3aWR0aCBmb3IgYXNwZWN0IHJhdGlvXG4gICAgICAgIGNhbGN1bGF0ZWRIZWlnaHQgPSBjYWxjdWxhdGVkV2lkdGggLyBhc3BlY3Q7XG4gICAgICB9IGVsc2UgaWYgKGNhbGN1bGF0ZWRIZWlnaHQpIHtcbiAgICAgICAgLy8gQnV0IHdlIHNob3VsZCBhbHNvIHRha2UgaGVpZ2h0IGludG8gY29uc2lkZXJhdGlvblxuICAgICAgICBjYWxjdWxhdGVkV2lkdGggPSBjYWxjdWxhdGVkSGVpZ2h0ICogYXNwZWN0O1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBtYXhIZWlnaHQgaXMgc2V0LCBvdmVyd3JpdGUgaWYgY2FsY3VsYXRlZEhlaWdodCBpcyBncmVhdGVyIHRoYW4gbWF4SGVpZ2h0XG4gICAgICBpZiAobWF4SGVpZ2h0ICYmIGNhbGN1bGF0ZWRIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgY2FsY3VsYXRlZEhlaWdodCA9IG1heEhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gICAgd2FybihjYWxjdWxhdGVkV2lkdGggPiAwIHx8IGNhbGN1bGF0ZWRIZWlnaHQgPiAwLCBcIlRoZSB3aWR0aCglcykgYW5kIGhlaWdodCglcykgb2YgY2hhcnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwLFxcbiAgICAgICBwbGVhc2UgY2hlY2sgdGhlIHN0eWxlIG9mIGNvbnRhaW5lciwgb3IgdGhlIHByb3BzIHdpZHRoKCVzKSBhbmQgaGVpZ2h0KCVzKSxcXG4gICAgICAgb3IgYWRkIGEgbWluV2lkdGgoJXMpIG9yIG1pbkhlaWdodCglcykgb3IgdXNlIGFzcGVjdCglcykgdG8gY29udHJvbCB0aGVcXG4gICAgICAgaGVpZ2h0IGFuZCB3aWR0aC5cIiwgY2FsY3VsYXRlZFdpZHRoLCBjYWxjdWxhdGVkSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBtaW5XaWR0aCwgbWluSGVpZ2h0LCBhc3BlY3QpO1xuICAgIHZhciBpc0NoYXJ0cyA9ICFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJiBnZXREaXNwbGF5TmFtZShjaGlsZHJlbi50eXBlKS5lbmRzV2l0aCgnQ2hhcnQnKTtcbiAgICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZCwgX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgd2lkdGg6IGNhbGN1bGF0ZWRXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGNhbGN1bGF0ZWRIZWlnaHRcbiAgICAgICAgfSwgaXNDaGFydHMgPyB7XG4gICAgICAgICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiBjYWxjdWxhdGVkSGVpZ2h0LFxuICAgICAgICAgICAgbWF4V2lkdGg6IGNhbGN1bGF0ZWRXaWR0aFxuICAgICAgICAgIH0sIGNoaWxkLnByb3BzLnN0eWxlKVxuICAgICAgICB9IDoge30pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgfSwgW2FzcGVjdCwgY2hpbGRyZW4sIGhlaWdodCwgbWF4SGVpZ2h0LCBtaW5IZWlnaHQsIG1pbldpZHRoLCBzaXplcywgd2lkdGhdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBpZDogaWQgPyBcIlwiLmNvbmNhdChpZCkgOiB1bmRlZmluZWQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy1yZXNwb25zaXZlLWNvbnRhaW5lcicsIGNsYXNzTmFtZSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3R5bGUpLCB7fSwge1xuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtaW5XaWR0aDogbWluV2lkdGgsXG4gICAgICBtaW5IZWlnaHQ6IG1pbkhlaWdodCxcbiAgICAgIG1heEhlaWdodDogbWF4SGVpZ2h0XG4gICAgfSksXG4gICAgcmVmOiBjb250YWluZXJSZWZcbiAgfSwgY2hhcnRDb250ZW50KTtcbn0pOyIsInZhciBfZXhjbHVkZWQgPSBbXCJ4XCIsIFwieVwiLCBcImxpbmVIZWlnaHRcIiwgXCJjYXBIZWlnaHRcIiwgXCJzY2FsZVRvRml0XCIsIFwidGV4dEFuY2hvclwiLCBcInZlcnRpY2FsQW5jaG9yXCIsIFwiZmlsbFwiXSxcbiAgX2V4Y2x1ZGVkMiA9IFtcImR4XCIsIFwiZHlcIiwgXCJhbmdsZVwiLCBcImNsYXNzTmFtZVwiLCBcImJyZWFrQWxsXCJdO1xuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsgcmV0dXJuIGFycjI7IH1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7IHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07IGlmIChudWxsICE9IHQpIHsgdmFyIGUsIG4sIGksIHUsIGEgPSBbXSwgZiA9ICEwLCBvID0gITE7IHRyeSB7IGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHsgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuOyBmID0gITE7IH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTsgfSBjYXRjaCAocikgeyBvID0gITAsIG4gPSByOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIWYgJiYgbnVsbCAhPSB0W1wicmV0dXJuXCJdICYmICh1ID0gdFtcInJldHVyblwiXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47IH0gZmluYWxseSB7IGlmIChvKSB0aHJvdyBuOyB9IH0gcmV0dXJuIGE7IH0gfVxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc05pbCBmcm9tICdsb2Rhc2gvaXNOaWwnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBpc051bWJlciwgaXNOdW1PclN0ciB9IGZyb20gJy4uL3V0aWwvRGF0YVV0aWxzJztcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4uL3V0aWwvR2xvYmFsJztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmltcG9ydCB7IGdldFN0cmluZ1NpemUgfSBmcm9tICcuLi91dGlsL0RPTVV0aWxzJztcbmltcG9ydCB7IHJlZHVjZUNTU0NhbGMgfSBmcm9tICcuLi91dGlsL1JlZHVjZUNTU0NhbGMnO1xudmFyIEJSRUFLSU5HX1NQQUNFUyA9IC9bIFxcZlxcblxcclxcdFxcdlxcdTIwMjhcXHUyMDI5XSsvO1xudmFyIGNhbGN1bGF0ZVdvcmRXaWR0aHMgPSBmdW5jdGlvbiBjYWxjdWxhdGVXb3JkV2lkdGhzKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBicmVha0FsbCA9IF9yZWYuYnJlYWtBbGwsXG4gICAgc3R5bGUgPSBfcmVmLnN0eWxlO1xuICB0cnkge1xuICAgIHZhciB3b3JkcyA9IFtdO1xuICAgIGlmICghaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICBpZiAoYnJlYWtBbGwpIHtcbiAgICAgICAgd29yZHMgPSBjaGlsZHJlbi50b1N0cmluZygpLnNwbGl0KCcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmRzID0gY2hpbGRyZW4udG9TdHJpbmcoKS5zcGxpdChCUkVBS0lOR19TUEFDRVMpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgd29yZHNXaXRoQ29tcHV0ZWRXaWR0aCA9IHdvcmRzLm1hcChmdW5jdGlvbiAod29yZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd29yZDogd29yZCxcbiAgICAgICAgd2lkdGg6IGdldFN0cmluZ1NpemUod29yZCwgc3R5bGUpLndpZHRoXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHZhciBzcGFjZVdpZHRoID0gYnJlYWtBbGwgPyAwIDogZ2V0U3RyaW5nU2l6ZShcIlxceEEwXCIsIHN0eWxlKS53aWR0aDtcbiAgICByZXR1cm4ge1xuICAgICAgd29yZHNXaXRoQ29tcHV0ZWRXaWR0aDogd29yZHNXaXRoQ29tcHV0ZWRXaWR0aCxcbiAgICAgIHNwYWNlV2lkdGg6IHNwYWNlV2lkdGhcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG52YXIgY2FsY3VsYXRlV29yZHNCeUxpbmVzID0gZnVuY3Rpb24gY2FsY3VsYXRlV29yZHNCeUxpbmVzKF9yZWYyLCBpbml0aWFsV29yZHNXaXRoQ29tcHV0ZWRXaXRoLCBzcGFjZVdpZHRoLCBsaW5lV2lkdGgsIHNjYWxlVG9GaXQpIHtcbiAgdmFyIG1heExpbmVzID0gX3JlZjIubWF4TGluZXMsXG4gICAgY2hpbGRyZW4gPSBfcmVmMi5jaGlsZHJlbixcbiAgICBzdHlsZSA9IF9yZWYyLnN0eWxlLFxuICAgIGJyZWFrQWxsID0gX3JlZjIuYnJlYWtBbGw7XG4gIHZhciBzaG91bGRMaW1pdExpbmVzID0gaXNOdW1iZXIobWF4TGluZXMpO1xuICB2YXIgdGV4dCA9IGNoaWxkcmVuO1xuICB2YXIgY2FsY3VsYXRlID0gZnVuY3Rpb24gY2FsY3VsYXRlKCkge1xuICAgIHZhciB3b3JkcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG4gICAgcmV0dXJuIHdvcmRzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBfcmVmMykge1xuICAgICAgdmFyIHdvcmQgPSBfcmVmMy53b3JkLFxuICAgICAgICB3aWR0aCA9IF9yZWYzLndpZHRoO1xuICAgICAgdmFyIGN1cnJlbnRMaW5lID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjdXJyZW50TGluZSAmJiAobGluZVdpZHRoID09IG51bGwgfHwgc2NhbGVUb0ZpdCB8fCBjdXJyZW50TGluZS53aWR0aCArIHdpZHRoICsgc3BhY2VXaWR0aCA8IE51bWJlcihsaW5lV2lkdGgpKSkge1xuICAgICAgICAvLyBXb3JkIGNhbiBiZSBhZGRlZCB0byBhbiBleGlzdGluZyBsaW5lXG4gICAgICAgIGN1cnJlbnRMaW5lLndvcmRzLnB1c2god29yZCk7XG4gICAgICAgIGN1cnJlbnRMaW5lLndpZHRoICs9IHdpZHRoICsgc3BhY2VXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFkZCBmaXJzdCB3b3JkIHRvIGxpbmUgb3Igd29yZCBpcyB0b28gbG9uZyB0byBzY2FsZVRvRml0IG9uIGV4aXN0aW5nIGxpbmVcbiAgICAgICAgdmFyIG5ld0xpbmUgPSB7XG4gICAgICAgICAgd29yZHM6IFt3b3JkXSxcbiAgICAgICAgICB3aWR0aDogd2lkdGhcbiAgICAgICAgfTtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3TGluZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIFtdKTtcbiAgfTtcbiAgdmFyIG9yaWdpbmFsUmVzdWx0ID0gY2FsY3VsYXRlKGluaXRpYWxXb3Jkc1dpdGhDb21wdXRlZFdpdGgpO1xuICB2YXIgZmluZExvbmdlc3RMaW5lID0gZnVuY3Rpb24gZmluZExvbmdlc3RMaW5lKHdvcmRzKSB7XG4gICAgcmV0dXJuIHdvcmRzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEud2lkdGggPiBiLndpZHRoID8gYSA6IGI7XG4gICAgfSk7XG4gIH07XG4gIGlmICghc2hvdWxkTGltaXRMaW5lcykge1xuICAgIHJldHVybiBvcmlnaW5hbFJlc3VsdDtcbiAgfVxuICB2YXIgc3VmZml4ID0gJ+KApic7XG4gIHZhciBjaGVja092ZXJmbG93ID0gZnVuY3Rpb24gY2hlY2tPdmVyZmxvdyhpbmRleCkge1xuICAgIHZhciB0ZW1wVGV4dCA9IHRleHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgIHZhciB3b3JkcyA9IGNhbGN1bGF0ZVdvcmRXaWR0aHMoe1xuICAgICAgYnJlYWtBbGw6IGJyZWFrQWxsLFxuICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgY2hpbGRyZW46IHRlbXBUZXh0ICsgc3VmZml4XG4gICAgfSkud29yZHNXaXRoQ29tcHV0ZWRXaWR0aDtcbiAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRlKHdvcmRzKTtcbiAgICB2YXIgZG9lc092ZXJmbG93ID0gcmVzdWx0Lmxlbmd0aCA+IG1heExpbmVzIHx8IGZpbmRMb25nZXN0TGluZShyZXN1bHQpLndpZHRoID4gTnVtYmVyKGxpbmVXaWR0aCk7XG4gICAgcmV0dXJuIFtkb2VzT3ZlcmZsb3csIHJlc3VsdF07XG4gIH07XG4gIHZhciBzdGFydCA9IDA7XG4gIHZhciBlbmQgPSB0ZXh0Lmxlbmd0aCAtIDE7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcbiAgdmFyIHRyaW1tZWRSZXN1bHQ7XG4gIHdoaWxlIChzdGFydCA8PSBlbmQgJiYgaXRlcmF0aW9ucyA8PSB0ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICB2YXIgbWlkZGxlID0gTWF0aC5mbG9vcigoc3RhcnQgKyBlbmQpIC8gMik7XG4gICAgdmFyIHByZXYgPSBtaWRkbGUgLSAxO1xuICAgIHZhciBfY2hlY2tPdmVyZmxvdyA9IGNoZWNrT3ZlcmZsb3cocHJldiksXG4gICAgICBfY2hlY2tPdmVyZmxvdzIgPSBfc2xpY2VkVG9BcnJheShfY2hlY2tPdmVyZmxvdywgMiksXG4gICAgICBkb2VzUHJldk92ZXJmbG93ID0gX2NoZWNrT3ZlcmZsb3cyWzBdLFxuICAgICAgcmVzdWx0ID0gX2NoZWNrT3ZlcmZsb3cyWzFdO1xuICAgIHZhciBfY2hlY2tPdmVyZmxvdzMgPSBjaGVja092ZXJmbG93KG1pZGRsZSksXG4gICAgICBfY2hlY2tPdmVyZmxvdzQgPSBfc2xpY2VkVG9BcnJheShfY2hlY2tPdmVyZmxvdzMsIDEpLFxuICAgICAgZG9lc01pZGRsZU92ZXJmbG93ID0gX2NoZWNrT3ZlcmZsb3c0WzBdO1xuICAgIGlmICghZG9lc1ByZXZPdmVyZmxvdyAmJiAhZG9lc01pZGRsZU92ZXJmbG93KSB7XG4gICAgICBzdGFydCA9IG1pZGRsZSArIDE7XG4gICAgfVxuICAgIGlmIChkb2VzUHJldk92ZXJmbG93ICYmIGRvZXNNaWRkbGVPdmVyZmxvdykge1xuICAgICAgZW5kID0gbWlkZGxlIC0gMTtcbiAgICB9XG4gICAgaWYgKCFkb2VzUHJldk92ZXJmbG93ICYmIGRvZXNNaWRkbGVPdmVyZmxvdykge1xuICAgICAgdHJpbW1lZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpdGVyYXRpb25zKys7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBvcmlnaW5hbFJlc3VsdCAocmVzdWx0IHdpdGhvdXQgdHJpbW1pbmcpIGlmIHdlIGNhbm5vdCBmaW5kIHRoZVxuICAvLyB3aGVyZSB0byB0cmltLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiA6dG06XG4gIHJldHVybiB0cmltbWVkUmVzdWx0IHx8IG9yaWdpbmFsUmVzdWx0O1xufTtcbnZhciBnZXRXb3Jkc1dpdGhvdXRDYWxjdWxhdGUgPSBmdW5jdGlvbiBnZXRXb3Jkc1dpdGhvdXRDYWxjdWxhdGUoY2hpbGRyZW4pIHtcbiAgdmFyIHdvcmRzID0gIWlzTmlsKGNoaWxkcmVuKSA/IGNoaWxkcmVuLnRvU3RyaW5nKCkuc3BsaXQoQlJFQUtJTkdfU1BBQ0VTKSA6IFtdO1xuICByZXR1cm4gW3tcbiAgICB3b3Jkczogd29yZHNcbiAgfV07XG59O1xudmFyIGdldFdvcmRzQnlMaW5lcyA9IGZ1bmN0aW9uIGdldFdvcmRzQnlMaW5lcyhfcmVmNCkge1xuICB2YXIgd2lkdGggPSBfcmVmNC53aWR0aCxcbiAgICBzY2FsZVRvRml0ID0gX3JlZjQuc2NhbGVUb0ZpdCxcbiAgICBjaGlsZHJlbiA9IF9yZWY0LmNoaWxkcmVuLFxuICAgIHN0eWxlID0gX3JlZjQuc3R5bGUsXG4gICAgYnJlYWtBbGwgPSBfcmVmNC5icmVha0FsbCxcbiAgICBtYXhMaW5lcyA9IF9yZWY0Lm1heExpbmVzO1xuICAvLyBPbmx5IHBlcmZvcm0gY2FsY3VsYXRpb25zIGlmIHVzaW5nIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSB0aGVtIChtdWx0aWxpbmUsIHNjYWxlVG9GaXQpXG4gIGlmICgod2lkdGggfHwgc2NhbGVUb0ZpdCkgJiYgIUdsb2JhbC5pc1Nzcikge1xuICAgIHZhciB3b3Jkc1dpdGhDb21wdXRlZFdpZHRoLCBzcGFjZVdpZHRoO1xuICAgIHZhciB3b3JkV2lkdGhzID0gY2FsY3VsYXRlV29yZFdpZHRocyh7XG4gICAgICBicmVha0FsbDogYnJlYWtBbGwsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9KTtcbiAgICBpZiAod29yZFdpZHRocykge1xuICAgICAgdmFyIHdjdyA9IHdvcmRXaWR0aHMud29yZHNXaXRoQ29tcHV0ZWRXaWR0aCxcbiAgICAgICAgc3cgPSB3b3JkV2lkdGhzLnNwYWNlV2lkdGg7XG4gICAgICB3b3Jkc1dpdGhDb21wdXRlZFdpZHRoID0gd2N3O1xuICAgICAgc3BhY2VXaWR0aCA9IHN3O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0V29yZHNXaXRob3V0Q2FsY3VsYXRlKGNoaWxkcmVuKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGN1bGF0ZVdvcmRzQnlMaW5lcyh7XG4gICAgICBicmVha0FsbDogYnJlYWtBbGwsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgICBtYXhMaW5lczogbWF4TGluZXMsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCB3b3Jkc1dpdGhDb21wdXRlZFdpZHRoLCBzcGFjZVdpZHRoLCB3aWR0aCwgc2NhbGVUb0ZpdCk7XG4gIH1cbiAgcmV0dXJuIGdldFdvcmRzV2l0aG91dENhbGN1bGF0ZShjaGlsZHJlbik7XG59O1xudmFyIERFRkFVTFRfRklMTCA9ICcjODA4MDgwJztcbmV4cG9ydCB2YXIgVGV4dCA9IGZ1bmN0aW9uIFRleHQoX3JlZjUpIHtcbiAgdmFyIF9yZWY1JHggPSBfcmVmNS54LFxuICAgIHByb3BzWCA9IF9yZWY1JHggPT09IHZvaWQgMCA/IDAgOiBfcmVmNSR4LFxuICAgIF9yZWY1JHkgPSBfcmVmNS55LFxuICAgIHByb3BzWSA9IF9yZWY1JHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmNSR5LFxuICAgIF9yZWY1JGxpbmVIZWlnaHQgPSBfcmVmNS5saW5lSGVpZ2h0LFxuICAgIGxpbmVIZWlnaHQgPSBfcmVmNSRsaW5lSGVpZ2h0ID09PSB2b2lkIDAgPyAnMWVtJyA6IF9yZWY1JGxpbmVIZWlnaHQsXG4gICAgX3JlZjUkY2FwSGVpZ2h0ID0gX3JlZjUuY2FwSGVpZ2h0LFxuICAgIGNhcEhlaWdodCA9IF9yZWY1JGNhcEhlaWdodCA9PT0gdm9pZCAwID8gJzAuNzFlbScgOiBfcmVmNSRjYXBIZWlnaHQsXG4gICAgX3JlZjUkc2NhbGVUb0ZpdCA9IF9yZWY1LnNjYWxlVG9GaXQsXG4gICAgc2NhbGVUb0ZpdCA9IF9yZWY1JHNjYWxlVG9GaXQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjUkc2NhbGVUb0ZpdCxcbiAgICBfcmVmNSR0ZXh0QW5jaG9yID0gX3JlZjUudGV4dEFuY2hvcixcbiAgICB0ZXh0QW5jaG9yID0gX3JlZjUkdGV4dEFuY2hvciA9PT0gdm9pZCAwID8gJ3N0YXJ0JyA6IF9yZWY1JHRleHRBbmNob3IsXG4gICAgX3JlZjUkdmVydGljYWxBbmNob3IgPSBfcmVmNS52ZXJ0aWNhbEFuY2hvcixcbiAgICB2ZXJ0aWNhbEFuY2hvciA9IF9yZWY1JHZlcnRpY2FsQW5jaG9yID09PSB2b2lkIDAgPyAnZW5kJyA6IF9yZWY1JHZlcnRpY2FsQW5jaG9yLFxuICAgIF9yZWY1JGZpbGwgPSBfcmVmNS5maWxsLFxuICAgIGZpbGwgPSBfcmVmNSRmaWxsID09PSB2b2lkIDAgPyBERUZBVUxUX0ZJTEwgOiBfcmVmNSRmaWxsLFxuICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY1LCBfZXhjbHVkZWQpO1xuICB2YXIgd29yZHNCeUxpbmVzID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFdvcmRzQnlMaW5lcyh7XG4gICAgICBicmVha0FsbDogcHJvcHMuYnJlYWtBbGwsXG4gICAgICBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW4sXG4gICAgICBtYXhMaW5lczogcHJvcHMubWF4TGluZXMsXG4gICAgICBzY2FsZVRvRml0OiBzY2FsZVRvRml0LFxuICAgICAgc3R5bGU6IHByb3BzLnN0eWxlLFxuICAgICAgd2lkdGg6IHByb3BzLndpZHRoXG4gICAgfSk7XG4gIH0sIFtwcm9wcy5icmVha0FsbCwgcHJvcHMuY2hpbGRyZW4sIHByb3BzLm1heExpbmVzLCBzY2FsZVRvRml0LCBwcm9wcy5zdHlsZSwgcHJvcHMud2lkdGhdKTtcbiAgdmFyIGR4ID0gcHJvcHMuZHgsXG4gICAgZHkgPSBwcm9wcy5keSxcbiAgICBhbmdsZSA9IHByb3BzLmFuZ2xlLFxuICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICBicmVha0FsbCA9IHByb3BzLmJyZWFrQWxsLFxuICAgIHRleHRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkMik7XG4gIGlmICghaXNOdW1PclN0cihwcm9wc1gpIHx8ICFpc051bU9yU3RyKHByb3BzWSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgeCA9IHByb3BzWCArIChpc051bWJlcihkeCkgPyBkeCA6IDApO1xuICB2YXIgeSA9IHByb3BzWSArIChpc051bWJlcihkeSkgPyBkeSA6IDApO1xuICB2YXIgc3RhcnREeTtcbiAgc3dpdGNoICh2ZXJ0aWNhbEFuY2hvcikge1xuICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIHN0YXJ0RHkgPSByZWR1Y2VDU1NDYWxjKFwiY2FsYyhcIi5jb25jYXQoY2FwSGVpZ2h0LCBcIilcIikpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgIHN0YXJ0RHkgPSByZWR1Y2VDU1NDYWxjKFwiY2FsYyhcIi5jb25jYXQoKHdvcmRzQnlMaW5lcy5sZW5ndGggLSAxKSAvIDIsIFwiICogLVwiKS5jb25jYXQobGluZUhlaWdodCwgXCIgKyAoXCIpLmNvbmNhdChjYXBIZWlnaHQsIFwiIC8gMikpXCIpKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGFydER5ID0gcmVkdWNlQ1NTQ2FsYyhcImNhbGMoXCIuY29uY2F0KHdvcmRzQnlMaW5lcy5sZW5ndGggLSAxLCBcIiAqIC1cIikuY29uY2F0KGxpbmVIZWlnaHQsIFwiKVwiKSk7XG4gICAgICBicmVhaztcbiAgfVxuICB2YXIgdHJhbnNmb3JtcyA9IFtdO1xuICBpZiAoc2NhbGVUb0ZpdCkge1xuICAgIHZhciBsaW5lV2lkdGggPSB3b3Jkc0J5TGluZXNbMF0ud2lkdGg7XG4gICAgdmFyIHdpZHRoID0gcHJvcHMud2lkdGg7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwic2NhbGUoXCIuY29uY2F0KChpc051bWJlcih3aWR0aCkgPyB3aWR0aCAvIGxpbmVXaWR0aCA6IDEpIC8gbGluZVdpZHRoLCBcIilcIikpO1xuICB9XG4gIGlmIChhbmdsZSkge1xuICAgIHRyYW5zZm9ybXMucHVzaChcInJvdGF0ZShcIi5jb25jYXQoYW5nbGUsIFwiLCBcIikuY29uY2F0KHgsIFwiLCBcIikuY29uY2F0KHksIFwiKVwiKSk7XG4gIH1cbiAgaWYgKHRyYW5zZm9ybXMubGVuZ3RoKSB7XG4gICAgdGV4dFByb3BzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybXMuam9pbignICcpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRleHRcIiwgX2V4dGVuZHMoe30sIGZpbHRlclByb3BzKHRleHRQcm9wcywgdHJ1ZSksIHtcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgY2xhc3NOYW1lOiBjbHN4KCdyZWNoYXJ0cy10ZXh0JywgY2xhc3NOYW1lKSxcbiAgICB0ZXh0QW5jaG9yOiB0ZXh0QW5jaG9yLFxuICAgIGZpbGw6IGZpbGwuaW5jbHVkZXMoJ3VybCcpID8gREVGQVVMVF9GSUxMIDogZmlsbFxuICB9KSwgd29yZHNCeUxpbmVzLm1hcChmdW5jdGlvbiAobGluZSwgaW5kZXgpIHtcbiAgICB2YXIgd29yZHMgPSBsaW5lLndvcmRzLmpvaW4oYnJlYWtBbGwgPyAnJyA6ICcgJyk7XG4gICAgcmV0dXJuIChcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIC8vIGR1cGxpY2F0ZSB3b3JkcyB3aWxsIGNhdXNlIGR1cGxpY2F0ZSBrZXlzXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5XG4gICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidHNwYW5cIiwge1xuICAgICAgICB4OiB4LFxuICAgICAgICBkeTogaW5kZXggPT09IDAgPyBzdGFydER5IDogbGluZUhlaWdodCxcbiAgICAgICAga2V5OiBcIlwiLmNvbmNhdCh3b3JkcywgXCItXCIpLmNvbmNhdChpbmRleClcbiAgICAgIH0sIHdvcmRzKVxuICAgICk7XG4gIH0pKTtcbn07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksIGRlc2NyaXB0b3IpOyB9IH1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5mdW5jdGlvbiBfY2FsbFN1cGVyKHQsIG8sIGUpIHsgcmV0dXJuIG8gPSBfZ2V0UHJvdG90eXBlT2YobyksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSA/IFJlZmxlY3QuY29uc3RydWN0KG8sIGUgfHwgW10sIF9nZXRQcm90b3R5cGVPZih0KS5jb25zdHJ1Y3RvcikgOiBvLmFwcGx5KHQsIGUpKTsgfVxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHRyeSB7IHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgfSBjYXRjaCAodCkge30gcmV0dXJuIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgcmV0dXJuICEhdDsgfSkoKTsgfVxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgVG9vbHRpcFxuICovXG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERlZmF1bHRUb29sdGlwQ29udGVudCB9IGZyb20gJy4vRGVmYXVsdFRvb2x0aXBDb250ZW50JztcbmltcG9ydCB7IFRvb2x0aXBCb3VuZGluZ0JveCB9IGZyb20gJy4vVG9vbHRpcEJvdW5kaW5nQm94JztcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gJy4uL3V0aWwvR2xvYmFsJztcbmltcG9ydCB7IGdldFVuaXFQYXlsb2FkIH0gZnJvbSAnLi4vdXRpbC9wYXlsb2FkL2dldFVuaXFQYXlsb2FkJztcbmZ1bmN0aW9uIGRlZmF1bHRVbmlxQnkoZW50cnkpIHtcbiAgcmV0dXJuIGVudHJ5LmRhdGFLZXk7XG59XG5mdW5jdGlvbiByZW5kZXJDb250ZW50KGNvbnRlbnQsIHByb3BzKSB7XG4gIGlmICggLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY29udGVudCwgcHJvcHMpO1xuICB9XG4gIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChjb250ZW50LCBwcm9wcyk7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERlZmF1bHRUb29sdGlwQ29udGVudCwgcHJvcHMpO1xufVxuZXhwb3J0IHZhciBUb29sdGlwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICBmdW5jdGlvbiBUb29sdGlwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb29sdGlwKTtcbiAgICByZXR1cm4gX2NhbGxTdXBlcih0aGlzLCBUb29sdGlwLCBhcmd1bWVudHMpO1xuICB9XG4gIF9pbmhlcml0cyhUb29sdGlwLCBfUHVyZUNvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoVG9vbHRpcCwgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wcy5hY3RpdmUsXG4gICAgICAgIGFsbG93RXNjYXBlVmlld0JveCA9IF90aGlzJHByb3BzLmFsbG93RXNjYXBlVmlld0JveCxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb24gPSBfdGhpcyRwcm9wcy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nID0gX3RoaXMkcHJvcHMuYW5pbWF0aW9uRWFzaW5nLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMuY29udGVudCxcbiAgICAgICAgY29vcmRpbmF0ZSA9IF90aGlzJHByb3BzLmNvb3JkaW5hdGUsXG4gICAgICAgIGZpbHRlck51bGwgPSBfdGhpcyRwcm9wcy5maWx0ZXJOdWxsLFxuICAgICAgICBpc0FuaW1hdGlvbkFjdGl2ZSA9IF90aGlzJHByb3BzLmlzQW5pbWF0aW9uQWN0aXZlLFxuICAgICAgICBvZmZzZXQgPSBfdGhpcyRwcm9wcy5vZmZzZXQsXG4gICAgICAgIHBheWxvYWQgPSBfdGhpcyRwcm9wcy5wYXlsb2FkLFxuICAgICAgICBwYXlsb2FkVW5pcUJ5ID0gX3RoaXMkcHJvcHMucGF5bG9hZFVuaXFCeSxcbiAgICAgICAgcG9zaXRpb24gPSBfdGhpcyRwcm9wcy5wb3NpdGlvbixcbiAgICAgICAgcmV2ZXJzZURpcmVjdGlvbiA9IF90aGlzJHByb3BzLnJldmVyc2VEaXJlY3Rpb24sXG4gICAgICAgIHVzZVRyYW5zbGF0ZTNkID0gX3RoaXMkcHJvcHMudXNlVHJhbnNsYXRlM2QsXG4gICAgICAgIHZpZXdCb3ggPSBfdGhpcyRwcm9wcy52aWV3Qm94LFxuICAgICAgICB3cmFwcGVyU3R5bGUgPSBfdGhpcyRwcm9wcy53cmFwcGVyU3R5bGU7XG4gICAgICB2YXIgZmluYWxQYXlsb2FkID0gcGF5bG9hZCAhPT0gbnVsbCAmJiBwYXlsb2FkICE9PSB2b2lkIDAgPyBwYXlsb2FkIDogW107XG4gICAgICBpZiAoZmlsdGVyTnVsbCAmJiBmaW5hbFBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgIGZpbmFsUGF5bG9hZCA9IGdldFVuaXFQYXlsb2FkKHBheWxvYWQuZmlsdGVyKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSAhPSBudWxsICYmIChlbnRyeS5oaWRlICE9PSB0cnVlIHx8IF90aGlzLnByb3BzLmluY2x1ZGVIaWRkZW4pO1xuICAgICAgICB9KSwgcGF5bG9hZFVuaXFCeSwgZGVmYXVsdFVuaXFCeSk7XG4gICAgICB9XG4gICAgICB2YXIgaGFzUGF5bG9hZCA9IGZpbmFsUGF5bG9hZC5sZW5ndGggPiAwO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBCb3VuZGluZ0JveCwge1xuICAgICAgICBhbGxvd0VzY2FwZVZpZXdCb3g6IGFsbG93RXNjYXBlVmlld0JveCxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246IGFuaW1hdGlvbkR1cmF0aW9uLFxuICAgICAgICBhbmltYXRpb25FYXNpbmc6IGFuaW1hdGlvbkVhc2luZyxcbiAgICAgICAgaXNBbmltYXRpb25BY3RpdmU6IGlzQW5pbWF0aW9uQWN0aXZlLFxuICAgICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgICAgY29vcmRpbmF0ZTogY29vcmRpbmF0ZSxcbiAgICAgICAgaGFzUGF5bG9hZDogaGFzUGF5bG9hZCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgcmV2ZXJzZURpcmVjdGlvbjogcmV2ZXJzZURpcmVjdGlvbixcbiAgICAgICAgdXNlVHJhbnNsYXRlM2Q6IHVzZVRyYW5zbGF0ZTNkLFxuICAgICAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgICAgICB3cmFwcGVyU3R5bGU6IHdyYXBwZXJTdHlsZVxuICAgICAgfSwgcmVuZGVyQ29udGVudChjb250ZW50LCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMucHJvcHMpLCB7fSwge1xuICAgICAgICBwYXlsb2FkOiBmaW5hbFBheWxvYWRcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9XSk7XG59KFB1cmVDb21wb25lbnQpO1xuX2RlZmluZVByb3BlcnR5KFRvb2x0aXAsIFwiZGlzcGxheU5hbWVcIiwgJ1Rvb2x0aXAnKTtcbl9kZWZpbmVQcm9wZXJ0eShUb29sdGlwLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGFjY2Vzc2liaWxpdHlMYXllcjogZmFsc2UsXG4gIGFsbG93RXNjYXBlVmlld0JveDoge1xuICAgIHg6IGZhbHNlLFxuICAgIHk6IGZhbHNlXG4gIH0sXG4gIGFuaW1hdGlvbkR1cmF0aW9uOiA0MDAsXG4gIGFuaW1hdGlvbkVhc2luZzogJ2Vhc2UnLFxuICBjb250ZW50U3R5bGU6IHt9LFxuICBjb29yZGluYXRlOiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH0sXG4gIGN1cnNvcjogdHJ1ZSxcbiAgY3Vyc29yU3R5bGU6IHt9LFxuICBmaWx0ZXJOdWxsOiB0cnVlLFxuICBpc0FuaW1hdGlvbkFjdGl2ZTogIUdsb2JhbC5pc1NzcixcbiAgaXRlbVN0eWxlOiB7fSxcbiAgbGFiZWxTdHlsZToge30sXG4gIG9mZnNldDogMTAsXG4gIHJldmVyc2VEaXJlY3Rpb246IHtcbiAgICB4OiBmYWxzZSxcbiAgICB5OiBmYWxzZVxuICB9LFxuICBzZXBhcmF0b3I6ICcgOiAnLFxuICB0cmlnZ2VyOiAnaG92ZXInLFxuICB1c2VUcmFuc2xhdGUzZDogZmFsc2UsXG4gIHZpZXdCb3g6IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHdpZHRoOiAwXG4gIH0sXG4gIHdyYXBwZXJTdHlsZToge31cbn0pOyIsImZ1bmN0aW9uIF90eXBlb2YobykgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9IDogZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87IH0sIF90eXBlb2Yobyk7IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsgfSB9XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgXCJwcm90b3R5cGVcIiwgeyB3cml0YWJsZTogZmFsc2UgfSk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7IHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7IH1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyB0cnkgeyB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IH0gY2F0Y2ggKHQpIHt9IHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IHJldHVybiAhIXQ7IH0pKCk7IH1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3ViQ2xhc3MsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRUb29sdGlwVHJhbnNsYXRlIH0gZnJvbSAnLi4vdXRpbC90b29sdGlwL3RyYW5zbGF0ZSc7XG52YXIgRVBTSUxPTiA9IDE7XG5leHBvcnQgdmFyIFRvb2x0aXBCb3VuZGluZ0JveCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gVG9vbHRpcEJvdW5kaW5nQm94KCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9vbHRpcEJvdW5kaW5nQm94KTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIF90aGlzID0gX2NhbGxTdXBlcih0aGlzLCBUb29sdGlwQm91bmRpbmdCb3gsIFtdLmNvbmNhdChhcmdzKSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInN0YXRlXCIsIHtcbiAgICAgIGRpc21pc3NlZDogZmFsc2UsXG4gICAgICBkaXNtaXNzZWRBdENvb3JkaW5hdGU6IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfSxcbiAgICAgIGxhc3RCb3VuZGluZ0JveDoge1xuICAgICAgICB3aWR0aDogLTEsXG4gICAgICAgIGhlaWdodDogLTFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiaGFuZGxlS2V5RG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyRjb29yZGluYXQsIF90aGlzJHByb3BzJGNvb3JkaW5hdDIsIF90aGlzJHByb3BzJGNvb3JkaW5hdDMsIF90aGlzJHByb3BzJGNvb3JkaW5hdDQ7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkaXNtaXNzZWQ6IHRydWUsXG4gICAgICAgICAgZGlzbWlzc2VkQXRDb29yZGluYXRlOiB7XG4gICAgICAgICAgICB4OiAoX3RoaXMkcHJvcHMkY29vcmRpbmF0ID0gKF90aGlzJHByb3BzJGNvb3JkaW5hdDIgPSBfdGhpcy5wcm9wcy5jb29yZGluYXRlKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wcyRjb29yZGluYXQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcyRjb29yZGluYXQyLngpICE9PSBudWxsICYmIF90aGlzJHByb3BzJGNvb3JkaW5hdCAhPT0gdm9pZCAwID8gX3RoaXMkcHJvcHMkY29vcmRpbmF0IDogMCxcbiAgICAgICAgICAgIHk6IChfdGhpcyRwcm9wcyRjb29yZGluYXQzID0gKF90aGlzJHByb3BzJGNvb3JkaW5hdDQgPSBfdGhpcy5wcm9wcy5jb29yZGluYXRlKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wcyRjb29yZGluYXQ0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcyRjb29yZGluYXQ0LnkpICE9PSBudWxsICYmIF90aGlzJHByb3BzJGNvb3JkaW5hdDMgIT09IHZvaWQgMCA/IF90aGlzJHByb3BzJGNvb3JkaW5hdDMgOiAwXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2luaGVyaXRzKFRvb2x0aXBCb3VuZGluZ0JveCwgX1B1cmVDb21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKFRvb2x0aXBCb3VuZGluZ0JveCwgW3tcbiAgICBrZXk6IFwidXBkYXRlQkJveFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVCQm94KCkge1xuICAgICAgaWYgKHRoaXMud3JhcHBlck5vZGUgJiYgdGhpcy53cmFwcGVyTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcbiAgICAgICAgdmFyIGJveCA9IHRoaXMud3JhcHBlck5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmIChNYXRoLmFicyhib3gud2lkdGggLSB0aGlzLnN0YXRlLmxhc3RCb3VuZGluZ0JveC53aWR0aCkgPiBFUFNJTE9OIHx8IE1hdGguYWJzKGJveC5oZWlnaHQgLSB0aGlzLnN0YXRlLmxhc3RCb3VuZGluZ0JveC5oZWlnaHQpID4gRVBTSUxPTikge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbGFzdEJvdW5kaW5nQm94OiB7XG4gICAgICAgICAgICAgIHdpZHRoOiBib3gud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogYm94LmhlaWdodFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUubGFzdEJvdW5kaW5nQm94LndpZHRoICE9PSAtMSB8fCB0aGlzLnN0YXRlLmxhc3RCb3VuZGluZ0JveC5oZWlnaHQgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGxhc3RCb3VuZGluZ0JveDoge1xuICAgICAgICAgICAgd2lkdGg6IC0xLFxuICAgICAgICAgICAgaGVpZ2h0OiAtMVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XG4gICAgICB0aGlzLnVwZGF0ZUJCb3goKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyRjb29yZGluYXQ1LCBfdGhpcyRwcm9wcyRjb29yZGluYXQ2O1xuICAgICAgaWYgKHRoaXMucHJvcHMuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQkJveCgpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnN0YXRlLmRpc21pc3NlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoKChfdGhpcyRwcm9wcyRjb29yZGluYXQ1ID0gdGhpcy5wcm9wcy5jb29yZGluYXRlKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wcyRjb29yZGluYXQ1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcyRjb29yZGluYXQ1LngpICE9PSB0aGlzLnN0YXRlLmRpc21pc3NlZEF0Q29vcmRpbmF0ZS54IHx8ICgoX3RoaXMkcHJvcHMkY29vcmRpbmF0NiA9IHRoaXMucHJvcHMuY29vcmRpbmF0ZSkgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMkY29vcmRpbmF0NiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcHJvcHMkY29vcmRpbmF0Ni55KSAhPT0gdGhpcy5zdGF0ZS5kaXNtaXNzZWRBdENvb3JkaW5hdGUueSkge1xuICAgICAgICB0aGlzLnN0YXRlLmRpc21pc3NlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wcy5hY3RpdmUsXG4gICAgICAgIGFsbG93RXNjYXBlVmlld0JveCA9IF90aGlzJHByb3BzLmFsbG93RXNjYXBlVmlld0JveCxcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb24gPSBfdGhpcyRwcm9wcy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nID0gX3RoaXMkcHJvcHMuYW5pbWF0aW9uRWFzaW5nLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBjb29yZGluYXRlID0gX3RoaXMkcHJvcHMuY29vcmRpbmF0ZSxcbiAgICAgICAgaGFzUGF5bG9hZCA9IF90aGlzJHByb3BzLmhhc1BheWxvYWQsXG4gICAgICAgIGlzQW5pbWF0aW9uQWN0aXZlID0gX3RoaXMkcHJvcHMuaXNBbmltYXRpb25BY3RpdmUsXG4gICAgICAgIG9mZnNldCA9IF90aGlzJHByb3BzLm9mZnNldCxcbiAgICAgICAgcG9zaXRpb24gPSBfdGhpcyRwcm9wcy5wb3NpdGlvbixcbiAgICAgICAgcmV2ZXJzZURpcmVjdGlvbiA9IF90aGlzJHByb3BzLnJldmVyc2VEaXJlY3Rpb24sXG4gICAgICAgIHVzZVRyYW5zbGF0ZTNkID0gX3RoaXMkcHJvcHMudXNlVHJhbnNsYXRlM2QsXG4gICAgICAgIHZpZXdCb3ggPSBfdGhpcyRwcm9wcy52aWV3Qm94LFxuICAgICAgICB3cmFwcGVyU3R5bGUgPSBfdGhpcyRwcm9wcy53cmFwcGVyU3R5bGU7XG4gICAgICB2YXIgX2dldFRvb2x0aXBUcmFuc2xhdGUgPSBnZXRUb29sdGlwVHJhbnNsYXRlKHtcbiAgICAgICAgICBhbGxvd0VzY2FwZVZpZXdCb3g6IGFsbG93RXNjYXBlVmlld0JveCxcbiAgICAgICAgICBjb29yZGluYXRlOiBjb29yZGluYXRlLFxuICAgICAgICAgIG9mZnNldFRvcExlZnQ6IG9mZnNldCxcbiAgICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgICAgICAgcmV2ZXJzZURpcmVjdGlvbjogcmV2ZXJzZURpcmVjdGlvbixcbiAgICAgICAgICB0b29sdGlwQm94OiB0aGlzLnN0YXRlLmxhc3RCb3VuZGluZ0JveCxcbiAgICAgICAgICB1c2VUcmFuc2xhdGUzZDogdXNlVHJhbnNsYXRlM2QsXG4gICAgICAgICAgdmlld0JveDogdmlld0JveFxuICAgICAgICB9KSxcbiAgICAgICAgY3NzQ2xhc3NlcyA9IF9nZXRUb29sdGlwVHJhbnNsYXRlLmNzc0NsYXNzZXMsXG4gICAgICAgIGNzc1Byb3BlcnRpZXMgPSBfZ2V0VG9vbHRpcFRyYW5zbGF0ZS5jc3NQcm9wZXJ0aWVzO1xuICAgICAgdmFyIG91dGVyU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICB0cmFuc2l0aW9uOiBpc0FuaW1hdGlvbkFjdGl2ZSAmJiBhY3RpdmUgPyBcInRyYW5zZm9ybSBcIi5jb25jYXQoYW5pbWF0aW9uRHVyYXRpb24sIFwibXMgXCIpLmNvbmNhdChhbmltYXRpb25FYXNpbmcpIDogdW5kZWZpbmVkXG4gICAgICB9LCBjc3NQcm9wZXJ0aWVzKSwge30sIHtcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICB2aXNpYmlsaXR5OiAhdGhpcy5zdGF0ZS5kaXNtaXNzZWQgJiYgYWN0aXZlICYmIGhhc1BheWxvYWQgPyAndmlzaWJsZScgOiAnaGlkZGVuJyxcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMFxuICAgICAgfSwgd3JhcHBlclN0eWxlKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgLy8gVGhpcyBlbGVtZW50IGFsbG93IGxpc3RlbmluZyB0byB0aGUgYEVzY2FwZWAga2V5LlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlY2hhcnRzL3JlY2hhcnRzL3B1bGwvMjkyNVxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjc3NDbGFzc2VzLFxuICAgICAgICAgIHN0eWxlOiBvdXRlclN0eWxlLFxuICAgICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKG5vZGUpIHtcbiAgICAgICAgICAgIF90aGlzMi53cmFwcGVyTm9kZSA9IG5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBjaGlsZHJlbilcbiAgICAgICk7XG4gICAgfVxuICB9XSk7XG59KFB1cmVDb21wb25lbnQpOyIsInZhciBfZXhjbHVkZWQgPSBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiXTtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGZpbHRlclByb3BzIH0gZnJvbSAnLi4vdXRpbC9SZWFjdFV0aWxzJztcbmV4cG9ydCB2YXIgTGF5ZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgb3RoZXJzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuICB2YXIgbGF5ZXJDbGFzcyA9IGNsc3goJ3JlY2hhcnRzLWxheWVyJywgY2xhc3NOYW1lKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBsYXllckNsYXNzXG4gIH0sIGZpbHRlclByb3BzKG90aGVycywgdHJ1ZSksIHtcbiAgICByZWY6IHJlZlxuICB9KSwgY2hpbGRyZW4pO1xufSk7IiwidmFyIF9leGNsdWRlZCA9IFtcImNoaWxkcmVuXCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJ2aWV3Qm94XCIsIFwiY2xhc3NOYW1lXCIsIFwic3R5bGVcIiwgXCJ0aXRsZVwiLCBcImRlc2NcIl07XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgU3VyZmFjZVxuICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBmaWx0ZXJQcm9wcyB9IGZyb20gJy4uL3V0aWwvUmVhY3RVdGlscyc7XG5leHBvcnQgZnVuY3Rpb24gU3VyZmFjZShwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICB2aWV3Qm94ID0gcHJvcHMudmlld0JveCxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICB0aXRsZSA9IHByb3BzLnRpdGxlLFxuICAgIGRlc2MgPSBwcm9wcy5kZXNjLFxuICAgIG90aGVycyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgX2V4Y2x1ZGVkKTtcbiAgdmFyIHN2Z1ZpZXcgPSB2aWV3Qm94IHx8IHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG4gIHZhciBsYXllckNsYXNzID0gY2xzeCgncmVjaGFydHMtc3VyZmFjZScsIGNsYXNzTmFtZSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7fSwgZmlsdGVyUHJvcHMob3RoZXJzLCB0cnVlLCAnc3ZnJyksIHtcbiAgICBjbGFzc05hbWU6IGxheWVyQ2xhc3MsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICB2aWV3Qm94OiBcIlwiLmNvbmNhdChzdmdWaWV3LngsIFwiIFwiKS5jb25jYXQoc3ZnVmlldy55LCBcIiBcIikuY29uY2F0KHN2Z1ZpZXcud2lkdGgsIFwiIFwiKS5jb25jYXQoc3ZnVmlldy5oZWlnaHQpXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRpdGxlXCIsIG51bGwsIHRpdGxlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZXNjXCIsIG51bGwsIGRlc2MpLCBjaGlsZHJlbik7XG59IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykgeyByZXR1cm4gdHlwZW9mIG87IH0gOiBmdW5jdGlvbiAobykgeyByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbzsgfSwgX3R5cGVvZihvKTsgfVxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCBmaW5kIGZyb20gJ2xvZGFzaC9maW5kJztcbmltcG9ydCBldmVyeSBmcm9tICdsb2Rhc2gvZXZlcnknO1xuaW1wb3J0IHsgY2FsY3VsYXRlVmlld0JveCB9IGZyb20gJy4uL3V0aWwvY2FsY3VsYXRlVmlld0JveCc7XG5pbXBvcnQgeyBnZXRBbnlFbGVtZW50T2ZPYmplY3QgfSBmcm9tICcuLi91dGlsL0RhdGFVdGlscyc7XG5leHBvcnQgdmFyIFhBeGlzQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG5leHBvcnQgdmFyIFlBeGlzQ29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG5leHBvcnQgdmFyIFZpZXdCb3hDb250ZXh0ID0gLyojX19QVVJFX18qL2NyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmV4cG9ydCB2YXIgT2Zmc2V0Q29udGV4dCA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHt9KTtcbmV4cG9ydCB2YXIgQ2xpcFBhdGhJZENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuZXhwb3J0IHZhciBDaGFydEhlaWdodENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCgwKTtcbmV4cG9ydCB2YXIgQ2hhcnRXaWR0aENvbnRleHQgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCgwKTtcblxuLyoqXG4gKiBXaWxsIGFkZCBhbGwgdGhlIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gcmVuZGVyIGFsbCBpbmRpdmlkdWFsIFJlY2hhcnRzIGNvbXBvbmVudHMgaW50byBhIFJlYWN0IENvbnRleHQuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gcmVhZCB0aGVzZSBwcm9wZXJ0aWVzLCBzZWUgdGhlIGNvbGxlY3Rpb24gb2YgaG9va3MgZXhwb3J0ZWQgZnJvbSB0aGlzIGZpbGUuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIENhdGVnb3JpY2FsQ2hhcnRTdGF0ZSwgcGx1cyBjaGlsZHJlblxuICogQHJldHVybnMge1JlYWN0RWxlbWVudH0gUmVhY3QgQ29udGV4dCBQcm92aWRlclxuICovXG5leHBvcnQgdmFyIENoYXJ0TGF5b3V0Q29udGV4dFByb3ZpZGVyID0gZnVuY3Rpb24gQ2hhcnRMYXlvdXRDb250ZXh0UHJvdmlkZXIocHJvcHMpIHtcbiAgdmFyIF9wcm9wcyRzdGF0ZSA9IHByb3BzLnN0YXRlLFxuICAgIHhBeGlzTWFwID0gX3Byb3BzJHN0YXRlLnhBeGlzTWFwLFxuICAgIHlBeGlzTWFwID0gX3Byb3BzJHN0YXRlLnlBeGlzTWFwLFxuICAgIG9mZnNldCA9IF9wcm9wcyRzdGF0ZS5vZmZzZXQsXG4gICAgY2xpcFBhdGhJZCA9IHByb3BzLmNsaXBQYXRoSWQsXG4gICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICB3aWR0aCA9IHByb3BzLndpZHRoLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodDtcblxuICAvKipcbiAgICogUGVyaGFwcyB3ZSBzaG91bGQgY29tcHV0ZSB0aGlzIHByb3BlcnR5IHdoZW4gcmVhZGluZz8gTGV0J3Mgc2VlIHdoYXQgaXMgbW9yZSBvZnRlbiB1c2VkXG4gICAqL1xuICB2YXIgdmlld0JveCA9IGNhbGN1bGF0ZVZpZXdCb3gob2Zmc2V0KTtcblxuICAvKlxuICAgKiBUaGlzIHByZXRlbmRzIHRvIGJlIGEgc2luZ2xlIGNvbnRleHQgYnV0IGFjdHVhbGx5IGlzIHNwbGl0IGludG8gbXVsdGlwbGUgc21hbGxlciBvbmVzLlxuICAgKiBXaHk/XG4gICAqIEJlY2F1c2Ugb25lIFJlYWN0IENvbnRleHQgb25seSBhbGxvd3MgdG8gc2V0IG9uZSB2YWx1ZS5cbiAgICogQnV0IHdlIG5lZWQgdG8gc2V0IG11bHRpcGxlIHZhbHVlcy5cbiAgICogSWYgd2UgZG8gdGhhdCB3aXRoIG9uZSBjb250ZXh0LCB0aGVuIHdlIGZvcmNlIHJlLXJlbmRlciBvbiBjb21wb25lbnRzIHRoYXQgbWlnaHQgbm90IGV2ZW4gYmUgaW50ZXJlc3RlZFxuICAgKiBpbiB0aGUgcGFydCBvZiB0aGUgc3RhdGUgdGhhdCBoYXMgY2hhbmdlZC5cbiAgICpcbiAgICogQnkgc3BsaXR0aW5nIGludG8gc21hbGxlciBjb250ZXh0cywgd2UgYWxsb3cgZWFjaCBjb21wb25lbnRzIHRvIGJlIG9wdGltaXplZCBhbmQgb25seSByZS1yZW5kZXIgd2hlbiBpdHMgZGVwZW5kZW5jaWVzIGNoYW5nZS5cbiAgICpcbiAgICogVG8gYWN0dWFsbHkgYWNoaWV2ZSB0aGUgb3B0aW1hbCByZS1yZW5kZXIsIGl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgUmVhY3QubWVtbygpLlxuICAgKiBTZWUgdGhlIHRlc3QgZmlsZSBmb3IgZGV0YWlscy5cbiAgICovXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChYQXhpc0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogeEF4aXNNYXBcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoWUF4aXNDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHlBeGlzTWFwXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE9mZnNldENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogb2Zmc2V0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFZpZXdCb3hDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHZpZXdCb3hcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xpcFBhdGhJZENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY2xpcFBhdGhJZFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGFydEhlaWdodENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogaGVpZ2h0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoYXJ0V2lkdGhDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHdpZHRoXG4gIH0sIGNoaWxkcmVuKSkpKSkpKTtcbn07XG5leHBvcnQgdmFyIHVzZUNsaXBQYXRoSWQgPSBmdW5jdGlvbiB1c2VDbGlwUGF0aElkKCkge1xuICByZXR1cm4gdXNlQ29udGV4dChDbGlwUGF0aElkQ29udGV4dCk7XG59O1xuZnVuY3Rpb24gZ2V0S2V5c0ZvckRlYnVnKG9iamVjdCkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnVGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBpZHMuJztcbiAgfVxuICByZXR1cm4gXCJBdmFpbGFibGUgaWRzIGFyZTogXCIuY29uY2F0KGtleXMsIFwiLlwiKTtcbn1cblxuLyoqXG4gKiBUaGlzIGVpdGhlciBmaW5kcyBhbmQgcmV0dXJucyBBeGlzIGJ5IHRoZSBzcGVjaWZpZWQgSUQsIG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgYW4gYXhpcyB3aXRoIHRoaXMgSUQgZG9lcyBub3QgZXhpc3QuXG4gKlxuICogQHBhcmFtIHhBeGlzSWQgaWRlbnRpZmllciBvZiB0aGUgYXhpcyAtIGl0J3MgZWl0aGVyIGF1dG9nZW5lcmF0ZWQgKCcwJyksIG9yIHBhc3NlZCB2aWEgYGlkYCBwcm9wIGFzIDxYQXhpcyBpZD0nZm9vJyAvPlxuICogQHJldHVybnMgYXhpcyBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHRocm93cyBFcnJvciBpZiBubyBheGlzIHdpdGggdGhpcyBJRCBleGlzdHNcbiAqL1xuZXhwb3J0IHZhciB1c2VYQXhpc09yVGhyb3cgPSBmdW5jdGlvbiB1c2VYQXhpc09yVGhyb3coeEF4aXNJZCkge1xuICB2YXIgeEF4aXNNYXAgPSB1c2VDb250ZXh0KFhBeGlzQ29udGV4dCk7XG4gICEoeEF4aXNNYXAgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsICdDb3VsZCBub3QgZmluZCBSZWNoYXJ0cyBjb250ZXh0OyBhcmUgeW91IHN1cmUgdGhpcyBpcyByZW5kZXJlZCBpbnNpZGUgYSBSZWNoYXJ0cyB3cmFwcGVyIGNvbXBvbmVudD8nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHZhciB4QXhpcyA9IHhBeGlzTWFwW3hBeGlzSWRdO1xuICAhKHhBeGlzICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gaW52YXJpYW50KGZhbHNlLCBcIkNvdWxkIG5vdCBmaW5kIHhBeGlzIGJ5IGlkIFxcXCJcIi5jb25jYXQoeEF4aXNJZCwgXCJcXFwiIFtcIikuY29uY2F0KF90eXBlb2YoeEF4aXNJZCksIFwiXS4gXCIpLmNvbmNhdChnZXRLZXlzRm9yRGVidWcoeEF4aXNNYXApKSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4geEF4aXM7XG59O1xuXG4vKipcbiAqIFRoaXMgd2lsbCBmaW5kIGFuIGFyYml0cmFyeSBmaXJzdCBYQXhpcy4gSWYgdGhlcmUncyBleGFjdGx5IG9uZSBpdCBhbHdheXMgcmV0dXJucyB0aGF0IG9uZVxuICogLSBidXQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHRoZW4gaXQgY2FuIHJldHVybiBhbnkgb2YgdGhvc2UuXG4gKlxuICogSWYgeW91IHdhbnQgc3BlY2lmaWMgWEF4aXMgb3V0IG9mIG11bHRpcGxlIHRoZW4gcHJlZmVyIHVzaW5nIHVzZVhBeGlzT3JUaHJvd1xuICpcbiAqIEByZXR1cm5zIFggYXhpc09wdGlvbnMsIG9yIHVuZGVmaW5lZCAtIGlmIHRoZXJlIGFyZSBubyBYIGF4ZXNcbiAqL1xuZXhwb3J0IHZhciB1c2VBcmJpdHJhcnlYQXhpcyA9IGZ1bmN0aW9uIHVzZUFyYml0cmFyeVhBeGlzKCkge1xuICB2YXIgeEF4aXNNYXAgPSB1c2VDb250ZXh0KFhBeGlzQ29udGV4dCk7XG4gIHJldHVybiBnZXRBbnlFbGVtZW50T2ZPYmplY3QoeEF4aXNNYXApO1xufTtcblxuLyoqXG4gKiBUaGlzIHdpbGwgZmluZCBhbiBhcmJpdHJhcnkgZmlyc3QgWUF4aXMuIElmIHRoZXJlJ3MgZXhhY3RseSBvbmUgaXQgYWx3YXlzIHJldHVybnMgdGhhdCBvbmVcbiAqIC0gYnV0IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0aGVuIGl0IGNhbiByZXR1cm4gYW55IG9mIHRob3NlLlxuICpcbiAqIElmIHlvdSB3YW50IHNwZWNpZmljIFlBeGlzIG91dCBvZiBtdWx0aXBsZSB0aGVuIHByZWZlciB1c2luZyB1c2VYQXhpc09yVGhyb3dcbiAqXG4gKiBAcmV0dXJucyBZIGF4aXNPcHRpb25zLCBvciB1bmRlZmluZWQgLSBpZiB0aGVyZSBhcmUgbm8gWSBheGVzXG4gKi9cbmV4cG9ydCB2YXIgdXNlQXJiaXRyYXJ5WUF4aXMgPSBmdW5jdGlvbiB1c2VBcmJpdHJhcnlZQXhpcygpIHtcbiAgdmFyIHlBeGlzTWFwID0gdXNlQ29udGV4dChZQXhpc0NvbnRleHQpO1xuICByZXR1cm4gZ2V0QW55RWxlbWVudE9mT2JqZWN0KHlBeGlzTWFwKTtcbn07XG5cbi8qKlxuICogVGhpcyBob29rcyB3aWxsOlxuICogMXN0IGF0dGVtcHQgdG8gZmluZCBhbiBZQXhpcyB0aGF0IGhhcyBhbGwgZWxlbWVudHMgaW4gaXRzIGRvbWFpbiBmaW5pdGVcbiAqIElmIG5vIHN1Y2ggYXhpcyBleGlzdHMsIGl0IHdpbGwgcmV0dXJuIGFuIGFyYml0cmFyeSBZQXhpc1xuICogaWYgdGhlcmUgYXJlIG5vIFkgYXhlcyB0aGVuIGl0IHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHJldHVybnMgRWl0aGVyIFkgYXhpc09wdGlvbnMsIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gWSBheGVzXG4gKi9cbmV4cG9ydCB2YXIgdXNlWUF4aXNXaXRoRmluaXRlRG9tYWluT3JSYW5kb20gPSBmdW5jdGlvbiB1c2VZQXhpc1dpdGhGaW5pdGVEb21haW5PclJhbmRvbSgpIHtcbiAgdmFyIHlBeGlzTWFwID0gdXNlQ29udGV4dChZQXhpc0NvbnRleHQpO1xuICB2YXIgeUF4aXNXaXRoRmluaXRlRG9tYWluID0gZmluZCh5QXhpc01hcCwgZnVuY3Rpb24gKGF4aXMpIHtcbiAgICByZXR1cm4gZXZlcnkoYXhpcy5kb21haW4sIE51bWJlci5pc0Zpbml0ZSk7XG4gIH0pO1xuICByZXR1cm4geUF4aXNXaXRoRmluaXRlRG9tYWluIHx8IGdldEFueUVsZW1lbnRPZk9iamVjdCh5QXhpc01hcCk7XG59O1xuXG4vKipcbiAqIFRoaXMgZWl0aGVyIGZpbmRzIGFuZCByZXR1cm5zIEF4aXMgYnkgdGhlIHNwZWNpZmllZCBJRCwgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBhbiBheGlzIHdpdGggdGhpcyBJRCBkb2VzIG5vdCBleGlzdC5cbiAqXG4gKiBAcGFyYW0geUF4aXNJZCBpZGVudGlmaWVyIG9mIHRoZSBheGlzIC0gaXQncyBlaXRoZXIgYXV0b2dlbmVyYXRlZCAoJzAnKSwgb3IgcGFzc2VkIHZpYSBgaWRgIHByb3AgYXMgPFlBeGlzIGlkPSdmb28nIC8+XG4gKiBAcmV0dXJucyBheGlzIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAdGhyb3dzIEVycm9yIGlmIG5vIGF4aXMgd2l0aCB0aGlzIElEIGV4aXN0c1xuICovXG5leHBvcnQgdmFyIHVzZVlBeGlzT3JUaHJvdyA9IGZ1bmN0aW9uIHVzZVlBeGlzT3JUaHJvdyh5QXhpc0lkKSB7XG4gIHZhciB5QXhpc01hcCA9IHVzZUNvbnRleHQoWUF4aXNDb250ZXh0KTtcbiAgISh5QXhpc01hcCAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGludmFyaWFudChmYWxzZSwgJ0NvdWxkIG5vdCBmaW5kIFJlY2hhcnRzIGNvbnRleHQ7IGFyZSB5b3Ugc3VyZSB0aGlzIGlzIHJlbmRlcmVkIGluc2lkZSBhIFJlY2hhcnRzIHdyYXBwZXIgY29tcG9uZW50PycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgdmFyIHlBeGlzID0geUF4aXNNYXBbeUF4aXNJZF07XG4gICEoeUF4aXMgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBpbnZhcmlhbnQoZmFsc2UsIFwiQ291bGQgbm90IGZpbmQgeUF4aXMgYnkgaWQgXFxcIlwiLmNvbmNhdCh5QXhpc0lkLCBcIlxcXCIgW1wiKS5jb25jYXQoX3R5cGVvZih5QXhpc0lkKSwgXCJdLiBcIikuY29uY2F0KGdldEtleXNGb3JEZWJ1Zyh5QXhpc01hcCkpKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHJldHVybiB5QXhpcztcbn07XG5leHBvcnQgdmFyIHVzZVZpZXdCb3ggPSBmdW5jdGlvbiB1c2VWaWV3Qm94KCkge1xuICB2YXIgdmlld0JveCA9IHVzZUNvbnRleHQoVmlld0JveENvbnRleHQpO1xuICByZXR1cm4gdmlld0JveDtcbn07XG5leHBvcnQgdmFyIHVzZU9mZnNldCA9IGZ1bmN0aW9uIHVzZU9mZnNldCgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoT2Zmc2V0Q29udGV4dCk7XG59O1xuZXhwb3J0IHZhciB1c2VDaGFydFdpZHRoID0gZnVuY3Rpb24gdXNlQ2hhcnRXaWR0aCgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoQ2hhcnRXaWR0aENvbnRleHQpO1xufTtcbmV4cG9ydCB2YXIgdXNlQ2hhcnRIZWlnaHQgPSBmdW5jdGlvbiB1c2VDaGFydEhlaWdodCgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoQ2hhcnRIZWlnaHRDb250ZXh0KTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9