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>
410 lines • 58.8 kB
JavaScript
var _excluded = ["allowClear", "className", "closeOnSelect", "defaultValue", "defaultVisible", "disabled", "disabledDays", "dropdownRender", "hour", "intent", "maxDate", "minDate", "onChange", "onClick", "onVisibleChange", "placeholder", "placement", "popoverProps", "renderDay", "shortcuts", "size", "theme", "triggerElement", "value", "visible"];
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 _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; }
import React, { forwardRef, useContext, useImperativeHandle, useRef, useState } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import DPR from "day-picker-react";
import { CaptionElementProps, DateUtils, NavbarElementProps } from "day-picker-react";
import RangePicker from "./RangePicker";
import "./style";
import styles from "./classNames";
import { ConfigContext, getComputedSize } from "../config-provider";
import Icon from "../icon";
import Input from "../input";
import Popover from "../popover";
import Caption from "./Caption";
import Navbar from "./Navbar";
import Shortcuts from "./Shortcuts";
import { MONTHS, WEEKDAYS_LONG, WEEKDAYS_SHORT, getDefaultMaxDate, getDefaultMinDate, isLegalDateString, convertDateToString } from "./core";
var DayPicker = DPR.__esModule ? DPR.default : DPR;
var prefix = "adui-date";
var noop = function noop() {};
var DatePicker = 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,
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 _useState = useState(function () {
if (valueProp !== null) {
return valueProp;
}
if (defaultValue !== null) {
return defaultValue;
}
return undefined;
}),
_useState2 = _slicedToArray(_useState, 2),
month = _useState2[0],
setMonth = _useState2[1];
var _useState3 = useState(function () {
if (valueProp !== null) {
return valueProp;
}
if (defaultValue !== null) {
return defaultValue;
}
return undefined;
}),
_useState4 = _slicedToArray(_useState3, 2),
selectedDay = _useState4[0],
setSelectedDay = _useState4[1];
var _useState5 = useState(function () {
if (valueProp !== null) {
return convertDateToString(valueProp);
}
if (defaultValue !== null) {
return convertDateToString(defaultValue);
}
return "";
}),
_useState6 = _slicedToArray(_useState5, 2),
value = _useState6[0],
setValue = _useState6[1];
var _useState7 = useState(function () {
if (visibleProp !== null && visibleProp !== undefined) {
return visibleProp;
}
if (defaultVisible !== null && defaultVisible !== undefined) {
return defaultVisible;
}
return false;
}),
_useState8 = _slicedToArray(_useState7, 2),
visible = _useState8[0],
setVisible = _useState8[1];
var _useState9 = useState("out"),
_useState10 = _slicedToArray(_useState9, 2),
clearIconState = _useState10[0],
setClearIconState = _useState10[1];
var nextClickInsideRef = useRef(false);
if (valueProp !== null && selectedDay !== valueProp) {
setMonth(valueProp);
setSelectedDay(valueProp);
setValue(convertDateToString(valueProp));
}
if (visibleProp !== null && visible !== !!visibleProp) {
setVisible(!!visibleProp);
}
var inputRef = useRef(null);
var _useContext = useContext(ConfigContext),
sizeContext = _useContext.size;
var size = getComputedSize(sizeProp, sizeContext);
var classSet = classNames(className, "".concat(prefix, "-dateBase"), "".concat(prefix, "-").concat(size));
var shortcutsEnabled = shortcuts && shortcuts.length > 0;
var isDayDisabled = function isDayDisabled(day) {
return disabledDays && disabledDays(day) || DateUtils.isDayBefore(day, minDate) || DateUtils.isDayAfter(day, maxDate);
};
var handleVisibleChange = function handleVisibleChange(bool) {
if (disabled) {
return;
}
setTimeout(function () {
if (nextClickInsideRef.current === true) {
nextClickInsideRef.current = false;
if (!bool) {
return;
}
}
var newVal = convertDateToString(selectedDay);
if (!bool && value !== newVal) {
setValue(newVal);
}
if (onVisibleChange) {
onVisibleChange(bool);
}
if (visibleProp === null) {
setVisible(bool);
}
}, 0);
};
var handleDayClick = function handleDayClick(selectedDayNew, _ref2) {
var bool = _ref2.disabled;
if (isDayDisabled(selectedDayNew)) {
return;
}
selectedDayNew.setHours(hour, 0, 0, 0);
if (!bool) {
if (closeOnSelect) {
setTimeout(function () {
if (onVisibleChange) {
onVisibleChange(false);
}
if (visibleProp === null) {
setVisible(false);
}
}, 100);
}
if (!DateUtils.isSameDay(selectedDayNew, selectedDay)) {
if (valueProp === null) {
setSelectedDay(selectedDayNew);
setValue(convertDateToString(selectedDayNew));
}
if (onChange) {
onChange(selectedDayNew);
}
}
}
};
var handleInputChange = function handleInputChange(_ref3) {
var val = _ref3.target.value;
setValue(val);
if (val.trim() === "") {
if (valueProp === null) {
setSelectedDay(null);
}
if (onChange) {
onChange("");
}
} else if (isLegalDateString(val)) {
var newDate = new Date(val);
newDate.setHours(hour, 0, 0, 0);
if (!isDayDisabled(newDate) && !DateUtils.isSameDay(newDate, selectedDay)) {
if (valueProp === null) {
setSelectedDay(newDate);
setValue(convertDateToString(newDate));
if (!DateUtils.isSameMonth(newDate, selectedDay)) {
setMonth(newDate);
}
}
if (onChange) {
onChange(newDate);
}
}
}
};
var handleInputFocus = function handleInputFocus() {
if (!visible) {
if (onVisibleChange) {
onVisibleChange(true);
}
if (visibleProp === null) {
setVisible(true);
}
}
};
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) {
var newDate = date;
if (minDate && DateUtils.isDayBefore(date, minDate)) {
newDate.setMonth(minDate.getMonth());
} else if (maxDate && DateUtils.isDayAfter(date, maxDate)) {
newDate.setMonth(maxDate.getMonth());
}
setMonth(newDate);
};
useImperativeHandle(ref, function () {
return {
input: inputRef.current,
handleDayClick: handleDayClick,
handleVisibleChange: handleVisibleChange
};
});
var popupElement = React.createElement("div", {
className: "".concat(prefix, "-popup")
}, shortcutsEnabled && React.createElement(Shortcuts, {
onShortcutClick: function onShortcutClick(valueShortcut) {
handleDayClick(valueShortcut, {});
setMonth(valueShortcut);
},
selectedDay: selectedDay,
shortcuts: shortcuts
}), React.createElement(DayPicker, {
disabledDays: isDayDisabled,
fromMonth: minDate,
toMonth: maxDate,
canChangeMonth: true,
classNames: styles,
month: month || undefined,
months: MONTHS,
weekdaysLong: WEEKDAYS_LONG,
weekdaysShort: WEEKDAYS_SHORT,
selectedDays: selectedDay || undefined,
navbarElement: React.createElement(Navbar, _extends({
maxDate: maxDate,
minDate: minDate
}, NavbarElementProps)),
captionElement: React.createElement(Caption, _extends({
maxDate: maxDate,
minDate: minDate,
onDateChange: handleMonthChange
}, CaptionElementProps)),
onDayClick: handleDayClick,
onMonthChange: handleMonthChange,
renderDay: function renderDay(day) {
return React.createElement("div", {
className: "".concat(prefix, "-cell")
}, _renderDay && _renderDay(day) ? _renderDay(day) : day.getDate());
}
}));
var inputElement = React.createElement(Input, _extends({
className: classSet,
cleaveOptions: {
blocks: [4, 2, 2],
delimiter: "-"
},
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.createElement(Icon, {
icon: clearIconState === "in" ? "cancel-circle" : "calendar-outlined",
onMouseEnter: function onMouseEnter() {
if (value) {
setClearIconState("in");
}
},
onMouseLeave: function onMouseLeave() {
setClearIconState("out");
},
onClick: function onClick(e) {
if (value) {
e.stopPropagation();
if (valueProp === null) {
setSelectedDay("");
setValue("");
}
if (onChange) {
onChange("");
}
if (visible) {
if (onVisibleChange) {
onVisibleChange(false);
}
if (visibleProp === null) {
setVisible(false);
}
}
setTimeout(function () {
nextClickInsideRef.current = false;
});
}
}
}) : React.createElement(Icon, {
icon: "calendar-outlined",
onClick: function onClick() {
setTimeout(function () {
nextClickInsideRef.current = false;
});
}
}),
size: size,
theme: theme,
value: value
}, otherProps));
return React.createElement(Popover, _extends({
arrowed: false,
onVisibleChange: handleVisibleChange,
placement: placement,
popup: React.createElement(React.Fragment, null, dropdownRender && dropdownRender(popupElement) ? dropdownRender(popupElement) : popupElement),
popupStyle: {
maxWidth: shortcutsEnabled ? "342px" : "242px",
width: shortcutsEnabled ? "342px" : "242px"
},
trigger: "click",
visible: visible
}, popoverProps), triggerElement || inputElement);
});
DatePicker.displayName = "DatePicker";
DatePicker.RangePicker = RangePicker;
DatePicker.propTypes = {
allowClear: PropTypes.bool,
className: PropTypes.string,
closeOnSelect: PropTypes.bool,
defaultValue: PropTypes.any,
defaultVisible: PropTypes.bool,
disabled: PropTypes.bool,
disabledDays: PropTypes.func,
dropdownRender: PropTypes.any,
hour: PropTypes.number,
intent: PropTypes.oneOf(["normal", "primary", "success", "warning", "danger"]),
maxDate: PropTypes.instanceOf(Date),
minDate: PropTypes.instanceOf(Date),
onChange: PropTypes.func,
onVisibleChange: PropTypes.func,
placeholder: PropTypes.string,
placement: PropTypes.oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]),
popoverProps: PropTypes.object,
renderDay: PropTypes.any,
shortcuts: PropTypes.any,
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
theme: PropTypes.oneOf([null, "light"]),
triggerElement: PropTypes.any,
value: PropTypes.any,
visible: PropTypes.bool
};
DatePicker.defaultProps = {
allowClear: false,
className: "",
closeOnSelect: false,
defaultValue: null,
defaultVisible: null,
disabled: false,
disabledDays: noop,
dropdownRender: undefined,
hour: 12,
intent: "normal",
maxDate: getDefaultMaxDate(),
minDate: getDefaultMinDate(),
onChange: noop,
onVisibleChange: noop,
placeholder: "选择日期",
placement: "bottomLeft",
popoverProps: {},
renderDay: undefined,
shortcuts: undefined,
size: "small",
theme: null,
triggerElement: undefined,
value: null,
visible: null
};
export default DatePicker;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VDb250ZXh0IiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsInVzZVJlZiIsInVzZVN0YXRlIiwiUHJvcFR5cGVzIiwiY2xhc3NOYW1lcyIsIkRQUiIsIkNhcHRpb25FbGVtZW50UHJvcHMiLCJEYXRlVXRpbHMiLCJOYXZiYXJFbGVtZW50UHJvcHMiLCJSYW5nZVBpY2tlciIsInN0eWxlcyIsIkNvbmZpZ0NvbnRleHQiLCJnZXRDb21wdXRlZFNpemUiLCJJY29uIiwiSW5wdXQiLCJQb3BvdmVyIiwiQ2FwdGlvbiIsIk5hdmJhciIsIlNob3J0Y3V0cyIsIk1PTlRIUyIsIldFRUtEQVlTX0xPTkciLCJXRUVLREFZU19TSE9SVCIsImdldERlZmF1bHRNYXhEYXRlIiwiZ2V0RGVmYXVsdE1pbkRhdGUiLCJpc0xlZ2FsRGF0ZVN0cmluZyIsImNvbnZlcnREYXRlVG9TdHJpbmciLCJEYXlQaWNrZXIiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsInByZWZpeCIsIm5vb3AiLCJEYXRlUGlja2VyIiwiX3JlZiIsInJlZiIsImFsbG93Q2xlYXIiLCJjbGFzc05hbWUiLCJjbG9zZU9uU2VsZWN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdFZpc2libGUiLCJkaXNhYmxlZCIsImRpc2FibGVkRGF5cyIsImRyb3Bkb3duUmVuZGVyIiwiX3JlZiRob3VyIiwiaG91ciIsImludGVudCIsIm1heERhdGUiLCJtaW5EYXRlIiwib25DaGFuZ2UiLCJvbkNsaWNrIiwib25WaXNpYmxlQ2hhbmdlIiwicGxhY2Vob2xkZXIiLCJwbGFjZW1lbnQiLCJwb3BvdmVyUHJvcHMiLCJyZW5kZXJEYXkiLCJzaG9ydGN1dHMiLCJzaXplUHJvcCIsInNpemUiLCJ0aGVtZSIsInRyaWdnZXJFbGVtZW50IiwidmFsdWVQcm9wIiwidmFsdWUiLCJ2aXNpYmxlUHJvcCIsInZpc2libGUiLCJvdGhlclByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiX3VzZVN0YXRlIiwidW5kZWZpbmVkIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibW9udGgiLCJzZXRNb250aCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0Iiwic2VsZWN0ZWREYXkiLCJzZXRTZWxlY3RlZERheSIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2Iiwic2V0VmFsdWUiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNldFZpc2libGUiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMTAiLCJjbGVhckljb25TdGF0ZSIsInNldENsZWFySWNvblN0YXRlIiwibmV4dENsaWNrSW5zaWRlUmVmIiwiaW5wdXRSZWYiLCJfdXNlQ29udGV4dCIsInNpemVDb250ZXh0IiwiY2xhc3NTZXQiLCJjb25jYXQiLCJzaG9ydGN1dHNFbmFibGVkIiwibGVuZ3RoIiwiaXNEYXlEaXNhYmxlZCIsImRheSIsImlzRGF5QmVmb3JlIiwiaXNEYXlBZnRlciIsImhhbmRsZVZpc2libGVDaGFuZ2UiLCJib29sIiwic2V0VGltZW91dCIsImN1cnJlbnQiLCJuZXdWYWwiLCJoYW5kbGVEYXlDbGljayIsInNlbGVjdGVkRGF5TmV3IiwiX3JlZjIiLCJzZXRIb3VycyIsImlzU2FtZURheSIsImhhbmRsZUlucHV0Q2hhbmdlIiwiX3JlZjMiLCJ2YWwiLCJ0YXJnZXQiLCJ0cmltIiwibmV3RGF0ZSIsIkRhdGUiLCJpc1NhbWVNb250aCIsImhhbmRsZUlucHV0Rm9jdXMiLCJoYW5kbGVJbnB1dEtleURvd24iLCJfcmVmNCIsImtleSIsImtleXMiLCJpbmNsdWRlcyIsIl9pbnB1dFJlZiRjdXJyZW50IiwiaW5wdXQiLCJibHVyIiwiaGFuZGxlTW9udGhDaGFuZ2UiLCJkYXRlIiwiZ2V0TW9udGgiLCJwb3B1cEVsZW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwib25TaG9ydGN1dENsaWNrIiwidmFsdWVTaG9ydGN1dCIsImZyb21Nb250aCIsInRvTW9udGgiLCJjYW5DaGFuZ2VNb250aCIsIm1vbnRocyIsIndlZWtkYXlzTG9uZyIsIndlZWtkYXlzU2hvcnQiLCJzZWxlY3RlZERheXMiLCJuYXZiYXJFbGVtZW50IiwiX2V4dGVuZHMiLCJjYXB0aW9uRWxlbWVudCIsIm9uRGF0ZUNoYW5nZSIsIm9uRGF5Q2xpY2siLCJvbk1vbnRoQ2hhbmdlIiwiZ2V0RGF0ZSIsImlucHV0RWxlbWVudCIsImNsZWF2ZU9wdGlvbnMiLCJibG9ja3MiLCJkZWxpbWl0ZXIiLCJvbkZvY3VzIiwib25LZXlEb3duIiwicmlnaHRFbGVtZW50IiwiaWNvbiIsIm9uTW91c2VFbnRlciIsIm9uTW91c2VMZWF2ZSIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJhcnJvd2VkIiwicG9wdXAiLCJGcmFnbWVudCIsInBvcHVwU3R5bGUiLCJtYXhXaWR0aCIsIndpZHRoIiwidHJpZ2dlciIsImRpc3BsYXlOYW1lIiwicHJvcFR5cGVzIiwic3RyaW5nIiwiYW55IiwiZnVuYyIsIm51bWJlciIsIm9uZU9mIiwiaW5zdGFuY2VPZiIsIm9iamVjdCIsImRlZmF1bHRQcm9wcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvRGF0ZVBpY2tlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWR1cGxpY2F0ZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5pbXBvcnQgUmVhY3QsIHtcbiAgZm9yd2FyZFJlZixcbiAgdXNlQ29udGV4dCxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IERQUiBmcm9tIFwiZGF5LXBpY2tlci1yZWFjdFwiXG5pbXBvcnQge1xuICBDYXB0aW9uRWxlbWVudFByb3BzLFxuICBEYXRlVXRpbHMsXG4gIE5hdmJhckVsZW1lbnRQcm9wcyxcbn0gZnJvbSBcImRheS1waWNrZXItcmVhY3RcIlxuaW1wb3J0IFJhbmdlUGlja2VyIGZyb20gXCIuL1JhbmdlUGlja2VyXCJcbmltcG9ydCBcIi4vc3R5bGVcIlxuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9jbGFzc05hbWVzXCJcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQsIGdldENvbXB1dGVkU2l6ZSB9IGZyb20gXCIuLi9jb25maWctcHJvdmlkZXJcIlxuaW1wb3J0IEljb24gZnJvbSBcIi4uL2ljb25cIlxuaW1wb3J0IElucHV0IGZyb20gXCIuLi9pbnB1dFwiXG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tIFwiLi4vcG9wLXRyaWdnZXJcIlxuaW1wb3J0IFBvcG92ZXIsIHsgSVBvcG92ZXJQcm9wcyB9IGZyb20gXCIuLi9wb3BvdmVyXCJcbmltcG9ydCBDYXB0aW9uIGZyb20gXCIuL0NhcHRpb25cIlxuaW1wb3J0IE5hdmJhciBmcm9tIFwiLi9OYXZiYXJcIlxuaW1wb3J0IFNob3J0Y3V0cyBmcm9tIFwiLi9TaG9ydGN1dHNcIlxuaW1wb3J0IHtcbiAgTU9OVEhTLFxuICBXRUVLREFZU19MT05HLFxuICBXRUVLREFZU19TSE9SVCxcbiAgZ2V0RGVmYXVsdE1heERhdGUsXG4gIGdldERlZmF1bHRNaW5EYXRlLFxuICBpc0xlZ2FsRGF0ZVN0cmluZyxcbiAgY29udmVydERhdGVUb1N0cmluZyxcbn0gZnJvbSBcIi4vY29yZVwiXG5cbmNvbnN0IERheVBpY2tlciA9IERQUi5fX2VzTW9kdWxlID8gRFBSLmRlZmF1bHQgOiBEUFJcbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1kYXRlXCJcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUGlja2VyUHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgea4hemZpFxuICAgKi9cbiAgYWxsb3dDbGVhcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKblnKjpgInmi6nlkI7vvIzmtojlpLEgUG9wb3ZlclxuICAgKi9cbiAgY2xvc2VPblNlbGVjdD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8mum7mOiupOaXpeacn1xuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogRGF0ZSB8IFwiXCIgfCBudWxsXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvJrpu5jorqTmmK/lkKbmmL7npLrkuIvmi4lcbiAgICovXG4gIGRlZmF1bHRWaXNpYmxlPzogYm9vbGVhbiB8IG51bGxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDnpoHmraLpgInmi6nnmoTlpKnvvIxkYXkgPT4gYm9vbO+8jOavj+S4gOWkqeaYr+eahOaXtumXtOS4uiAxMjowMDowMO+8jOi/meS4gOS4quaYr+eUsSBkYXktcGlja2VyLXJlYWN0IOWGs+WumueahO+8m1xuICAgKiDmr5TovoPml6XmnJ/nmoTml7blgJnlsI/lv4Pov5nkuIDngrnjgIJcbiAgICovXG4gIGRpc2FibGVkRGF5cz86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuIHwgdm9pZFxuICAvKipcbiAgICog6Ieq5a6a5LmJ5LiL5ouJ5qGG5YaF5a65XG4gICAqL1xuICBkcm9wZG93blJlbmRlcj86IChlbGVtZW50OiBKU1guRWxlbWVudCkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiAyMDIyMDQwNzog6buY6K6k55qE5pel5pyf5pe26Ze05Li6IDEyIOeCue+8jOWPr+S7peS9v+eUqOatpCBQcm9wIOS/ruaUueWwj+aXtlxuICAgKi9cbiAgaG91cj86IG51bWJlclxuICAvKipcbiAgICog6K6+572u6L6T5YWl5qGG57G75Z6LXG4gICAqL1xuICBpbnRlbnQ/OiBcIm5vcm1hbFwiIHwgXCJwcmltYXJ5XCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJkYW5nZXJcIlxuICAvKipcbiAgICog5pyA5aSn6ZmQ5Yi25pel5pyfXG4gICAqL1xuICBtYXhEYXRlPzogRGF0ZSB8IG51bGxcbiAgLyoqXG4gICAqIOacgOWwj+mZkOWItuaXpeacn1xuICAgKi9cbiAgbWluRGF0ZT86IERhdGUgfCBudWxsXG4gIC8qKlxuICAgKiDml6XmnJ/mlLnlj5jml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZGF0ZT86IERhdGUgfCBcIlwiIHwgbnVsbCkgPT4gdm9pZFxuICAvKipcbiAgICog5pi+56S654q25oCB5Y+R55Sf5Y+Y5YyW5pe255qEaGFuZGxlclxuICAgKi9cbiAgb25WaXNpYmxlQ2hhbmdlPzogKHZpc2libGU6IGJvb2xlYW4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOWNoOS9jeWtl+esplxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOW8ueWHuuWxguS9jee9rlxuICAgKi9cbiAgcGxhY2VtZW50PzogUGxhY2VtZW50XG4gIC8qKlxuICAgKiDkvKDlhaUgUG9wb3ZlciDnmoQgcHJvcHNcbiAgICovXG4gIHBvcG92ZXJQcm9wcz86IElQb3BvdmVyUHJvcHNcbiAgLyoqXG4gICAqIOiHquWumuS5ieWmguS9lea4suafk+avj+S4quaXpeacn1xuICAgKi9cbiAgcmVuZGVyRGF5PzogKGRheTogRGF0ZSkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlv6vmjbfpgInmi6npobnvvIzmoLzlvI/vvJpbeyBsYWJlbDogXCLnpZblm73nlJ/ml6VcIiwgdmFsdWU6IG5ldyBEYXRlKFwiMjAyMi0xMC0wMVwiKSB9XVxuICAgKi9cbiAgc2hvcnRjdXRzPzoge1xuICAgIC8qKlxuICAgICAqIOivpemhueeahOaWh+Wtl1xuICAgICAqL1xuICAgIGxhYmVsOiBSZWFjdC5SZWFjdE5vZGVcbiAgICAvKipcbiAgICAgKiDor6XpobnnmoTml6XmnJ9cbiAgICAgKi9cbiAgICB2YWx1ZTogRGF0ZVxuICB9W11cbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuFxuICAgKi9cbiAgc2l6ZT86IFwibWluaVwiIHwgXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIlxuICAvKipcbiAgICog6K6+572u5Li76aKYXG4gICAqL1xuICB0aGVtZT86IG51bGwgfCBcImxpZ2h0XCJcbiAgLyoqXG4gICAqIOiHquWumuS5ieinpuWPkeS4i+aLieeahOWFg+e0oFxuICAgKi9cbiAgdHJpZ2dlckVsZW1lbnQ/OiBKU1guRWxlbWVudFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5b2T5YmN5pel5pyfXG4gICAqL1xuICB2YWx1ZT86IERhdGUgfCBcIlwiIHwgbnVsbFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S65LiL5ouJ6YCJ5oupXG4gICAqL1xuICB2aXNpYmxlPzogYm9vbGVhbiB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVBpY2tlclxuICBleHRlbmRzIFJlYWN0LkZvcndhcmRSZWZFeG90aWNDb21wb25lbnQ8XG4gICAgSURhdGVQaWNrZXJQcm9wcyAmIFJlYWN0LlJlZkF0dHJpYnV0ZXM8YW55PlxuICA+IHtcbiAgUmFuZ2VQaWNrZXI6IHR5cGVvZiBSYW5nZVBpY2tlclxufVxuXG4vKipcbiAqIOaXpeacn+mAieaLqeWZqOeUqOS6juS6huino+W9k+WJjeW3sumAieaXpeacn++8jOmAieaLqeaIlui+k+WFpemcgOimgeeahOaXpeacn+OAgeaXpeacn+iMg+WbtOetieOAglxuICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBEYXRlUGlja2VyOiBJRGF0ZVBpY2tlciA9IGZvcndhcmRSZWYoXG4gIChcbiAgICB7XG4gICAgICBhbGxvd0NsZWFyLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgY2xvc2VPblNlbGVjdCxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGRlZmF1bHRWaXNpYmxlLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZERheXMsXG4gICAgICBkcm9wZG93blJlbmRlcixcbiAgICAgIGhvdXIgPSAxMixcbiAgICAgIGludGVudCxcbiAgICAgIG1heERhdGUsXG4gICAgICBtaW5EYXRlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkNsaWNrLFxuICAgICAgb25WaXNpYmxlQ2hhbmdlLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBwb3BvdmVyUHJvcHMsXG4gICAgICByZW5kZXJEYXksXG4gICAgICBzaG9ydGN1dHMsXG4gICAgICBzaXplOiBzaXplUHJvcCxcbiAgICAgIHRoZW1lLFxuICAgICAgdHJpZ2dlckVsZW1lbnQsXG4gICAgICB2YWx1ZTogdmFsdWVQcm9wLFxuICAgICAgdmlzaWJsZTogdmlzaWJsZVByb3AsXG4gICAgICAuLi5vdGhlclByb3BzXG4gICAgfTogSURhdGVQaWNrZXJQcm9wcyxcbiAgICByZWZcbiAgKSA9PiB7XG4gICAgY29uc3QgW21vbnRoLCBzZXRNb250aF0gPSB1c2VTdGF0ZTxEYXRlIHwgXCJcIiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgICAgaWYgKHZhbHVlUHJvcCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWVQcm9wXG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9KVxuICAgIGNvbnN0IFtzZWxlY3RlZERheSwgc2V0U2VsZWN0ZWREYXldID0gdXNlU3RhdGU8XG4gICAgICBEYXRlIHwgXCJcIiB8IG51bGwgfCB1bmRlZmluZWRcbiAgICA+KCgpID0+IHtcbiAgICAgIGlmICh2YWx1ZVByb3AgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlUHJvcFxuICAgICAgfVxuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSlcbiAgICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlPHN0cmluZz4oKCkgPT4ge1xuICAgICAgaWYgKHZhbHVlUHJvcCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29udmVydERhdGVUb1N0cmluZyh2YWx1ZVByb3ApXG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0RGF0ZVRvU3RyaW5nKGRlZmF1bHRWYWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBcIlwiXG4gICAgfSlcbiAgICBjb25zdCBbdmlzaWJsZSwgc2V0VmlzaWJsZV0gPSB1c2VTdGF0ZTxib29sZWFuPigoKSA9PiB7XG4gICAgICBpZiAodmlzaWJsZVByb3AgIT09IG51bGwgJiYgdmlzaWJsZVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdmlzaWJsZVByb3BcbiAgICAgIH1cbiAgICAgIGlmIChkZWZhdWx0VmlzaWJsZSAhPT0gbnVsbCAmJiBkZWZhdWx0VmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmlzaWJsZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcbiAgICBjb25zdCBbY2xlYXJJY29uU3RhdGUsIHNldENsZWFySWNvblN0YXRlXSA9IHVzZVN0YXRlPFwiaW5cIiB8IFwib3V0XCI+KFwib3V0XCIpXG4gICAgY29uc3QgbmV4dENsaWNrSW5zaWRlUmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gICAgLy8g55u45b2T5LqO55Sf5ZG95ZGo5pyfIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuICAgIGlmICh2YWx1ZVByb3AgIT09IG51bGwgJiYgc2VsZWN0ZWREYXkgIT09IHZhbHVlUHJvcCkge1xuICAgICAgc2V0TW9udGgodmFsdWVQcm9wKVxuICAgICAgc2V0U2VsZWN0ZWREYXkodmFsdWVQcm9wKVxuICAgICAgc2V0VmFsdWUoY29udmVydERhdGVUb1N0cmluZyh2YWx1ZVByb3ApKVxuICAgIH1cbiAgICBpZiAodmlzaWJsZVByb3AgIT09IG51bGwgJiYgdmlzaWJsZSAhPT0gISF2aXNpYmxlUHJvcCkge1xuICAgICAgc2V0VmlzaWJsZSghIXZpc2libGVQcm9wKVxuICAgIH1cblxuICAgIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPGFueT4obnVsbClcblxuICAgIGNvbnN0IHsgc2l6ZTogc2l6ZUNvbnRleHQgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dClcbiAgICBjb25zdCBzaXplID0gZ2V0Q29tcHV0ZWRTaXplKHNpemVQcm9wLCBzaXplQ29udGV4dClcblxuICAgIGNvbnN0IGNsYXNzU2V0ID0gY2xhc3NOYW1lcyhcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGAke3ByZWZpeH0tZGF0ZUJhc2VgLFxuICAgICAgYCR7cHJlZml4fS0ke3NpemV9YFxuICAgIClcblxuICAgIGNvbnN0IHNob3J0Y3V0c0VuYWJsZWQgPSBzaG9ydGN1dHMgJiYgc2hvcnRjdXRzLmxlbmd0aCA+IDBcblxuICAgIGNvbnN0IGlzRGF5RGlzYWJsZWQgPSAoZGF5OiBEYXRlKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZGlzYWJsZWREYXlzICYmIGRpc2FibGVkRGF5cyhkYXkpKSB8fFxuICAgICAgICBEYXRlVXRpbHMuaXNEYXlCZWZvcmUoZGF5LCBtaW5EYXRlKSB8fFxuICAgICAgICBEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXksIG1heERhdGUpXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlVmlzaWJsZUNoYW5nZSA9IChib29sOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKG5leHRDbGlja0luc2lkZVJlZi5jdXJyZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgbmV4dENsaWNrSW5zaWRlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgIC8vIOWxleW8gOaXtu+8jOWmguaenOWcqOWGhemDqOWFg+e0oOeCueWHu++8jOWImeS4jeWBmum7mOiupOeahOaUtui1t+aTjeS9nFxuICAgICAgICAgIGlmICghYm9vbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbCA9IGNvbnZlcnREYXRlVG9TdHJpbmcoc2VsZWN0ZWREYXkpXG4gICAgICAgIGlmICghYm9vbCAmJiB2YWx1ZSAhPT0gbmV3VmFsKSB7XG4gICAgICAgICAgc2V0VmFsdWUobmV3VmFsKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgICBvblZpc2libGVDaGFuZ2UoYm9vbClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRWaXNpYmxlKGJvb2wpXG4gICAgICAgIH1cbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRGF5Q2xpY2sgPSAoXG4gICAgICBzZWxlY3RlZERheU5ldzogRGF0ZSxcbiAgICAgIHsgZGlzYWJsZWQ6IGJvb2wgfTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxuICAgICkgPT4ge1xuICAgICAgaWYgKGlzRGF5RGlzYWJsZWQoc2VsZWN0ZWREYXlOZXcpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2VsZWN0ZWREYXlOZXcuc2V0SG91cnMoaG91ciwgMCwgMCwgMClcbiAgICAgIGlmICghYm9vbCkge1xuICAgICAgICBpZiAoY2xvc2VPblNlbGVjdCkge1xuICAgICAgICAgIC8vIOW7tui/n+aYr+S4uuS6huiuqeeKtuaAgeeahOWPmOWMluWcqOinhuinieS4iuWFiOiiq+aOpeWPl1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9uVmlzaWJsZUNoYW5nZSkge1xuICAgICAgICAgICAgICBvblZpc2libGVDaGFuZ2UoZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlzaWJsZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAxMDApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIURhdGVVdGlscy5pc1NhbWVEYXkoc2VsZWN0ZWREYXlOZXcsIHNlbGVjdGVkRGF5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFNlbGVjdGVkRGF5KHNlbGVjdGVkRGF5TmV3KVxuICAgICAgICAgICAgc2V0VmFsdWUoY29udmVydERhdGVUb1N0cmluZyhzZWxlY3RlZERheU5ldykpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgb25DaGFuZ2Uoc2VsZWN0ZWREYXlOZXcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoe1xuICAgICAgdGFyZ2V0OiB7IHZhbHVlOiB2YWwgfSxcbiAgICB9OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgc2V0VmFsdWUodmFsKVxuICAgICAgaWYgKHZhbC50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgICAgaWYgKHZhbHVlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNldFNlbGVjdGVkRGF5KG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UoXCJcIilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0xlZ2FsRGF0ZVN0cmluZyh2YWwpKSB7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2YWwpXG4gICAgICAgIG5ld0RhdGUuc2V0SG91cnMoaG91ciwgMCwgMCwgMClcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFpc0RheURpc2FibGVkKG5ld0RhdGUpICYmXG4gICAgICAgICAgIURhdGVVdGlscy5pc1NhbWVEYXkobmV3RGF0ZSwgc2VsZWN0ZWREYXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICh2YWx1ZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHNldFNlbGVjdGVkRGF5KG5ld0RhdGUpXG4gICAgICAgICAgICBzZXRWYWx1ZShjb252ZXJ0RGF0ZVRvU3RyaW5nKG5ld0RhdGUpKVxuICAgICAgICAgICAgaWYgKCFEYXRlVXRpbHMuaXNTYW1lTW9udGgobmV3RGF0ZSwgc2VsZWN0ZWREYXkpKSB7XG4gICAgICAgICAgICAgIHNldE1vbnRoKG5ld0RhdGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgb25DaGFuZ2UobmV3RGF0ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVJbnB1dEZvY3VzID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgICBvblZpc2libGVDaGFuZ2UodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRWaXNpYmxlKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVJbnB1dEtleURvd24gPSAoe1xuICAgICAga2V5LFxuICAgIH06IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGtleXMgPSBbXCJUYWJcIiwgXCJFc2NhcGVcIiwgXCJFbnRlclwiXVxuICAgICAgaWYgKGtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBoYW5kbGVWaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50Py5pbnB1dC5ibHVyKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVNb250aENoYW5nZSA9IChkYXRlOiBEYXRlKSA9PiB7XG4gICAgICBjb25zdCBuZXdEYXRlID0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgRGF0ZVV0aWxzLmlzRGF5QmVmb3JlKGRhdGUsIG1pbkRhdGUpKSB7XG4gICAgICAgIG5ld0RhdGUuc2V0TW9udGgobWluRGF0ZS5nZXRNb250aCgpKVxuICAgICAgfSBlbHNlIGlmIChtYXhEYXRlICYmIERhdGVVdGlscy5pc0RheUFmdGVyKGRhdGUsIG1heERhdGUpKSB7XG4gICAgICAgIG5ld0RhdGUuc2V0TW9udGgobWF4RGF0ZS5nZXRNb250aCgpKVxuICAgICAgfVxuICAgICAgc2V0TW9udGgobmV3RGF0ZSlcbiAgICB9XG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICAgIGlucHV0OiBpbnB1dFJlZi5jdXJyZW50LFxuICAgICAgaGFuZGxlRGF5Q2xpY2ssXG4gICAgICBoYW5kbGVWaXNpYmxlQ2hhbmdlLFxuICAgIH0pKVxuXG4gICAgY29uc3QgcG9wdXBFbGVtZW50ID0gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tcG9wdXBgfT5cbiAgICAgICAge3Nob3J0Y3V0c0VuYWJsZWQgJiYgKFxuICAgICAgICAgIDxTaG9ydGN1dHNcbiAgICAgICAgICAgIG9uU2hvcnRjdXRDbGljaz17KHZhbHVlU2hvcnRjdXQ6IERhdGUpID0+IHtcbiAgICAgICAgICAgICAgaGFuZGxlRGF5Q2xpY2sodmFsdWVTaG9ydGN1dCwge30pXG4gICAgICAgICAgICAgIHNldE1vbnRoKHZhbHVlU2hvcnRjdXQpXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgc2VsZWN0ZWREYXk9e3NlbGVjdGVkRGF5fVxuICAgICAgICAgICAgc2hvcnRjdXRzPXtzaG9ydGN1dHN9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPERheVBpY2tlclxuICAgICAgICAgIGRpc2FibGVkRGF5cz17aXNEYXlEaXNhYmxlZH1cbiAgICAgICAgICBmcm9tTW9udGg9e21pbkRhdGV9XG4gICAgICAgICAgdG9Nb250aD17bWF4RGF0ZX1cbiAgICAgICAgICBjYW5DaGFuZ2VNb250aFxuICAgICAgICAgIGNsYXNzTmFtZXM9e3N0eWxlc31cbiAgICAgICAgICBtb250aD17bW9udGggfHwgdW5kZWZpbmVkfVxuICAgICAgICAgIG1vbnRocz17TU9OVEhTfVxuICAgICAgICAgIHdlZWtkYXlzTG9uZz17V0VFS0RBWVNfTE9OR31cbiAgICAgICAgICB3ZWVrZGF5c1Nob3J0PXtXRUVLREFZU19TSE9SVH1cbiAgICAgICAgICBzZWxlY3RlZERheXM9e3NlbGVjdGVkRGF5IHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICBuYXZiYXJFbGVtZW50PXtcbiAgICAgICAgICAgIDxOYXZiYXJcbiAgICAgICAgICAgICAgbWF4RGF0ZT17bWF4RGF0ZX1cbiAgICAgICAgICAgICAgbWluRGF0ZT17bWluRGF0ZX1cbiAgICAgICAgICAgICAgey4uLk5hdmJhckVsZW1lbnRQcm9wc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHRpb25FbGVtZW50PXtcbiAgICAgICAgICAgIDxDYXB0aW9uXG4gICAgICAgICAgICAgIG1heERhdGU9e21heERhdGV9XG4gICAgICAgICAgICAgIG1pbkRhdGU9e21pbkRhdGV9XG4gICAgICAgICAgICAgIG9uRGF0ZUNoYW5nZT17aGFuZGxlTW9udGhDaGFuZ2V9XG4gICAgICAgICAgICAgIHsuLi5DYXB0aW9uRWxlbWVudFByb3BzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgb25EYXlDbGljaz17aGFuZGxlRGF5Q2xpY2t9XG4gICAgICAgICAgb25Nb250aENoYW5nZT17aGFuZGxlTW9udGhDaGFuZ2V9XG4gICAgICAgICAgcmVuZGVyRGF5PXsoZGF5OiBEYXRlKSA9PiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1jZWxsYH0+XG4gICAgICAgICAgICAgIHtyZW5kZXJEYXkgJiYgcmVuZGVyRGF5KGRheSkgPyByZW5kZXJEYXkoZGF5KSA6IGRheS5nZXREYXRlKCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKVxuXG4gICAgY29uc3QgaW5wdXRFbGVtZW50ID0gKFxuICAgICAgPElucHV0XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NTZXR9XG4gICAgICAgIGNsZWF2ZU9wdGlvbnM9e3tcbiAgICAgICAgICBibG9ja3M6IFs0LCAyLCAyXSxcbiAgICAgICAgICBkZWxpbWl0ZXI6IFwiLVwiLFxuICAgICAgICB9fVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGludGVudD17aW50ZW50fVxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgIG9uRm9jdXM9e2hhbmRsZUlucHV0Rm9jdXN9XG4gICAgICAgIG9uS2V5RG93bj17aGFuZGxlSW5wdXRLZXlEb3dufVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgICAgIG9uQ2xpY2soKVxuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0Q2xpY2tJbnNpZGVSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgfX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICByaWdodEVsZW1lbnQ9e1xuICAgICAgICAgIGFsbG93Q2xlYXIgPyAoXG4gICAgICAgICAgICA8SWNvblxuICAgICAgICAgICAgICBpY29uPXtcbiAgICAgICAgICAgICAgICBjbGVhckljb25TdGF0ZSA9PT0gXCJpblwiID8gXCJjYW5jZWwtY2lyY2xlXCIgOiBcImNhbGVuZGFyLW91dGxpbmVkXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHNldENsZWFySWNvblN0YXRlKFwiaW5cIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldENsZWFySWNvblN0YXRlKFwib3V0XCIpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRGF5KFwiXCIpXG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKFwiXCIpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoXCJcIilcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9uVmlzaWJsZUNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodmlzaWJsZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZXh0Q2xpY2tJbnNpZGVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxJY29uXG4gICAgICAgICAgICAgIGljb249XCJjYWxlbmRhci1vdXRsaW5lZFwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0IOeUqOS6juimhuebliBJbnB1dCDmnKzouqvorr7nva7nmoQgbmV4dENsaWNrSW5zaWRlUmVmXG4gICAgICAgICAgICAgICAgLy8g5rOo5oSPIOS4i+S4gOasoSBoYW5kbGVWaXNpYmxlQ2hhbmdlIOiwg+eUqOS4reeahCBzZXRUaW1lb3V0XG4gICAgICAgICAgICAgICAgLy8g55Sx5LqO5piv5Zyo5YWo5bGAIGNsaWNrIOS6i+S7tuS4reinpuWPke+8jOWboOatpOWPr+S7peS/neivgemhuuW6j+WcqOatpOS5i+WQjlxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgbmV4dENsaWNrSW5zaWRlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgey4uLm90aGVyUHJvcHN9XG4gICAgICAvPlxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICA8UG9wb3ZlclxuICAgICAgICBhcnJvd2VkPXtmYWxzZX1cbiAgICAgICAgb25WaXNpYmxlQ2hhbmdlPXtoYW5kbGVWaXNpYmxlQ2hhbmdlfVxuICAgICAgICBwbGFjZW1lbnQ9e3BsYWNlbWVudH1cbiAgICAgICAgcG9wdXA9e1xuICAgICAgICAgIDw+XG4gICAgICAgICAgICB7ZHJvcGRvd25SZW5kZXIgJiYgZHJvcGRvd25SZW5kZXIocG9wdXBFbGVtZW50KVxuICAgICAgICAgICAgICA/IGRyb3Bkb3duUmVuZGVyKHBvcHVwRWxlbWVudClcbiAgICAgICAgICAgICAgOiBwb3B1cEVsZW1lbnR9XG4gICAgICAgICAgPC8+XG4gICAgICAgIH1cbiAgICAgICAgcG9wdXBTdHlsZT17e1xuICAgICAgICAgIG1heFdpZHRoOiBzaG9ydGN1dHNFbmFibGVkID8gXCIzNDJweFwiIDogXCIyNDJweFwiLFxuICAgICAgICAgIHdpZHRoOiBzaG9ydGN1dHNFbmFibGVkID8gXCIzNDJweFwiIDogXCIyNDJweFwiLFxuICAgICAgICB9fVxuICAgICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICB2aXNpYmxlPXt2aXNpYmxlfVxuICAgICAgICB7Li4ucG9wb3ZlclByb3BzfVxuICAgICAgPlxuICAgICAgICB7dHJpZ2dlckVsZW1lbnQgfHwgaW5wdXRFbGVtZW50fVxuICAgICAgPC9Qb3BvdmVyPlxuICAgIClcbiAgfVxuKVxuXG5EYXRlUGlja2VyLmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyXCJcblxuRGF0ZVBpY2tlci5SYW5nZVBpY2tlciA9IFJhbmdlUGlja2VyXG5cbkRhdGVQaWNrZXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICog5piv5ZCm5pSv5oyB5riF6ZmkXG4gICAqL1xuICBhbGxvd0NsZWFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5piv5ZCm5Zyo6YCJ5oup5ZCO77yM5raI5aSxIFBvcG92ZXJcbiAgICovXG4gIGNsb3NlT25TZWxlY3Q6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5YaF6YOo6amx5Yqo77ya6buY6K6k5pel5pyfXG4gICAqL1xuICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvJrpu5jorqTmmK/lkKbmmL7npLrkuIvmi4lcbiAgICovXG4gIGRlZmF1bHRWaXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog56aB5q2i6YCJ5oup55qE5aSp77yMZGF5ID0+IGJvb2zvvIzmr4/kuIDlpKnmmK/nmoTml7bpl7TkuLogMTI6MDA6MDDvvIzov5nkuIDkuKrmmK/nlLEgZGF5LXBpY2tlci1yZWFjdCDlhrPlrprnmoTvvJtcbiAgICog5q+U6L6D5pel5pyf55qE5pe25YCZ5bCP5b+D6L+Z5LiA54K544CCXG4gICAqL1xuICBkaXNhYmxlZERheXM6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog6Ieq5a6a5LmJ5LiL5ouJ5qGG5YaF5a65XG4gICAqL1xuICBkcm9wZG93blJlbmRlcjogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIDIwMjIwNDA3OiDpu5jorqTnmoTml6XmnJ/ml7bpl7TkuLogMTIg54K577yM5Y+v5Lul5L2/55So5q2kIFByb3Ag5L+u5pS55bCP5pe2XG4gICAqL1xuICBob3VyOiBQcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICog6K6+572u6L6T5YWl5qGG57G75Z6LXG4gICAqL1xuICBpbnRlbnQ6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgXCJub3JtYWxcIixcbiAgICBcInByaW1hcnlcIixcbiAgICBcInN1Y2Nlc3NcIixcbiAgICBcIndhcm5pbmdcIixcbiAgICBcImRhbmdlclwiLFxuICBdKSxcbiAgLyoqXG4gICAqIOacgOWkp+mZkOWItuaXpeacn1xuICAgKi9cbiAgbWF4RGF0ZTogUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSksXG4gIC8qKlxuICAgKiDmnIDlsI/pmZDliLbml6XmnJ9cbiAgICovXG4gIG1pbkRhdGU6IFByb3BUeXBlcy5pbnN0YW5jZU9mKERhdGUpLFxuICAvKipcbiAgICog5pel5pyf5pS55Y+Y5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIOaYvuekuueKtuaAgeWPkeeUn+WPmOWMluaXtueahGhhbmRsZXJcbiAgICovXG4gIG9uVmlzaWJsZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDljaDkvY3lrZfnrKZcbiAgICovXG4gIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5by55Ye65bGC5L2N572uXG4gICAqL1xuICBwbGFjZW1lbnQ6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgXCJ0b3BcIixcbiAgICBcImxlZnRcIixcbiAgICBcInJpZ2h0XCIsXG4gICAgXCJib3R0b21cIixcbiAgICBcInRvcExlZnRcIixcbiAgICBcInRvcFJpZ2h0XCIsXG4gICAgXCJib3R0b21MZWZ0XCIsXG4gICAgXCJib3R0b21SaWdodFwiLFxuICAgIFwibGVmdFRvcFwiLFxuICAgIFwibGVmdEJvdHRvbVwiLFxuICAgIFwicmlnaHRUb3BcIixcbiAgICBcInJpZ2h0Qm90dG9tXCIsXG4gIF0pLFxuICAvKipcbiAgICog5Lyg5YWlIFBvcG92ZXIg55qEIHByb3BzXG4gICAqL1xuICBwb3BvdmVyUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiDoh6rlrprkuYnlpoLkvZXmuLLmn5Pmr4/kuKrml6XmnJ9cbiAgICovXG4gIHJlbmRlckRheTogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOW/q+aNt+mAieaLqemhue+8jOagvOW8j++8mlt7IGxhYmVsOiBcIuelluWbveeUn+aXpVwiLCB2YWx1ZTogbmV3IERhdGUoXCIyMDIyLTEwLTAxXCIpIH1dXG4gICAqL1xuICBzaG9ydGN1dHM6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDorr7nva7lsLrlr7hcbiAgICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihbXCJtaW5pXCIsIFwic21hbGxcIiwgXCJtZWRpdW1cIiwgXCJsYXJnZVwiXSksXG4gIC8qKlxuICAgKiDorr7nva7kuLvpophcbiAgICovXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2YoW251bGwsIFwibGlnaHRcIl0pLFxuICAvKipcbiAgICog6Ieq5a6a5LmJ6Kem5Y+R5LiL5ouJ55qE5YWD57SgXG4gICAqL1xuICB0cmlnZ2VyRWxlbWVudDogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muW9k+WJjeaXpeacn1xuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDlpJbpg6jmjqfliLbvvJrmmK/lkKbmmL7npLrkuIvmi4npgInmi6lcbiAgICovXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxufVxuXG5EYXRlUGlja2VyLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWxsb3dDbGVhcjogZmFsc2UsXG4gIGNsYXNzTmFtZTogXCJcIixcbiAgY2xvc2VPblNlbGVjdDogZmFsc2UsXG4gIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgZGVmYXVsdFZpc2libGU6IG51bGwsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgZGlzYWJsZWREYXlzOiBub29wLFxuICBkcm9wZG93blJlbmRlcjogdW5kZWZpbmVkLFxuICBob3VyOiAxMixcbiAgaW50ZW50OiBcIm5vcm1hbFwiLFxuICBtYXhEYXRlOiBnZXREZWZhdWx0TWF4RGF0ZSgpLFxuICBtaW5EYXRlOiBnZXREZWZhdWx0TWluRGF0ZSgpLFxuICBvbkNoYW5nZTogbm9vcCxcbiAgb25WaXNpYmxlQ2hhbmdlOiBub29wLFxuICBwbGFjZWhvbGRlcjogXCLpgInmi6nml6XmnJ9cIixcbiAgcGxhY2VtZW50OiBcImJvdHRvbUxlZnRcIixcbiAgcG9wb3ZlclByb3BzOiB7fSxcbiAgcmVuZGVyRGF5OiB1bmRlZmluZWQsXG4gIHNob3J0Y3V0czogdW5kZWZpbmVkLFxuICBzaXplOiBcInNtYWxsXCIsXG4gIHRoZW1lOiBudWxsLFxuICB0cmlnZ2VyRWxlbWVudDogdW5kZWZpbmVkLFxuICB2YWx1ZTogbnVsbCxcbiAgdmlzaWJsZTogbnVsbCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBRUEsT0FBT0EsS0FBSyxJQUNWQyxVQUFVLEVBQ1ZDLFVBQVUsRUFDVkMsbUJBQW1CLEVBQ25CQyxNQUFNLEVBQ05DLFFBQVEsUUFDSCxPQUFPO0FBQ2QsT0FBT0MsU0FBUyxNQUFNLFlBQVk7QUFDbEMsT0FBT0MsVUFBVSxNQUFNLFlBQVk7QUFDbkMsT0FBT0MsR0FBRyxNQUFNLGtCQUFrQjtBQUNsQyxTQUNFQyxtQkFBbUIsRUFDbkJDLFNBQVMsRUFDVEMsa0JBQWtCLFFBQ2Isa0JBQWtCO0FBQ3pCLE9BQU9DLFdBQVcsTUFBTSxlQUFlO0FBQ3ZDLE9BQU8sU0FBUztBQUNoQixPQUFPQyxNQUFNLE1BQU0sY0FBYztBQUNqQyxTQUFTQyxhQUFhLEVBQUVDLGVBQWUsUUFBUSxvQkFBb0I7QUFDbkUsT0FBT0MsSUFBSSxNQUFNLFNBQVM7QUFDMUIsT0FBT0MsS0FBSyxNQUFNLFVBQVU7QUFFNUIsT0FBT0MsT0FBTyxNQUF5QixZQUFZO0FBQ25ELE9BQU9DLE9BQU8sTUFBTSxXQUFXO0FBQy9CLE9BQU9DLE1BQU0sTUFBTSxVQUFVO0FBQzdCLE9BQU9DLFNBQVMsTUFBTSxhQUFhO0FB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