matrix-react-sdk
Version:
SDK for matrix.org using React
223 lines (221 loc) • 42.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.showContextMenu = exports.WidgetContextMenu = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _matrixWidgetApi = require("matrix-widget-api");
var _logger = require("matrix-js-sdk/src/logger");
var _WidgetLifecycle = require("@matrix-org/react-sdk-module-api/lib/lifecycles/WidgetLifecycle");
var _IconizedContextMenu = _interopRequireWildcard(require("./IconizedContextMenu"));
var _ContextMenu = require("../../structures/ContextMenu");
var _languageHandler = require("../../../languageHandler");
var _WidgetStore = require("../../../stores/WidgetStore");
var _WidgetUtils = _interopRequireDefault(require("../../../utils/WidgetUtils"));
var _WidgetMessagingStore = require("../../../stores/widgets/WidgetMessagingStore");
var _RoomContext = _interopRequireDefault(require("../../../contexts/RoomContext"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _QuestionDialog = _interopRequireDefault(require("../dialogs/QuestionDialog"));
var _ErrorDialog = _interopRequireDefault(require("../dialogs/ErrorDialog"));
var _WidgetType = require("../../../widgets/WidgetType");
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _WidgetLayoutStore = require("../../../stores/widgets/WidgetLayoutStore");
var _Livestream = require("../../../Livestream");
var _ModuleRunner = require("../../../modules/ModuleRunner");
var _StopGapWidget = require("../../../stores/widgets/StopGapWidget");
const _excluded = ["onFinished", "app", "userWidget", "onDeleteClick", "onEditClick", "showUnpin"];
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
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; }
const showStreamAudioStreamButton = app => {
return !!(0, _Livestream.getConfigLivestreamUrl)() && _WidgetType.WidgetType.JITSI.matches(app.type);
};
const showEditButton = (app, canModify) => {
return canModify && _WidgetUtils.default.isManagedByManager(app);
};
const showRevokeButton = (cli, roomId, app, userWidget) => {
const isAllowedWidget = (0, _WidgetStore.isAppWidget)(app) && app.eventId !== undefined && (_SettingsStore.default.getValue("allowedWidgets", roomId)[app.eventId] ?? false) || app.creatorUserId === cli?.getUserId();
const isLocalWidget = _WidgetType.WidgetType.JITSI.matches(app.type);
return !userWidget && !isLocalWidget && isAllowedWidget;
};
const showDeleteButton = (canModify, onDeleteClick) => {
return !!onDeleteClick || canModify;
};
const showSnapshotButton = widgetMessaging => {
return _SettingsStore.default.getValue("enableWidgetScreenshots") && !!widgetMessaging?.hasCapability(_matrixWidgetApi.MatrixCapabilities.Screenshots);
};
const showMoveButtons = (app, room, showUnpin) => {
if (!showUnpin) return [false, false];
const pinnedWidgets = room ? _WidgetLayoutStore.WidgetLayoutStore.instance.getContainerWidgets(room, _WidgetLayoutStore.Container.Top) : [];
const widgetIndex = pinnedWidgets.findIndex(widget => widget.id === app.id);
return [widgetIndex > 0, widgetIndex < pinnedWidgets.length - 1];
};
const showContextMenu = (cli, room, app, userWidget, showUnpin, onDeleteClick) => {
const canModify = userWidget || _WidgetUtils.default.canUserModifyWidgets(cli, room?.roomId);
const widgetMessaging = _WidgetMessagingStore.WidgetMessagingStore.instance.getMessagingForUid(_WidgetUtils.default.getWidgetUid(app));
return showStreamAudioStreamButton(app) || showEditButton(app, canModify) || showRevokeButton(cli, room?.roomId, app, userWidget) || showDeleteButton(canModify, onDeleteClick) || showSnapshotButton(widgetMessaging) || showMoveButtons(app, room, showUnpin).some(Boolean);
};
exports.showContextMenu = showContextMenu;
const WidgetContextMenu = _ref => {
let {
onFinished,
app,
userWidget,
onDeleteClick,
onEditClick,
showUnpin
} = _ref,
props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const {
room,
roomId
} = (0, _react.useContext)(_RoomContext.default);
const widgetMessaging = _WidgetMessagingStore.WidgetMessagingStore.instance.getMessagingForUid(_WidgetUtils.default.getWidgetUid(app));
const canModify = userWidget || _WidgetUtils.default.canUserModifyWidgets(cli, roomId);
let streamAudioStreamButton;
if (roomId && showStreamAudioStreamButton(app)) {
const onStreamAudioClick = async () => {
try {
await (0, _Livestream.startJitsiAudioLivestream)(cli, widgetMessaging, roomId);
} catch (err) {
_logger.logger.error("Failed to start livestream", err);
// XXX: won't i18n well, but looks like widget api only support 'message'?
const message = err instanceof Error ? err.message : (0, _languageHandler._t)("widget|error_unable_start_audio_stream_description");
_Modal.default.createDialog(_ErrorDialog.default, {
title: (0, _languageHandler._t)("widget|error_unable_start_audio_stream_title"),
description: message
});
}
onFinished();
};
streamAudioStreamButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onStreamAudioClick,
label: (0, _languageHandler._t)("widget|context_menu|start_audio_stream")
});
}
let editButton;
if (showEditButton(app, canModify)) {
const _onEditClick = () => {
if (onEditClick) {
onEditClick();
} else if (room) {
_WidgetUtils.default.editWidget(room, app);
}
onFinished();
};
editButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: _onEditClick,
label: (0, _languageHandler._t)("action|edit")
});
}
let snapshotButton;
if (showSnapshotButton(widgetMessaging)) {
const onSnapshotClick = () => {
widgetMessaging?.takeScreenshot().then(data => {
_dispatcher.default.dispatch({
action: "picture_snapshot",
file: data.screenshot
});
}).catch(err => {
_logger.logger.error("Failed to take screenshot: ", err);
});
onFinished();
};
snapshotButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onSnapshotClick,
label: (0, _languageHandler._t)("widget|context_menu|screenshot")
});
}
let deleteButton;
if (showDeleteButton(canModify, onDeleteClick)) {
const _onDeleteClick = () => {
if (onDeleteClick) {
onDeleteClick();
} else if (roomId) {
// Show delete confirmation dialog
_Modal.default.createDialog(_QuestionDialog.default, {
title: (0, _languageHandler._t)("widget|context_menu|delete"),
description: (0, _languageHandler._t)("widget|context_menu|delete_warning"),
button: (0, _languageHandler._t)("widget|context_menu|delete"),
onFinished: confirmed => {
if (!confirmed) return;
_WidgetUtils.default.setRoomWidget(cli, roomId, app.id);
}
});
}
onFinished();
};
deleteButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: _onDeleteClick,
label: userWidget ? (0, _languageHandler._t)("action|remove") : (0, _languageHandler._t)("widget|context_menu|remove")
});
}
let revokeButton;
if (showRevokeButton(cli, roomId, app, userWidget)) {
const opts = {
approved: undefined
};
_ModuleRunner.ModuleRunner.instance.invoke(_WidgetLifecycle.WidgetLifecycle.PreLoadRequest, opts, new _StopGapWidget.ElementWidget(app));
if (!opts.approved) {
const onRevokeClick = () => {
const eventId = (0, _WidgetStore.isAppWidget)(app) ? app.eventId : undefined;
_logger.logger.info("Revoking permission for widget to load: " + eventId);
const current = _SettingsStore.default.getValue("allowedWidgets", roomId);
if (eventId !== undefined) current[eventId] = false;
const level = _SettingsStore.default.firstSupportedLevel("allowedWidgets");
if (!level) throw new Error("level must be defined");
_SettingsStore.default.setValue("allowedWidgets", roomId ?? null, level, current).catch(err => {
_logger.logger.error(err);
// We don't really need to do anything about this - the user will just hit the button again.
});
onFinished();
};
revokeButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onRevokeClick,
label: (0, _languageHandler._t)("widget|context_menu|revoke")
});
}
}
const [showMoveLeftButton, showMoveRightButton] = showMoveButtons(app, room, showUnpin);
let moveLeftButton;
if (showMoveLeftButton) {
const onClick = () => {
if (!room) throw new Error("room must be defined");
_WidgetLayoutStore.WidgetLayoutStore.instance.moveWithinContainer(room, _WidgetLayoutStore.Container.Top, app, -1);
onFinished();
};
moveLeftButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onClick,
label: (0, _languageHandler._t)("widget|context_menu|move_left")
});
}
let moveRightButton;
if (showMoveRightButton) {
const onClick = () => {
if (!room) throw new Error("room must be defined");
_WidgetLayoutStore.WidgetLayoutStore.instance.moveWithinContainer(room, _WidgetLayoutStore.Container.Top, app, 1);
onFinished();
};
moveRightButton = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
onClick: onClick,
label: (0, _languageHandler._t)("widget|context_menu|move_right")
});
}
return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, props, {
chevronFace: _ContextMenu.ChevronFace.None,
onFinished: onFinished
}), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, streamAudioStreamButton, editButton, revokeButton, deleteButton, snapshotButton, moveLeftButton, moveRightButton));
};
exports.WidgetContextMenu = WidgetContextMenu;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4V2lkZ2V0QXBpIiwiX2xvZ2dlciIsIl9XaWRnZXRMaWZlY3ljbGUiLCJfSWNvbml6ZWRDb250ZXh0TWVudSIsIl9Db250ZXh0TWVudSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfV2lkZ2V0U3RvcmUiLCJfV2lkZ2V0VXRpbHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1dpZGdldE1lc3NhZ2luZ1N0b3JlIiwiX1Jvb21Db250ZXh0IiwiX2Rpc3BhdGNoZXIiLCJfU2V0dGluZ3NTdG9yZSIsIl9Nb2RhbCIsIl9RdWVzdGlvbkRpYWxvZyIsIl9FcnJvckRpYWxvZyIsIl9XaWRnZXRUeXBlIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfV2lkZ2V0TGF5b3V0U3RvcmUiLCJfTGl2ZXN0cmVhbSIsIl9Nb2R1bGVSdW5uZXIiLCJfU3RvcEdhcFdpZGdldCIsIl9leGNsdWRlZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsInNob3dTdHJlYW1BdWRpb1N0cmVhbUJ1dHRvbiIsImFwcCIsImdldENvbmZpZ0xpdmVzdHJlYW1VcmwiLCJXaWRnZXRUeXBlIiwiSklUU0kiLCJtYXRjaGVzIiwidHlwZSIsInNob3dFZGl0QnV0dG9uIiwiY2FuTW9kaWZ5IiwiV2lkZ2V0VXRpbHMiLCJpc01hbmFnZWRCeU1hbmFnZXIiLCJzaG93UmV2b2tlQnV0dG9uIiwiY2xpIiwicm9vbUlkIiwidXNlcldpZGdldCIsImlzQWxsb3dlZFdpZGdldCIsImlzQXBwV2lkZ2V0IiwiZXZlbnRJZCIsInVuZGVmaW5lZCIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImNyZWF0b3JVc2VySWQiLCJnZXRVc2VySWQiLCJpc0xvY2FsV2lkZ2V0Iiwic2hvd0RlbGV0ZUJ1dHRvbiIsIm9uRGVsZXRlQ2xpY2siLCJzaG93U25hcHNob3RCdXR0b24iLCJ3aWRnZXRNZXNzYWdpbmciLCJoYXNDYXBhYmlsaXR5IiwiTWF0cml4Q2FwYWJpbGl0aWVzIiwiU2NyZWVuc2hvdHMiLCJzaG93TW92ZUJ1dHRvbnMiLCJyb29tIiwic2hvd1VucGluIiwicGlubmVkV2lkZ2V0cyIsIldpZGdldExheW91dFN0b3JlIiwiaW5zdGFuY2UiLCJnZXRDb250YWluZXJXaWRnZXRzIiwiQ29udGFpbmVyIiwiVG9wIiwid2lkZ2V0SW5kZXgiLCJmaW5kSW5kZXgiLCJ3aWRnZXQiLCJpZCIsImxlbmd0aCIsInNob3dDb250ZXh0TWVudSIsImNhblVzZXJNb2RpZnlXaWRnZXRzIiwiV2lkZ2V0TWVzc2FnaW5nU3RvcmUiLCJnZXRNZXNzYWdpbmdGb3JVaWQiLCJnZXRXaWRnZXRVaWQiLCJzb21lIiwiQm9vbGVhbiIsImV4cG9ydHMiLCJXaWRnZXRDb250ZXh0TWVudSIsIl9yZWYiLCJvbkZpbmlzaGVkIiwib25FZGl0Q2xpY2siLCJwcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJ1c2VDb250ZXh0IiwiTWF0cml4Q2xpZW50Q29udGV4dCIsIlJvb21Db250ZXh0Iiwic3RyZWFtQXVkaW9TdHJlYW1CdXR0b24iLCJvblN0cmVhbUF1ZGlvQ2xpY2siLCJzdGFydEppdHNpQXVkaW9MaXZlc3RyZWFtIiwiZXJyIiwibG9nZ2VyIiwiZXJyb3IiLCJtZXNzYWdlIiwiRXJyb3IiLCJfdCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiRXJyb3JEaWFsb2ciLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiY3JlYXRlRWxlbWVudCIsIkljb25pemVkQ29udGV4dE1lbnVPcHRpb24iLCJvbkNsaWNrIiwibGFiZWwiLCJlZGl0QnV0dG9uIiwiX29uRWRpdENsaWNrIiwiZWRpdFdpZGdldCIsInNuYXBzaG90QnV0dG9uIiwib25TbmFwc2hvdENsaWNrIiwidGFrZVNjcmVlbnNob3QiLCJ0aGVuIiwiZGF0YSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiZmlsZSIsInNjcmVlbnNob3QiLCJjYXRjaCIsImRlbGV0ZUJ1dHRvbiIsIl9vbkRlbGV0ZUNsaWNrIiwiUXVlc3Rpb25EaWFsb2ciLCJidXR0b24iLCJjb25maXJtZWQiLCJzZXRSb29tV2lkZ2V0IiwicmV2b2tlQnV0dG9uIiwib3B0cyIsImFwcHJvdmVkIiwiTW9kdWxlUnVubmVyIiwiaW52b2tlIiwiV2lkZ2V0TGlmZWN5Y2xlIiwiUHJlTG9hZFJlcXVlc3QiLCJFbGVtZW50V2lkZ2V0Iiwib25SZXZva2VDbGljayIsImluZm8iLCJjdXJyZW50IiwibGV2ZWwiLCJmaXJzdFN1cHBvcnRlZExldmVsIiwic2V0VmFsdWUiLCJzaG93TW92ZUxlZnRCdXR0b24iLCJzaG93TW92ZVJpZ2h0QnV0dG9uIiwibW92ZUxlZnRCdXR0b24iLCJtb3ZlV2l0aGluQ29udGFpbmVyIiwibW92ZVJpZ2h0QnV0dG9uIiwiX2V4dGVuZHMyIiwiY2hldnJvbkZhY2UiLCJDaGV2cm9uRmFjZSIsIk5vbmUiLCJJY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2NvbnRleHRfbWVudXMvV2lkZ2V0Q29udGV4dE1lbnUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnRQcm9wcywgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgQ2xpZW50V2lkZ2V0QXBpLCBJV2lkZ2V0LCBNYXRyaXhDYXBhYmlsaXRpZXMgfSBmcm9tIFwibWF0cml4LXdpZGdldC1hcGlcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCB7IEFwcHJvdmFsT3B0cywgV2lkZ2V0TGlmZWN5Y2xlIH0gZnJvbSBcIkBtYXRyaXgtb3JnL3JlYWN0LXNkay1tb2R1bGUtYXBpL2xpYi9saWZlY3ljbGVzL1dpZGdldExpZmVjeWNsZVwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50LCBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgSWNvbml6ZWRDb250ZXh0TWVudSwgeyBJY29uaXplZENvbnRleHRNZW51T3B0aW9uLCBJY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdCB9IGZyb20gXCIuL0ljb25pemVkQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7IENoZXZyb25GYWNlIH0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgaXNBcHBXaWRnZXQgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL1dpZGdldFN0b3JlXCI7XG5pbXBvcnQgV2lkZ2V0VXRpbHMgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL1dpZGdldFV0aWxzXCI7XG5pbXBvcnQgeyBXaWRnZXRNZXNzYWdpbmdTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvd2lkZ2V0cy9XaWRnZXRNZXNzYWdpbmdTdG9yZVwiO1xuaW1wb3J0IFJvb21Db250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9Sb29tQ29udGV4dFwiO1xuaW1wb3J0IGRpcyBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFF1ZXN0aW9uRGlhbG9nIGZyb20gXCIuLi9kaWFsb2dzL1F1ZXN0aW9uRGlhbG9nXCI7XG5pbXBvcnQgRXJyb3JEaWFsb2cgZnJvbSBcIi4uL2RpYWxvZ3MvRXJyb3JEaWFsb2dcIjtcbmltcG9ydCB7IFdpZGdldFR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vd2lkZ2V0cy9XaWRnZXRUeXBlXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgQ29udGFpbmVyLCBXaWRnZXRMYXlvdXRTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvd2lkZ2V0cy9XaWRnZXRMYXlvdXRTdG9yZVwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnTGl2ZXN0cmVhbVVybCwgc3RhcnRKaXRzaUF1ZGlvTGl2ZXN0cmVhbSB9IGZyb20gXCIuLi8uLi8uLi9MaXZlc3RyZWFtXCI7XG5pbXBvcnQgeyBNb2R1bGVSdW5uZXIgfSBmcm9tIFwiLi4vLi4vLi4vbW9kdWxlcy9Nb2R1bGVSdW5uZXJcIjtcbmltcG9ydCB7IEVsZW1lbnRXaWRnZXQgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3dpZGdldHMvU3RvcEdhcFdpZGdldFwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIGV4dGVuZHMgT21pdDxDb21wb25lbnRQcm9wczx0eXBlb2YgSWNvbml6ZWRDb250ZXh0TWVudT4sIFwiY2hpbGRyZW5cIj4ge1xuICAgIGFwcDogSVdpZGdldDtcbiAgICB1c2VyV2lkZ2V0PzogYm9vbGVhbjtcbiAgICBzaG93VW5waW4/OiBib29sZWFuO1xuICAgIC8vIG92ZXJyaWRlIGRlbGV0ZSBoYW5kbGVyXG4gICAgb25EZWxldGVDbGljaz8oKTogdm9pZDtcbiAgICAvLyBvdmVycmlkZSBlZGl0IGhhbmRsZXJcbiAgICBvbkVkaXRDbGljaz8oKTogdm9pZDtcbn1cblxuY29uc3Qgc2hvd1N0cmVhbUF1ZGlvU3RyZWFtQnV0dG9uID0gKGFwcDogSVdpZGdldCk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiAhIWdldENvbmZpZ0xpdmVzdHJlYW1VcmwoKSAmJiBXaWRnZXRUeXBlLkpJVFNJLm1hdGNoZXMoYXBwLnR5cGUpO1xufTtcblxuY29uc3Qgc2hvd0VkaXRCdXR0b24gPSAoYXBwOiBJV2lkZ2V0LCBjYW5Nb2RpZnk6IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gY2FuTW9kaWZ5ICYmIFdpZGdldFV0aWxzLmlzTWFuYWdlZEJ5TWFuYWdlcihhcHApO1xufTtcblxuY29uc3Qgc2hvd1Jldm9rZUJ1dHRvbiA9IChcbiAgICBjbGk6IE1hdHJpeENsaWVudCxcbiAgICByb29tSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhcHA6IElXaWRnZXQsXG4gICAgdXNlcldpZGdldDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGlzQWxsb3dlZFdpZGdldCA9XG4gICAgICAgIChpc0FwcFdpZGdldChhcHApICYmXG4gICAgICAgICAgICBhcHAuZXZlbnRJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImFsbG93ZWRXaWRnZXRzXCIsIHJvb21JZClbYXBwLmV2ZW50SWRdID8/IGZhbHNlKSkgfHxcbiAgICAgICAgYXBwLmNyZWF0b3JVc2VySWQgPT09IGNsaT8uZ2V0VXNlcklkKCk7XG5cbiAgICBjb25zdCBpc0xvY2FsV2lkZ2V0ID0gV2lkZ2V0VHlwZS5KSVRTSS5tYXRjaGVzKGFwcC50eXBlKTtcbiAgICByZXR1cm4gIXVzZXJXaWRnZXQgJiYgIWlzTG9jYWxXaWRnZXQgJiYgaXNBbGxvd2VkV2lkZ2V0O1xufTtcblxuY29uc3Qgc2hvd0RlbGV0ZUJ1dHRvbiA9IChjYW5Nb2RpZnk6IGJvb2xlYW4sIG9uRGVsZXRlQ2xpY2s6IHVuZGVmaW5lZCB8ICgoKSA9PiB2b2lkKSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiAhIW9uRGVsZXRlQ2xpY2sgfHwgY2FuTW9kaWZ5O1xufTtcblxuY29uc3Qgc2hvd1NuYXBzaG90QnV0dG9uID0gKHdpZGdldE1lc3NhZ2luZzogQ2xpZW50V2lkZ2V0QXBpIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZTxib29sZWFuPihcImVuYWJsZVdpZGdldFNjcmVlbnNob3RzXCIpICYmXG4gICAgICAgICEhd2lkZ2V0TWVzc2FnaW5nPy5oYXNDYXBhYmlsaXR5KE1hdHJpeENhcGFiaWxpdGllcy5TY3JlZW5zaG90cylcbiAgICApO1xufTtcblxuY29uc3Qgc2hvd01vdmVCdXR0b25zID0gKGFwcDogSVdpZGdldCwgcm9vbTogUm9vbSB8IHVuZGVmaW5lZCwgc2hvd1VucGluOiBib29sZWFuIHwgdW5kZWZpbmVkKTogW2Jvb2xlYW4sIGJvb2xlYW5dID0+IHtcbiAgICBpZiAoIXNob3dVbnBpbikgcmV0dXJuIFtmYWxzZSwgZmFsc2VdO1xuXG4gICAgY29uc3QgcGlubmVkV2lkZ2V0cyA9IHJvb20gPyBXaWRnZXRMYXlvdXRTdG9yZS5pbnN0YW5jZS5nZXRDb250YWluZXJXaWRnZXRzKHJvb20sIENvbnRhaW5lci5Ub3ApIDogW107XG4gICAgY29uc3Qgd2lkZ2V0SW5kZXggPSBwaW5uZWRXaWRnZXRzLmZpbmRJbmRleCgod2lkZ2V0KSA9PiB3aWRnZXQuaWQgPT09IGFwcC5pZCk7XG4gICAgcmV0dXJuIFt3aWRnZXRJbmRleCA+IDAsIHdpZGdldEluZGV4IDwgcGlubmVkV2lkZ2V0cy5sZW5ndGggLSAxXTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaG93Q29udGV4dE1lbnUgPSAoXG4gICAgY2xpOiBNYXRyaXhDbGllbnQsXG4gICAgcm9vbTogUm9vbSB8IHVuZGVmaW5lZCxcbiAgICBhcHA6IElXaWRnZXQsXG4gICAgdXNlcldpZGdldDogYm9vbGVhbixcbiAgICBzaG93VW5waW46IGJvb2xlYW4sXG4gICAgb25EZWxldGVDbGljazogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgY2FuTW9kaWZ5ID0gdXNlcldpZGdldCB8fCBXaWRnZXRVdGlscy5jYW5Vc2VyTW9kaWZ5V2lkZ2V0cyhjbGksIHJvb20/LnJvb21JZCk7XG4gICAgY29uc3Qgd2lkZ2V0TWVzc2FnaW5nID0gV2lkZ2V0TWVzc2FnaW5nU3RvcmUuaW5zdGFuY2UuZ2V0TWVzc2FnaW5nRm9yVWlkKFdpZGdldFV0aWxzLmdldFdpZGdldFVpZChhcHApKTtcbiAgICByZXR1cm4gKFxuICAgICAgICBzaG93U3RyZWFtQXVkaW9TdHJlYW1CdXR0b24oYXBwKSB8fFxuICAgICAgICBzaG93RWRpdEJ1dHRvbihhcHAsIGNhbk1vZGlmeSkgfHxcbiAgICAgICAgc2hvd1Jldm9rZUJ1dHRvbihjbGksIHJvb20/LnJvb21JZCwgYXBwLCB1c2VyV2lkZ2V0KSB8fFxuICAgICAgICBzaG93RGVsZXRlQnV0dG9uKGNhbk1vZGlmeSwgb25EZWxldGVDbGljaykgfHxcbiAgICAgICAgc2hvd1NuYXBzaG90QnV0dG9uKHdpZGdldE1lc3NhZ2luZykgfHxcbiAgICAgICAgc2hvd01vdmVCdXR0b25zKGFwcCwgcm9vbSwgc2hvd1VucGluKS5zb21lKEJvb2xlYW4pXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBXaWRnZXRDb250ZXh0TWVudTogUmVhY3QuRkM8SVByb3BzPiA9ICh7XG4gICAgb25GaW5pc2hlZCxcbiAgICBhcHAsXG4gICAgdXNlcldpZGdldCxcbiAgICBvbkRlbGV0ZUNsaWNrLFxuICAgIG9uRWRpdENsaWNrLFxuICAgIHNob3dVbnBpbixcbiAgICAuLi5wcm9wc1xufSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3QgeyByb29tLCByb29tSWQgfSA9IHVzZUNvbnRleHQoUm9vbUNvbnRleHQpO1xuXG4gICAgY29uc3Qgd2lkZ2V0TWVzc2FnaW5nID0gV2lkZ2V0TWVzc2FnaW5nU3RvcmUuaW5zdGFuY2UuZ2V0TWVzc2FnaW5nRm9yVWlkKFdpZGdldFV0aWxzLmdldFdpZGdldFVpZChhcHApKTtcbiAgICBjb25zdCBjYW5Nb2RpZnkgPSB1c2VyV2lkZ2V0IHx8IFdpZGdldFV0aWxzLmNhblVzZXJNb2RpZnlXaWRnZXRzKGNsaSwgcm9vbUlkKTtcblxuICAgIGxldCBzdHJlYW1BdWRpb1N0cmVhbUJ1dHRvbjogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJvb21JZCAmJiBzaG93U3RyZWFtQXVkaW9TdHJlYW1CdXR0b24oYXBwKSkge1xuICAgICAgICBjb25zdCBvblN0cmVhbUF1ZGlvQ2xpY2sgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0YXJ0Sml0c2lBdWRpb0xpdmVzdHJlYW0oY2xpLCB3aWRnZXRNZXNzYWdpbmchLCByb29tSWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRmFpbGVkIHRvIHN0YXJ0IGxpdmVzdHJlYW1cIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAvLyBYWFg6IHdvbid0IGkxOG4gd2VsbCwgYnV0IGxvb2tzIGxpa2Ugd2lkZ2V0IGFwaSBvbmx5IHN1cHBvcnQgJ21lc3NhZ2UnP1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogX3QoXCJ3aWRnZXR8ZXJyb3JfdW5hYmxlX3N0YXJ0X2F1ZGlvX3N0cmVhbV9kZXNjcmlwdGlvblwiKTtcbiAgICAgICAgICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF90KFwid2lkZ2V0fGVycm9yX3VuYWJsZV9zdGFydF9hdWRpb19zdHJlYW1fdGl0bGVcIiksXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgICB9O1xuICAgICAgICBzdHJlYW1BdWRpb1N0cmVhbUJ1dHRvbiA9IChcbiAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17b25TdHJlYW1BdWRpb0NsaWNrfVxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcIndpZGdldHxjb250ZXh0X21lbnV8c3RhcnRfYXVkaW9fc3RyZWFtXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgZWRpdEJ1dHRvbjogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNob3dFZGl0QnV0dG9uKGFwcCwgY2FuTW9kaWZ5KSkge1xuICAgICAgICBjb25zdCBfb25FZGl0Q2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAob25FZGl0Q2xpY2spIHtcbiAgICAgICAgICAgICAgICBvbkVkaXRDbGljaygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyb29tKSB7XG4gICAgICAgICAgICAgICAgV2lkZ2V0VXRpbHMuZWRpdFdpZGdldChyb29tLCBhcHApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGVkaXRCdXR0b24gPSA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbiBvbkNsaWNrPXtfb25FZGl0Q2xpY2t9IGxhYmVsPXtfdChcImFjdGlvbnxlZGl0XCIpfSAvPjtcbiAgICB9XG5cbiAgICBsZXQgc25hcHNob3RCdXR0b246IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzaG93U25hcHNob3RCdXR0b24od2lkZ2V0TWVzc2FnaW5nKSkge1xuICAgICAgICBjb25zdCBvblNuYXBzaG90Q2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICB3aWRnZXRNZXNzYWdpbmdcbiAgICAgICAgICAgICAgICA/LnRha2VTY3JlZW5zaG90KClcbiAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcInBpY3R1cmVfc25hcHNob3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGRhdGEuc2NyZWVuc2hvdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJGYWlsZWQgdG8gdGFrZSBzY3JlZW5zaG90OiBcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzbmFwc2hvdEJ1dHRvbiA9IChcbiAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uIG9uQ2xpY2s9e29uU25hcHNob3RDbGlja30gbGFiZWw9e190KFwid2lkZ2V0fGNvbnRleHRfbWVudXxzY3JlZW5zaG90XCIpfSAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxldCBkZWxldGVCdXR0b246IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzaG93RGVsZXRlQnV0dG9uKGNhbk1vZGlmeSwgb25EZWxldGVDbGljaykpIHtcbiAgICAgICAgY29uc3QgX29uRGVsZXRlQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAob25EZWxldGVDbGljaykge1xuICAgICAgICAgICAgICAgIG9uRGVsZXRlQ2xpY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocm9vbUlkKSB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdyBkZWxldGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAgICAgICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhRdWVzdGlvbkRpYWxvZywge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJ3aWRnZXR8Y29udGV4dF9tZW51fGRlbGV0ZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IF90KFwid2lkZ2V0fGNvbnRleHRfbWVudXxkZWxldGVfd2FybmluZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiBfdChcIndpZGdldHxjb250ZXh0X21lbnV8ZGVsZXRlXCIpLFxuICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaGVkOiAoY29uZmlybWVkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0VXRpbHMuc2V0Um9vbVdpZGdldChjbGksIHJvb21JZCwgYXBwLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGRlbGV0ZUJ1dHRvbiA9IChcbiAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17X29uRGVsZXRlQ2xpY2t9XG4gICAgICAgICAgICAgICAgbGFiZWw9e3VzZXJXaWRnZXQgPyBfdChcImFjdGlvbnxyZW1vdmVcIikgOiBfdChcIndpZGdldHxjb250ZXh0X21lbnV8cmVtb3ZlXCIpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmV2b2tlQnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2hvd1Jldm9rZUJ1dHRvbihjbGksIHJvb21JZCwgYXBwLCB1c2VyV2lkZ2V0KSkge1xuICAgICAgICBjb25zdCBvcHRzOiBBcHByb3ZhbE9wdHMgPSB7IGFwcHJvdmVkOiB1bmRlZmluZWQgfTtcbiAgICAgICAgTW9kdWxlUnVubmVyLmluc3RhbmNlLmludm9rZShXaWRnZXRMaWZlY3ljbGUuUHJlTG9hZFJlcXVlc3QsIG9wdHMsIG5ldyBFbGVtZW50V2lkZ2V0KGFwcCkpO1xuXG4gICAgICAgIGlmICghb3B0cy5hcHByb3ZlZCkge1xuICAgICAgICAgICAgY29uc3Qgb25SZXZva2VDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudElkID0gaXNBcHBXaWRnZXQoYXBwKSA/IGFwcC5ldmVudElkIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiUmV2b2tpbmcgcGVybWlzc2lvbiBmb3Igd2lkZ2V0IHRvIGxvYWQ6IFwiICsgZXZlbnRJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJhbGxvd2VkV2lkZ2V0c1wiLCByb29tSWQpO1xuICAgICAgICAgICAgICAgIGlmIChldmVudElkICE9PSB1bmRlZmluZWQpIGN1cnJlbnRbZXZlbnRJZF0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBsZXZlbCA9IFNldHRpbmdzU3RvcmUuZmlyc3RTdXBwb3J0ZWRMZXZlbChcImFsbG93ZWRXaWRnZXRzXCIpO1xuICAgICAgICAgICAgICAgIGlmICghbGV2ZWwpIHRocm93IG5ldyBFcnJvcihcImxldmVsIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICAgICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwiYWxsb3dlZFdpZGdldHNcIiwgcm9vbUlkID8/IG51bGwsIGxldmVsLCBjdXJyZW50KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCByZWFsbHkgbmVlZCB0byBkbyBhbnl0aGluZyBhYm91dCB0aGlzIC0gdGhlIHVzZXIgd2lsbCBqdXN0IGhpdCB0aGUgYnV0dG9uIGFnYWluLlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldm9rZUJ1dHRvbiA9IChcbiAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbiBvbkNsaWNrPXtvblJldm9rZUNsaWNrfSBsYWJlbD17X3QoXCJ3aWRnZXR8Y29udGV4dF9tZW51fHJldm9rZVwiKX0gLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbc2hvd01vdmVMZWZ0QnV0dG9uLCBzaG93TW92ZVJpZ2h0QnV0dG9uXSA9IHNob3dNb3ZlQnV0dG9ucyhhcHAsIHJvb20sIHNob3dVbnBpbik7XG4gICAgbGV0IG1vdmVMZWZ0QnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2hvd01vdmVMZWZ0QnV0dG9uKSB7XG4gICAgICAgIGNvbnN0IG9uQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvb20pIHRocm93IG5ldyBFcnJvcihcInJvb20gbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgICAgICAgICAgV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UubW92ZVdpdGhpbkNvbnRhaW5lcihyb29tLCBDb250YWluZXIuVG9wLCBhcHAsIC0xKTtcbiAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBtb3ZlTGVmdEJ1dHRvbiA9IDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uIG9uQ2xpY2s9e29uQ2xpY2t9IGxhYmVsPXtfdChcIndpZGdldHxjb250ZXh0X21lbnV8bW92ZV9sZWZ0XCIpfSAvPjtcbiAgICB9XG5cbiAgICBsZXQgbW92ZVJpZ2h0QnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2hvd01vdmVSaWdodEJ1dHRvbikge1xuICAgICAgICBjb25zdCBvbkNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKCFyb29tKSB0aHJvdyBuZXcgRXJyb3IoXCJyb29tIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICAgICAgICAgIFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLm1vdmVXaXRoaW5Db250YWluZXIocm9vbSwgQ29udGFpbmVyLlRvcCwgYXBwLCAxKTtcbiAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBtb3ZlUmlnaHRCdXR0b24gPSA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbiBvbkNsaWNrPXtvbkNsaWNrfSBsYWJlbD17X3QoXCJ3aWRnZXR8Y29udGV4dF9tZW51fG1vdmVfcmlnaHRcIil9IC8+O1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxJY29uaXplZENvbnRleHRNZW51IHsuLi5wcm9wc30gY2hldnJvbkZhY2U9e0NoZXZyb25GYWNlLk5vbmV9IG9uRmluaXNoZWQ9e29uRmluaXNoZWR9PlxuICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0PlxuICAgICAgICAgICAgICAgIHtzdHJlYW1BdWRpb1N0cmVhbUJ1dHRvbn1cbiAgICAgICAgICAgICAgICB7ZWRpdEJ1dHRvbn1cbiAgICAgICAgICAgICAgICB7cmV2b2tlQnV0dG9ufVxuICAgICAgICAgICAgICAgIHtkZWxldGVCdXR0b259XG4gICAgICAgICAgICAgICAge3NuYXBzaG90QnV0dG9ufVxuICAgICAgICAgICAgICAgIHttb3ZlTGVmdEJ1dHRvbn1cbiAgICAgICAgICAgICAgICB7bW92ZVJpZ2h0QnV0dG9ufVxuICAgICAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdD5cbiAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51PlxuICAgICk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxnQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUdBLElBQUFJLG9CQUFBLEdBQUFMLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxZQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sWUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsWUFBQSxHQUFBQyxzQkFBQSxDQUFBVCxPQUFBO0FBQ0EsSUFBQVUscUJBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLFlBQUEsR0FBQUYsc0JBQUEsQ0FBQVQsT0FBQTtBQUNBLElBQUFZLFdBQUEsR0FBQUgsc0JBQUEsQ0FBQVQsT0FBQTtBQUNBLElBQUFhLGNBQUEsR0FBQUosc0JBQUEsQ0FBQVQsT0FBQTtBQUNBLElBQUFjLE1BQUEsR0FBQUwsc0JBQUEsQ0FBQVQsT0FBQTtBQUNBLElBQUFlLGVBQUEsR0FBQU4sc0JBQUEsQ0FBQVQsT0FBQTtBQUNBLElBQUFnQixZQUFBLEdBQUFQLHNCQUFBLENBQUFULE9BQUE7QUFDQSxJQUFBaUIsV0FBQSxHQUFBakIsT0FBQTtBQUNBLElBQUFrQixvQkFBQSxHQUFBVCxzQkFBQSxDQUFBVCxPQUFB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