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>
548 lines (547 loc) • 89.7 kB
JavaScript
"use strict";
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); }
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(e) { return e && e.__esModule ? e : { "default": e }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
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(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
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(r) { if (Array.isArray(r)) return r; }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
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 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 = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, "".concat(prefix, "-rangeStart"), isReverse ? to && fromFinal : fromFinal), "".concat(prefix, "-rangeStartHover"), isReverse && !to && fromFinal), "".concat(prefix, "-rangeEnd"), isReverse ? enteredToFinal : to && enteredToFinal), "".concat(prefix, "-rangeEndHover"), !isReverse && !to && enteredToFinal), "".concat(prefix, "-selectedRange"), function selectedRange(day) {
return (0, _core.isDayInRange)(day, [fromFinal, enteredToFinal], true);
});
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 || _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 = exports["default"] = RangePicker;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jbGFzc25hbWVzIiwiX2RheVBpY2tlclJlYWN0IiwiX2NsYXNzTmFtZXMiLCJfY29uZmlnUHJvdmlkZXIiLCJfaWNvbiIsIl9pbnB1dCIsIl9wb3BvdmVyIiwiX0NhcHRpb24iLCJfTmF2YmFyIiwiX1Nob3J0Y3V0cyIsIl9jb3JlIiwiX2V4Y2x1ZGVkIiwiZSIsIl9fZXNNb2R1bGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJXZWFrTWFwIiwiciIsInQiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJiaW5kIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXBwbHkiLCJfZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJfc2xpY2VkVG9BcnJheSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwibCIsIml0ZXJhdG9yIiwiZiIsIm8iLCJuZXh0IiwiZG9uZSIsInB1c2giLCJpc0FycmF5IiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJzIiwiaW5jbHVkZXMiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIkRheVBpY2tlciIsIkRQUiIsInByZWZpeCIsIm5vb3AiLCJSYW5nZVBpY2tlciIsImZvcndhcmRSZWYiLCJfcmVmIiwicmVmIiwiYWxsb3dDbGVhciIsImNsYXNzTmFtZSIsImNsb3NlT25TZWxlY3QiLCJkZWZhdWx0VmFsdWUiLCJkZWZhdWx0VmlzaWJsZSIsImRpc2FibGVkIiwiZGlzYWJsZWREYXlzIiwiZHJvcGRvd25SZW5kZXIiLCJfcmVmJGhvdXIiLCJob3VyIiwiaW50ZW50IiwibWF4RGF0ZSIsIm1pbkRhdGUiLCJvbkNoYW5nZSIsIm9uQ2xpY2siLCJvbkVuZERheVNlbGVjdCIsIm9uU3RhcnREYXlTZWxlY3QiLCJvblZpc2libGVDaGFuZ2UiLCJwbGFjZWhvbGRlciIsInBsYWNlbWVudCIsInBvcG92ZXJQcm9wcyIsInJlbmRlckRheSIsInNob3J0Y3V0cyIsInNpemVQcm9wIiwic2l6ZSIsInRoZW1lIiwidHJpZ2dlckVsZW1lbnQiLCJ2YWx1ZVByb3AiLCJ2aXNpYmxlUHJvcCIsInZpc2libGUiLCJvdGhlclByb3BzIiwiZ2V0SW5pdGlhbFN0YXRlIiwicmFuZ2VWYWx1ZSIsInRvIiwidW5kZWZpbmVkIiwiX3ZhbHVlUHJvcCIsImNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyIsIl9kZWZhdWx0VmFsdWUiLCJtb250aCIsImluaXRpYWxTdGF0ZSIsInVzZU1lbW8iLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJlbnRlcmVkVG8iLCJzZXRFbnRlcmVkVG8iLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInNldEZyb20iLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInNldFRvIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJzZXRNb250aCIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUxMCIsInByZXZWYWx1ZVByb3AiLCJzZXRQcmV2VmFsdWVQcm9wIiwiX3VzZVN0YXRlMTEiLCJfdXNlU3RhdGUxMiIsInNldFJhbmdlVmFsdWUiLCJfdXNlU3RhdGUxMyIsIl91c2VTdGF0ZTE0Iiwic2V0VmlzaWJsZSIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJjbGVhckljb25TdGF0ZSIsInNldENsZWFySWNvblN0YXRlIiwibmV4dENsaWNrSW5zaWRlUmVmIiwidXNlUmVmIiwiaW5wdXRSZWYiLCJkYXlQaWNrZXJSZWYiLCJfdXNlQ29udGV4dCIsInVzZUNvbnRleHQiLCJDb25maWdDb250ZXh0Iiwic2l6ZUNvbnRleHQiLCJnZXRDb21wdXRlZFNpemUiLCJjbGFzc1NldCIsImNsYXNzTmFtZXMiLCJjb25jYXQiLCJmcm9tRmluYWwiLCJlbnRlcmVkVG9GaW5hbCIsImlzUmV2ZXJzZSIsIkRhdGVVdGlscyIsImlzRGF5QWZ0ZXIiLCJzZWxlY3RlZERheXMiLCJtb2RpZmllcnMiLCJzZWxlY3RlZFJhbmdlIiwiZGF5IiwiaXNEYXlJblJhbmdlIiwic2hvcnRjdXRzRW5hYmxlZCIsInJhbmdlIiwiaXNEYXlEaXNhYmxlZCIsImlzRGF5QmVmb3JlIiwiaGFuZGxlVmlzaWJsZUNoYW5nZSIsImJvb2wiLCJzZXRUaW1lb3V0IiwiY3VycmVudCIsIm5ld1ZhbCIsInJhbmdlUmVzZXQiLCJzcGxpdCIsIkRhdGUiLCJpc1NlbGVjdGluZ0ZpcnN0RGF5IiwiZnJvbUFyZyIsInRvQXJnIiwiaXNSYW5nZVNlbGVjdGVkIiwiaGFuZGxlRGF5Q2xpY2siLCJzZXRIb3VycyIsIm5ld1JhbmdlIiwiZnJvbVN0ciIsImNvbnZlcnREYXRlVG9TdHJpbmciLCJ0b1N0ciIsIm5ld1JhbmdlVmFsdWUiLCJoYW5kbGVEYXlNb3VzZUVudGVyIiwiaGFuZGxlRGF5TW91c2VMZWF2ZSIsImhhbmRsZUlucHV0Q2hhbmdlIiwiX3JlZjIiLCJ0YXJnZXQiLCJ2YWwiLCJ0cmltIiwiaXNMZWdhbERhdGVSYW5nZVN0cmluZyIsInJhbmdlVmFsdWVTdHJzIiwibmV3RnJvbSIsIm5ld1RvIiwiaXNTYW1lRGF5IiwiaGFuZGxlSW5wdXRGb2N1cyIsIl9yZWYzIiwiaW5wdXRFbGVtZW50IiwiaW5wdXQiLCJzZWxlY3Rpb25TdGFydCIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJoYW5kbGVJbnB1dEtleURvd24iLCJfcmVmNCIsImtleSIsImtleXMiLCJfaW5wdXRSZWYkY3VycmVudCIsImJsdXIiLCJoYW5kbGVNb250aENoYW5nZSIsImRhdGUiLCJjdXJyZW50VGFyZ2V0IiwidGFyZ2V0UmVjdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImRheVBpY2tlclJlY3QiLCJkYXlQaWNrZXIiLCJsZWZ0Iiwid2lkdGgiLCJuZXdNb250aCIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJwb3B1cEVsZW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiRnJhZ21lbnQiLCJvblNob3J0Y3V0Q2xpY2siLCJ2YWx1ZVNob3J0Y3V0IiwiZnJvbVNob3J0Y3V0IiwidG9TaG9ydGN1dCIsIm51bWJlck9mTW9udGhzIiwiZnJvbU1vbnRoIiwidG9Nb250aCIsImNhbkNoYW5nZU1vbnRoIiwic3R5bGVzIiwibW9udGhzIiwiTU9OVEhTIiwid2Vla2RheXNMb25nIiwiV0VFS0RBWVNfTE9ORyIsIndlZWtkYXlzU2hvcnQiLCJXRUVLREFZU19TSE9SVCIsIm5hdmJhckVsZW1lbnQiLCJvbk1hbnVhbGx5Q2hhbmdlTW9udGgiLCJOYXZiYXJFbGVtZW50UHJvcHMiLCJjYXB0aW9uRWxlbWVudCIsIm9uRGF0ZUNoYW5nZSIsIkNhcHRpb25FbGVtZW50UHJvcHMiLCJvbkRheU1vdXNlRW50ZXIiLCJvbkRheU1vdXNlTGVhdmUiLCJvbkRheUNsaWNrIiwiZ2V0RGF0ZSIsIm9uRm9jdXMiLCJvbktleURvd24iLCJyaWdodEVsZW1lbnQiLCJpY29uIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwic3RvcFByb3BhZ2F0aW9uIiwiYXJyb3dlZCIsInBvcHVwIiwicG9wdXBTdHlsZSIsIm1heFdpZHRoIiwidHJpZ2dlciIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFueSIsImZ1bmMiLCJudW1iZXIiLCJvbmVPZiIsImluc3RhbmNlT2YiLCJvYmplY3QiLCJkZWZhdWx0UHJvcHMiLCJnZXREZWZhdWx0TWF4RGF0ZSIsImdldERlZmF1bHRNaW5EYXRlIiwiZGlzcGxheU5hbWUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL2RhdGUtcGlja2VyL1JhbmdlUGlja2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZHVwbGljYXRlcyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCBSZWFjdCwge1xuICBmb3J3YXJkUmVmLFxuICB1c2VDb250ZXh0LFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgRFBSIGZyb20gXCJkYXktcGlja2VyLXJlYWN0XCJcbmltcG9ydCB7XG4gIENhcHRpb25FbGVtZW50UHJvcHMsXG4gIERhdGVVdGlscyxcbiAgTmF2YmFyRWxlbWVudFByb3BzLFxufSBmcm9tIFwiZGF5LXBpY2tlci1yZWFjdFwiXG5pbXBvcnQgXCIuL3N0eWxlXCJcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vY2xhc3NOYW1lc1wiXG5pbXBvcnQgeyBDb25maWdDb250ZXh0LCBnZXRDb21wdXRlZFNpemUgfSBmcm9tIFwiLi4vY29uZmlnLXByb3ZpZGVyXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi9pY29uXCJcbmltcG9ydCBJbnB1dCBmcm9tIFwiLi4vaW5wdXRcIlxuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcIi4uL3BvcC10cmlnZ2VyXCJcbmltcG9ydCBQb3BvdmVyLCB7IElQb3BvdmVyUHJvcHMgfSBmcm9tIFwiLi4vcG9wb3ZlclwiXG5pbXBvcnQgQ2FwdGlvbiBmcm9tIFwiLi9DYXB0aW9uXCJcbmltcG9ydCBOYXZiYXIgZnJvbSBcIi4vTmF2YmFyXCJcbmltcG9ydCBTaG9ydGN1dHMgZnJvbSBcIi4vU2hvcnRjdXRzXCJcbmltcG9ydCB7XG4gIE1PTlRIUyxcbiAgV0VFS0RBWVNfTE9ORyxcbiAgV0VFS0RBWVNfU0hPUlQsXG4gIGdldERlZmF1bHRNYXhEYXRlLFxuICBnZXREZWZhdWx0TWluRGF0ZSxcbiAgaXNMZWdhbERhdGVSYW5nZVN0cmluZyxcbiAgY29udmVydERhdGVUb1N0cmluZyxcbiAgY29udmVydERhdGVSYW5nZVRvU3RyaW5nLFxuICBpc0RheUluUmFuZ2UsXG59IGZyb20gXCIuL2NvcmVcIlxuXG5jb25zdCBEYXlQaWNrZXIgPSBEUFIuX19lc01vZHVsZSA/IERQUi5kZWZhdWx0IDogRFBSXG5jb25zdCBwcmVmaXggPSBcImFkdWktZGF0ZVwiXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuZXhwb3J0IGludGVyZmFjZSBJUmFuZ2VQaWNrZXJQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICAvKipcbiAgICog5piv5ZCm5pSv5oyB5riF6ZmkXG4gICAqL1xuICBhbGxvd0NsZWFyPzogYm9vbGVhblxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCNXG4gICAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOaYr+WQpuWcqOmAieaLqeWQju+8jOa2iOWksSBQb3BvdmVyXG4gICAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhblxuICAvKipcbiAgICog5YaF6YOo6amx5Yqo77ya6buY6K6k5pel5pyf6IyD5Zu0XG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSB8IG51bGxcbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8mum7mOiupOaYr+WQpuaYvuekuuS4i+aLiVxuICAgKi9cbiAgZGVmYXVsdFZpc2libGU/OiBib29sZWFuIHwgbnVsbFxuICAvKipcbiAgICog5piv5ZCm56aB55SoXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOemgeatoumAieaLqeeahOWkqe+8jGRheSA9PiBib29s77yb5q+P5LiA5aSp5piv55qE5pe26Ze05Li6IDEyOjAwOjAw77yM6L+Z5LiA5Liq5piv55SxIGRheS1waWNrZXItcmVhY3Qg5Yaz5a6a55qE77ybXG4gICAqIOavlOi+g+aXpeacn+eahOaXtuWAmeWwj+W/g+i/meS4gOeCueOAglxuICAgKi9cbiAgZGlzYWJsZWREYXlzPzogKGRhdGU6IERhdGUpID0+IGJvb2xlYW4gfCB2b2lkXG4gIC8qKlxuICAgKiDoh6rlrprkuYnkuIvmi4nmoYblhoXlrrlcbiAgICovXG4gIGRyb3Bkb3duUmVuZGVyPzogKGVsZW1lbnQ6IEpTWC5FbGVtZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIDIwMjIwNDA3OiDpu5jorqTnmoTml6XmnJ/ml7bpl7TkuLogMTIg54K577yM5Y+v5Lul5L2/55So5q2kIFByb3Ag5L+u5pS55bCP5pe2XG4gICAqL1xuICBob3VyPzogbnVtYmVyXG4gIC8qKlxuICAgKiDorr7nva7ovpPlhaXmoYbnsbvlnotcbiAgICovXG4gIGludGVudD86IFwibm9ybWFsXCIgfCBcInByaW1hcnlcIiB8IFwic3VjY2Vzc1wiIHwgXCJ3YXJuaW5nXCIgfCBcImRhbmdlclwiXG4gIC8qKlxuICAgKiDmnIDlpKfpmZDliLbml6XmnJ9cbiAgICovXG4gIG1heERhdGU/OiBEYXRlXG4gIC8qKlxuICAgKiDmnIDlsI/pmZDliLbml6XmnJ9cbiAgICovXG4gIG1pbkRhdGU/OiBEYXRlXG4gIC8qKlxuICAgKiDml6XmnJ/mlLnlj5jml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZGF0ZTogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF0pID0+IHZvaWRcbiAgLyoqXG4gICAqIOesrOS6jOasoeeCueWHu+S6huaXpeacn+aXtueahCBoYW5kbGVy77yM5Y2z57uT5p2f6YCJ5oupXG4gICAqL1xuICBvbkVuZERheVNlbGVjdD86IChkYXRlOiBEYXRlKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDnrKzkuIDmrKHngrnlh7vkuobml6XmnJ/ml7bnmoQgaGFuZGxlcu+8jOWNs+W8gOWni+mAieaLqe+8iOWPr+S7peWcqOatpOaXtuiuvue9riBtYXhEYXRlIG1pbkRhdGXvvIzlrp7njrDmjqfliLbml6XmnJ/pgInmi6nojIPlm7TnmoTlip/og73vvIlcbiAgICovXG4gIG9uU3RhcnREYXlTZWxlY3Q/OiAoZGF0ZTogRGF0ZSkgPT4gdm9pZFxuICAvKipcbiAgICog5pi+56S654q25oCB5Y+R55Sf5Y+Y5YyW5pe255qEaGFuZGxlclxuICAgKi9cbiAgb25WaXNpYmxlQ2hhbmdlPzogKHZpc2libGU6IGJvb2xlYW4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOWNoOS9jeWtl+esplxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOW8ueWHuuWxguS9jee9rlxuICAgKi9cbiAgcGxhY2VtZW50PzogUGxhY2VtZW50XG4gIC8qKlxuICAgKiDkvKDlhaUgUG9wb3ZlciDnmoQgcHJvcHNcbiAgICovXG4gIHBvcG92ZXJQcm9wcz86IElQb3BvdmVyUHJvcHNcbiAgLyoqXG4gICAqIOiHquWumuS5ieWmguS9lea4suafk+avj+S4quaXpeacn1xuICAgKi9cbiAgcmVuZGVyRGF5PzogKGRheTogRGF0ZSkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlv6vmjbfpgInmi6npobnvvIzmoLzlvI/vvJpcbiAgICogW3tcbiAgICogbGFiZWw6IFwi56WW5Zu95q+N5Lqy55Sf5pelXCIsIHZhbHVlOiBbbmV3IERhdGUoXCIyMDIyLTEwLTAxXCIpLCBuZXcgRGF0ZShcIjIwMjItMTAtMDdcIildXG4gICAqIH1dXG4gICAqL1xuICBzaG9ydGN1dHM/OiB7XG4gICAgLyoqXG4gICAgICog6K+l6aG555qE5paH5a2XXG4gICAgICovXG4gICAgbGFiZWw6IFJlYWN0LlJlYWN0Tm9kZVxuICAgIC8qKlxuICAgICAqIOivpemhueeahOaXpeacn1xuICAgICAqL1xuICAgIHZhbHVlOiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXVxuICB9W11cbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuFxuICAgKi9cbiAgc2l6ZT86IFwibWluaVwiIHwgXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIlxuICAvKipcbiAgICog6K6+572u5Li76aKYXG4gICAqL1xuICB0aGVtZT86IG51bGwgfCBcImxpZ2h0XCJcbiAgLyoqXG4gICAqIOiHquWumuS5ieinpuWPkeS4i+aLieeahOWFg+e0oFxuICAgKi9cbiAgdHJpZ2dlckVsZW1lbnQ/OiBKU1guRWxlbWVudFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5b2T5YmN5pel5pyf6IyD5Zu0XG4gICAqL1xuICB2YWx1ZT86IFtEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgRGF0ZSB8IG51bGwgfCB1bmRlZmluZWRdIHwgbnVsbFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S65LiL5ouJ6YCJ5oupXG4gICAqL1xuICB2aXNpYmxlPzogYm9vbGVhbiB8IG51bGxcbn1cblxuLyoqXG4gKiDml6XmnJ/pgInmi6nlmajnlKjkuo7kuobop6PlvZPliY3lt7LpgInml6XmnJ/vvIzpgInmi6nmiJbovpPlhaXpnIDopoHnmoTml6XmnJ/jgIHml6XmnJ/ojIPlm7TnrYnjgIJcbiAqL1xuY29uc3QgUmFuZ2VQaWNrZXI6IFJlYWN0LkZvcndhcmRSZWZFeG90aWNDb21wb25lbnQ8XG4gIElSYW5nZVBpY2tlclByb3BzICYgUmVhY3QuUmVmQXR0cmlidXRlczxhbnk+XG4+ID0gZm9yd2FyZFJlZihcbiAgKFxuICAgIHtcbiAgICAgIGFsbG93Q2xlYXIsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjbG9zZU9uU2VsZWN0LFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZGVmYXVsdFZpc2libGUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkRGF5cyxcbiAgICAgIGRyb3Bkb3duUmVuZGVyLFxuICAgICAgaG91ciA9IDEyLFxuICAgICAgaW50ZW50LFxuICAgICAgbWF4RGF0ZSxcbiAgICAgIG1pbkRhdGUsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBvbkVuZERheVNlbGVjdCxcbiAgICAgIG9uU3RhcnREYXlTZWxlY3QsXG4gICAgICBvblZpc2libGVDaGFuZ2UsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHBvcG92ZXJQcm9wcyxcbiAgICAgIHJlbmRlckRheSxcbiAgICAgIHNob3J0Y3V0cyxcbiAgICAgIHNpemU6IHNpemVQcm9wLFxuICAgICAgdGhlbWUsXG4gICAgICB0cmlnZ2VyRWxlbWVudCxcbiAgICAgIHZhbHVlOiB2YWx1ZVByb3AsXG4gICAgICB2aXNpYmxlOiB2aXNpYmxlUHJvcCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9OiBJUmFuZ2VQaWNrZXJQcm9wcyxcbiAgICByZWZcbiAgKSA9PiB7XG4gICAgLyoqXG4gICAgICogc2VsZWN0ZWREYXkg5Li65Lyg57uZIERheVBpY2tlciDnmoTmnIDnu4ggRGF0ZSBPYmplY3TvvIxcbiAgICAgKiB2YWx1ZSDkuLogaW5wdXQg55qE6L6T5YWlIFN0cmluZ+OAglxuICAgICAqL1xuICAgIGNvbnN0IGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IHtcbiAgICAgIGxldCByYW5nZVZhbHVlID0gXCJcIlxuICAgICAgbGV0IGZyb21cbiAgICAgIGxldCB0b1xuICAgICAgaWYgKHZhbHVlUHJvcCAhPT0gbnVsbCAmJiB2YWx1ZVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICA7W2Zyb20sIHRvXSA9IHZhbHVlUHJvcFxuICAgICAgICByYW5nZVZhbHVlID0gY29udmVydERhdGVSYW5nZVRvU3RyaW5nKHZhbHVlUHJvcClcbiAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIDtbZnJvbSwgdG9dID0gZGVmYXVsdFZhbHVlXG4gICAgICAgIHJhbmdlVmFsdWUgPSBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcoZGVmYXVsdFZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tLFxuICAgICAgICBtb250aDogZnJvbSxcbiAgICAgICAgcmFuZ2VWYWx1ZSxcbiAgICAgICAgdG8sXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gdXNlTWVtbyhnZXRJbml0aWFsU3RhdGUsIFtdKVxuXG4gICAgY29uc3QgW2VudGVyZWRUbywgc2V0RW50ZXJlZFRvXSA9IHVzZVN0YXRlPERhdGUgfCBudWxsIHwgdW5kZWZpbmVkPihudWxsKVxuICAgIGNvbnN0IFtmcm9tLCBzZXRGcm9tXSA9IHVzZVN0YXRlPERhdGUgfCBudWxsIHwgdW5kZWZpbmVkPihpbml0aWFsU3RhdGUuZnJvbSlcbiAgICBjb25zdCBbdG8sIHNldFRvXSA9IHVzZVN0YXRlPERhdGUgfCBudWxsIHwgdW5kZWZpbmVkPihpbml0aWFsU3RhdGUudG8pXG4gICAgY29uc3QgW21vbnRoLCBzZXRNb250aF0gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gICAgICBpbml0aWFsU3RhdGUubW9udGhcbiAgICApXG4gICAgY29uc3QgW3ByZXZWYWx1ZVByb3AsIHNldFByZXZWYWx1ZVByb3BdID0gdXNlU3RhdGU8XG4gICAgICBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSB8IG51bGwgfCB1bmRlZmluZWRcbiAgICA+KHZhbHVlUHJvcClcbiAgICBjb25zdCBbcmFuZ2VWYWx1ZSwgc2V0UmFuZ2VWYWx1ZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFxuICAgICAgaW5pdGlhbFN0YXRlLnJhbmdlVmFsdWVcbiAgICApXG4gICAgY29uc3QgW3Zpc2libGUsIHNldFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgaWYgKHZpc2libGVQcm9wICE9PSBudWxsICYmIHZpc2libGVQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2libGVQcm9wXG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZpc2libGUgIT09IG51bGwgJiYgZGVmYXVsdFZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZpc2libGVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0pXG4gICAgY29uc3QgW2NsZWFySWNvblN0YXRlLCBzZXRDbGVhckljb25TdGF0ZV0gPSB1c2VTdGF0ZTxcImluXCIgfCBcIm91dFwiPihcIm91dFwiKVxuICAgIGNvbnN0IG5leHRDbGlja0luc2lkZVJlZiA9IHVzZVJlZihmYWxzZSlcblxuICAgIC8vIOebuOW9k+S6jueUn+WRveWRqOacnyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcbiAgICBpZiAoXG4gICAgICB2YWx1ZVByb3AgIT09IG51bGwgJiZcbiAgICAgIHZhbHVlUHJvcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB2YWx1ZVByb3AgIT09IHByZXZWYWx1ZVByb3BcbiAgICApIHtcbiAgICAgIHNldEZyb20odmFsdWVQcm9wWzBdKVxuICAgICAgc2V0VG8odmFsdWVQcm9wWzFdKVxuICAgICAgc2V0UmFuZ2VWYWx1ZShjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsdWVQcm9wKSlcbiAgICAgIHNldFByZXZWYWx1ZVByb3AodmFsdWVQcm9wKVxuICAgIH1cbiAgICBpZiAodmlzaWJsZVByb3AgIT09IG51bGwgJiYgdmlzaWJsZSAhPT0gISF2aXNpYmxlUHJvcCkge1xuICAgICAgc2V0VmlzaWJsZSghIXZpc2libGVQcm9wKVxuICAgIH1cblxuICAgIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPGFueT4obnVsbClcbiAgICBjb25zdCBkYXlQaWNrZXJSZWYgPSB1c2VSZWY8YW55PihudWxsKVxuXG4gICAgY29uc3QgeyBzaXplOiBzaXplQ29udGV4dCB9ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KVxuICAgIGNvbnN0IHNpemUgPSBnZXRDb21wdXRlZFNpemUoc2l6ZVByb3AsIHNpemVDb250ZXh0KVxuXG4gICAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgYCR7cHJlZml4fS1yYW5nZUJhc2VgLFxuICAgICAgYCR7cHJlZml4fS0ke3NpemV9YFxuICAgIClcblxuICAgIGxldCBmcm9tRmluYWw6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgbGV0IGVudGVyZWRUb0ZpbmFsID0gdG8gfHwgZW50ZXJlZFRvXG4gICAgY29uc3QgaXNSZXZlcnNlID1cbiAgICAgIGZyb20gJiYgZW50ZXJlZFRvRmluYWwgJiYgRGF0ZVV0aWxzLmlzRGF5QWZ0ZXIoZnJvbSwgZW50ZXJlZFRvRmluYWwpXG4gICAgaWYgKGlzUmV2ZXJzZSkge1xuICAgICAgZnJvbUZpbmFsID0gZW50ZXJlZFRvRmluYWxcbiAgICAgIGVudGVyZWRUb0ZpbmFsID0gZnJvbVxuICAgIH0gZWxzZSB7XG4gICAgICBmcm9tRmluYWwgPSBmcm9tXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWREYXlzID0gW1xuICAgICAgZnJvbUZpbmFsLFxuICAgICAge1xuICAgICAgICBmcm9tOiBmcm9tRmluYWwsXG4gICAgICAgIHRvOiBlbnRlcmVkVG9GaW5hbCxcbiAgICAgIH0sXG4gICAgXVxuICAgIGNvbnN0IG1vZGlmaWVycyA9IHtcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlU3RhcnRgXTogaXNSZXZlcnNlID8gdG8gJiYgZnJvbUZpbmFsIDogZnJvbUZpbmFsLFxuICAgICAgW2Ake3ByZWZpeH0tcmFuZ2VTdGFydEhvdmVyYF06IGlzUmV2ZXJzZSAmJiAhdG8gJiYgZnJvbUZpbmFsLFxuICAgICAgW2Ake3ByZWZpeH0tcmFuZ2VFbmRgXTogaXNSZXZlcnNlID8gZW50ZXJlZFRvRmluYWwgOiB0byAmJiBlbnRlcmVkVG9GaW5hbCxcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlRW5kSG92ZXJgXTogIWlzUmV2ZXJzZSAmJiAhdG8gJiYgZW50ZXJlZFRvRmluYWwsXG4gICAgICBbYCR7cHJlZml4fS1zZWxlY3RlZFJhbmdlYF06IChkYXk6IERhdGUpID0+XG4gICAgICAgIGlzRGF5SW5SYW5nZShkYXksIFtmcm9tRmluYWwsIGVudGVyZWRUb0ZpbmFsXSwgdHJ1ZSksXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvcnRjdXRzRW5hYmxlZCA9IHNob3J0Y3V0cyAmJiBzaG9ydGN1dHMubGVuZ3RoID4gMFxuXG4gICAgY29uc3QgcmFuZ2U6IFtEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgRGF0ZSB8IG51bGwgfCB1bmRlZmluZWRdID0gW1xuICAgICAgZnJvbUZpbmFsLFxuICAgICAgZW50ZXJlZFRvRmluYWwsXG4gICAgXVxuXG4gICAgY29uc3QgaXNEYXlEaXNhYmxlZCA9IChkYXk6IERhdGUpID0+IHtcbiAgICAgIHJldHVybiBkaXNhYmxlZERheXNcbiAgICAgICAgPyBkaXNhYmxlZERheXMoZGF5KSB8fFxuICAgICAgICAgICAgRGF0ZVV0aWxzLmlzRGF5QmVmb3JlKGRheSwgbWluRGF0ZSkgfHxcbiAgICAgICAgICAgIERhdGVVdGlscy5pc0RheUFmdGVyKGRheSwgbWF4RGF0ZSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlVmlzaWJsZUNoYW5nZSA9IChib29sOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKG5leHRDbGlja0luc2lkZVJlZi5jdXJyZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgbmV4dENsaWNrSW5zaWRlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgIC8vIOWxleW8gOaXtu+8jOWmguaenOWcqOWGhemDqOWFg+e0oOeCueWHu++8jOWImeS4jeWBmum7mOiupOeahOaUtui1t+aTjeS9nFxuICAgICAgICAgIGlmICghYm9vbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbCA9IGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyhbZnJvbSwgdG9dKVxuICAgICAgICBpZiAoIWJvb2wpIHtcbiAgICAgICAgICBpZiAoIXRvKSB7XG4gICAgICAgICAgICBpZiAobmV3VmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJhbmdlUmVzZXQgPSByYW5nZVZhbHVlLnNwbGl0KFwiIC0gXCIpXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldEZyb20obmV3IERhdGUocmFuZ2VSZXNldFswXSkpXG4gICAgICAgICAgICAgICAgc2V0VG8obmV3IERhdGUocmFuZ2VSZXNldFsxXSkpXG4gICAgICAgICAgICAgIH0sIDI1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJhbmdlVmFsdWUgIT09IG5ld1ZhbCkge1xuICAgICAgICAgICAgc2V0UmFuZ2VWYWx1ZShuZXdWYWwpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgICBvblZpc2libGVDaGFuZ2UoYm9vbClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRWaXNpYmxlKGJvb2wpXG4gICAgICAgIH1cbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgY29uc3QgaXNTZWxlY3RpbmdGaXJzdERheSA9IChcbiAgICAgIGZyb21Bcmc/OiBEYXRlIHwgbnVsbCxcbiAgICAgIHRvQXJnPzogRGF0ZSB8IG51bGxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGlzUmFuZ2VTZWxlY3RlZCA9IGZyb21BcmcgJiYgdG9BcmdcbiAgICAgIHJldHVybiAhZnJvbUFyZyB8fCBpc1JhbmdlU2VsZWN0ZWRcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVEYXlDbGljayA9IChkYXk6IERhdGUpID0+IHtcbiAgICAgIGRheS5zZXRIb3Vycyhob3VyLCAwLCAwLCAwKVxuICAgICAgaWYgKFxuICAgICAgICBEYXRlVXRpbHMuaXNEYXlCZWZvcmUoZGF5LCBtaW5EYXRlKSB8fFxuICAgICAgICBEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXksIG1heERhdGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoaXNTZWxlY3RpbmdGaXJzdERheShmcm9tLCB0bykpIHtcbiAgICAgICAgaWYgKG9uU3RhcnREYXlTZWxlY3QpIHtcbiAgICAgICAgICBvblN0YXJ0RGF5U2VsZWN0KGRheSlcbiAgICAgICAgfVxuICAgICAgICBzZXRFbnRlcmVkVG8obnVsbClcbiAgICAgICAgc2V0RnJvbShkYXkpXG4gICAgICAgIHNldFRvKG51bGwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob25FbmREYXlTZWxlY3QpIHtcbiAgICAgICAgICBvbkVuZERheVNlbGVjdChkYXkpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld1JhbmdlOiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXVxuICAgICAgICBjb25zdCBmcm9tU3RyID0gY29udmVydERhdGVUb1N0cmluZyhmcm9tKVxuICAgICAgICBjb25zdCB0b1N0ciA9IGNvbnZlcnREYXRlVG9TdHJpbmcoZGF5KVxuICAgICAgICBsZXQgbmV3UmFuZ2VWYWx1ZSA9IFwiXCJcbiAgICAgICAgaWYgKERhdGVVdGlscy5pc0RheUFmdGVyKGRheSwgZnJvbSkpIHtcbiAgICAgICAgICBuZXdSYW5nZSA9IFtmcm9tLCBkYXldXG4gICAgICAgICAgbmV3UmFuZ2VWYWx1ZSA9IGAke2Zyb21TdHJ9IC0gJHt0b1N0cn1gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3UmFuZ2UgPSBbZGF5LCBmcm9tXVxuICAgICAgICAgIG5ld1JhbmdlVmFsdWUgPSBgJHt0b1N0cn0gLSAke2Zyb21TdHJ9YFxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRFbnRlcmVkVG8oZGF5KVxuICAgICAgICAgIHNldFJhbmdlVmFsdWUobmV3UmFuZ2VWYWx1ZSlcbiAgICAgICAgICBzZXRUbyhkYXkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UobmV3UmFuZ2UpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICAvLyDlu7bov5/mmK/kuLrkuoborqnnirbmgIHnmoTlj5jljJblnKjop4bop4nkuIrlhYjooqvmjqXlj5dcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgb25WaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpc2libGVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMTAwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRGF5TW91c2VFbnRlciA9IChkYXk6IERhdGUpID0+IHtcbiAgICAgIGlmICghaXNTZWxlY3RpbmdGaXJzdERheShmcm9tLCB0bykpIHtcbiAgICAgICAgc2V0RW50ZXJlZFRvKGRheSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVEYXlNb3VzZUxlYXZlID0gKCkgPT4ge1xuICAgICAgc2V0RW50ZXJlZFRvKG51bGwpXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoe1xuICAgICAgdGFyZ2V0LFxuICAgIH06IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCB7IHZhbHVlOiB2YWwgfSA9IHRhcmdldFxuICAgICAgc2V0UmFuZ2VWYWx1ZSh2YWwpXG4gICAgICBpZiAodmFsLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0RW50ZXJlZFRvKG51bGwpXG4gICAgICAgICAgc2V0RnJvbShudWxsKVxuICAgICAgICAgIHNldFRvKG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UoW3VuZGVmaW5lZCwgdW5kZWZpbmVkXSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0xlZ2FsRGF0ZVJhbmdlU3RyaW5nKHZhbCkpIHtcbiAgICAgICAgY29uc3QgcmFuZ2VWYWx1ZVN0cnMgPSB2YWwuc3BsaXQoXCIgLSBcIilcbiAgICAgICAgY29uc3QgbmV3RnJvbSA9IG5ldyBEYXRlKHJhbmdlVmFsdWVTdHJzWzBdKVxuICAgICAgICBjb25zdCBuZXdUbyA9IG5ldyBEYXRlKHJhbmdlVmFsdWVTdHJzWzFdKVxuICAgICAgICBuZXdGcm9tLnNldEhvdXJzKGhvdXIsIDAsIDAsIDApXG4gICAgICAgIG5ld1RvLnNldEhvdXJzKGhvdXIsIDAsIDAsIDApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaXNEYXlEaXNhYmxlZChuZXdGcm9tKSAmJlxuICAgICAgICAgICFpc0RheURpc2FibGVkKG5ld1RvKSAmJlxuICAgICAgICAgICFEYXRlVXRpbHMuaXNEYXlCZWZvcmUobmV3VG8sIG5ld0Zyb20pICYmXG4gICAgICAgICAgIShcbiAgICAgICAgICAgIERhdGVVdGlscy5pc1NhbWVEYXkoZnJvbSwgbmV3RnJvbSkgJiYgRGF0ZVV0aWxzLmlzU2FtZURheSh0bywgbmV3VG8pXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRGcm9tKG5ld0Zyb20pXG4gICAgICAgICAgICBzZXRUbyhuZXdUbylcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g5L+u5pS55pel5pyf5ZCO55qEIG1vbnRoIOi3s+i9rFxuICAgICAgICAgIGlmICghRGF0ZVV0aWxzLmlzU2FtZURheShmcm9tLCBuZXdGcm9tKSkge1xuICAgICAgICAgICAgc2V0TW9udGgobmV3RnJvbSlcbiAgICAgICAgICB9IGVsc2UgaWYgKCFEYXRlVXRpbHMuaXNTYW1lRGF5KHRvLCBuZXdUbykpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG5ld1RvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgICAgIG9uQ2hhbmdlKFtuZXdGcm9tLCBuZXdUb10pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICAgICAgb25WaXNpYmxlQ2hhbmdlKHRydWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0VmlzaWJsZSh0cnVlKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaW5wdXQ6IGlucHV0RWxlbWVudCB9ID0gaW5wdXRSZWYuY3VycmVudCB8fCB7fVxuICAgICAgICAvLyBnZXQgaW5wdXQgY3Vyc29yIHBvc2l0aW9uIHdoZW4gZm9jdXNlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0IH0gPSBpbnB1dEVsZW1lbnRcbiAgICAgICAgICAvLyDlsI/kuo4gMTIg5Luj6KGoIGZvY3VzIOWIsOeahOaYryBmcm9tIGRhdGVcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPCAxMikge1xuICAgICAgICAgICAgc2V0TW9udGgoZnJvbSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHRvKSB7XG4gICAgICAgICAgICBzZXRNb250aChuZXcgRGF0ZSh0by5nZXRGdWxsWWVhcigpLCB0by5nZXRNb250aCgpIC0gMSkpXG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0S2V5RG93biA9ICh7XG4gICAgICBrZXksXG4gICAgfTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3Qga2V5cyA9IFtcIlRhYlwiLCBcIkVzY2FwZVwiLCBcIkVudGVyXCJdXG4gICAgICBpZiAoa2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGhhbmRsZVZpc2libGVDaGFuZ2UoZmFsc2UpXG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQ/LmlucHV0LmJsdXIoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZU1vbnRoQ2hhbmdlID0gKFxuICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgIGU6IFJlYWN0LkZvcm1FdmVudDxIVE1MU2VsZWN0RWxlbWVudD5cbiAgICApID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldDogdGFyZ2V0IH0gPSBlXG4gICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGNvbnN0IGRheVBpY2tlclJlY3QgPVxuICAgICAgICAgIGRheVBpY2tlclJlZi5jdXJyZW50LmRheVBpY2tlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQubmFtZSA9PT0gXCJtb250aFwiICYmXG4gICAgICAgICAgKHRhcmdldFJlY3QubGVmdCAtIGRheVBpY2tlclJlY3QubGVmdCkgKiAyID4gZGF5UGlja2VyUmVjdC53aWR0aFxuICAgICAgICApIHtcbiAgICAgICAgICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSAtIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBuZXdNb250aCA9IGRhdGVcbiAgICAgIGlmIChEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXRlLCBtYXhEYXRlKSkge1xuICAgICAgICBpZiAobWF4RGF0ZSkge1xuICAgICAgICAgIG5ld01vbnRoID0gbWF4RGF0ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKERhdGVVdGlscy5pc0RheUJlZm9yZShkYXRlLCBtaW5EYXRlKSkge1xuICAgICAgICBpZiAobWluRGF0ZSkge1xuICAgICAgICAgIG5ld01vbnRoID0gbWluRGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRNb250aChuZXdNb250aClcbiAgICB9XG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICAgIGlucHV0OiBpbnB1dFJlZi5jdXJyZW50LFxuICAgICAgaGFuZGxlRGF5Q2xpY2ssXG4gICAgICBoYW5kbGVWaXNpYmxlQ2hhbmdlLFxuICAgIH0pKVxuXG4gICAgY29uc3QgcG9wdXBFbGVtZW50ID0gKFxuICAgICAgPD5cbiAgICAgICAge3Nob3J0Y3V0c0VuYWJsZWQgJiYgKFxuICAgICAgICAgIDxTaG9ydGN1dHNcbiAgICAgICAgICAgIG9uU2hvcnRjdXRDbGljaz17KHZhbHVlU2hvcnRjdXQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVTaG9ydGN1dCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tU2hvcnRjdXQgPSB2YWx1ZVNob3J0Y3V0WzBdXG4gICAgICAgICAgICAgICAgY29uc3QgdG9TaG9ydGN1dCA9IHZhbHVlU2hvcnRjdXRbMV1cbiAgICAgICAgICAgICAgICBzZXRGcm9tKGZyb21TaG9ydGN1dClcbiAgICAgICAgICAgICAgICBzZXRNb250aChmcm9tU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgc2V0VG8odG9TaG9ydGN1dClcbiAgICAgICAgICAgICAgICBzZXRSYW5nZVZhbHVlKGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWx1ZVNob3J0Y3V0KSlcblxuICAgICAgICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodmFsdWVTaG9ydGN1dClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvc2VPblNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgLy8g5bu26L+f5piv5Li65LqG6K6p54q25oCB55qE5Y+Y5YyW5Zyo6KeG6KeJ5LiK5YWI6KKr5o6l5Y+XXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSlcbiAgICAgICAgICAgICAgICAgIH0sIDEwMClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBzZWxlY3RlZERheXM9e3JhbmdlfVxuICAgICAgICAgICAgc2hvcnRjdXRzPXtzaG9ydGN1dHN9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPERheVBpY2tlclxuICAgICAgICAgIHJlZj17ZGF5UGlja2VyUmVmfVxuICAgICAgICAgIG51bWJlck9mTW9udGhzPXsy