UNPKG

matrix-react-sdk

Version:
615 lines (613 loc) 109 kB
"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