matrix-react-sdk
Version:
SDK for matrix.org using React
241 lines (238 loc) • 42.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _LegacyCallContextMenu = _interopRequireDefault(require("../../context_menus/LegacyCallContextMenu"));
var _DialpadContextMenu = _interopRequireDefault(require("../../context_menus/DialpadContextMenu"));
var _ContextMenu = require("../../../structures/ContextMenu");
var _languageHandler = require("../../../../languageHandler");
var _DeviceContextMenu = _interopRequireDefault(require("../../context_menus/DeviceContextMenu"));
var _MediaDeviceHandler = require("../../../../MediaDeviceHandler");
var _AccessibleButton = _interopRequireDefault(require("../../elements/AccessibleButton"));
const _excluded = ["children", "state", "className", "onLabel", "offLabel", "forceHide", "onHover"],
_excluded2 = ["state", "deviceKinds"];
/*
Copyright 2024 New Vector Ltd.
Copyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>
Copyright 2019-2021 The Matrix.org Foundation C.I.C.
Copyright 2015, 2016 OpenMarket Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (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; }
// Height of the header duplicated from CSS because we need to subtract it from our max
// height to get the max height of the video
const CONTEXT_MENU_VPADDING = 8; // How far the context menu sits above the button (px)
const CONTROLS_HIDE_DELAY = 2000;
const LegacyCallViewToggleButton = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
let {
children,
state: isOn,
className,
onLabel,
offLabel,
forceHide,
onHover
} = _ref,
props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
const classes = (0, _classnames.default)("mx_LegacyCallViewButtons_button", className, {
mx_LegacyCallViewButtons_button_on: isOn,
mx_LegacyCallViewButtons_button_off: !isOn
});
const title = forceHide ? undefined : isOn ? onLabel : offLabel;
return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, (0, _extends2.default)({
ref: ref,
className: classes,
title: title,
placement: "top",
onTooltipOpenChange: onHover
}, props), children);
});
const LegacyCallViewDropdownButton = _ref2 => {
let {
state,
deviceKinds
} = _ref2,
props = (0, _objectWithoutProperties2.default)(_ref2, _excluded2);
const [menuDisplayed, buttonRef, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)();
const [hoveringDropdown, setHoveringDropdown] = (0, _react.useState)(false);
const classes = (0, _classnames.default)("mx_LegacyCallViewButtons_button", "mx_LegacyCallViewButtons_dropdownButton", {
mx_LegacyCallViewButtons_dropdownButton_collapsed: !menuDisplayed
});
const onClick = event => {
event.stopPropagation();
openMenu();
};
return /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, (0, _extends2.default)({
ref: buttonRef,
forceHide: menuDisplayed || hoveringDropdown,
state: state
}, props), /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, {
className: classes,
onClick: onClick,
onHover: hovering => setHoveringDropdown(hovering),
state: state
}), menuDisplayed && buttonRef.current && /*#__PURE__*/_react.default.createElement(_DeviceContextMenu.default, (0, _extends2.default)({}, (0, _ContextMenu.alwaysAboveRightOf)(buttonRef.current.getBoundingClientRect()), {
onFinished: closeMenu,
deviceKinds: deviceKinds
})));
};
class LegacyCallViewButtons extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "dialpadButton", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "contextMenuButton", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "controlsHideTimer", null);
(0, _defineProperty2.default)(this, "onControlsHideTimer", () => {
if (this.state.hoveringControls || this.state.showDialpad || this.state.showMoreMenu) return;
this.controlsHideTimer = null;
this.setState({
visible: false
});
});
(0, _defineProperty2.default)(this, "onMouseEnter", () => {
this.setState({
hoveringControls: true
});
});
(0, _defineProperty2.default)(this, "onMouseLeave", () => {
this.setState({
hoveringControls: false
});
});
(0, _defineProperty2.default)(this, "onDialpadClick", () => {
if (!this.state.showDialpad) {
this.setState({
showDialpad: true
});
this.showControls();
} else {
this.setState({
showDialpad: false
});
}
});
(0, _defineProperty2.default)(this, "onMoreClick", () => {
this.setState({
showMoreMenu: true
});
this.showControls();
});
(0, _defineProperty2.default)(this, "closeDialpad", () => {
this.setState({
showDialpad: false
});
});
(0, _defineProperty2.default)(this, "closeContextMenu", () => {
this.setState({
showMoreMenu: false
});
});
this.state = {
showDialpad: false,
hoveringControls: false,
showMoreMenu: false,
visible: true
};
}
componentDidMount() {
this.showControls();
}
showControls() {
if (this.state.showMoreMenu || this.state.showDialpad) return;
if (!this.state.visible) {
this.setState({
visible: true
});
}
if (this.controlsHideTimer !== null) {
clearTimeout(this.controlsHideTimer);
}
this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY);
}
render() {
const callControlsClasses = (0, _classnames.default)("mx_LegacyCallViewButtons", {
mx_LegacyCallViewButtons_hidden: !this.state.visible
});
let dialPad;
if (this.state.showDialpad && this.dialpadButton.current) {
dialPad = /*#__PURE__*/_react.default.createElement(_DialpadContextMenu.default, (0, _extends2.default)({}, (0, _ContextMenu.alwaysMenuProps)(this.dialpadButton.current.getBoundingClientRect(), _ContextMenu.ChevronFace.None, CONTEXT_MENU_VPADDING), {
// We mount the context menus as a child typically in order to include the
// context menus when fullscreening the call content.
// However, this does not work as well when the call is embedded in a
// picture-in-picture frame. Thus, only mount as child when we are *not* in PiP.
mountAsChild: !this.props.pipMode,
onFinished: this.closeDialpad,
call: this.props.call
}));
}
let contextMenu;
if (this.state.showMoreMenu && this.contextMenuButton.current) {
contextMenu = /*#__PURE__*/_react.default.createElement(_LegacyCallContextMenu.default, (0, _extends2.default)({}, (0, _ContextMenu.alwaysMenuProps)(this.contextMenuButton.current.getBoundingClientRect(), _ContextMenu.ChevronFace.None, CONTEXT_MENU_VPADDING), {
mountAsChild: !this.props.pipMode,
onFinished: this.closeContextMenu,
call: this.props.call
}));
}
return /*#__PURE__*/_react.default.createElement("div", {
className: callControlsClasses,
onMouseEnter: this.onMouseEnter,
onMouseLeave: this.onMouseLeave
}, dialPad, contextMenu, this.props.buttonsVisibility.dialpad && /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, {
className: "mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_dialpad",
ref: this.dialpadButton,
onClick: this.onDialpadClick,
isExpanded: this.state.showDialpad,
title: (0, _languageHandler._t)("voip|dialpad"),
placement: "top"
}), /*#__PURE__*/_react.default.createElement(LegacyCallViewDropdownButton, {
state: !this.props.buttonsState.micMuted,
className: "mx_LegacyCallViewButtons_button_mic",
onLabel: (0, _languageHandler._t)("voip|disable_microphone"),
offLabel: (0, _languageHandler._t)("voip|enable_microphone"),
onClick: this.props.handlers.onMicMuteClick,
deviceKinds: [_MediaDeviceHandler.MediaDeviceKindEnum.AudioInput, _MediaDeviceHandler.MediaDeviceKindEnum.AudioOutput]
}), this.props.buttonsVisibility.vidMute && /*#__PURE__*/_react.default.createElement(LegacyCallViewDropdownButton, {
state: !this.props.buttonsState.vidMuted,
className: "mx_LegacyCallViewButtons_button_vid",
onLabel: (0, _languageHandler._t)("voip|disable_camera"),
offLabel: (0, _languageHandler._t)("voip|enable_camera"),
onClick: this.props.handlers.onVidMuteClick,
deviceKinds: [_MediaDeviceHandler.MediaDeviceKindEnum.VideoInput]
}), this.props.buttonsVisibility.screensharing && /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, {
state: this.props.buttonsState.screensharing,
className: "mx_LegacyCallViewButtons_button_screensharing",
onLabel: (0, _languageHandler._t)("voip|stop_screenshare"),
offLabel: (0, _languageHandler._t)("voip|start_screenshare"),
onClick: this.props.handlers.onScreenshareClick
}), this.props.buttonsVisibility.sidebar && /*#__PURE__*/_react.default.createElement(LegacyCallViewToggleButton, {
state: this.props.buttonsState.sidebarShown,
className: "mx_LegacyCallViewButtons_button_sidebar",
onLabel: (0, _languageHandler._t)("voip|hide_sidebar_button"),
offLabel: (0, _languageHandler._t)("voip|show_sidebar_button"),
onClick: this.props.handlers.onToggleSidebarClick
}), this.props.buttonsVisibility.contextMenu && /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuTooltipButton, {
className: "mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_more",
onClick: this.onMoreClick,
ref: this.contextMenuButton,
isExpanded: this.state.showMoreMenu,
title: (0, _languageHandler._t)("voip|more_button"),
placement: "top"
}), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_hangup",
onClick: this.props.handlers.onHangupClick,
title: (0, _languageHandler._t)("voip|hangup"),
placement: "top"
}));
}
}
exports.default = LegacyCallViewButtons;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfTGVnYWN5Q2FsbENvbnRleHRNZW51IiwiX0RpYWxwYWRDb250ZXh0TWVudSIsIl9Db250ZXh0TWVudSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfRGV2aWNlQ29udGV4dE1lbnUiLCJfTWVkaWFEZXZpY2VIYW5kbGVyIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfZXhjbHVkZWQiLCJfZXhjbHVkZWQyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiQ09OVEVYVF9NRU5VX1ZQQURESU5HIiwiQ09OVFJPTFNfSElERV9ERUxBWSIsIkxlZ2FjeUNhbGxWaWV3VG9nZ2xlQnV0dG9uIiwiZm9yd2FyZFJlZiIsIl9yZWYiLCJyZWYiLCJjaGlsZHJlbiIsInN0YXRlIiwiaXNPbiIsImNsYXNzTmFtZSIsIm9uTGFiZWwiLCJvZmZMYWJlbCIsImZvcmNlSGlkZSIsIm9uSG92ZXIiLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJjbGFzc2VzIiwiY2xhc3NOYW1lcyIsIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fb24iLCJteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfYnV0dG9uX29mZiIsInRpdGxlIiwidW5kZWZpbmVkIiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzMiIsInBsYWNlbWVudCIsIm9uVG9vbHRpcE9wZW5DaGFuZ2UiLCJMZWdhY3lDYWxsVmlld0Ryb3Bkb3duQnV0dG9uIiwiX3JlZjIiLCJkZXZpY2VLaW5kcyIsIm1lbnVEaXNwbGF5ZWQiLCJidXR0b25SZWYiLCJvcGVuTWVudSIsImNsb3NlTWVudSIsInVzZUNvbnRleHRNZW51IiwiaG92ZXJpbmdEcm9wZG93biIsInNldEhvdmVyaW5nRHJvcGRvd24iLCJ1c2VTdGF0ZSIsIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19kcm9wZG93bkJ1dHRvbl9jb2xsYXBzZWQiLCJvbkNsaWNrIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJob3ZlcmluZyIsImN1cnJlbnQiLCJhbHdheXNBYm92ZVJpZ2h0T2YiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJvbkZpbmlzaGVkIiwiTGVnYWN5Q2FsbFZpZXdCdXR0b25zIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJjcmVhdGVSZWYiLCJob3ZlcmluZ0NvbnRyb2xzIiwic2hvd0RpYWxwYWQiLCJzaG93TW9yZU1lbnUiLCJjb250cm9sc0hpZGVUaW1lciIsInNldFN0YXRlIiwidmlzaWJsZSIsInNob3dDb250cm9scyIsImNvbXBvbmVudERpZE1vdW50IiwiY2xlYXJUaW1lb3V0Iiwid2luZG93Iiwic2V0VGltZW91dCIsIm9uQ29udHJvbHNIaWRlVGltZXIiLCJyZW5kZXIiLCJjYWxsQ29udHJvbHNDbGFzc2VzIiwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2hpZGRlbiIsImRpYWxQYWQiLCJkaWFscGFkQnV0dG9uIiwiYWx3YXlzTWVudVByb3BzIiwiQ2hldnJvbkZhY2UiLCJOb25lIiwibW91bnRBc0NoaWxkIiwicGlwTW9kZSIsImNsb3NlRGlhbHBhZCIsImNvbnRleHRNZW51IiwiY29udGV4dE1lbnVCdXR0b24iLCJjbG9zZUNvbnRleHRNZW51Iiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwiYnV0dG9uc1Zpc2liaWxpdHkiLCJkaWFscGFkIiwiQ29udGV4dE1lbnVUb29sdGlwQnV0dG9uIiwib25EaWFscGFkQ2xpY2siLCJpc0V4cGFuZGVkIiwiX3QiLCJidXR0b25zU3RhdGUiLCJtaWNNdXRlZCIsImhhbmRsZXJzIiwib25NaWNNdXRlQ2xpY2siLCJNZWRpYURldmljZUtpbmRFbnVtIiwiQXVkaW9JbnB1dCIsIkF1ZGlvT3V0cHV0IiwidmlkTXV0ZSIsInZpZE11dGVkIiwib25WaWRNdXRlQ2xpY2siLCJWaWRlb0lucHV0Iiwic2NyZWVuc2hhcmluZyIsIm9uU2NyZWVuc2hhcmVDbGljayIsInNpZGViYXIiLCJzaWRlYmFyU2hvd24iLCJvblRvZ2dsZVNpZGViYXJDbGljayIsIm9uTW9yZUNsaWNrIiwib25IYW5ndXBDbGljayIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy92b2lwL0xlZ2FjeUNhbGxWaWV3L0xlZ2FjeUNhbGxWaWV3QnV0dG9ucy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEgxaBpbW9uIEJyYW5kbmVyIDxzaW1vbi5icmEuYWdAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTUsIDIwMTYgT3Blbk1hcmtldCBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiwgdXNlU3RhdGUsIGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQgeyBNYXRyaXhDYWxsIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3dlYnJ0Yy9jYWxsXCI7XG5cbmltcG9ydCBMZWdhY3lDYWxsQ29udGV4dE1lbnUgZnJvbSBcIi4uLy4uL2NvbnRleHRfbWVudXMvTGVnYWN5Q2FsbENvbnRleHRNZW51XCI7XG5pbXBvcnQgRGlhbHBhZENvbnRleHRNZW51IGZyb20gXCIuLi8uLi9jb250ZXh0X21lbnVzL0RpYWxwYWRDb250ZXh0TWVudVwiO1xuaW1wb3J0IHtcbiAgICBhbHdheXNNZW51UHJvcHMsXG4gICAgYWx3YXlzQWJvdmVSaWdodE9mLFxuICAgIENoZXZyb25GYWNlLFxuICAgIENvbnRleHRNZW51VG9vbHRpcEJ1dHRvbixcbiAgICB1c2VDb250ZXh0TWVudSxcbn0gZnJvbSBcIi4uLy4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IERldmljZUNvbnRleHRNZW51IGZyb20gXCIuLi8uLi9jb250ZXh0X21lbnVzL0RldmljZUNvbnRleHRNZW51XCI7XG5pbXBvcnQgeyBNZWRpYURldmljZUtpbmRFbnVtIH0gZnJvbSBcIi4uLy4uLy4uLy4uL01lZGlhRGV2aWNlSGFuZGxlclwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQsIEJ1dHRvblByb3BzIGFzIEFjY2Vzc2libGVCdXR0b25Qcm9wcyB9IGZyb20gXCIuLi8uLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5cbi8vIEhlaWdodCBvZiB0aGUgaGVhZGVyIGR1cGxpY2F0ZWQgZnJvbSBDU1MgYmVjYXVzZSB3ZSBuZWVkIHRvIHN1YnRyYWN0IGl0IGZyb20gb3VyIG1heFxuLy8gaGVpZ2h0IHRvIGdldCB0aGUgbWF4IGhlaWdodCBvZiB0aGUgdmlkZW9cbmNvbnN0IENPTlRFWFRfTUVOVV9WUEFERElORyA9IDg7IC8vIEhvdyBmYXIgdGhlIGNvbnRleHQgbWVudSBzaXRzIGFib3ZlIHRoZSBidXR0b24gKHB4KVxuXG5jb25zdCBDT05UUk9MU19ISURFX0RFTEFZID0gMjAwMDtcblxudHlwZSBCdXR0b25Qcm9wcyA9IE9taXQ8QWNjZXNzaWJsZUJ1dHRvblByb3BzPFwiZGl2XCI+LCBcInRpdGxlXCIgfCBcImVsZW1lbnRcIj4gJiB7XG4gICAgc3RhdGU6IGJvb2xlYW47XG4gICAgb25MYWJlbD86IHN0cmluZztcbiAgICBvZmZMYWJlbD86IHN0cmluZztcbiAgICBmb3JjZUhpZGU/OiBib29sZWFuO1xuICAgIG9uSG92ZXI/OiAoaG92ZXJpbmc6IGJvb2xlYW4pID0+IHZvaWQ7XG59O1xuXG5jb25zdCBMZWdhY3lDYWxsVmlld1RvZ2dsZUJ1dHRvbiA9IGZvcndhcmRSZWY8SFRNTEVsZW1lbnQsIEJ1dHRvblByb3BzPihcbiAgICAoeyBjaGlsZHJlbiwgc3RhdGU6IGlzT24sIGNsYXNzTmFtZSwgb25MYWJlbCwgb2ZmTGFiZWwsIGZvcmNlSGlkZSwgb25Ib3ZlciwgLi4ucHJvcHMgfSwgcmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKFwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvblwiLCBjbGFzc05hbWUsIHtcbiAgICAgICAgICAgIG14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fb246IGlzT24sXG4gICAgICAgICAgICBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfYnV0dG9uX29mZjogIWlzT24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZm9yY2VIaWRlID8gdW5kZWZpbmVkIDogaXNPbiA/IG9uTGFiZWwgOiBvZmZMYWJlbDtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgICAgICAgICAgdGl0bGU9e3RpdGxlfVxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgb25Ub29sdGlwT3BlbkNoYW5nZT17b25Ib3Zlcn1cbiAgICAgICAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICApO1xuICAgIH0sXG4pO1xuXG5pbnRlcmZhY2UgSURyb3Bkb3duQnV0dG9uUHJvcHMgZXh0ZW5kcyBCdXR0b25Qcm9wcyB7XG4gICAgZGV2aWNlS2luZHM6IE1lZGlhRGV2aWNlS2luZEVudW1bXTtcbn1cblxuY29uc3QgTGVnYWN5Q2FsbFZpZXdEcm9wZG93bkJ1dHRvbjogUmVhY3QuRkM8SURyb3Bkb3duQnV0dG9uUHJvcHM+ID0gKHsgc3RhdGUsIGRldmljZUtpbmRzLCAuLi5wcm9wcyB9KSA9PiB7XG4gICAgY29uc3QgW21lbnVEaXNwbGF5ZWQsIGJ1dHRvblJlZiwgb3Blbk1lbnUsIGNsb3NlTWVudV0gPSB1c2VDb250ZXh0TWVudSgpO1xuICAgIGNvbnN0IFtob3ZlcmluZ0Ryb3Bkb3duLCBzZXRIb3ZlcmluZ0Ryb3Bkb3duXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKFwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvblwiLCBcIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19kcm9wZG93bkJ1dHRvblwiLCB7XG4gICAgICAgIG14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19kcm9wZG93bkJ1dHRvbl9jb2xsYXBzZWQ6ICFtZW51RGlzcGxheWVkLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb25DbGljayA9IChldmVudDogQnV0dG9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG9wZW5NZW51KCk7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxMZWdhY3lDYWxsVmlld1RvZ2dsZUJ1dHRvblxuICAgICAgICAgICAgcmVmPXtidXR0b25SZWZ9XG4gICAgICAgICAgICBmb3JjZUhpZGU9e21lbnVEaXNwbGF5ZWQgfHwgaG92ZXJpbmdEcm9wZG93bn1cbiAgICAgICAgICAgIHN0YXRlPXtzdGF0ZX1cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgPlxuICAgICAgICAgICAgPExlZ2FjeUNhbGxWaWV3VG9nZ2xlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgICAgICAgb25Ib3Zlcj17KGhvdmVyaW5nKSA9PiBzZXRIb3ZlcmluZ0Ryb3Bkb3duKGhvdmVyaW5nKX1cbiAgICAgICAgICAgICAgICBzdGF0ZT17c3RhdGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge21lbnVEaXNwbGF5ZWQgJiYgYnV0dG9uUmVmLmN1cnJlbnQgJiYgKFxuICAgICAgICAgICAgICAgIDxEZXZpY2VDb250ZXh0TWVudVxuICAgICAgICAgICAgICAgICAgICB7Li4uYWx3YXlzQWJvdmVSaWdodE9mKGJ1dHRvblJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX1cbiAgICAgICAgICAgICAgICAgICAgb25GaW5pc2hlZD17Y2xvc2VNZW51fVxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VLaW5kcz17ZGV2aWNlS2luZHN9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvTGVnYWN5Q2FsbFZpZXdUb2dnbGVCdXR0b24+XG4gICAgKTtcbn07XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGNhbGw6IE1hdHJpeENhbGw7XG4gICAgcGlwTW9kZT86IGJvb2xlYW47XG4gICAgaGFuZGxlcnM6IHtcbiAgICAgICAgb25IYW5ndXBDbGljazogKCkgPT4gdm9pZDtcbiAgICAgICAgb25TY3JlZW5zaGFyZUNsaWNrOiAoKSA9PiB2b2lkO1xuICAgICAgICBvblRvZ2dsZVNpZGViYXJDbGljazogKCkgPT4gdm9pZDtcbiAgICAgICAgb25NaWNNdXRlQ2xpY2s6ICgpID0+IHZvaWQ7XG4gICAgICAgIG9uVmlkTXV0ZUNsaWNrOiAoKSA9PiB2b2lkO1xuICAgIH07XG4gICAgYnV0dG9uc1N0YXRlOiB7XG4gICAgICAgIG1pY011dGVkOiBib29sZWFuO1xuICAgICAgICB2aWRNdXRlZDogYm9vbGVhbjtcbiAgICAgICAgc2lkZWJhclNob3duOiBib29sZWFuO1xuICAgICAgICBzY3JlZW5zaGFyaW5nOiBib29sZWFuO1xuICAgIH07XG4gICAgYnV0dG9uc1Zpc2liaWxpdHk6IHtcbiAgICAgICAgc2NyZWVuc2hhcmluZzogYm9vbGVhbjtcbiAgICAgICAgdmlkTXV0ZTogYm9vbGVhbjtcbiAgICAgICAgc2lkZWJhcjogYm9vbGVhbjtcbiAgICAgICAgZGlhbHBhZDogYm9vbGVhbjtcbiAgICAgICAgY29udGV4dE1lbnU6IGJvb2xlYW47XG4gICAgfTtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgdmlzaWJsZTogYm9vbGVhbjtcbiAgICBzaG93RGlhbHBhZDogYm9vbGVhbjtcbiAgICBob3ZlcmluZ0NvbnRyb2xzOiBib29sZWFuO1xuICAgIHNob3dNb3JlTWVudTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGVnYWN5Q2FsbFZpZXdCdXR0b25zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSBkaWFscGFkQnV0dG9uID0gY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuICAgIHByaXZhdGUgY29udGV4dE1lbnVCdXR0b24gPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gICAgcHJpdmF0ZSBjb250cm9sc0hpZGVUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNob3dEaWFscGFkOiBmYWxzZSxcbiAgICAgICAgICAgIGhvdmVyaW5nQ29udHJvbHM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd01vcmVNZW51OiBmYWxzZSxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dDb250cm9scygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93Q29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnNob3dNb3JlTWVudSB8fCB0aGlzLnN0YXRlLnNob3dEaWFscGFkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250cm9sc0hpZGVUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29udHJvbHNIaWRlVGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbHNIaWRlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9uQ29udHJvbHNIaWRlVGltZXIsIENPTlRST0xTX0hJREVfREVMQVkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Db250cm9sc0hpZGVUaW1lciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaG92ZXJpbmdDb250cm9scyB8fCB0aGlzLnN0YXRlLnNob3dEaWFscGFkIHx8IHRoaXMuc3RhdGUuc2hvd01vcmVNZW51KSByZXR1cm47XG4gICAgICAgIHRoaXMuY29udHJvbHNIaWRlVGltZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Nb3VzZUVudGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaG92ZXJpbmdDb250cm9sczogdHJ1ZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbk1vdXNlTGVhdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBob3ZlcmluZ0NvbnRyb2xzOiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkRpYWxwYWRDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNob3dEaWFscGFkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd0RpYWxwYWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dDb250cm9scygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dEaWFscGFkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uTW9yZUNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd01vcmVNZW51OiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNob3dDb250cm9scygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGNsb3NlRGlhbHBhZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dEaWFscGFkOiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjbG9zZUNvbnRleHRNZW51ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd01vcmVNZW51OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCBjYWxsQ29udHJvbHNDbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc1wiLCB7XG4gICAgICAgICAgICBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfaGlkZGVuOiAhdGhpcy5zdGF0ZS52aXNpYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZGlhbFBhZDtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2hvd0RpYWxwYWQgJiYgdGhpcy5kaWFscGFkQnV0dG9uLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGRpYWxQYWQgPSAoXG4gICAgICAgICAgICAgICAgPERpYWxwYWRDb250ZXh0TWVudVxuICAgICAgICAgICAgICAgICAgICB7Li4uYWx3YXlzTWVudVByb3BzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFscGFkQnV0dG9uLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGV2cm9uRmFjZS5Ob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVF9NRU5VX1ZQQURESU5HLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBtb3VudCB0aGUgY29udGV4dCBtZW51cyBhcyBhIGNoaWxkIHR5cGljYWxseSBpbiBvcmRlciB0byBpbmNsdWRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0IG1lbnVzIHdoZW4gZnVsbHNjcmVlbmluZyB0aGUgY2FsbCBjb250ZW50LlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGlzIGRvZXMgbm90IHdvcmsgYXMgd2VsbCB3aGVuIHRoZSBjYWxsIGlzIGVtYmVkZGVkIGluIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gcGljdHVyZS1pbi1waWN0dXJlIGZyYW1lLiBUaHVzLCBvbmx5IG1vdW50IGFzIGNoaWxkIHdoZW4gd2UgYXJlICpub3QqIGluIFBpUC5cbiAgICAgICAgICAgICAgICAgICAgbW91bnRBc0NoaWxkPXshdGhpcy5wcm9wcy5waXBNb2RlfVxuICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaGVkPXt0aGlzLmNsb3NlRGlhbHBhZH1cbiAgICAgICAgICAgICAgICAgICAgY2FsbD17dGhpcy5wcm9wcy5jYWxsfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRleHRNZW51O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zaG93TW9yZU1lbnUgJiYgdGhpcy5jb250ZXh0TWVudUJ1dHRvbi5jdXJyZW50KSB7XG4gICAgICAgICAgICBjb250ZXh0TWVudSA9IChcbiAgICAgICAgICAgICAgICA8TGVnYWN5Q2FsbENvbnRleHRNZW51XG4gICAgICAgICAgICAgICAgICAgIHsuLi5hbHdheXNNZW51UHJvcHMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51QnV0dG9uLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGV2cm9uRmFjZS5Ob25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVF9NRU5VX1ZQQURESU5HLFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBtb3VudEFzQ2hpbGQ9eyF0aGlzLnByb3BzLnBpcE1vZGV9XG4gICAgICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMuY2xvc2VDb250ZXh0TWVudX1cbiAgICAgICAgICAgICAgICAgICAgY2FsbD17dGhpcy5wcm9wcy5jYWxsfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjYWxsQ29udHJvbHNDbGFzc2VzfSBvbk1vdXNlRW50ZXI9e3RoaXMub25Nb3VzZUVudGVyfSBvbk1vdXNlTGVhdmU9e3RoaXMub25Nb3VzZUxlYXZlfT5cbiAgICAgICAgICAgICAgICB7ZGlhbFBhZH1cbiAgICAgICAgICAgICAgICB7Y29udGV4dE1lbnV9XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5idXR0b25zVmlzaWJpbGl0eS5kaWFscGFkICYmIChcbiAgICAgICAgICAgICAgICAgICAgPENvbnRleHRNZW51VG9vbHRpcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbiBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfZGlhbHBhZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuZGlhbHBhZEJ1dHRvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25EaWFscGFkQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXt0aGlzLnN0YXRlLnNob3dEaWFscGFkfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwidm9pcHxkaWFscGFkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxMZWdhY3lDYWxsVmlld0Ryb3Bkb3duQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlPXshdGhpcy5wcm9wcy5idXR0b25zU3RhdGUubWljTXV0ZWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fbWljXCJcbiAgICAgICAgICAgICAgICAgICAgb25MYWJlbD17X3QoXCJ2b2lwfGRpc2FibGVfbWljcm9waG9uZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgb2ZmTGFiZWw9e190KFwidm9pcHxlbmFibGVfbWljcm9waG9uZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5oYW5kbGVycy5vbk1pY011dGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlS2luZHM9e1tNZWRpYURldmljZUtpbmRFbnVtLkF1ZGlvSW5wdXQsIE1lZGlhRGV2aWNlS2luZEVudW0uQXVkaW9PdXRwdXRdfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuYnV0dG9uc1Zpc2liaWxpdHkudmlkTXV0ZSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxMZWdhY3lDYWxsVmlld0Ryb3Bkb3duQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT17IXRoaXMucHJvcHMuYnV0dG9uc1N0YXRlLnZpZE11dGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbl92aWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25MYWJlbD17X3QoXCJ2b2lwfGRpc2FibGVfY2FtZXJhXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmTGFiZWw9e190KFwidm9pcHxlbmFibGVfY2FtZXJhXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5wcm9wcy5oYW5kbGVycy5vblZpZE11dGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUtpbmRzPXtbTWVkaWFEZXZpY2VLaW5kRW51bS5WaWRlb0lucHV0XX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmJ1dHRvbnNWaXNpYmlsaXR5LnNjcmVlbnNoYXJpbmcgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8TGVnYWN5Q2FsbFZpZXdUb2dnbGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPXt0aGlzLnByb3BzLmJ1dHRvbnNTdGF0ZS5zY3JlZW5zaGFyaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbl9zY3JlZW5zaGFyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTGFiZWw9e190KFwidm9pcHxzdG9wX3NjcmVlbnNoYXJlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmTGFiZWw9e190KFwidm9pcHxzdGFydF9zY3JlZW5zaGFyZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGFuZGxlcnMub25TY3JlZW5zaGFyZUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuYnV0dG9uc1Zpc2liaWxpdHkuc2lkZWJhciAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxMZWdhY3lDYWxsVmlld1RvZ2dsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9e3RoaXMucHJvcHMuYnV0dG9uc1N0YXRlLnNpZGViYXJTaG93bn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b25fc2lkZWJhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkxhYmVsPXtfdChcInZvaXB8aGlkZV9zaWRlYmFyX2J1dHRvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZkxhYmVsPXtfdChcInZvaXB8c2hvd19zaWRlYmFyX2J1dHRvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGFuZGxlcnMub25Ub2dnbGVTaWRlYmFyQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5idXR0b25zVmlzaWJpbGl0eS5jb250ZXh0TWVudSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxDb250ZXh0TWVudVRvb2x0aXBCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0xlZ2FjeUNhbGxWaWV3QnV0dG9uc19idXR0b24gbXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbl9tb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25Nb3JlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuY29udGV4dE1lbnVCdXR0b259XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V4cGFuZGVkPXt0aGlzLnN0YXRlLnNob3dNb3JlTWVudX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInZvaXB8bW9yZV9idXR0b25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTGVnYWN5Q2FsbFZpZXdCdXR0b25zX2J1dHRvbiBteF9MZWdhY3lDYWxsVmlld0J1dHRvbnNfYnV0dG9uX2hhbmd1cFwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGFuZGxlcnMub25IYW5ndXBDbGlja31cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9e190KFwidm9pcHxoYW5ndXBcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAg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