matrix-react-sdk
Version:
SDK for matrix.org using React
615 lines (613 loc) • 109 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 _matrix = require("matrix-js-sdk/src/matrix");
var _types = require("matrix-js-sdk/src/types");
var _logger = require("matrix-js-sdk/src/logger");
var _react = _interopRequireWildcard(require("react"));
var _MatrixClientContext = _interopRequireDefault(require("../../contexts/MatrixClientContext"));
var _createRoom = _interopRequireDefault(require("../../createRoom"));
var _UIComponents = require("../../customisations/helpers/UIComponents");
var _actions = require("../../dispatcher/actions");
var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher"));
var Email = _interopRequireWildcard(require("../../email"));
var _useEventEmitter = require("../../hooks/useEventEmitter");
var _useRoomMembers = require("../../hooks/useRoomMembers");
var _useSettings = require("../../hooks/useSettings");
var _useStateArray = require("../../hooks/useStateArray");
var _languageHandler = require("../../languageHandler");
var _PosthogTrackers = _interopRequireDefault(require("../../PosthogTrackers"));
var _RoomInvite = require("../../RoomInvite");
var _UIFeature = require("../../settings/UIFeature");
var _AsyncStore = require("../../stores/AsyncStore");
var _RightPanelStore = _interopRequireDefault(require("../../stores/right-panel/RightPanelStore"));
var _RightPanelStorePhases = require("../../stores/right-panel/RightPanelStorePhases");
var _space = require("../../utils/space");
var _RoomAvatar = _interopRequireDefault(require("../views/avatars/RoomAvatar"));
var _BetaCard = require("../views/beta/BetaCard");
var _IconizedContextMenu = _interopRequireWildcard(require("../views/context_menus/IconizedContextMenu"));
var _AddExistingToSpaceDialog = require("../views/dialogs/AddExistingToSpaceDialog");
var _AccessibleButton = _interopRequireDefault(require("../views/elements/AccessibleButton"));
var _ErrorBoundary = _interopRequireDefault(require("../views/elements/ErrorBoundary"));
var _Field = _interopRequireDefault(require("../views/elements/Field"));
var _RoomFacePile = _interopRequireDefault(require("../views/elements/RoomFacePile"));
var _RoomName = _interopRequireDefault(require("../views/elements/RoomName"));
var _RoomTopic = _interopRequireDefault(require("../views/elements/RoomTopic"));
var _Validation = _interopRequireDefault(require("../views/elements/Validation"));
var _RoomInfoLine = _interopRequireDefault(require("../views/rooms/RoomInfoLine"));
var _RoomPreviewCard = _interopRequireDefault(require("../views/rooms/RoomPreviewCard"));
var _SpacePublicShare = _interopRequireDefault(require("../views/spaces/SpacePublicShare"));
var _ContextMenu = require("./ContextMenu");
var _MainSplit = _interopRequireDefault(require("./MainSplit"));
var _RightPanel = _interopRequireDefault(require("./RightPanel"));
var _SpaceHierarchy = _interopRequireWildcard(require("./SpaceHierarchy"));
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; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2021, 2022 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.
*/
var Phase = /*#__PURE__*/function (Phase) {
Phase[Phase["Landing"] = 0] = "Landing";
Phase[Phase["PublicCreateRooms"] = 1] = "PublicCreateRooms";
Phase[Phase["PublicShare"] = 2] = "PublicShare";
Phase[Phase["PrivateScope"] = 3] = "PrivateScope";
Phase[Phase["PrivateInvite"] = 4] = "PrivateInvite";
Phase[Phase["PrivateCreateRooms"] = 5] = "PrivateCreateRooms";
Phase[Phase["PrivateExistingRooms"] = 6] = "PrivateExistingRooms";
return Phase;
}(Phase || {});
const SpaceLandingAddButton = ({
space
}) => {
const [menuDisplayed, handle, openMenu, closeMenu] = (0, _ContextMenu.useContextMenu)();
const canCreateRoom = (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.CreateRooms);
const canCreateSpace = (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.CreateSpaces);
const videoRoomsEnabled = (0, _useSettings.useFeatureEnabled)("feature_video_rooms");
const elementCallVideoRoomsEnabled = (0, _useSettings.useFeatureEnabled)("feature_element_call_video_rooms");
let contextMenu = null;
if (menuDisplayed) {
const rect = handle.current.getBoundingClientRect();
contextMenu = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, {
left: rect.left + window.scrollX + 0,
top: rect.bottom + window.scrollY + 8,
chevronFace: _ContextMenu.ChevronFace.None,
onFinished: closeMenu,
className: "mx_RoomTile_contextMenu",
compact: true
}, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, {
first: true
}, canCreateRoom && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("action|new_room"),
iconClassName: "mx_RoomList_iconNewRoom",
onClick: async e => {
e.preventDefault();
e.stopPropagation();
closeMenu();
_PosthogTrackers.default.trackInteraction("WebSpaceHomeCreateRoomButton", e);
if (await (0, _space.showCreateNewRoom)(space)) {
_dispatcher.default.fire(_actions.Action.UpdateSpaceHierarchy);
}
}
}), videoRoomsEnabled && /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("action|new_video_room"),
iconClassName: "mx_RoomList_iconNewVideoRoom",
onClick: async e => {
e.preventDefault();
e.stopPropagation();
closeMenu();
if (await (0, _space.showCreateNewRoom)(space, elementCallVideoRoomsEnabled ? _matrix.RoomType.UnstableCall : _matrix.RoomType.ElementVideo)) {
_dispatcher.default.fire(_actions.Action.UpdateSpaceHierarchy);
}
}
}, /*#__PURE__*/_react.default.createElement(_BetaCard.BetaPill, null))), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("action|add_existing_room"),
iconClassName: "mx_RoomList_iconAddExistingRoom",
onClick: e => {
e.preventDefault();
e.stopPropagation();
closeMenu();
(0, _space.showAddExistingRooms)(space);
}
}), canCreateSpace && /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, {
label: (0, _languageHandler._t)("room_list|add_space_label"),
iconClassName: "mx_RoomList_iconPlus",
onClick: e => {
e.preventDefault();
e.stopPropagation();
closeMenu();
(0, _space.showCreateNewSubspace)(space);
}
}, /*#__PURE__*/_react.default.createElement(_BetaCard.BetaPill, null))));
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenuButton, {
kind: "primary",
ref: handle,
onClick: openMenu,
isExpanded: menuDisplayed,
label: (0, _languageHandler._t)("action|add")
}, (0, _languageHandler._t)("action|add")), contextMenu);
};
const SpaceLanding = ({
space
}) => {
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const myMembership = (0, _useRoomMembers.useMyRoomMembership)(space);
const userId = cli.getSafeUserId();
const storeIsShowingSpaceMembers = (0, _react.useCallback)(() => _RightPanelStore.default.instance.isOpenForRoom(space.roomId) && _RightPanelStore.default.instance.currentCardForRoom(space.roomId)?.phase === _RightPanelStorePhases.RightPanelPhases.SpaceMemberList, [space.roomId]);
const isShowingMembers = (0, _useEventEmitter.useEventEmitterState)(_RightPanelStore.default.instance, _AsyncStore.UPDATE_EVENT, storeIsShowingSpaceMembers);
let inviteButton;
if ((0, _space.shouldShowSpaceInvite)(space) && (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.InviteUsers)) {
inviteButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
className: "mx_SpaceRoomView_landing_inviteButton",
onClick: () => {
(0, _space.showSpaceInvite)(space);
}
}, (0, _languageHandler._t)("action|invite"));
}
const hasAddRoomPermissions = myMembership === _types.KnownMembership.Join && space.currentState.maySendStateEvent(_matrix.EventType.SpaceChild, userId);
let addRoomButton;
if (hasAddRoomPermissions) {
addRoomButton = /*#__PURE__*/_react.default.createElement(SpaceLandingAddButton, {
space: space
});
}
let settingsButton;
if ((0, _space.shouldShowSpaceSettings)(space)) {
settingsButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_SpaceRoomView_landing_settingsButton",
onClick: () => {
(0, _space.showSpaceSettings)(space);
},
title: (0, _languageHandler._t)("common|settings"),
placement: "bottom"
});
}
const onMembersClick = () => {
_RightPanelStore.default.instance.setCard({
phase: _RightPanelStorePhases.RightPanelPhases.SpaceMemberList
});
};
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_landing"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_landing_header"
}, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: space,
size: "80px",
viewAvatarOnClick: true,
type: "square"
})), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_landing_name"
}, /*#__PURE__*/_react.default.createElement(_RoomName.default, {
room: space
}, name => {
const tags = {
name: () => /*#__PURE__*/_react.default.createElement("h1", null, name)
};
return (0, _languageHandler._t)("space|landing_welcome", {}, tags);
})), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_landing_infoBar"
}, /*#__PURE__*/_react.default.createElement(_RoomInfoLine.default, {
room: space
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_landing_infoBar_interactive"
}, /*#__PURE__*/_react.default.createElement(_RoomFacePile.default, {
room: space,
onlyKnownUsers: false,
numShown: 7,
onClick: isShowingMembers ? undefined : onMembersClick
}), inviteButton, settingsButton)), /*#__PURE__*/_react.default.createElement(_RoomTopic.default, {
room: space,
className: "mx_SpaceRoomView_landing_topic"
}), /*#__PURE__*/_react.default.createElement(_SpaceHierarchy.default, {
space: space,
showRoom: _SpaceHierarchy.showRoom,
additionalButtons: addRoomButton
}));
};
const SpaceSetupFirstRooms = ({
space,
title,
description,
onFinished
}) => {
const [busy, setBusy] = (0, _react.useState)(false);
const [error, setError] = (0, _react.useState)("");
const numFields = 3;
const placeholders = [(0, _languageHandler._t)("common|general"), (0, _languageHandler._t)("common|random"), (0, _languageHandler._t)("common|support")];
const [roomNames, setRoomName] = (0, _useStateArray.useStateArray)(numFields, [(0, _languageHandler._t)("common|general"), (0, _languageHandler._t)("common|random"), ""]);
const fields = new Array(numFields).fill(0).map((x, i) => {
const name = "roomName" + i;
return /*#__PURE__*/_react.default.createElement(_Field.default, {
key: name,
name: name,
type: "text",
label: (0, _languageHandler._t)("common|room_name"),
placeholder: placeholders[i],
value: roomNames[i],
onChange: ev => setRoomName(i, ev.target.value),
autoFocus: i === 2,
disabled: busy,
autoComplete: "off"
});
});
const onNextClick = async ev => {
ev.preventDefault();
if (busy) return;
setError("");
setBusy(true);
try {
const isPublic = space.getJoinRule() === _matrix.JoinRule.Public;
const filteredRoomNames = roomNames.map(name => name.trim()).filter(Boolean);
const roomIds = await Promise.all(filteredRoomNames.map(name => {
return (0, _createRoom.default)(space.client, {
createOpts: {
preset: isPublic ? _matrix.Preset.PublicChat : _matrix.Preset.PrivateChat,
name
},
spinner: false,
encryption: false,
andView: false,
inlineErrors: true,
parentSpace: space,
joinRule: !isPublic ? _matrix.JoinRule.Restricted : undefined,
suggested: true
});
}));
onFinished(roomIds[0] ?? undefined);
} catch (e) {
_logger.logger.error("Failed to create initial space rooms", e);
setError((0, _languageHandler._t)("create_space|failed_create_initial_rooms"));
}
setBusy(false);
};
let onClick = ev => {
ev.preventDefault();
onFinished();
};
let buttonLabel = (0, _languageHandler._t)("create_space|skip_action");
if (roomNames.some(name => name.trim())) {
onClick = onNextClick;
buttonLabel = busy ? (0, _languageHandler._t)("create_space|creating_rooms") : (0, _languageHandler._t)("action|continue");
}
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h1", null, title), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_description"
}, description), error && /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_errorText"
}, error), /*#__PURE__*/_react.default.createElement("form", {
onSubmit: onClick,
id: "mx_SpaceSetupFirstRooms"
}, fields), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_buttons"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
disabled: busy,
onClick: onClick,
element: "input",
type: "submit",
form: "mx_SpaceSetupFirstRooms",
value: buttonLabel
})));
};
const SpaceAddExistingRooms = ({
space,
onFinished
}) => {
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h1", null, (0, _languageHandler._t)("create_space|add_existing_rooms_heading")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_description"
}, (0, _languageHandler._t)("create_space|add_existing_rooms_description")), /*#__PURE__*/_react.default.createElement(_AddExistingToSpaceDialog.AddExistingToSpace, {
space: space,
emptySelectionButton: /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
onClick: onFinished
}, (0, _languageHandler._t)("create_space|skip_action")),
filterPlaceholder: (0, _languageHandler._t)("space|room_filter_placeholder"),
onFinished: onFinished,
roomsRenderer: _AddExistingToSpaceDialog.defaultRoomsRenderer,
dmsRenderer: _AddExistingToSpaceDialog.defaultDmsRenderer
}));
};
const SpaceSetupPublicShare = ({
justCreatedOpts,
space,
onFinished,
firstRoomId
}) => {
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_publicShare"
}, /*#__PURE__*/_react.default.createElement("h1", null, (0, _languageHandler._t)("create_space|share_heading", {
name: justCreatedOpts?.createOpts?.name || space.name
})), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_description"
}, (0, _languageHandler._t)("create_space|share_description")), /*#__PURE__*/_react.default.createElement(_SpacePublicShare.default, {
space: space
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_buttons"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
onClick: onFinished
}, firstRoomId ? (0, _languageHandler._t)("create_space|done_action_first_room") : (0, _languageHandler._t)("create_space|done_action"))));
};
const SpaceSetupPrivateScope = ({
space,
justCreatedOpts,
onFinished
}) => {
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_privateScope"
}, /*#__PURE__*/_react.default.createElement("h1", null, (0, _languageHandler._t)("create_space|private_personal_heading")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_description"
}, (0, _languageHandler._t)("create_space|private_personal_description", {
name: justCreatedOpts?.createOpts?.name || space.name
})), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_SpaceRoomView_privateScope_justMeButton",
onClick: () => {
onFinished(false);
}
}, (0, _languageHandler._t)("create_space|personal_space"), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("create_space|personal_space_description"))), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_SpaceRoomView_privateScope_meAndMyTeammatesButton",
onClick: () => {
onFinished(true);
}
}, (0, _languageHandler._t)("create_space|private_space"), /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("create_space|private_space_description"))));
};
const validateEmailRules = (0, _Validation.default)({
rules: [{
key: "email",
test: ({
value
}) => !value || Email.looksValid(value),
invalid: () => (0, _languageHandler._t)("auth|email_field_label_invalid")
}]
});
const SpaceSetupPrivateInvite = ({
space,
onFinished
}) => {
const [busy, setBusy] = (0, _react.useState)(false);
const [error, setError] = (0, _react.useState)("");
const numFields = 3;
const fieldRefs = [(0, _react.useRef)(null), (0, _react.useRef)(null), (0, _react.useRef)(null)];
const [emailAddresses, setEmailAddress] = (0, _useStateArray.useStateArray)(numFields, "");
const fields = new Array(numFields).fill(0).map((x, i) => {
const name = "emailAddress" + i;
return /*#__PURE__*/_react.default.createElement(_Field.default, {
key: name,
name: name,
type: "text",
label: (0, _languageHandler._t)("common|email_address"),
placeholder: (0, _languageHandler._t)("auth|email_field_label"),
value: emailAddresses[i],
onChange: ev => setEmailAddress(i, ev.target.value),
ref: fieldRefs[i],
onValidate: validateEmailRules,
autoFocus: i === 0,
disabled: busy
});
});
const onNextClick = async ev => {
ev.preventDefault();
if (busy) return;
setError("");
for (const fieldRef of fieldRefs) {
const valid = await fieldRef.current?.validate({
allowEmpty: true
});
if (valid === false) {
// true/null are allowed
fieldRef.current.focus();
fieldRef.current.validate({
allowEmpty: true,
focused: true
});
return;
}
}
setBusy(true);
const targetIds = emailAddresses.map(name => name.trim()).filter(Boolean);
try {
const result = await (0, _RoomInvite.inviteMultipleToRoom)(space.client, space.roomId, targetIds);
const failedUsers = Object.keys(result.states).filter(a => result.states[a] === "error");
if (failedUsers.length > 0) {
_logger.logger.log("Failed to invite users to space: ", result);
setError((0, _languageHandler._t)("create_space|failed_invite_users", {
csvUsers: failedUsers.join(", ")
}));
} else {
onFinished();
}
} catch (err) {
_logger.logger.error("Failed to invite users to space: ", err);
setError((0, _languageHandler._t)("invite|error_invite"));
}
setBusy(false);
};
let onClick = ev => {
ev.preventDefault();
onFinished();
};
let buttonLabel = (0, _languageHandler._t)("create_space|skip_action");
if (emailAddresses.some(name => name.trim())) {
onClick = onNextClick;
buttonLabel = busy ? (0, _languageHandler._t)("create_space|inviting_users") : (0, _languageHandler._t)("action|continue");
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_inviteTeammates"
}, /*#__PURE__*/_react.default.createElement("h1", null, (0, _languageHandler._t)("create_space|invite_teammates_heading")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_description"
}, (0, _languageHandler._t)("create_space|invite_teammates_description")), error && /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_errorText"
}, error), /*#__PURE__*/_react.default.createElement("form", {
onSubmit: onClick,
id: "mx_SpaceSetupPrivateInvite"
}, fields), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_inviteTeammates_buttons"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_SpaceRoomView_inviteTeammates_inviteDialogButton",
onClick: () => (0, _RoomInvite.showRoomInviteDialog)(space.roomId)
}, (0, _languageHandler._t)("create_space|invite_teammates_by_username"))), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SpaceRoomView_buttons"
}, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
disabled: busy,
onClick: onClick,
element: "input",
type: "submit",
form: "mx_SpaceSetupPrivateInvite",
value: buttonLabel
})));
};
class SpaceRoomView extends _react.default.PureComponent {
constructor(props, context) {
super(props, context);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "onMyMembership", (room, myMembership) => {
if (room.roomId === this.props.space.roomId) {
this.setState({
myMembership
});
}
});
(0, _defineProperty2.default)(this, "onRightPanelStoreUpdate", () => {
this.setState({
showRightPanel: _RightPanelStore.default.instance.isOpenForRoom(this.props.space.roomId)
});
});
(0, _defineProperty2.default)(this, "onAction", payload => {
if (payload.action === _actions.Action.ViewRoom && payload.room_id === this.props.space.roomId) {
this.setState({
phase: Phase.Landing
});
return;
}
});
(0, _defineProperty2.default)(this, "goToFirstRoom", async () => {
if (this.state.firstRoomId) {
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: this.state.firstRoomId,
metricsTrigger: undefined // other
});
return;
}
this.setState({
phase: Phase.Landing
});
});
let phase = Phase.Landing;
const creator = this.props.space.currentState.getStateEvents(_matrix.EventType.RoomCreate, "")?.getSender();
const showSetup = this.props.justCreatedOpts && context.getSafeUserId() === creator;
if (showSetup) {
phase = this.props.justCreatedOpts.createOpts?.preset === _matrix.Preset.PublicChat ? Phase.PublicCreateRooms : Phase.PrivateScope;
}
this.state = {
phase,
showRightPanel: _RightPanelStore.default.instance.isOpenForRoom(this.props.space.roomId),
myMembership: this.props.space.getMyMembership()
};
this.dispatcherRef = _dispatcher.default.register(this.onAction);
_RightPanelStore.default.instance.on(_AsyncStore.UPDATE_EVENT, this.onRightPanelStoreUpdate);
}
componentDidMount() {
this.context.on(_matrix.RoomEvent.MyMembership, this.onMyMembership);
}
componentWillUnmount() {
_dispatcher.default.unregister(this.dispatcherRef);
_RightPanelStore.default.instance.off(_AsyncStore.UPDATE_EVENT, this.onRightPanelStoreUpdate);
this.context.off(_matrix.RoomEvent.MyMembership, this.onMyMembership);
}
renderBody() {
switch (this.state.phase) {
case Phase.Landing:
if (this.state.myMembership === _types.KnownMembership.Join) {
return /*#__PURE__*/_react.default.createElement(SpaceLanding, {
space: this.props.space
});
} else {
return /*#__PURE__*/_react.default.createElement(_RoomPreviewCard.default, {
room: this.props.space,
onJoinButtonClicked: this.props.onJoinButtonClicked,
onRejectButtonClicked: this.props.onRejectButtonClicked
});
}
case Phase.PublicCreateRooms:
return /*#__PURE__*/_react.default.createElement(SpaceSetupFirstRooms, {
space: this.props.space,
title: (0, _languageHandler._t)("create_space|setup_rooms_community_heading", {
spaceName: this.props.justCreatedOpts?.createOpts?.name || this.props.space.name
}),
description: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _languageHandler._t)("create_space|setup_rooms_community_description"), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("create_space|setup_rooms_description")),
onFinished: firstRoomId => this.setState({
phase: Phase.PublicShare,
firstRoomId
})
});
case Phase.PublicShare:
return /*#__PURE__*/_react.default.createElement(SpaceSetupPublicShare, {
justCreatedOpts: this.props.justCreatedOpts,
space: this.props.space,
onFinished: this.goToFirstRoom,
firstRoomId: this.state.firstRoomId
});
case Phase.PrivateScope:
return /*#__PURE__*/_react.default.createElement(SpaceSetupPrivateScope, {
space: this.props.space,
justCreatedOpts: this.props.justCreatedOpts,
onFinished: invite => {
this.setState({
phase: invite ? Phase.PrivateCreateRooms : Phase.PrivateExistingRooms
});
}
});
case Phase.PrivateInvite:
return /*#__PURE__*/_react.default.createElement(SpaceSetupPrivateInvite, {
space: this.props.space,
onFinished: () => this.setState({
phase: Phase.Landing
})
});
case Phase.PrivateCreateRooms:
return /*#__PURE__*/_react.default.createElement(SpaceSetupFirstRooms, {
space: this.props.space,
title: (0, _languageHandler._t)("create_space|setup_rooms_private_heading"),
description: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _languageHandler._t)("create_space|setup_rooms_private_description"), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("create_space|setup_rooms_description")),
onFinished: firstRoomId => this.setState({
phase: Phase.PrivateInvite,
firstRoomId
})
});
case Phase.PrivateExistingRooms:
return /*#__PURE__*/_react.default.createElement(SpaceAddExistingRooms, {
space: this.props.space,
onFinished: () => this.setState({
phase: Phase.Landing
})
});
}
}
render() {
const rightPanel = this.state.showRightPanel && this.state.phase === Phase.Landing ? /*#__PURE__*/_react.default.createElement(_RightPanel.default, {
room: this.props.space,
resizeNotifier: this.props.resizeNotifier,
permalinkCreator: this.props.permalinkCreator
}) : undefined;
return /*#__PURE__*/_react.default.createElement("main", {
className: "mx_SpaceRoomView"
}, /*#__PURE__*/_react.default.createElement(_ErrorBoundary.default, null, /*#__PURE__*/_react.default.createElement(_MainSplit.default, {
panel: rightPanel,
resizeNotifier: this.props.resizeNotifier,
analyticsRoomType: "space"
}, this.renderBody())));
}
}
exports.default = SpaceRoomView;
(0, _defineProperty2.default)(SpaceRoomView, "contextType", _MatrixClientContext.default);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl90eXBlcyIsIl9sb2dnZXIiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jcmVhdGVSb29tIiwiX1VJQ29tcG9uZW50cyIsIl9hY3Rpb25zIiwiX2Rpc3BhdGNoZXIiLCJFbWFpbCIsIl91c2VFdmVudEVtaXR0ZXIiLCJfdXNlUm9vbU1lbWJlcnMiLCJfdXNlU2V0dGluZ3MiLCJfdXNlU3RhdGVBcnJheSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfUG9zdGhvZ1RyYWNrZXJzIiwiX1Jvb21JbnZpdGUiLCJfVUlGZWF0dXJlIiwiX0FzeW5jU3RvcmUiLCJfUmlnaHRQYW5lbFN0b3JlIiwiX1JpZ2h0UGFuZWxTdG9yZVBoYXNlcyIsIl9zcGFjZSIsIl9Sb29tQXZhdGFyIiwiX0JldGFDYXJkIiwiX0ljb25pemVkQ29udGV4dE1lbnUiLCJfQWRkRXhpc3RpbmdUb1NwYWNlRGlhbG9nIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfRXJyb3JCb3VuZGFyeSIsIl9GaWVsZCIsIl9Sb29tRmFjZVBpbGUiLCJfUm9vbU5hbWUiLCJfUm9vbVRvcGljIiwiX1ZhbGlkYXRpb24iLCJfUm9vbUluZm9MaW5lIiwiX1Jvb21QcmV2aWV3Q2FyZCIsIl9TcGFjZVB1YmxpY1NoYXJlIiwiX0NvbnRleHRNZW51IiwiX01haW5TcGxpdCIsIl9SaWdodFBhbmVsIiwiX1NwYWNlSGllcmFyY2h5IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUGhhc2UiLCJTcGFjZUxhbmRpbmdBZGRCdXR0b24iLCJzcGFjZSIsIm1lbnVEaXNwbGF5ZWQiLCJoYW5kbGUiLCJvcGVuTWVudSIsImNsb3NlTWVudSIsInVzZUNvbnRleHRNZW51IiwiY2FuQ3JlYXRlUm9vbSIsInNob3VsZFNob3dDb21wb25lbnQiLCJVSUNvbXBvbmVudCIsIkNyZWF0ZVJvb21zIiwiY2FuQ3JlYXRlU3BhY2UiLCJDcmVhdGVTcGFjZXMiLCJ2aWRlb1Jvb21zRW5hYmxlZCIsInVzZUZlYXR1cmVFbmFibGVkIiwiZWxlbWVudENhbGxWaWRlb1Jvb21zRW5hYmxlZCIsImNvbnRleHRNZW51IiwicmVjdCIsImN1cnJlbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjcmVhdGVFbGVtZW50IiwibGVmdCIsIndpbmRvdyIsInNjcm9sbFgiLCJ0b3AiLCJib3R0b20iLCJzY3JvbGxZIiwiY2hldnJvbkZhY2UiLCJDaGV2cm9uRmFjZSIsIk5vbmUiLCJvbkZpbmlzaGVkIiwiY2xhc3NOYW1lIiwiY29tcGFjdCIsIkljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0IiwiZmlyc3QiLCJGcmFnbWVudCIsIkljb25pemVkQ29udGV4dE1lbnVPcHRpb24iLCJsYWJlbCIsIl90IiwiaWNvbkNsYXNzTmFtZSIsIm9uQ2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsIlBvc3Rob2dUcmFja2VycyIsInRyYWNrSW50ZXJhY3Rpb24iLCJzaG93Q3JlYXRlTmV3Um9vbSIsImRlZmF1bHREaXNwYXRjaGVyIiwiZmlyZSIsIkFjdGlvbiIsIlVwZGF0ZVNwYWNlSGllcmFyY2h5IiwiUm9vbVR5cGUiLCJVbnN0YWJsZUNhbGwiLCJFbGVtZW50VmlkZW8iLCJCZXRhUGlsbCIsInNob3dBZGRFeGlzdGluZ1Jvb21zIiwic2hvd0NyZWF0ZU5ld1N1YnNwYWNlIiwiQ29udGV4dE1lbnVCdXR0b24iLCJraW5kIiwicmVmIiwiaXNFeHBhbmRlZCIsIlNwYWNlTGFuZGluZyIsImNsaSIsInVzZUNvbnRleHQiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwibXlNZW1iZXJzaGlwIiwidXNlTXlSb29tTWVtYmVyc2hpcCIsInVzZXJJZCIsImdldFNhZmVVc2VySWQiLCJzdG9yZUlzU2hvd2luZ1NwYWNlTWVtYmVycyIsInVzZUNhbGxiYWNrIiwiUmlnaHRQYW5lbFN0b3JlIiwiaW5zdGFuY2UiLCJpc09wZW5Gb3JSb29tIiwicm9vbUlkIiwiY3VycmVudENhcmRGb3JSb29tIiwicGhhc2UiLCJSaWdodFBhbmVsUGhhc2VzIiwiU3BhY2VNZW1iZXJMaXN0IiwiaXNTaG93aW5nTWVtYmVycyIsInVzZUV2ZW50RW1pdHRlclN0YXRlIiwiVVBEQVRFX0VWRU5UIiwiaW52aXRlQnV0dG9uIiwic2hvdWxkU2hvd1NwYWNlSW52aXRlIiwiSW52aXRlVXNlcnMiLCJzaG93U3BhY2VJbnZpdGUiLCJoYXNBZGRSb29tUGVybWlzc2lvbnMiLCJLbm93bk1lbWJlcnNoaXAiLCJKb2luIiwiY3VycmVudFN0YXRlIiwibWF5U2VuZFN0YXRlRXZlbnQiLCJFdmVudFR5cGUiLCJTcGFjZUNoaWxkIiwiYWRkUm9vbUJ1dHRvbiIsInNldHRpbmdzQnV0dG9uIiwic2hvdWxkU2hvd1NwYWNlU2V0dGluZ3MiLCJzaG93U3BhY2VTZXR0aW5ncyIsInRpdGxlIiwicGxhY2VtZW50Iiwib25NZW1iZXJzQ2xpY2siLCJzZXRDYXJkIiwicm9vbSIsInNpemUiLCJ2aWV3QXZhdGFyT25DbGljayIsInR5cGUiLCJuYW1lIiwidGFncyIsIm9ubHlLbm93blVzZXJzIiwibnVtU2hvd24iLCJ1bmRlZmluZWQiLCJzaG93Um9vbSIsImFkZGl0aW9uYWxCdXR0b25zIiwiU3BhY2VTZXR1cEZpcnN0Um9vbXMiLCJkZXNjcmlwdGlvbiIsImJ1c3kiLCJzZXRCdXN5IiwidXNlU3RhdGUiLCJlcnJvciIsInNldEVycm9yIiwibnVtRmllbGRzIiwicGxhY2Vob2xkZXJzIiwicm9vbU5hbWVzIiwic2V0Um9vbU5hbWUiLCJ1c2VTdGF0ZUFycmF5IiwiZmllbGRzIiwiQXJyYXkiLCJmaWxsIiwibWFwIiwieCIsImtleSIsInBsYWNlaG9sZGVyIiwidmFsdWUiLCJvbkNoYW5nZSIsImV2IiwidGFyZ2V0IiwiYXV0b0ZvY3VzIiwiZGlzYWJsZWQiLCJhdXRvQ29tcGxldGUiLCJvbk5leHRDbGljayIsImlzUHVibGljIiwiZ2V0Sm9pblJ1bGUiLCJKb2luUnVsZSIsIlB1YmxpYyIsImZpbHRlcmVkUm9vbU5hbWVzIiwidHJpbSIsImZpbHRlciIsIkJvb2xlYW4iLCJyb29tSWRzIiwiUHJvbWlzZSIsImFsbCIsImNyZWF0ZVJvb20iLCJjbGllbnQiLCJjcmVhdGVPcHRzIiwicHJlc2V0IiwiUHJlc2V0IiwiUHVibGljQ2hhdCIsIlByaXZhdGVDaGF0Iiwic3Bpbm5lciIsImVuY3J5cHRpb24iLCJhbmRWaWV3IiwiaW5saW5lRXJyb3JzIiwicGFyZW50U3BhY2UiLCJqb2luUnVsZSIsIlJlc3RyaWN0ZWQiLCJzdWdnZXN0ZWQiLCJsb2dnZXIiLCJidXR0b25MYWJlbCIsInNvbWUiLCJvblN1Ym1pdCIsImlkIiwiZWxlbWVudCIsImZvcm0iLCJTcGFjZUFkZEV4aXN0aW5nUm9vbXMiLCJBZGRFeGlzdGluZ1RvU3BhY2UiLCJlbXB0eVNlbGVjdGlvbkJ1dHRvbiIsImZpbHRlclBsYWNlaG9sZGVyIiwicm9vbXNSZW5kZXJlciIsImRlZmF1bHRSb29tc1JlbmRlcmVyIiwiZG1zUmVuZGVyZXIiLCJkZWZhdWx0RG1zUmVuZGVyZXIiLCJTcGFjZVNldHVwUHVibGljU2hhcmUiLCJqdXN0Q3JlYXRlZE9wdHMiLCJmaXJzdFJvb21JZCIsIlNwYWNlU2V0dXBQcml2YXRlU2NvcGUiLCJ2YWxpZGF0ZUVtYWlsUnVsZXMiLCJ3aXRoVmFsaWRhdGlvbiIsInJ1bGVzIiwidGVzdCIsImxvb2tzVmFsaWQiLCJpbnZhbGlkIiwiU3BhY2VTZXR1cFByaXZhdGVJbnZpdGUiLCJmaWVsZFJlZnMiLCJ1c2VSZWYiLCJlbWFpbEFkZHJlc3NlcyIsInNldEVtYWlsQWRkcmVzcyIsIm9uVmFsaWRhdGUiLCJmaWVsZFJlZiIsInZhbGlkIiwidmFsaWRhdGUiLCJhbGxvd0VtcHR5IiwiZm9jdXMiLCJmb2N1c2VkIiwidGFyZ2V0SWRzIiwicmVzdWx0IiwiaW52aXRlTXVsdGlwbGVUb1Jvb20iLCJmYWlsZWRVc2VycyIsImtleXMiLCJzdGF0ZXMiLCJsZW5ndGgiLCJsb2ciLCJjc3ZVc2VycyIsImpvaW4iLCJlcnIiLCJzaG93Um9vbUludml0ZURpYWxvZyIsIlNwYWNlUm9vbVZpZXciLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiY29udGV4dCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJzZXRTdGF0ZSIsInNob3dSaWdodFBhbmVsIiwicGF5bG9hZCIsImFjdGlvbiIsIlZpZXdSb29tIiwicm9vbV9pZCIsIkxhbmRpbmciLCJzdGF0ZSIsImRpc3BhdGNoIiwibWV0cmljc1RyaWdnZXIiLCJjcmVhdG9yIiwiZ2V0U3RhdGVFdmVudHMiLCJSb29tQ3JlYXRlIiwiZ2V0U2VuZGVyIiwic2hvd1NldHVwIiwiUHVibGljQ3JlYXRlUm9vbXMiLCJQcml2YXRlU2NvcGUiLCJnZXRNeU1lbWJlcnNoaXAiLCJkaXNwYXRjaGVyUmVmIiwicmVnaXN0ZXIiLCJvbkFjdGlvbiIsIm9uIiwib25SaWdodFBhbmVsU3RvcmVVcGRhdGUiLCJjb21wb25lbnREaWRNb3VudCIsIlJvb21FdmVudCIsIk15TWVtYmVyc2hpcCIsIm9uTXlNZW1iZXJzaGlwIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bnJlZ2lzdGVyIiwib2ZmIiwicmVuZGVyQm9keSIsIm9uSm9pbkJ1dHRvbkNsaWNrZWQiLCJvblJlamVjdEJ1dHRvbkNsaWNrZWQiLCJzcGFjZU5hbWUiLCJQdWJsaWNTaGFyZSIsImdvVG9GaXJzdFJvb20iLCJpbnZpdGUiLCJQcml2YXRlQ3JlYXRlUm9vbXMiLCJQcml2YXRlRXhpc3RpbmdSb29tcyIsIlByaXZhdGVJbnZpdGUiLCJyZW5kZXIiLCJyaWdodFBhbmVsIiwicmVzaXplTm90aWZpZXIiLCJwZXJtYWxpbmtDcmVhdG9yIiwicGFuZWwiLCJhbmFseXRpY3NSb29tVHlwZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zdHJ1Y3R1cmVzL1NwYWNlUm9vbVZpZXcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIxLCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IEV2ZW50VHlwZSwgUm9vbVR5cGUsIEpvaW5SdWxlLCBQcmVzZXQsIFJvb20sIFJvb21FdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IEtub3duTWVtYmVyc2hpcCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy90eXBlc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgY3JlYXRlUm9vbSwgeyBJT3B0cyB9IGZyb20gXCIuLi8uLi9jcmVhdGVSb29tXCI7XG5pbXBvcnQgeyBzaG91bGRTaG93Q29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2N1c3RvbWlzYXRpb25zL2hlbHBlcnMvVUlDb21wb25lbnRzXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgZGVmYXVsdERpc3BhdGNoZXIgZnJvbSBcIi4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5pbXBvcnQgeyBWaWV3Um9vbVBheWxvYWQgfSBmcm9tIFwiLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9WaWV3Um9vbVBheWxvYWRcIjtcbmltcG9ydCAqIGFzIEVtYWlsIGZyb20gXCIuLi8uLi9lbWFpbFwiO1xuaW1wb3J0IHsgdXNlRXZlbnRFbWl0dGVyU3RhdGUgfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyB1c2VNeVJvb21NZW1iZXJzaGlwIH0gZnJvbSBcIi4uLy4uL2hvb2tzL3VzZVJvb21NZW1iZXJzXCI7XG5pbXBvcnQgeyB1c2VGZWF0dXJlRW5hYmxlZCB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VTZXR0aW5nc1wiO1xuaW1wb3J0IHsgdXNlU3RhdGVBcnJheSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VTdGF0ZUFycmF5XCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBQb3N0aG9nVHJhY2tlcnMgZnJvbSBcIi4uLy4uL1Bvc3Rob2dUcmFja2Vyc1wiO1xuaW1wb3J0IHsgaW52aXRlTXVsdGlwbGVUb1Jvb20sIHNob3dSb29tSW52aXRlRGlhbG9nIH0gZnJvbSBcIi4uLy4uL1Jvb21JbnZpdGVcIjtcbmltcG9ydCB7IFVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1VJRmVhdHVyZVwiO1xuaW1wb3J0IHsgVVBEQVRFX0VWRU5UIH0gZnJvbSBcIi4uLy4uL3N0b3Jlcy9Bc3luY1N0b3JlXCI7XG5pbXBvcnQgUmlnaHRQYW5lbFN0b3JlIGZyb20gXCIuLi8uLi9zdG9yZXMvcmlnaHQtcGFuZWwvUmlnaHRQYW5lbFN0b3JlXCI7XG5pbXBvcnQgeyBSaWdodFBhbmVsUGhhc2VzIH0gZnJvbSBcIi4uLy4uL3N0b3Jlcy9yaWdodC1wYW5lbC9SaWdodFBhbmVsU3RvcmVQaGFzZXNcIjtcbmltcG9ydCBSZXNpemVOb3RpZmllciBmcm9tIFwiLi4vLi4vdXRpbHMvUmVzaXplTm90aWZpZXJcIjtcbmltcG9ydCB7XG4gICAgc2hvdWxkU2hvd1NwYWNlSW52aXRlLFxuICAgIHNob3VsZFNob3dTcGFjZVNldHRpbmdzLFxuICAgIHNob3dBZGRFeGlzdGluZ1Jvb21zLFxuICAgIHNob3dDcmVhdGVOZXdSb29tLFxuICAgIHNob3dDcmVhdGVOZXdTdWJzcGFjZSxcbiAgICBzaG93U3BhY2VJbnZpdGUsXG4gICAgc2hvd1NwYWNlU2V0dGluZ3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9zcGFjZVwiO1xuaW1wb3J0IFJvb21BdmF0YXIgZnJvbSBcIi4uL3ZpZXdzL2F2YXRhcnMvUm9vbUF2YXRhclwiO1xuaW1wb3J0IHsgQmV0YVBpbGwgfSBmcm9tIFwiLi4vdmlld3MvYmV0YS9CZXRhQ2FyZFwiO1xuaW1wb3J0IEljb25pemVkQ29udGV4dE1lbnUsIHtcbiAgICBJY29uaXplZENvbnRleHRNZW51T3B0aW9uLFxuICAgIEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0LFxufSBmcm9tIFwiLi4vdmlld3MvY29udGV4dF9tZW51cy9JY29uaXplZENvbnRleHRNZW51XCI7XG5pbXBvcnQge1xuICAgIEFkZEV4aXN0aW5nVG9TcGFjZSxcbiAgICBkZWZhdWx0RG1zUmVuZGVyZXIsXG4gICAgZGVmYXVsdFJvb21zUmVuZGVyZXIsXG59IGZyb20gXCIuLi92aWV3cy9kaWFsb2dzL0FkZEV4aXN0aW5nVG9TcGFjZURpYWxvZ1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vdmlld3MvZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4uL3ZpZXdzL2VsZW1lbnRzL0Vycm9yQm91bmRhcnlcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi4vdmlld3MvZWxlbWVudHMvRmllbGRcIjtcbmltcG9ydCBSb29tRmFjZVBpbGUgZnJvbSBcIi4uL3ZpZXdzL2VsZW1lbnRzL1Jvb21GYWNlUGlsZVwiO1xuaW1wb3J0IFJvb21OYW1lIGZyb20gXCIuLi92aWV3cy9lbGVtZW50cy9Sb29tTmFtZVwiO1xuaW1wb3J0IFJvb21Ub3BpYyBmcm9tIFwiLi4vdmlld3MvZWxlbWVudHMvUm9vbVRvcGljXCI7XG5pbXBvcnQgd2l0aFZhbGlkYXRpb24gZnJvbSBcIi4uL3ZpZXdzL2VsZW1lbnRzL1ZhbGlkYXRpb25cIjtcbmltcG9ydCBSb29tSW5mb0xpbmUgZnJvbSBcIi4uL3ZpZXdzL3Jvb21zL1Jvb21JbmZvTGluZVwiO1xuaW1wb3J0IFJvb21QcmV2aWV3Q2FyZCBmcm9tIFwiLi4vdmlld3Mvcm9vbXMvUm9vbVByZXZpZXdDYXJkXCI7XG5pbXBvcnQgU3BhY2VQdWJsaWNTaGFyZSBmcm9tIFwiLi4vdmlld3Mvc3BhY2VzL1NwYWNlUHVibGljU2hhcmVcIjtcbmltcG9ydCB7IENoZXZyb25GYWNlLCBDb250ZXh0TWVudUJ1dHRvbiwgdXNlQ29udGV4dE1lbnUgfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IE1haW5TcGxpdCBmcm9tIFwiLi9NYWluU3BsaXRcIjtcbmltcG9ydCBSaWdodFBhbmVsIGZyb20gXCIuL1JpZ2h0UGFuZWxcIjtcbmltcG9ydCBTcGFjZUhpZXJhcmNoeSwgeyBzaG93Um9vbSB9IGZyb20gXCIuL1NwYWNlSGllcmFyY2h5XCI7XG5pbXBvcnQgeyBSb29tUGVybWFsaW5rQ3JlYXRvciB9IGZyb20gXCIuLi8uLi91dGlscy9wZXJtYWxpbmtzL1Blcm1hbGlua3NcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgc3BhY2U6IFJvb207XG4gICAganVzdENyZWF0ZWRPcHRzPzogSU9wdHM7XG4gICAgcmVzaXplTm90aWZpZXI6IFJlc2l6ZU5vdGlmaWVyO1xuICAgIHBlcm1hbGlua0NyZWF0b3I6IFJvb21QZXJtYWxpbmtDcmVhdG9yO1xuICAgIG9uSm9pbkJ1dHRvbkNsaWNrZWQoKTogdm9pZDtcbiAgICBvblJlamVjdEJ1dHRvbkNsaWNrZWQoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgcGhhc2U6IFBoYXNlO1xuICAgIGZpcnN0Um9vbUlkPzogc3RyaW5nOyAvLyBpbnRlcm5hbCBzdGF0ZSBmb3IgdGhlIGNyZWF0aW9uIHdpemFyZFxuICAgIHNob3dSaWdodFBhbmVsOiBib29sZWFuO1xuICAgIG15TWVtYmVyc2hpcDogc3RyaW5nO1xufVxuXG5lbnVtIFBoYXNlIHtcbiAgICBMYW5kaW5nLFxuICAgIFB1YmxpY0NyZWF0ZVJvb21zLFxuICAgIFB1YmxpY1NoYXJlLFxuICAgIFByaXZhdGVTY29wZSxcbiAgICBQcml2YXRlSW52aXRlLFxuICAgIFByaXZhdGVDcmVhdGVSb29tcyxcbiAgICBQcml2YXRlRXhpc3RpbmdSb29tcyxcbn1cblxuY29uc3QgU3BhY2VMYW5kaW5nQWRkQnV0dG9uOiBSZWFjdC5GQzx7IHNwYWNlOiBSb29tIH0+ID0gKHsgc3BhY2UgfSkgPT4ge1xuICAgIGNvbnN0IFttZW51RGlzcGxheWVkLCBoYW5kbGUsIG9wZW5NZW51LCBjbG9zZU1lbnVdID0gdXNlQ29udGV4dE1lbnUoKTtcbiAgICBjb25zdCBjYW5DcmVhdGVSb29tID0gc2hvdWxkU2hvd0NvbXBvbmVudChVSUNvbXBvbmVudC5DcmVhdGVSb29tcyk7XG4gICAgY29uc3QgY2FuQ3JlYXRlU3BhY2UgPSBzaG91bGRTaG93Q29tcG9uZW50KFVJQ29tcG9uZW50LkNyZWF0ZVNwYWNlcyk7XG4gICAgY29uc3QgdmlkZW9Sb29tc0VuYWJsZWQgPSB1c2VGZWF0dXJlRW5hYmxlZChcImZlYXR1cmVfdmlkZW9fcm9vbXNcIik7XG4gICAgY29uc3QgZWxlbWVudENhbGxWaWRlb1Jvb21zRW5hYmxlZCA9IHVzZUZlYXR1cmVFbmFibGVkKFwiZmVhdHVyZV9lbGVtZW50X2NhbGxfdmlkZW9fcm9vbXNcIik7XG5cbiAgICBsZXQgY29udGV4dE1lbnU6IEpTWC5FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG1lbnVEaXNwbGF5ZWQpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGhhbmRsZS5jdXJyZW50IS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29udGV4dE1lbnUgPSAoXG4gICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudVxuICAgICAgICAgICAgICAgIGxlZnQ9e3JlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgMH1cbiAgICAgICAgICAgICAgICB0b3A9e3JlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyA4fVxuICAgICAgICAgICAgICAgIGNoZXZyb25GYWNlPXtDaGV2cm9uRmFjZS5Ob25lfVxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e2Nsb3NlTWVudX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Sb29tVGlsZV9jb250ZXh0TWVudVwiXG4gICAgICAgICAgICAgICAgY29tcGFjdFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uTGlzdCBmaXJzdD5cbiAgICAgICAgICAgICAgICAgICAge2NhbkNyZWF0ZVJvb20gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJhY3Rpb258bmV3X3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9Sb29tTGlzdF9pY29uTmV3Um9vbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jIChlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VNZW51KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3Rob2dUcmFja2Vycy50cmFja0ludGVyYWN0aW9uKFwiV2ViU3BhY2VIb21lQ3JlYXRlUm9vbUJ1dHRvblwiLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCBzaG93Q3JlYXRlTmV3Um9vbShzcGFjZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5maXJlKEFjdGlvbi5VcGRhdGVTcGFjZUhpZXJhcmNoeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmlkZW9Sb29tc0VuYWJsZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiYWN0aW9ufG5ld192aWRlb19yb29tXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X1Jvb21MaXN0X2ljb25OZXdWaWRlb1Jvb21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU1lbnUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2hvd0NyZWF0ZU5ld1Jvb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRDYWxsVmlkZW9Sb29tc0VuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFJvb21UeXBlLlVuc3RhYmxlQ2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUm9vbVR5cGUuRWxlbWVudFZpZGVvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmZpcmUoQWN0aW9uLlVwZGF0ZVNwYWNlSGllcmFyY2h5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QmV0YVBpbGwgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51T3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImFjdGlvbnxhZGRfZXhpc3Rpbmdfcm9vbVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9Sb29tTGlzdF9pY29uQWRkRXhpc3RpbmdSb29tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FkZEV4aXN0aW5nUm9vbXMoc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAge2NhbkNyZWF0ZVNwYWNlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwicm9vbV9saXN0fGFkZF9zcGFjZV9sYWJlbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfUm9vbUxpc3RfaWNvblBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDcmVhdGVOZXdTdWJzcGFjZShzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QmV0YVBpbGwgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L0ljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0PlxuICAgICAgICAgICAgPC9JY29uaXplZENvbnRleHRNZW51PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgICA8Q29udGV4dE1lbnVCdXR0b25cbiAgICAgICAgICAgICAgICBraW5kPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgcmVmPXtoYW5kbGV9XG4gICAgICAgICAgICAgICAgb25DbGljaz17b3Blbk1lbnV9XG4gICAgICAgICAgICAgICAgaXNFeHBhbmRlZD17bWVudURpc3BsYXllZH1cbiAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJhY3Rpb258YWRkXCIpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxhZGRcIil9XG4gICAgICAgICAgICA8L0NvbnRleHRNZW51QnV0dG9uPlxuICAgICAgICAgICAge2NvbnRleHRNZW51fVxuICAgICAgICA8Lz5cbiAgICApO1xufTtcblxuY29uc3QgU3BhY2VMYW5kaW5nOiBSZWFjdC5GQzx7IHNwYWNlOiBSb29tIH0+ID0gKHsgc3BhY2UgfSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3QgbXlNZW1iZXJzaGlwID0gdXNlTXlSb29tTWVtYmVyc2hpcChzcGFjZSk7XG4gICAgY29uc3QgdXNlcklkID0gY2xpLmdldFNhZmVVc2VySWQoKTtcblxuICAgIGNvbnN0IHN0b3JlSXNTaG93aW5nU3BhY2VNZW1iZXJzID0gdXNlQ2FsbGJhY2soXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICBSaWdodFBhbmVsU3RvcmUuaW5zdGFuY2UuaXNPcGVuRm9yUm9vbShzcGFjZS5yb29tSWQpICYmXG4gICAgICAgICAgICBSaWdodFBhbmVsU3RvcmUuaW5zdGFuY2UuY3VycmVudENhcmRGb3JSb29tKHNwYWNlLnJvb21JZCk/LnBoYXNlID09PSBSaWdodFBhbmVsUGhhc2VzLlNwYWNlTWVtYmVyTGlzdCxcbiAgICAgICAgW3NwYWNlLnJvb21JZF0sXG4gICAgKTtcbiAgICBjb25zdCBpc1Nob3dpbmdNZW1iZXJzID0gdXNlRXZlbnRFbWl0dGVyU3RhdGUoUmlnaHRQYW5lbFN0b3JlLmluc3RhbmNlLCBVUERBVEVfRVZFTlQsIHN0b3JlSXNTaG93aW5nU3BhY2VNZW1iZXJzKTtcblxuICAgIGxldCBpbnZpdGVCdXR0b247XG4gICAgaWYgKHNob3VsZFNob3dTcGFjZUludml0ZShzcGFjZSkgJiYgc2hvdWxkU2hvd0NvbXBvbmVudChVSUNvbXBvbmVudC5JbnZpdGVVc2VycykpIHtcbiAgICAgICAgaW52aXRlQnV0dG9uID0gKFxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICBraW5kPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU3BhY2VSb29tVmlld19sYW5kaW5nX2ludml0ZUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzaG93U3BhY2VJbnZpdGUoc3BhY2UpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge190KFwiYWN0aW9ufGludml0ZVwiKX1cbiAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNBZGRSb29tUGVybWlzc2lvbnMgPVxuICAgICAgICBteU1lbWJlcnNoaXAgPT09IEtub3duTWVtYmVyc2hpcC5Kb2luICYmIHNwYWNlLmN1cnJlbnRTdGF0ZS5tYXlTZW5kU3RhdGVFdmVudChFdmVudFR5cGUuU3BhY2VDaGlsZCwgdXNlcklkKTtcblxuICAgIGxldCBhZGRSb29tQnV0dG9uO1xuICAgIGlmIChoYXNBZGRSb29tUGVybWlzc2lvbnMpIHtcbiAgICAgICAgYWRkUm9vbUJ1dHRvbiA9IDxTcGFjZUxhbmRpbmdBZGRCdXR0b24gc3BhY2U9e3NwYWNlfSAvPjtcbiAgICB9XG5cbiAgICBsZXQgc2V0dGluZ3NCdXR0b247XG4gICAgaWYgKHNob3VsZFNob3dTcGFjZVNldHRpbmdzKHNwYWNlKSkge1xuICAgICAgICBzZXR0aW5nc0J1dHRvbiA9IChcbiAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfU3BhY2VSb29tVmlld19sYW5kaW5nX3NldHRpbmdzQnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dTcGFjZVNldHRpbmdzKHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcImNvbW1vbnxzZXR0aW5nc1wiKX1cbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbk1lbWJlcnNDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgUmlnaHRQYW5lbFN0b3JlLmluc3RhbmNlLnNldENhcmQoeyBwaGFzZTogUmlnaHRQYW5lbFBoYXNlcy5TcGFjZU1lbWJlckxpc3QgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfU3BhY2VSb29tVmlld19sYW5kaW5nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NwYWNlUm9vbVZpZXdfbGFuZ