UNPKG

adui

Version:

<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>

660 lines (547 loc) 80.2 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _dayPickerReact = _interopRequireWildcard(require("day-picker-react")); require("./style"); var _classNames = _interopRequireDefault(require("./classNames")); var _configProvider = require("../config-provider"); var _icon = _interopRequireDefault(require("../icon")); var _input = _interopRequireDefault(require("../input")); var _popover = _interopRequireDefault(require("../popover")); var _Caption = _interopRequireDefault(require("./Caption")); var _Navbar = _interopRequireDefault(require("./Navbar")); var _Shortcuts = _interopRequireDefault(require("./Shortcuts")); var _core = require("./core"); var _excluded = ["allowClear", "className", "closeOnSelect", "defaultValue", "defaultVisible", "disabled", "disabledDays", "dropdownRender", "hour", "intent", "maxDate", "minDate", "onChange", "onClick", "onEndDaySelect", "onStartDaySelect", "onVisibleChange", "placeholder", "placement", "popoverProps", "renderDay", "shortcuts", "size", "theme", "triggerElement", "value", "visible"]; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _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 _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 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(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 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 = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } var DayPicker = _dayPickerReact["default"].__esModule ? _dayPickerReact["default"]["default"] : _dayPickerReact["default"]; var prefix = "adui-date"; var noop = function noop() {}; var RangePicker = (0, _react.forwardRef)(function (_ref, ref) { var _modifiers; var allowClear = _ref.allowClear, className = _ref.className, closeOnSelect = _ref.closeOnSelect, defaultValue = _ref.defaultValue, defaultVisible = _ref.defaultVisible, disabled = _ref.disabled, disabledDays = _ref.disabledDays, dropdownRender = _ref.dropdownRender, _ref$hour = _ref.hour, hour = _ref$hour === void 0 ? 12 : _ref$hour, intent = _ref.intent, maxDate = _ref.maxDate, minDate = _ref.minDate, onChange = _ref.onChange, _onClick = _ref.onClick, onEndDaySelect = _ref.onEndDaySelect, onStartDaySelect = _ref.onStartDaySelect, onVisibleChange = _ref.onVisibleChange, placeholder = _ref.placeholder, placement = _ref.placement, popoverProps = _ref.popoverProps, _renderDay = _ref.renderDay, shortcuts = _ref.shortcuts, sizeProp = _ref.size, theme = _ref.theme, triggerElement = _ref.triggerElement, valueProp = _ref.value, visibleProp = _ref.visible, otherProps = _objectWithoutProperties(_ref, _excluded); var getInitialState = function getInitialState() { var rangeValue = ""; var from; var to; if (valueProp !== null && valueProp !== undefined) { ; var _valueProp = _slicedToArray(valueProp, 2); from = _valueProp[0]; to = _valueProp[1]; rangeValue = (0, _core.convertDateRangeToString)(valueProp); } else if (defaultValue !== null && defaultValue !== undefined) { ; var _defaultValue = _slicedToArray(defaultValue, 2); from = _defaultValue[0]; to = _defaultValue[1]; rangeValue = (0, _core.convertDateRangeToString)(defaultValue); } return { from: from, month: from, rangeValue: rangeValue, to: to }; }; var initialState = (0, _react.useMemo)(getInitialState, []); var _useState = (0, _react.useState)(null), _useState2 = _slicedToArray(_useState, 2), enteredTo = _useState2[0], setEnteredTo = _useState2[1]; var _useState3 = (0, _react.useState)(initialState.from), _useState4 = _slicedToArray(_useState3, 2), from = _useState4[0], setFrom = _useState4[1]; var _useState5 = (0, _react.useState)(initialState.to), _useState6 = _slicedToArray(_useState5, 2), to = _useState6[0], setTo = _useState6[1]; var _useState7 = (0, _react.useState)(initialState.month), _useState8 = _slicedToArray(_useState7, 2), month = _useState8[0], setMonth = _useState8[1]; var _useState9 = (0, _react.useState)(valueProp), _useState10 = _slicedToArray(_useState9, 2), prevValueProp = _useState10[0], setPrevValueProp = _useState10[1]; var _useState11 = (0, _react.useState)(initialState.rangeValue), _useState12 = _slicedToArray(_useState11, 2), rangeValue = _useState12[0], setRangeValue = _useState12[1]; var _useState13 = (0, _react.useState)(function () { if (visibleProp !== null && visibleProp !== undefined) { return visibleProp; } if (defaultVisible !== null && defaultVisible !== undefined) { return defaultVisible; } return false; }), _useState14 = _slicedToArray(_useState13, 2), visible = _useState14[0], setVisible = _useState14[1]; var _useState15 = (0, _react.useState)("out"), _useState16 = _slicedToArray(_useState15, 2), clearIconState = _useState16[0], setClearIconState = _useState16[1]; var nextClickInsideRef = (0, _react.useRef)(false); if (valueProp !== null && valueProp !== undefined && valueProp !== prevValueProp) { setFrom(valueProp[0]); setTo(valueProp[1]); setRangeValue((0, _core.convertDateRangeToString)(valueProp)); setPrevValueProp(valueProp); } if (visibleProp !== null && visible !== !!visibleProp) { setVisible(!!visibleProp); } var inputRef = (0, _react.useRef)(null); var dayPickerRef = (0, _react.useRef)(null); var _useContext = (0, _react.useContext)(_configProvider.ConfigContext), sizeContext = _useContext.size; var size = (0, _configProvider.getComputedSize)(sizeProp, sizeContext); var classSet = (0, _classnames["default"])(className, "".concat(prefix, "-rangeBase"), "".concat(prefix, "-").concat(size)); var fromFinal; var enteredToFinal = to || enteredTo; var isReverse = from && enteredToFinal && _dayPickerReact.DateUtils.isDayAfter(from, enteredToFinal); if (isReverse) { fromFinal = enteredToFinal; enteredToFinal = from; } else { fromFinal = from; } var selectedDays = [fromFinal, { from: fromFinal, to: enteredToFinal }]; var modifiers = (_modifiers = {}, _defineProperty(_modifiers, "".concat(prefix, "-rangeStart"), isReverse ? to && fromFinal : fromFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeStartHover"), isReverse && !to && fromFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeEnd"), isReverse ? enteredToFinal : to && enteredToFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeEndHover"), !isReverse && !to && enteredToFinal), _defineProperty(_modifiers, "".concat(prefix, "-selectedRange"), function selectedRange(day) { return (0, _core.isDayInRange)(day, [fromFinal, enteredToFinal], true); }), _modifiers); var shortcutsEnabled = shortcuts && shortcuts.length > 0; var range = [fromFinal, enteredToFinal]; var isDayDisabled = function isDayDisabled(day) { return disabledDays ? disabledDays(day) || _dayPickerReact.DateUtils.isDayBefore(day, minDate) || _dayPickerReact.DateUtils.isDayAfter(day, maxDate) : null; }; var handleVisibleChange = function handleVisibleChange(bool) { if (disabled) { return; } setTimeout(function () { if (nextClickInsideRef.current === true) { nextClickInsideRef.current = false; if (!bool) { return; } } var newVal = (0, _core.convertDateRangeToString)([from, to]); if (!bool) { if (!to) { if (newVal) { var rangeReset = rangeValue.split(" - "); setTimeout(function () { setFrom(new Date(rangeReset[0])); setTo(new Date(rangeReset[1])); }, 250); } } else if (rangeValue !== newVal) { setRangeValue(newVal); } } if (onVisibleChange) { onVisibleChange(bool); } if (visibleProp === null) { setVisible(bool); } }, 0); }; var isSelectingFirstDay = function isSelectingFirstDay(fromArg, toArg) { var isRangeSelected = fromArg && toArg; return !fromArg || isRangeSelected; }; var handleDayClick = function handleDayClick(day) { day.setHours(hour, 0, 0, 0); if (_dayPickerReact.DateUtils.isDayBefore(day, minDate) || _dayPickerReact.DateUtils.isDayAfter(day, maxDate)) { return; } if (isSelectingFirstDay(from, to)) { if (onStartDaySelect) { onStartDaySelect(day); } setEnteredTo(null); setFrom(day); setTo(null); } else { if (onEndDaySelect) { onEndDaySelect(day); } var newRange; var fromStr = (0, _core.convertDateToString)(from); var toStr = (0, _core.convertDateToString)(day); var newRangeValue = ""; if (_dayPickerReact.DateUtils.isDayAfter(day, from)) { newRange = [from, day]; newRangeValue = "".concat(fromStr, " - ").concat(toStr); } else { newRange = [day, from]; newRangeValue = "".concat(toStr, " - ").concat(fromStr); } if (valueProp === null) { setEnteredTo(day); setRangeValue(newRangeValue); setTo(day); } if (onChange) { onChange(newRange); } if (closeOnSelect) { setTimeout(function () { if (onVisibleChange) { onVisibleChange(false); } if (visibleProp === null) { setVisible(false); } }, 100); } } }; var handleDayMouseEnter = function handleDayMouseEnter(day) { if (!isSelectingFirstDay(from, to)) { setEnteredTo(day); } }; var handleDayMouseLeave = function handleDayMouseLeave() { setEnteredTo(null); }; var handleInputChange = function handleInputChange(_ref2) { var target = _ref2.target; var val = target.value; setRangeValue(val); if (val.trim() === "") { if (valueProp === null) { setEnteredTo(null); setFrom(null); setTo(null); } if (onChange) { onChange([undefined, undefined]); } } else if ((0, _core.isLegalDateRangeString)(val)) { var rangeValueStrs = val.split(" - "); var newFrom = new Date(rangeValueStrs[0]); var newTo = new Date(rangeValueStrs[1]); newFrom.setHours(hour, 0, 0, 0); newTo.setHours(hour, 0, 0, 0); if (!isDayDisabled(newFrom) && !isDayDisabled(newTo) && !_dayPickerReact.DateUtils.isDayBefore(newTo, newFrom) && !(_dayPickerReact.DateUtils.isSameDay(from, newFrom) && _dayPickerReact.DateUtils.isSameDay(to, newTo))) { if (valueProp === null) { setFrom(newFrom); setTo(newTo); } if (!_dayPickerReact.DateUtils.isSameDay(from, newFrom)) { setMonth(newFrom); } else if (!_dayPickerReact.DateUtils.isSameDay(to, newTo)) { setMonth(newTo); } if (onChange) { onChange([newFrom, newTo]); } } } }; var handleInputFocus = function handleInputFocus() { if (!visible) { if (onVisibleChange) { onVisibleChange(true); } if (visibleProp === null) { setVisible(true); } var _ref3 = inputRef.current || {}, _inputElement = _ref3.input; setTimeout(function () { var selectionStart = _inputElement.selectionStart; if (selectionStart < 12) { setMonth(from); } else if (to) { setMonth(new Date(to.getFullYear(), to.getMonth() - 1)); } }, 0); } }; var handleInputKeyDown = function handleInputKeyDown(_ref4) { var key = _ref4.key; var keys = ["Tab", "Escape", "Enter"]; if (keys.includes(key)) { var _inputRef$current; handleVisibleChange(false); (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.input.blur(); } }; var handleMonthChange = function handleMonthChange(date, e) { if (e) { var target = e.currentTarget; var targetRect = target && target.getBoundingClientRect(); var dayPickerRect = dayPickerRef.current.dayPicker.getBoundingClientRect(); if (target.name === "month" && (targetRect.left - dayPickerRect.left) * 2 > dayPickerRect.width) { date.setMonth(date.getMonth() - 1); } } var newMonth = date; if (_dayPickerReact.DateUtils.isDayAfter(date, maxDate)) { if (maxDate) { newMonth = maxDate; } } else if (_dayPickerReact.DateUtils.isDayBefore(date, minDate)) { if (minDate) { newMonth = minDate; } } setMonth(newMonth); }; (0, _react.useImperativeHandle)(ref, function () { return { input: inputRef.current, handleDayClick: handleDayClick, handleVisibleChange: handleVisibleChange }; }); var popupElement = _react["default"].createElement(_react["default"].Fragment, null, shortcutsEnabled && _react["default"].createElement(_Shortcuts["default"], { onShortcutClick: function onShortcutClick(valueShortcut) { if (Array.isArray(valueShortcut)) { var fromShortcut = valueShortcut[0]; var toShortcut = valueShortcut[1]; setFrom(fromShortcut); setMonth(fromShortcut); setTo(toShortcut); setRangeValue((0, _core.convertDateRangeToString)(valueShortcut)); if (onChange) { onChange(valueShortcut); } if (closeOnSelect) { setTimeout(function () { setVisible(false); }, 100); } } }, selectedDays: range, shortcuts: shortcuts }), _react["default"].createElement(DayPicker, { ref: dayPickerRef, numberOfMonths: 2, disabledDays: isDayDisabled, fromMonth: minDate, toMonth: maxDate, canChangeMonth: true, classNames: _classNames["default"], month: month, months: _core.MONTHS, weekdaysLong: _core.WEEKDAYS_LONG, weekdaysShort: _core.WEEKDAYS_SHORT, selectedDays: selectedDays, navbarElement: _react["default"].createElement(_Navbar["default"], _extends({ maxDate: maxDate, minDate: minDate, onManuallyChangeMonth: function onManuallyChangeMonth() { setMonth(minDate); } }, _dayPickerReact.NavbarElementProps)), captionElement: _react["default"].createElement(_Caption["default"], _extends({ maxDate: maxDate, minDate: minDate, onDateChange: handleMonthChange }, _dayPickerReact.CaptionElementProps)), onDayMouseEnter: handleDayMouseEnter, onDayMouseLeave: handleDayMouseLeave, onDayClick: handleDayClick, renderDay: function renderDay(day) { return _react["default"].createElement("div", { className: "".concat(prefix, "-cell") }, _renderDay && _renderDay(day) ? _renderDay(day) : day.getDate()); }, modifiers: modifiers })); var inputElement = _react["default"].createElement(_input["default"], _extends({ className: classSet, disabled: disabled, intent: intent, onChange: handleInputChange, onFocus: handleInputFocus, onKeyDown: handleInputKeyDown, onClick: function onClick() { if (_onClick) { _onClick(); } nextClickInsideRef.current = true; }, placeholder: placeholder, ref: inputRef, rightElement: allowClear ? _react["default"].createElement(_icon["default"], { icon: clearIconState === "in" ? "cancel-circle" : "calendar-outlined", onMouseEnter: function onMouseEnter() { if (rangeValue) { setClearIconState("in"); } }, onMouseLeave: function onMouseLeave() { setClearIconState("out"); }, onClick: function onClick(e) { if (rangeValue) { e.stopPropagation(); if (valueProp === null) { setEnteredTo(null); setFrom(null); setTo(null); setRangeValue(""); } if (onChange) { onChange([undefined, undefined]); } if (visible) { if (onVisibleChange) { onVisibleChange(false); } if (visibleProp === null) { setVisible(false); } } setTimeout(function () { nextClickInsideRef.current = false; }); } } }) : _react["default"].createElement(_icon["default"], { icon: "calendar-outlined", onClick: function onClick() { setTimeout(function () { nextClickInsideRef.current = false; }); } }), size: size, theme: theme, value: rangeValue }, otherProps)); return _react["default"].createElement(_popover["default"], _extends({ arrowed: false, onVisibleChange: handleVisibleChange, placement: placement, popup: _react["default"].createElement("div", { className: "".concat(prefix, "-popup") }, dropdownRender && dropdownRender(popupElement) ? dropdownRender(popupElement) : popupElement), popupStyle: { width: shortcutsEnabled ? "576px" : "476px", maxWidth: shortcutsEnabled ? "576px" : "476px" }, trigger: "click", visible: visible }, popoverProps), triggerElement || inputElement); }); RangePicker.propTypes = { allowClear: _propTypes["default"].bool, className: _propTypes["default"].string, closeOnSelect: _propTypes["default"].bool, defaultValue: _propTypes["default"].any, defaultVisible: _propTypes["default"].bool, disabled: _propTypes["default"].bool, disabledDays: _propTypes["default"].func, dropdownRender: _propTypes["default"].any, hour: _propTypes["default"].number, intent: _propTypes["default"].oneOf(["normal", "primary", "success", "warning", "danger"]), maxDate: _propTypes["default"].instanceOf(Date), minDate: _propTypes["default"].instanceOf(Date), onChange: _propTypes["default"].func, onEndDaySelect: _propTypes["default"].func, onStartDaySelect: _propTypes["default"].func, onVisibleChange: _propTypes["default"].func, placeholder: _propTypes["default"].string, placement: _propTypes["default"].oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]), popoverProps: _propTypes["default"].object, renderDay: _propTypes["default"].any, shortcuts: _propTypes["default"].any, size: _propTypes["default"].oneOf(["mini", "small", "medium", "large"]), theme: _propTypes["default"].oneOf([null, "light"]), triggerElement: _propTypes["default"].any, value: _propTypes["default"].any, visible: _propTypes["default"].bool }; RangePicker.defaultProps = { allowClear: false, className: "", closeOnSelect: false, defaultValue: null, defaultVisible: null, disabled: false, disabledDays: noop, dropdownRender: undefined, hour: 12, intent: "normal", maxDate: (0, _core.getDefaultMaxDate)(), minDate: (0, _core.getDefaultMinDate)(), onChange: noop, onEndDaySelect: noop, onStartDaySelect: noop, onVisibleChange: noop, placeholder: "选择日期范围", placement: "bottomLeft", popoverProps: {}, renderDay: undefined, shortcuts: undefined, size: "small", theme: null, triggerElement: undefined, value: null, visible: null }; RangePicker.displayName = "RangePicker"; var _default = RangePicker; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEYXlQaWNrZXIiLCJEUFIiLCJfX2VzTW9kdWxlIiwicHJlZml4Iiwibm9vcCIsIlJhbmdlUGlja2VyIiwiZm9yd2FyZFJlZiIsInJlZiIsImFsbG93Q2xlYXIiLCJjbGFzc05hbWUiLCJjbG9zZU9uU2VsZWN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdFZpc2libGUiLCJkaXNhYmxlZCIsImRpc2FibGVkRGF5cyIsImRyb3Bkb3duUmVuZGVyIiwiaG91ciIsImludGVudCIsIm1heERhdGUiLCJtaW5EYXRlIiwib25DaGFuZ2UiLCJvbkNsaWNrIiwib25FbmREYXlTZWxlY3QiLCJvblN0YXJ0RGF5U2VsZWN0Iiwib25WaXNpYmxlQ2hhbmdlIiwicGxhY2Vob2xkZXIiLCJwbGFjZW1lbnQiLCJwb3BvdmVyUHJvcHMiLCJyZW5kZXJEYXkiLCJzaG9ydGN1dHMiLCJzaXplUHJvcCIsInNpemUiLCJ0aGVtZSIsInRyaWdnZXJFbGVtZW50IiwidmFsdWVQcm9wIiwidmFsdWUiLCJ2aXNpYmxlUHJvcCIsInZpc2libGUiLCJvdGhlclByb3BzIiwiZ2V0SW5pdGlhbFN0YXRlIiwicmFuZ2VWYWx1ZSIsImZyb20iLCJ0byIsInVuZGVmaW5lZCIsImNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyIsIm1vbnRoIiwiaW5pdGlhbFN0YXRlIiwidXNlTWVtbyIsInVzZVN0YXRlIiwiZW50ZXJlZFRvIiwic2V0RW50ZXJlZFRvIiwic2V0RnJvbSIsInNldFRvIiwic2V0TW9udGgiLCJwcmV2VmFsdWVQcm9wIiwic2V0UHJldlZhbHVlUHJvcCIsInNldFJhbmdlVmFsdWUiLCJzZXRWaXNpYmxlIiwiY2xlYXJJY29uU3RhdGUiLCJzZXRDbGVhckljb25TdGF0ZSIsIm5leHRDbGlja0luc2lkZVJlZiIsInVzZVJlZiIsImlucHV0UmVmIiwiZGF5UGlja2VyUmVmIiwidXNlQ29udGV4dCIsIkNvbmZpZ0NvbnRleHQiLCJzaXplQ29udGV4dCIsImdldENvbXB1dGVkU2l6ZSIsImNsYXNzU2V0IiwiY2xhc3NOYW1lcyIsImZyb21GaW5hbCIsImVudGVyZWRUb0ZpbmFsIiwiaXNSZXZlcnNlIiwiRGF0ZVV0aWxzIiwiaXNEYXlBZnRlciIsInNlbGVjdGVkRGF5cyIsIm1vZGlmaWVycyIsImRheSIsImlzRGF5SW5SYW5nZSIsInNob3J0Y3V0c0VuYWJsZWQiLCJsZW5ndGgiLCJyYW5nZSIsImlzRGF5RGlzYWJsZWQiLCJpc0RheUJlZm9yZSIsImhhbmRsZVZpc2libGVDaGFuZ2UiLCJib29sIiwic2V0VGltZW91dCIsImN1cnJlbnQiLCJuZXdWYWwiLCJyYW5nZVJlc2V0Iiwic3BsaXQiLCJEYXRlIiwiaXNTZWxlY3RpbmdGaXJzdERheSIsImZyb21BcmciLCJ0b0FyZyIsImlzUmFuZ2VTZWxlY3RlZCIsImhhbmRsZURheUNsaWNrIiwic2V0SG91cnMiLCJuZXdSYW5nZSIsImZyb21TdHIiLCJjb252ZXJ0RGF0ZVRvU3RyaW5nIiwidG9TdHIiLCJuZXdSYW5nZVZhbHVlIiwiaGFuZGxlRGF5TW91c2VFbnRlciIsImhhbmRsZURheU1vdXNlTGVhdmUiLCJoYW5kbGVJbnB1dENoYW5nZSIsInRhcmdldCIsInZhbCIsInRyaW0iLCJpc0xlZ2FsRGF0ZVJhbmdlU3RyaW5nIiwicmFuZ2VWYWx1ZVN0cnMiLCJuZXdGcm9tIiwibmV3VG8iLCJpc1NhbWVEYXkiLCJoYW5kbGVJbnB1dEZvY3VzIiwiaW5wdXRFbGVtZW50IiwiaW5wdXQiLCJzZWxlY3Rpb25TdGFydCIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJoYW5kbGVJbnB1dEtleURvd24iLCJrZXkiLCJrZXlzIiwiaW5jbHVkZXMiLCJibHVyIiwiaGFuZGxlTW9udGhDaGFuZ2UiLCJkYXRlIiwiZSIsImN1cnJlbnRUYXJnZXQiLCJ0YXJnZXRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZGF5UGlja2VyUmVjdCIsImRheVBpY2tlciIsIm5hbWUiLCJsZWZ0Iiwid2lkdGgiLCJuZXdNb250aCIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJwb3B1cEVsZW1lbnQiLCJ2YWx1ZVNob3J0Y3V0IiwiQXJyYXkiLCJpc0FycmF5IiwiZnJvbVNob3J0Y3V0IiwidG9TaG9ydGN1dCIsInN0eWxlcyIsIk1PTlRIUyIsIldFRUtEQVlTX0xPTkciLCJXRUVLREFZU19TSE9SVCIsIk5hdmJhckVsZW1lbnRQcm9wcyIsIkNhcHRpb25FbGVtZW50UHJvcHMiLCJnZXREYXRlIiwic3RvcFByb3BhZ2F0aW9uIiwibWF4V2lkdGgiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJhbnkiLCJmdW5jIiwibnVtYmVyIiwib25lT2YiLCJpbnN0YW5jZU9mIiwib2JqZWN0IiwiZGVmYXVsdFByb3BzIiwiZ2V0RGVmYXVsdE1heERhdGUiLCJnZXREZWZhdWx0TWluRGF0ZSIsImRpc3BsYXlOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9kYXRlLXBpY2tlci9SYW5nZVBpY2tlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWR1cGxpY2F0ZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgUmVhY3QsIHtcbiAgZm9yd2FyZFJlZixcbiAgdXNlQ29udGV4dCxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IERQUiBmcm9tIFwiZGF5LXBpY2tlci1yZWFjdFwiXG5pbXBvcnQge1xuICBDYXB0aW9uRWxlbWVudFByb3BzLFxuICBEYXRlVXRpbHMsXG4gIE5hdmJhckVsZW1lbnRQcm9wcyxcbn0gZnJvbSBcImRheS1waWNrZXItcmVhY3RcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL2NsYXNzTmFtZXNcIlxuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCwgZ2V0Q29tcHV0ZWRTaXplIH0gZnJvbSBcIi4uL2NvbmZpZy1wcm92aWRlclwiXG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4uL2lucHV0XCJcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCIuLi9wb3AtdHJpZ2dlclwiXG5pbXBvcnQgUG9wb3ZlciwgeyBJUG9wb3ZlclByb3BzIH0gZnJvbSBcIi4uL3BvcG92ZXJcIlxuaW1wb3J0IENhcHRpb24gZnJvbSBcIi4vQ2FwdGlvblwiXG5pbXBvcnQgTmF2YmFyIGZyb20gXCIuL05hdmJhclwiXG5pbXBvcnQgU2hvcnRjdXRzIGZyb20gXCIuL1Nob3J0Y3V0c1wiXG5pbXBvcnQge1xuICBNT05USFMsXG4gIFdFRUtEQVlTX0xPTkcsXG4gIFdFRUtEQVlTX1NIT1JULFxuICBnZXREZWZhdWx0TWF4RGF0ZSxcbiAgZ2V0RGVmYXVsdE1pbkRhdGUsXG4gIGlzTGVnYWxEYXRlUmFuZ2VTdHJpbmcsXG4gIGNvbnZlcnREYXRlVG9TdHJpbmcsXG4gIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyxcbiAgaXNEYXlJblJhbmdlLFxufSBmcm9tIFwiLi9jb3JlXCJcblxuY29uc3QgRGF5UGlja2VyID0gRFBSLl9fZXNNb2R1bGUgPyBEUFIuZGVmYXVsdCA6IERQUlxuY29uc3QgcHJlZml4ID0gXCJhZHVpLWRhdGVcIlxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhbmdlUGlja2VyUHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgea4hemZpFxuICAgKi9cbiAgYWxsb3dDbGVhcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKblnKjpgInmi6nlkI7vvIzmtojlpLEgUG9wb3ZlclxuICAgKi9cbiAgY2xvc2VPblNlbGVjdD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8mum7mOiupOaXpeacn+iMg+WbtFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF0gfCBudWxsXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvJrpu5jorqTmmK/lkKbmmL7npLrkuIvmi4lcbiAgICovXG4gIGRlZmF1bHRWaXNpYmxlPzogYm9vbGVhbiB8IG51bGxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDnpoHmraLpgInmi6nnmoTlpKnvvIxkYXkgPT4gYm9vbO+8m+avj+S4gOWkqeaYr+eahOaXtumXtOS4uiAxMjowMDowMO+8jOi/meS4gOS4quaYr+eUsSBkYXktcGlja2VyLXJlYWN0IOWGs+WumueahO+8m1xuICAgKiDmr5TovoPml6XmnJ/nmoTml7blgJnlsI/lv4Pov5nkuIDngrnjgIJcbiAgICovXG4gIGRpc2FibGVkRGF5cz86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuIHwgdm9pZFxuICAvKipcbiAgICog6Ieq5a6a5LmJ5LiL5ouJ5qGG5YaF5a65XG4gICAqL1xuICBkcm9wZG93blJlbmRlcj86IChlbGVtZW50OiBKU1guRWxlbWVudCkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiAyMDIyMDQwNzog6buY6K6k55qE5pel5pyf5pe26Ze05Li6IDEyIOeCue+8jOWPr+S7peS9v+eUqOatpCBQcm9wIOS/ruaUueWwj+aXtlxuICAgKi9cbiAgaG91cj86IG51bWJlclxuICAvKipcbiAgICog6K6+572u6L6T5YWl5qGG57G75Z6LXG4gICAqL1xuICBpbnRlbnQ/OiBcIm5vcm1hbFwiIHwgXCJwcmltYXJ5XCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJkYW5nZXJcIlxuICAvKipcbiAgICog5pyA5aSn6ZmQ5Yi25pel5pyfXG4gICAqL1xuICBtYXhEYXRlPzogRGF0ZVxuICAvKipcbiAgICog5pyA5bCP6ZmQ5Yi25pel5pyfXG4gICAqL1xuICBtaW5EYXRlPzogRGF0ZVxuICAvKipcbiAgICog5pel5pyf5pS55Y+Y5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlPzogKGRhdGU6IFtEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgRGF0ZSB8IG51bGwgfCB1bmRlZmluZWRdKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDnrKzkuozmrKHngrnlh7vkuobml6XmnJ/ml7bnmoQgaGFuZGxlcu+8jOWNs+e7k+adn+mAieaLqVxuICAgKi9cbiAgb25FbmREYXlTZWxlY3Q/OiAoZGF0ZTogRGF0ZSkgPT4gdm9pZFxuICAvKipcbiAgICog56ys5LiA5qyh54K55Ye75LqG5pel5pyf5pe255qEIGhhbmRsZXLvvIzljbPlvIDlp4vpgInmi6nvvIjlj6/ku6XlnKjmraTml7borr7nva4gbWF4RGF0ZSBtaW5EYXRl77yM5a6e546w5o6n5Yi25pel5pyf6YCJ5oup6IyD5Zu055qE5Yqf6IO977yJXG4gICAqL1xuICBvblN0YXJ0RGF5U2VsZWN0PzogKGRhdGU6IERhdGUpID0+IHZvaWRcbiAgLyoqXG4gICAqIOaYvuekuueKtuaAgeWPkeeUn+WPmOWMluaXtueahGhhbmRsZXJcbiAgICovXG4gIG9uVmlzaWJsZUNoYW5nZT86ICh2aXNpYmxlOiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDljaDkvY3lrZfnrKZcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIC8qKlxuICAgKiDlvLnlh7rlsYLkvY3nva5cbiAgICovXG4gIHBsYWNlbWVudD86IFBsYWNlbWVudFxuICAvKipcbiAgICog5Lyg5YWlIFBvcG92ZXIg55qEIHByb3BzXG4gICAqL1xuICBwb3BvdmVyUHJvcHM/OiBJUG9wb3ZlclByb3BzXG4gIC8qKlxuICAgKiDoh6rlrprkuYnlpoLkvZXmuLLmn5Pmr4/kuKrml6XmnJ9cbiAgICovXG4gIHJlbmRlckRheT86IChkYXk6IERhdGUpID0+IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5b+r5o236YCJ5oup6aG577yM5qC85byP77yaXG4gICAqIFt7XG4gICAqIGxhYmVsOiBcIuelluWbveavjeS6sueUn+aXpVwiLCB2YWx1ZTogW25ldyBEYXRlKFwiMjAyMi0xMC0wMVwiKSwgbmV3IERhdGUoXCIyMDIyLTEwLTA3XCIpXVxuICAgKiB9XVxuICAgKi9cbiAgc2hvcnRjdXRzPzoge1xuICAgIC8qKlxuICAgICAqIOivpemhueeahOaWh+Wtl1xuICAgICAqL1xuICAgIGxhYmVsOiBSZWFjdC5SZWFjdE5vZGVcbiAgICAvKipcbiAgICAgKiDor6XpobnnmoTml6XmnJ9cbiAgICAgKi9cbiAgICB2YWx1ZTogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF1cbiAgfVtdXG4gIC8qKlxuICAgKiDorr7nva7lsLrlr7hcbiAgICovXG4gIHNpemU/OiBcIm1pbmlcIiB8IFwic21hbGxcIiB8IFwibWVkaXVtXCIgfCBcImxhcmdlXCJcbiAgLyoqXG4gICAqIOiuvue9ruS4u+mimFxuICAgKi9cbiAgdGhlbWU/OiBudWxsIHwgXCJsaWdodFwiXG4gIC8qKlxuICAgKiDoh6rlrprkuYnop6blj5HkuIvmi4nnmoTlhYPntKBcbiAgICovXG4gIHRyaWdnZXJFbGVtZW50PzogSlNYLkVsZW1lbnRcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muW9k+WJjeaXpeacn+iMg+WbtFxuICAgKi9cbiAgdmFsdWU/OiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSB8IG51bGxcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muaYr+WQpuaYvuekuuS4i+aLiemAieaLqVxuICAgKi9cbiAgdmlzaWJsZT86IGJvb2xlYW4gfCBudWxsXG59XG5cbi8qKlxuICog5pel5pyf6YCJ5oup5Zmo55So5LqO5LqG6Kej5b2T5YmN5bey6YCJ5pel5pyf77yM6YCJ5oup5oiW6L6T5YWl6ZyA6KaB55qE5pel5pyf44CB5pel5pyf6IyD5Zu0562J44CCXG4gKi9cbmNvbnN0IFJhbmdlUGlja2VyOiBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PFxuICBJUmFuZ2VQaWNrZXJQcm9wcyAmIFJlYWN0LlJlZkF0dHJpYnV0ZXM8YW55PlxuPiA9IGZvcndhcmRSZWYoXG4gIChcbiAgICB7XG4gICAgICBhbGxvd0NsZWFyLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgY2xvc2VPblNlbGVjdCxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGRlZmF1bHRWaXNpYmxlLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZERheXMsXG4gICAgICBkcm9wZG93blJlbmRlcixcbiAgICAgIGhvdXIgPSAxMixcbiAgICAgIGludGVudCxcbiAgICAgIG1heERhdGUsXG4gICAgICBtaW5EYXRlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkNsaWNrLFxuICAgICAgb25FbmREYXlTZWxlY3QsXG4gICAgICBvblN0YXJ0RGF5U2VsZWN0LFxuICAgICAgb25WaXNpYmxlQ2hhbmdlLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBwb3BvdmVyUHJvcHMsXG4gICAgICByZW5kZXJEYXksXG4gICAgICBzaG9ydGN1dHMsXG4gICAgICBzaXplOiBzaXplUHJvcCxcbiAgICAgIHRoZW1lLFxuICAgICAgdHJpZ2dlckVsZW1lbnQsXG4gICAgICB2YWx1ZTogdmFsdWVQcm9wLFxuICAgICAgdmlzaWJsZTogdmlzaWJsZVByb3AsXG4gICAgICAuLi5vdGhlclByb3BzXG4gICAgfTogSVJhbmdlUGlja2VyUHJvcHMsXG4gICAgcmVmXG4gICkgPT4ge1xuICAgIC8qKlxuICAgICAqIHNlbGVjdGVkRGF5IOS4uuS8oOe7mSBEYXlQaWNrZXIg55qE5pyA57uIIERhdGUgT2JqZWN077yMXG4gICAgICogdmFsdWUg5Li6IGlucHV0IOeahOi+k+WFpSBTdHJpbmfjgIJcbiAgICAgKi9cbiAgICBjb25zdCBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiB7XG4gICAgICBsZXQgcmFuZ2VWYWx1ZSA9IFwiXCJcbiAgICAgIGxldCBmcm9tXG4gICAgICBsZXQgdG9cbiAgICAgIGlmICh2YWx1ZVByb3AgIT09IG51bGwgJiYgdmFsdWVQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgO1tmcm9tLCB0b10gPSB2YWx1ZVByb3BcbiAgICAgICAgcmFuZ2VWYWx1ZSA9IGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWx1ZVByb3ApXG4gICAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICA7W2Zyb20sIHRvXSA9IGRlZmF1bHRWYWx1ZVxuICAgICAgICByYW5nZVZhbHVlID0gY29udmVydERhdGVSYW5nZVRvU3RyaW5nKGRlZmF1bHRWYWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbSxcbiAgICAgICAgbW9udGg6IGZyb20sXG4gICAgICAgIHJhbmdlVmFsdWUsXG4gICAgICAgIHRvLFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHVzZU1lbW8oZ2V0SW5pdGlhbFN0YXRlLCBbXSlcblxuICAgIGNvbnN0IFtlbnRlcmVkVG8sIHNldEVudGVyZWRUb10gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4obnVsbClcbiAgICBjb25zdCBbZnJvbSwgc2V0RnJvbV0gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4oaW5pdGlhbFN0YXRlLmZyb20pXG4gICAgY29uc3QgW3RvLCBzZXRUb10gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4oaW5pdGlhbFN0YXRlLnRvKVxuICAgIGNvbnN0IFttb250aCwgc2V0TW9udGhdID0gdXNlU3RhdGU8RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+KFxuICAgICAgaW5pdGlhbFN0YXRlLm1vbnRoXG4gICAgKVxuICAgIGNvbnN0IFtwcmV2VmFsdWVQcm9wLCBzZXRQcmV2VmFsdWVQcm9wXSA9IHVzZVN0YXRlPFxuICAgICAgW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF0gfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgPih2YWx1ZVByb3ApXG4gICAgY29uc3QgW3JhbmdlVmFsdWUsIHNldFJhbmdlVmFsdWVdID0gdXNlU3RhdGU8c3RyaW5nPihcbiAgICAgIGluaXRpYWxTdGF0ZS5yYW5nZVZhbHVlXG4gICAgKVxuICAgIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgIGlmICh2aXNpYmxlUHJvcCAhPT0gbnVsbCAmJiB2aXNpYmxlUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2aXNpYmxlUHJvcFxuICAgICAgfVxuICAgICAgaWYgKGRlZmF1bHRWaXNpYmxlICE9PSBudWxsICYmIGRlZmF1bHRWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICAgIGNvbnN0IFtjbGVhckljb25TdGF0ZSwgc2V0Q2xlYXJJY29uU3RhdGVdID0gdXNlU3RhdGU8XCJpblwiIHwgXCJvdXRcIj4oXCJvdXRcIilcbiAgICBjb25zdCBuZXh0Q2xpY2tJbnNpZGVSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgICAvLyDnm7jlvZPkuo7nlJ/lkb3lkajmnJ8gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG4gICAgaWYgKFxuICAgICAgdmFsdWVQcm9wICE9PSBudWxsICYmXG4gICAgICB2YWx1ZVByb3AgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdmFsdWVQcm9wICE9PSBwcmV2VmFsdWVQcm9wXG4gICAgKSB7XG4gICAgICBzZXRGcm9tKHZhbHVlUHJvcFswXSlcbiAgICAgIHNldFRvKHZhbHVlUHJvcFsxXSlcbiAgICAgIHNldFJhbmdlVmFsdWUoY29udmVydERhdGVSYW5nZVRvU3RyaW5nKHZhbHVlUHJvcCkpXG4gICAgICBzZXRQcmV2VmFsdWVQcm9wKHZhbHVlUHJvcClcbiAgICB9XG4gICAgaWYgKHZpc2libGVQcm9wICE9PSBudWxsICYmIHZpc2libGUgIT09ICEhdmlzaWJsZVByb3ApIHtcbiAgICAgIHNldFZpc2libGUoISF2aXNpYmxlUHJvcClcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxhbnk+KG51bGwpXG4gICAgY29uc3QgZGF5UGlja2VyUmVmID0gdXNlUmVmPGFueT4obnVsbClcblxuICAgIGNvbnN0IHsgc2l6ZTogc2l6ZUNvbnRleHQgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dClcbiAgICBjb25zdCBzaXplID0gZ2V0Q29tcHV0ZWRTaXplKHNpemVQcm9wLCBzaXplQ29udGV4dClcblxuICAgIGNvbnN0IGNsYXNzU2V0ID0gY2xhc3NOYW1lcyhcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGAke3ByZWZpeH0tcmFuZ2VCYXNlYCxcbiAgICAgIGAke3ByZWZpeH0tJHtzaXplfWBcbiAgICApXG5cbiAgICBsZXQgZnJvbUZpbmFsOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgIGxldCBlbnRlcmVkVG9GaW5hbCA9IHRvIHx8IGVudGVyZWRUb1xuICAgIGNvbnN0IGlzUmV2ZXJzZSA9XG4gICAgICBmcm9tICYmIGVudGVyZWRUb0ZpbmFsICYmIERhdGVVdGlscy5pc0RheUFmdGVyKGZyb20sIGVudGVyZWRUb0ZpbmFsKVxuICAgIGlmIChpc1JldmVyc2UpIHtcbiAgICAgIGZyb21GaW5hbCA9IGVudGVyZWRUb0ZpbmFsXG4gICAgICBlbnRlcmVkVG9GaW5hbCA9IGZyb21cbiAgICB9IGVsc2Uge1xuICAgICAgZnJvbUZpbmFsID0gZnJvbVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRGF5cyA9IFtcbiAgICAgIGZyb21GaW5hbCxcbiAgICAgIHtcbiAgICAgICAgZnJvbTogZnJvbUZpbmFsLFxuICAgICAgICB0bzogZW50ZXJlZFRvRmluYWwsXG4gICAgICB9LFxuICAgIF1cbiAgICBjb25zdCBtb2RpZmllcnMgPSB7XG4gICAgICBbYCR7cHJlZml4fS1yYW5nZVN0YXJ0YF06IGlzUmV2ZXJzZSA/IHRvICYmIGZyb21GaW5hbCA6IGZyb21GaW5hbCxcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlU3RhcnRIb3ZlcmBdOiBpc1JldmVyc2UgJiYgIXRvICYmIGZyb21GaW5hbCxcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlRW5kYF06IGlzUmV2ZXJzZSA/IGVudGVyZWRUb0ZpbmFsIDogdG8gJiYgZW50ZXJlZFRvRmluYWwsXG4gICAgICBbYCR7cHJlZml4fS1yYW5nZUVuZEhvdmVyYF06ICFpc1JldmVyc2UgJiYgIXRvICYmIGVudGVyZWRUb0ZpbmFsLFxuICAgICAgW2Ake3ByZWZpeH0tc2VsZWN0ZWRSYW5nZWBdOiAoZGF5OiBEYXRlKSA9PlxuICAgICAgICBpc0RheUluUmFuZ2UoZGF5LCBbZnJvbUZpbmFsLCBlbnRlcmVkVG9GaW5hbF0sIHRydWUpLFxuICAgIH1cblxuICAgIGNvbnN0IHNob3J0Y3V0c0VuYWJsZWQgPSBzaG9ydGN1dHMgJiYgc2hvcnRjdXRzLmxlbmd0aCA+IDBcblxuICAgIGNvbnN0IHJhbmdlOiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSA9IFtcbiAgICAgIGZyb21GaW5hbCxcbiAgICAgIGVudGVyZWRUb0ZpbmFsLFxuICAgIF1cblxuICAgIGNvbnN0IGlzRGF5RGlzYWJsZWQgPSAoZGF5OiBEYXRlKSA9PiB7XG4gICAgICByZXR1cm4gZGlzYWJsZWREYXlzXG4gICAgICAgID8gZGlzYWJsZWREYXlzKGRheSkgfHxcbiAgICAgICAgICAgIERhdGVVdGlscy5pc0RheUJlZm9yZShkYXksIG1pbkRhdGUpIHx8XG4gICAgICAgICAgICBEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXksIG1heERhdGUpXG4gICAgICAgIDogbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZVZpc2libGVDaGFuZ2UgPSAoYm9vbDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChuZXh0Q2xpY2tJbnNpZGVSZWYuY3VycmVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIG5leHRDbGlja0luc2lkZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAvLyDlsZXlvIDml7bvvIzlpoLmnpzlnKjlhoXpg6jlhYPntKDngrnlh7vvvIzliJnkuI3lgZrpu5jorqTnmoTmlLbotbfmk43kvZxcbiAgICAgICAgICBpZiAoIWJvb2wpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdWYWwgPSBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcoW2Zyb20sIHRvXSlcbiAgICAgICAgaWYgKCFib29sKSB7XG4gICAgICAgICAgaWYgKCF0bykge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbCkge1xuICAgICAgICAgICAgICBjb25zdCByYW5nZVJlc2V0ID0gcmFuZ2VWYWx1ZS5zcGxpdChcIiAtIFwiKVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRGcm9tKG5ldyBEYXRlKHJhbmdlUmVzZXRbMF0pKVxuICAgICAgICAgICAgICAgIHNldFRvKG5ldyBEYXRlKHJhbmdlUmVzZXRbMV0pKVxuICAgICAgICAgICAgICB9LCAyNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyYW5nZVZhbHVlICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgIHNldFJhbmdlVmFsdWUobmV3VmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICAgICAgb25WaXNpYmxlQ2hhbmdlKGJvb2wpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0VmlzaWJsZShib29sKVxuICAgICAgICB9XG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2VsZWN0aW5nRmlyc3REYXkgPSAoXG4gICAgICBmcm9tQXJnPzogRGF0ZSB8IG51bGwsXG4gICAgICB0b0FyZz86IERhdGUgfCBudWxsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBpc1JhbmdlU2VsZWN0ZWQgPSBmcm9tQXJnICYmIHRvQXJnXG4gICAgICByZXR1cm4gIWZyb21BcmcgfHwgaXNSYW5nZVNlbGVjdGVkXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRGF5Q2xpY2sgPSAoZGF5OiBEYXRlKSA9PiB7XG4gICAgICBkYXkuc2V0SG91cnMoaG91ciwgMCwgMCwgMClcbiAgICAgIGlmIChcbiAgICAgICAgRGF0ZVV0aWxzLmlzRGF5QmVmb3JlKGRheSwgbWluRGF0ZSkgfHxcbiAgICAgICAgRGF0ZVV0aWxzLmlzRGF5QWZ0ZXIoZGF5LCBtYXhEYXRlKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGlzU2VsZWN0aW5nRmlyc3REYXkoZnJvbSwgdG8pKSB7XG4gICAgICAgIGlmIChvblN0YXJ0RGF5U2VsZWN0KSB7XG4gICAgICAgICAgb25TdGFydERheVNlbGVjdChkYXkpXG4gICAgICAgIH1cbiAgICAgICAgc2V0RW50ZXJlZFRvKG51bGwpXG4gICAgICAgIHNldEZyb20oZGF5KVxuICAgICAgICBzZXRUbyhudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9uRW5kRGF5U2VsZWN0KSB7XG4gICAgICAgICAgb25FbmREYXlTZWxlY3QoZGF5KVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdSYW5nZTogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF1cbiAgICAgICAgY29uc3QgZnJvbVN0ciA9IGNvbnZlcnREYXRlVG9TdHJpbmcoZnJvbSlcbiAgICAgICAgY29uc3QgdG9TdHIgPSBjb252ZXJ0RGF0ZVRvU3RyaW5nKGRheSlcbiAgICAgICAgbGV0IG5ld1JhbmdlVmFsdWUgPSBcIlwiXG4gICAgICAgIGlmIChEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXksIGZyb20pKSB7XG4gICAgICAgICAgbmV3UmFuZ2UgPSBbZnJvbSwgZGF5XVxuICAgICAgICAgIG5ld1JhbmdlVmFsdWUgPSBgJHtmcm9tU3RyfSAtICR7dG9TdHJ9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1JhbmdlID0gW2RheSwgZnJvbV1cbiAgICAgICAgICBuZXdSYW5nZVZhbHVlID0gYCR7dG9TdHJ9IC0gJHtmcm9tU3RyfWBcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0RW50ZXJlZFRvKGRheSlcbiAgICAgICAgICBzZXRSYW5nZVZhbHVlKG5ld1JhbmdlVmFsdWUpXG4gICAgICAgICAgc2V0VG8oZGF5KVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKG5ld1JhbmdlKVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbG9zZU9uU2VsZWN0KSB7XG4gICAgICAgICAgLy8g5bu26L+f5piv5Li65LqG6K6p54q25oCB55qE5Y+Y5YyW5Zyo6KeG6KeJ5LiK5YWI6KKr5o6l5Y+XXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aXNpYmxlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDEwMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZURheU1vdXNlRW50ZXIgPSAoZGF5OiBEYXRlKSA9PiB7XG4gICAgICBpZiAoIWlzU2VsZWN0aW5nRmlyc3REYXkoZnJvbSwgdG8pKSB7XG4gICAgICAgIHNldEVudGVyZWRUbyhkYXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRGF5TW91c2VMZWF2ZSA9ICgpID0+IHtcbiAgICAgIHNldEVudGVyZWRUbyhudWxsKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gKHtcbiAgICAgIHRhcmdldCxcbiAgICB9OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgeyB2YWx1ZTogdmFsIH0gPSB0YXJnZXRcbiAgICAgIHNldFJhbmdlVmFsdWUodmFsKVxuICAgICAgaWYgKHZhbC50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgICAgaWYgKHZhbHVlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNldEVudGVyZWRUbyhudWxsKVxuICAgICAgICAgIHNldEZyb20obnVsbClcbiAgICAgICAgICBzZXRUbyhudWxsKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKFt1bmRlZmluZWQsIHVuZGVmaW5lZF0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNMZWdhbERhdGVSYW5nZVN0cmluZyh2YWwpKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlVmFsdWVTdHJzID0gdmFsLnNwbGl0KFwiIC0gXCIpXG4gICAgICAgIGNvbnN0IG5ld0Zyb20gPSBuZXcgRGF0ZShyYW5nZVZhbHVlU3Ryc1swXSlcbiAgICAgICAgY29uc3QgbmV3VG8gPSBuZXcgRGF0ZShyYW5nZVZhbHVlU3Ryc1sxXSlcbiAgICAgICAgbmV3RnJvbS5zZXRIb3Vycyhob3VyLCAwLCAwLCAwKVxuICAgICAgICBuZXdUby5zZXRIb3Vycyhob3VyLCAwLCAwLCAwKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgIWlzRGF5RGlzYWJsZWQobmV3RnJvbSkgJiZcbiAgICAgICAgICAhaXNEYXlEaXNhYmxlZChuZXdUbykgJiZcbiAgICAgICAgICAhRGF0ZVV0aWxzLmlzRGF5QmVmb3JlKG5ld1RvLCBuZXdGcm9tKSAmJlxuICAgICAgICAgICEoXG4gICAgICAgICAgICBEYXRlVXRpbHMuaXNTYW1lRGF5KGZyb20sIG5ld0Zyb20pICYmIERhdGVVdGlscy5pc1NhbWVEYXkodG8sIG5ld1RvKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHZhbHVlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0RnJvbShuZXdGcm9tKVxuICAgICAgICAgICAgc2V0VG8obmV3VG8pXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOS/ruaUueaXpeacn+WQjueahCBtb250aCDot7PovaxcbiAgICAgICAgICBpZiAoIURhdGVVdGlscy5pc1NhbWVEYXkoZnJvbSwgbmV3RnJvbSkpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG5ld0Zyb20pXG4gICAgICAgICAgfSBlbHNlIGlmICghRGF0ZVV0aWxzLmlzU2FtZURheSh0bywgbmV3VG8pKSB7XG4gICAgICAgICAgICBzZXRNb250aChuZXdUbylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgICBvbkNoYW5nZShbbmV3RnJvbSwgbmV3VG9dKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0Rm9jdXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgICAgaWYgKG9uVmlzaWJsZUNoYW5nZSkge1xuICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZSh0cnVlKVxuICAgICAgICB9XG4gICAgICAgIGlmICh2aXNpYmxlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNldFZpc2libGUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGlucHV0OiBpbnB1dEVsZW1lbnQgfSA9IGlucHV0UmVmLmN1cnJlbnQgfHwge31cbiAgICAgICAgLy8gZ2V0IGlucHV0IGN1cnNvciBwb3NpdGlvbiB3aGVuIGZvY3VzZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCB9ID0gaW5wdXRFbGVtZW50XG4gICAgICAgICAgLy8g5bCP5LqOIDEyIOS7o+ihqCBmb2N1cyDliLDnmoTmmK8gZnJvbSBkYXRlXG4gICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0IDwgMTIpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKGZyb20pXG4gICAgICAgICAgfSBlbHNlIGlmICh0bykge1xuICAgICAgICAgICAgc2V0TW9udGgobmV3IERhdGUodG8uZ2V0RnVsbFllYXIoKSwgdG8uZ2V0TW9udGgoKSAtIDEpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVJbnB1dEtleURvd24gPSAoe1xuICAgICAga2V5LFxuICAgIH06IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGtleXMgPSBbXCJUYWJcIiwgXCJFc2NhcGVcIiwgXCJFbnRlclwiXVxuICAgICAgaWYgKGtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBoYW5kbGVWaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50Py5pbnB1dC5ibHVyKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVNb250aENoYW5nZSA9IChcbiAgICAgIGRhdGU6IERhdGUsXG4gICAgICBlOiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTFNlbGVjdEVsZW1lbnQ+XG4gICAgKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQ6IHRhcmdldCB9ID0gZVxuICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBjb25zdCBkYXlQaWNrZXJSZWN0ID1cbiAgICAgICAgICBkYXlQaWNrZXJSZWYuY3VycmVudC5kYXlQaWNrZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGFyZ2V0Lm5hbWUgPT09IFwibW9udGhcIiAmJlxuICAgICAgICAgICh0YXJnZXRSZWN0LmxlZnQgLSBkYXlQaWNrZXJSZWN0LmxlZnQpICogMiA+IGRheVBpY2tlclJlY3Qud2lkdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgLSAxKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgbmV3TW9udGggPSBkYXRlXG4gICAgICBpZiAoRGF0ZVV0aWxzLmlzRGF5QWZ0ZXIoZGF0ZSwgbWF4RGF0ZSkpIHtcbiAgICAgICAgaWYgKG1heERhdGUpIHtcbiAgICAgICAgICBuZXdNb250aCA9IG1heERhdGVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChEYXRlVXRpbHMuaXNEYXlCZWZvcmUoZGF0ZSwgbWluRGF0ZSkpIHtcbiAgICAgICAgaWYgKG1pbkRhdGUpIHtcbiAgICAgICAgICBuZXdNb250aCA9IG1pbkRhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0TW9udGgobmV3TW9udGgpXG4gICAgfVxuXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgICBpbnB1dDogaW5wdXRSZWYuY3VycmVudCxcbiAgICAgIGhhbmRsZURheUNsaWNrLFxuICAgICAgaGFuZGxlVmlzaWJsZUNoYW5nZSxcbiAgICB9KSlcblxuICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IChcbiAgICAgIDw+XG4gICAgICAgIHtzaG9ydGN1dHNFbmFibGVkICYmIChcbiAgICAgICAgICA8U2hvcnRjdXRzXG4gICAgICAgICAgICBvblNob3J0Y3V0Q2xpY2s9eyh2YWx1ZVNob3J0Y3V0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlU2hvcnRjdXQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVNob3J0Y3V0ID0gdmFsdWVTaG9ydGN1dFswXVxuICAgICAgICAgICAgICAgIGNvbnN0IHRvU2hvcnRjdXQgPSB2YWx1ZVNob3J0Y3V0WzFdXG4gICAgICAgICAgICAgICAgc2V0RnJvbShmcm9tU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgc2V0TW9udGgoZnJvbVNob3J0Y3V0KVxuICAgICAgICAgICAgICAgIHNldFRvKHRvU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgc2V0UmFuZ2VWYWx1ZShjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsdWVTaG9ydGN1dCkpXG5cbiAgICAgICAgICAgICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHZhbHVlU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOW7tui/n+aYr+S4uuS6huiuqeeKtuaAgeeahOWPmOWMluWcqOinhuinieS4iuWFiOiiq+aOpeWPl1xuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAgICAgICB9LCAxMDApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgc2VsZWN0ZWREYXlzPXtyYW5nZX1cbiAgICAgICAgICAgIHNob3J0Y3V0cz17c2hvcnRjdXRzfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxEYXlQaWNrZXJcbiAgICAgICAgICByZWY9e2RheVBpY2tlclJlZn1cbiAgICAgICAgICBudW1iZXJPZk1vbnRocz17Mn1cbiAgICAgICAgICBkaXNhYmxlZERheXM9e2lzRGF5RGlzYWJsZWR9XG4gICAgICAgICAgZnJvbU1vbnRoPXttaW5EYXRlfVxuICAgICAgICAgIHRvTW9udGg9e21heERhdGV9XG4gICAgICAgICAgY2FuQ2hhbmdlTW9udGhcbiAgICAgICAgICBjbGFzc05hbWVzPXtzdHlsZXN9XG4gICAgICAgICAgbW9udGg9e21vbnRofVxuICAgICAgICAgIG1vbnRocz17TU9OVEhTfVxuICAgICAgICAgIHdlZWtkYXlzTG9uZz17V0VFS0RBWVNfTE9OR31cbiAgICAgICAgICB3ZWVrZGF5c1Nob3J0PXtXRUVLREFZU19TSE9SVH1cbiAgICAgICAgICBzZWxlY3RlZERheXM9e3NlbGVjdGVkRGF5c31cbiAgICAgICAgICBuYXZiYXJFbGVtZW50PXtcbiAgICAgICAgICAgIDxOYXZiYXJcbiAgICAgICAgICAgICAgbWF4RGF0ZT17bWF4RGF0ZX1cbiAgICAgICAgICAgICAgbWluRGF0ZT17bWluRGF0ZX1cbiAgICAgICAgICAgICAgb25NYW51YWxseUNoYW5nZU1vbnRoPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0TW9udGgobWluRGF0ZSlcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgey4uLk5hdmJhckVsZW1lbnRQcm9wc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHRpb25FbGVtZW50PXtcbiAgICAgICAgICAgIDxDYXB0aW9uXG4gICAgICAgICAgICAgIG1heERhdGU9e21heERhdGV9XG4gICAgICAgICAgICAgIG1pbkRhdGU9e21pbkRhdGV9XG4gICAgICAgICAgICAgIG9uRGF0ZUNoYW5nZT17aGFuZGxlTW9udGhDaGFuZ2V9XG4gICAgICAgICAgICAgIHsuLi5DYXB0aW9uRWxlbWVudFByb3BzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgb25EYXlNb3VzZUVudGVyPXtoYW5kbGVEYXlNb3VzZUVudGVyfVxuICAgICAgICAgIG9uRGF5TW91c2VMZWF2ZT17aGFuZGxlRGF5TW91c2VMZWF2ZX1cbiAgICAgICAgICBvbkRheUNsaWNrPXtoYW5kbGVEYXlDbGlja31cbiAgICAgICAgICByZW5kZXJEYXk9eyhkYXk6IERhdGUpID0+IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWNlbGxgfT5cbiAgICAgICAgICAgICAge3JlbmRlckRheSAmJiByZW5kZXJEYXkoZGF5KSA/IHJlbmRlckRheShkYXkpIDogZGF5