mediasfu-shared 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +17 -0
- package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts +1 -1
- package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts.map +1 -1
- package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts +1 -1
- package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts.map +1 -1
- package/dist/consumers/connectIps.d.ts +1 -1
- package/dist/consumers/connectIps.d.ts.map +1 -1
- package/dist/consumers/connectRecvTransport.d.ts +1 -1
- package/dist/consumers/connectRecvTransport.d.ts.map +1 -1
- package/dist/consumers/connectSendTransport.d.ts +1 -1
- package/dist/consumers/connectSendTransport.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportAudio.d.ts +1 -1
- package/dist/consumers/connectSendTransportAudio.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportScreen.d.ts +1 -1
- package/dist/consumers/connectSendTransportScreen.d.ts.map +1 -1
- package/dist/consumers/connectSendTransportVideo.d.ts +1 -1
- package/dist/consumers/connectSendTransportVideo.d.ts.map +1 -1
- package/dist/consumers/createSendTransport.d.ts +1 -1
- package/dist/consumers/createSendTransport.d.ts.map +1 -1
- package/dist/consumers/disconnectSendTransportAudio.d.ts +1 -1
- package/dist/consumers/disconnectSendTransportAudio.d.ts.map +1 -1
- package/dist/consumers/disconnectSendTransportScreen.d.ts +1 -1
- package/dist/consumers/disconnectSendTransportScreen.d.ts.map +1 -1
- package/dist/consumers/disconnectSendTransportVideo.d.ts +1 -1
- package/dist/consumers/disconnectSendTransportVideo.d.ts.map +1 -1
- package/dist/consumers/index.cjs +80 -0
- package/dist/consumers/index.cjs.map +1 -0
- package/dist/consumers/index.d.ts +62 -0
- package/dist/consumers/index.d.ts.map +1 -0
- package/dist/consumers/index.js +80 -0
- package/dist/consumers/index.js.map +1 -0
- package/dist/consumers/resumeSendTransportAudio.d.ts +1 -1
- package/dist/consumers/resumeSendTransportAudio.d.ts.map +1 -1
- package/dist/consumers/signalNewConsumerTransport.d.ts +1 -1
- package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -1
- package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts +1 -1
- package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts.map +1 -1
- package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts +1 -1
- package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts.map +1 -1
- package/dist/consumers/streamSuccessAudio.d.ts +1 -1
- package/dist/consumers/streamSuccessAudio.d.ts.map +1 -1
- package/dist/consumers/streamSuccessAudioSwitch.d.ts +1 -1
- package/dist/consumers/streamSuccessAudioSwitch.d.ts.map +1 -1
- package/dist/consumers/streamSuccessVideo.d.ts +1 -1
- package/dist/consumers/streamSuccessVideo.d.ts.map +1 -1
- package/dist/getParticipantMedia-Bu_aZlxe.js +3555 -0
- package/dist/getParticipantMedia-Bu_aZlxe.js.map +1 -0
- package/dist/getParticipantMedia-DC_Nca8S.cjs +3554 -0
- package/dist/getParticipantMedia-DC_Nca8S.cjs.map +1 -0
- package/dist/index.cjs +299 -252
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1994 -1947
- package/dist/index.js.map +1 -1
- package/dist/index.native.cjs +230 -224
- package/dist/index.native.cjs.map +1 -1
- package/dist/index.native.js +349 -343
- package/dist/index.native.js.map +1 -1
- package/dist/joinLocalRoom-7ibqv7zZ.js +657 -0
- package/dist/joinLocalRoom-7ibqv7zZ.js.map +1 -0
- package/dist/joinLocalRoom-BJBDvTYh.cjs +673 -0
- package/dist/joinLocalRoom-BJBDvTYh.cjs.map +1 -0
- package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs +1222 -0
- package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +1 -0
- package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js +1223 -0
- package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +1 -0
- package/dist/methods/index.cjs +3975 -0
- package/dist/methods/index.cjs.map +1 -0
- package/dist/methods/index.js +3976 -0
- package/dist/methods/index.js.map +1 -0
- package/dist/methods/socketReceive/getDomains.d.ts +1 -1
- package/dist/methods/socketReceive/getDomains.d.ts.map +1 -1
- package/dist/methods/utils/headless/virtualBackground.d.ts +2 -2
- package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -1
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts +21 -0
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -0
- package/dist/methods/whiteboard/captureCanvasStream.d.ts +1 -1
- package/dist/methods/whiteboard/captureCanvasStream.d.ts.map +1 -1
- package/dist/producers/producerEmits/joinConRoom.d.ts +1 -1
- package/dist/producers/producerEmits/joinConRoom.d.ts.map +1 -1
- package/dist/producers/producerEmits/joinRoom.d.ts +1 -1
- package/dist/producers/producerEmits/joinRoom.d.ts.map +1 -1
- package/dist/translationConsumerSwitch-C20MfNNq.cjs +509 -0
- package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +1 -0
- package/dist/translationConsumerSwitch-zKuS5wgH.js +510 -0
- package/dist/translationConsumerSwitch-zKuS5wgH.js.map +1 -0
- package/dist/types/index.cjs +85 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +85 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/shared-base-types.d.ts +1 -1
- package/dist/types/shared-base-types.d.ts.map +1 -1
- package/dist/updateParticipantAudioDecibels-C_MygF6q.js +5432 -0
- package/dist/updateParticipantAudioDecibels-C_MygF6q.js.map +1 -0
- package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs +5431 -0
- package/dist/updateParticipantAudioDecibels-bZ6R8WHj.cjs.map +1 -0
- package/dist/validateAlphanumeric-DKn5BsUP.cjs +15 -0
- package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +1 -0
- package/dist/validateAlphanumeric-Dk1JB80W.js +16 -0
- package/dist/validateAlphanumeric-Dk1JB80W.js.map +1 -0
- package/package.json +2 -1
- package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +1 -2
- package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +1 -1
- package/src/consumers/connectIps.ts +69 -9
- package/src/consumers/connectRecvTransport.ts +1 -1
- package/src/consumers/connectSendTransport.ts +1 -1
- package/src/consumers/connectSendTransportAudio.ts +1 -1
- package/src/consumers/connectSendTransportScreen.ts +1 -1
- package/src/consumers/connectSendTransportVideo.ts +1 -1
- package/src/consumers/createSendTransport.ts +1 -1
- package/src/consumers/disconnectSendTransportAudio.ts +1 -1
- package/src/consumers/disconnectSendTransportScreen.ts +1 -1
- package/src/consumers/disconnectSendTransportVideo.ts +1 -1
- package/src/consumers/index.ts +61 -0
- package/src/consumers/resumeSendTransportAudio.ts +1 -1
- package/src/consumers/signalNewConsumerTransport.ts +1 -2
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +1 -1
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +1 -1
- package/src/consumers/streamSuccessAudio.ts +1 -2
- package/src/consumers/streamSuccessAudioSwitch.ts +1 -2
- package/src/consumers/streamSuccessVideo.ts +1 -1
- package/src/index.ts +2 -0
- package/src/methods/socketReceive/getDomains.ts +1 -1
- package/src/methods/utils/headless/virtualBackground.ts +45 -30
- package/src/methods/utils/virtualBackgroundCompositor.ts +53 -0
- package/src/methods/whiteboard/captureCanvasStream.ts +2 -2
- package/src/producers/producerEmits/joinConRoom.ts +1 -1
- package/src/producers/producerEmits/joinRoom.ts +1 -1
- package/src/types/index.ts +1 -0
- package/src/types/shared-base-types.ts +2 -3
- package/dist/getParticipantMedia-D9ChmEqq.js +0 -15265
- package/dist/getParticipantMedia-D9ChmEqq.js.map +0 -1
- package/dist/getParticipantMedia-DWvIhPPY.cjs +0 -15281
- package/dist/getParticipantMedia-DWvIhPPY.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/methods/panelists/launchPanelists.ts","../../src/methods/panelists/updatePanelists.ts","../../src/methods/panelists/focusPanelists.ts","../../src/methods/permissions/launchPermissions.ts","../../src/methods/permissions/updateParticipantPermission.ts","../../src/methods/permissions/updatePermissionConfig.ts","../../src/methods/polls/pollUpdated.ts","../../src/methods/prejoin/handleCreateRoom.ts","../../src/methods/prejoin/handleJoinRoom.ts","../../src/methods/stream/clickChat.ts","../../src/methods/utils/liveSubtitle.ts","../../src/methods/utils/translationLanguages.ts","../../src/methods/utils/SoundPlayer.ts","../../src/methods/utils/getOverlayPosition.ts","../../src/methods/utils/sleep.ts","../../src/methods/utils/formatNumber.ts","../../src/methods/utils/generateRandomMessages.ts","../../src/methods/utils/generateRandomParticipants.ts","../../src/methods/utils/generateRandomPolls.ts","../../src/methods/utils/generateRandomRequestList.ts","../../src/methods/utils/generateRandomWaitingRoomList.ts","../../src/methods/utils/initialValuesState.ts","../../src/methods/utils/webrtc.ts","../../src/methods/utils/createResponseJoinRoom.ts","../../src/methods/utils/createRoomOnMediaSFU.ts","../../src/methods/utils/meetingTimer/startMeetingProgressTimer.ts","../../src/methods/utils/meetingTimeRemaining.ts","../../src/methods/socketReceive/allWaitingRoomMembers.ts","../../src/methods/socketReceive/allMembers.ts","../../src/methods/socketReceive/allMembersRest.ts","../../src/methods/socketReceive/banParticipant.ts","../../src/methods/socketReceive/controlMediaHost.ts","../../src/methods/socketReceive/disconnect.ts","../../src/methods/socketReceive/disconnectUserSelf.ts","../../src/methods/socketReceive/getDomains.ts","../../src/methods/socketReceive/meetingEnded.ts","../../src/methods/socketReceive/meetingStillThere.ts","../../src/methods/socketReceive/panelistReceiveMethods.ts","../../src/methods/socketReceive/participantRequested.ts","../../src/methods/socketReceive/permissionReceiveMethods.ts","../../src/methods/socketReceive/personJoined.ts","../../src/methods/socketReceive/producerMediaClosed.ts","../../src/methods/socketReceive/producerMediaPaused.ts","../../src/methods/socketReceive/producerMediaResumed.ts","../../src/methods/socketReceive/receiveMessage.ts","../../src/methods/socketReceive/recordingNotice.ts","../../src/methods/socketReceive/reInitiateRecording.ts","../../src/methods/socketReceive/roomRecordParams.ts","../../src/methods/socketReceive/screenProducerId.ts","../../src/methods/socketReceive/startRecords.ts","../../src/methods/socketReceive/stoppedRecording.ts","../../src/methods/socketReceive/translationReceiveMethods.ts","../../src/methods/socketReceive/updateMediaSettings.ts","../../src/methods/socketReceive/updateConsumingDomains.ts","../../src/methods/socketReceive/updatedCoHost.ts","../../src/methods/socketReceive/userWaiting.ts","../../src/methods/welcome/handleWelcomeRequest.ts"],"sourcesContent":["export interface LaunchPanelistsOptions {\n updateIsPanelistsModalVisible: (visible: boolean) => void;\n isPanelistsModalVisible: boolean;\n}\n\nexport type LaunchPanelistsType = (options: LaunchPanelistsOptions) => void;\n\nexport const launchPanelists = ({\n updateIsPanelistsModalVisible,\n isPanelistsModalVisible,\n}: LaunchPanelistsOptions): void => {\n updateIsPanelistsModalVisible(!isPanelistsModalVisible);\n};\n","import { Socket } from 'socket.io-client';\nimport type { Participant, ShowAlert } from '../../types/types';\n\nexport interface UpdatePanelistsOptions {\n socket: Socket;\n panelists: Participant[];\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport interface AddPanelistOptions {\n socket: Socket;\n participant: Participant;\n currentPanelists: Participant[];\n maxPanelists: number;\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport interface RemovePanelistOptions {\n socket: Socket;\n participant: Participant;\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport type UpdatePanelistsType = (options: UpdatePanelistsOptions) => Promise<void>;\nexport type AddPanelistType = (options: AddPanelistOptions) => Promise<boolean>;\nexport type RemovePanelistType = (options: RemovePanelistOptions) => Promise<void>;\n\nexport const updatePanelists = async ({\n socket,\n panelists,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: UpdatePanelistsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'updatePanelists',\n {\n panelists: panelists.map((p) => ({ id: p.id, name: p.name })),\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to update panelists', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n\nexport const addPanelist = async ({\n socket,\n participant,\n currentPanelists,\n maxPanelists,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: AddPanelistOptions): Promise<boolean> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can add panelists', type: 'danger', duration: 3000 });\n return false;\n }\n\n if (currentPanelists.some((p) => p.id === participant.id)) {\n showAlert?.({ message: `${participant.name} is already a panelist`, type: 'success', duration: 3000 });\n return false;\n }\n\n if (currentPanelists.length >= maxPanelists) {\n showAlert?.({ message: `Maximum panelist limit (${maxPanelists}) reached`, type: 'danger', duration: 3000 });\n return false;\n }\n\n return new Promise((resolve) => {\n socket.emit(\n 'addPanelist',\n {\n participantId: participant.id,\n participantName: participant.name,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to add panelist', type: 'danger', duration: 3000 });\n resolve(false);\n } else {\n resolve(true);\n }\n }\n );\n });\n};\n\nexport const removePanelist = async ({\n socket,\n participant,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: RemovePanelistOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can remove panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'removePanelist',\n {\n participantId: participant.id,\n participantName: participant.name,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to remove panelist', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface FocusPanelistsOptions {\n socket: Socket;\n roomName: string;\n member: string;\n islevel: string;\n focusEnabled: boolean;\n muteOthersMic?: boolean;\n muteOthersCamera?: boolean;\n showAlert?: ShowAlert;\n}\n\nexport interface UnfocusPanelistsOptions {\n socket: Socket;\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport type FocusPanelistsType = (options: FocusPanelistsOptions) => Promise<void>;\nexport type UnfocusPanelistsType = (options: UnfocusPanelistsOptions) => Promise<void>;\n\nexport const focusPanelists = async ({\n socket,\n roomName,\n member: _member,\n islevel,\n focusEnabled,\n muteOthersMic = false,\n muteOthersCamera = false,\n showAlert,\n}: FocusPanelistsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can focus panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'focusPanelists',\n {\n roomName,\n focusEnabled,\n muteOthersMic,\n muteOthersCamera,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to focus panelists', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n\nexport const unfocusPanelists = async ({\n socket,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: UnfocusPanelistsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can unfocus panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'focusPanelists',\n {\n roomName,\n focusEnabled: false,\n muteOthersMic: false,\n muteOthersCamera: false,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to unfocus panelists', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n","export interface LaunchPermissionsOptions {\n updateIsPermissionsModalVisible: (visible: boolean) => void;\n isPermissionsModalVisible: boolean;\n}\n\nexport type LaunchPermissionsType = (options: LaunchPermissionsOptions) => void;\n\nexport const launchPermissions = ({\n updateIsPermissionsModalVisible,\n isPermissionsModalVisible,\n}: LaunchPermissionsOptions): void => {\n updateIsPermissionsModalVisible(!isPermissionsModalVisible);\n};\n","import { Socket } from 'socket.io-client';\nimport type { Participant, ShowAlert } from '../../types/types';\n\nexport type PermissionLevel = '0' | '1' | '2';\n\nexport interface UpdateParticipantPermissionOptions {\n socket: Socket;\n participant: Participant;\n newLevel: PermissionLevel;\n member: string;\n islevel: string;\n roomName: string;\n showAlert?: ShowAlert;\n}\n\nexport interface BulkUpdateParticipantPermissionsOptions {\n socket: Socket;\n participants: Participant[];\n newLevel: PermissionLevel;\n member: string;\n islevel: string;\n roomName: string;\n showAlert?: ShowAlert;\n maxBatchSize?: number;\n}\n\nexport const updateParticipantPermission = async ({\n socket,\n participant,\n newLevel,\n member: _member,\n islevel,\n roomName,\n showAlert,\n}: UpdateParticipantPermissionOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update participant permissions', type: 'danger', duration: 3000 });\n return;\n }\n\n if (participant.islevel === '2') {\n showAlert?.({ message: \"Cannot change the host's permission level\", type: 'danger', duration: 3000 });\n return;\n }\n\n if (participant.islevel === newLevel) return;\n\n return new Promise<void>((resolve) => {\n socket.emit(\n 'updateParticipantPermission',\n {\n participantId: participant.id,\n participantName: participant.name,\n newLevel,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to update permission', type: 'danger', duration: 3000 });\n }\n resolve();\n }\n );\n });\n};\n\nexport const bulkUpdateParticipantPermissions = async ({\n socket,\n participants,\n newLevel,\n member: _member,\n islevel,\n roomName,\n showAlert,\n maxBatchSize = 50,\n}: BulkUpdateParticipantPermissionsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update participant permissions', type: 'danger', duration: 3000 });\n return;\n }\n\n const eligibleParticipants = participants.filter(\n (p) => p.islevel !== '2' && p.islevel !== newLevel\n );\n\n if (eligibleParticipants.length === 0) {\n showAlert?.({\n message: 'No participants to update',\n type: 'info',\n duration: 3000,\n });\n return;\n }\n\n const batch = eligibleParticipants.slice(0, maxBatchSize);\n\n return new Promise<void>((resolve) => {\n socket.emit(\n 'bulkUpdateParticipantPermissions',\n {\n updates: batch.map((p) => ({\n participantId: p.id,\n participantName: p.name,\n newLevel,\n })),\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({\n message: response?.reason || 'Failed to update permissions',\n type: 'danger',\n duration: 3000,\n });\n } else if (eligibleParticipants.length > maxBatchSize) {\n showAlert?.({\n message: `Updated ${batch.length} participants. ${eligibleParticipants.length - maxBatchSize} remaining.`,\n type: 'info',\n duration: 3000,\n });\n }\n\n resolve();\n }\n );\n });\n};\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface PermissionCapabilities {\n useMic: 'allow' | 'approval' | 'disallow';\n useCamera: 'allow' | 'approval' | 'disallow';\n useScreen: 'allow' | 'approval' | 'disallow';\n useChat: 'allow' | 'disallow';\n}\n\nexport interface PermissionConfig {\n level0: PermissionCapabilities;\n level1: PermissionCapabilities;\n}\n\nexport interface UpdatePermissionConfigOptions {\n socket: Socket;\n config: PermissionConfig;\n member: string;\n islevel: string;\n roomName: string;\n showAlert?: ShowAlert;\n}\n\nexport const updatePermissionConfig = async ({\n socket,\n config,\n islevel,\n roomName,\n showAlert,\n}: UpdatePermissionConfigOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update permission configuration', type: 'danger', duration: 3000 });\n return;\n }\n\n return new Promise<void>((resolve) => {\n socket.emit(\n 'updatePermissionConfig',\n {\n config,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to update permission config', type: 'danger', duration: 3000 });\n }\n resolve();\n }\n );\n });\n};\n","import type { Poll, PollUpdatedData, ShowAlert } from '../../types/types';\n\nexport interface PollUpdatedOptions {\n data: PollUpdatedData;\n polls: Poll[];\n poll: Poll;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n updatePolls: (polls: Poll[]) => void;\n updatePoll: (poll: Poll) => void;\n updateIsPollModalVisible: (isVisible: boolean) => void;\n}\n\nexport type PollUpdatedType = (options: PollUpdatedOptions) => Promise<void>;\n\n/**\n * Reconciles poll update payloads with current poll state.\n *\n * This helper updates the poll collection, manages active poll visibility, and\n * emits user-facing alerts when a new poll starts or an active poll ends.\n *\n * @param options Poll update handling options.\n * @returns A promise that resolves after local poll state has been synchronized.\n *\n * @example\n * ```typescript\n * await pollUpdated({\n * data,\n * polls,\n * poll,\n * member: 'Ada',\n * islevel: '1',\n * updatePolls: setPolls,\n * updatePoll: setCurrentPoll,\n * updateIsPollModalVisible: setPollModalVisible,\n * });\n * ```\n */\nexport const pollUpdated = async ({\n data,\n polls,\n poll,\n member,\n islevel,\n showAlert,\n updatePolls,\n updatePoll,\n updateIsPollModalVisible,\n}: PollUpdatedOptions): Promise<void> => {\n try {\n if (data.polls) {\n polls = data.polls;\n updatePolls(data.polls);\n } else {\n polls = [data.poll];\n updatePolls(polls);\n }\n\n let tempPoll: Poll | { id: string } = { id: '' };\n\n if (poll) {\n tempPoll = { ...poll };\n }\n\n if (data.status !== 'ended') {\n poll = data.poll;\n updatePoll(data.poll);\n }\n\n if (data.status === 'started' && islevel !== '2') {\n if (!poll.voters || (poll.voters && !poll.voters[member])) {\n showAlert?.({\n message: 'New poll started',\n type: 'success',\n duration: 3000,\n });\n updateIsPollModalVisible(true);\n }\n } else if (data.status === 'ended') {\n if (tempPoll.id === data.poll.id) {\n showAlert?.({ message: 'Poll ended', type: 'danger', duration: 3000 });\n updatePoll(data.poll);\n }\n }\n } catch {\n }\n};","import { Socket } from 'socket.io-client';\nimport type {\n CreateMediaSFURoomOptions,\n CreateRoomOnMediaSFUType,\n RecordingParams,\n MeetingRoomParams,\n ResponseLocalConnectionData,\n PreJoinPageParameters,\n} from '../../types/types';\nimport { checkLimitsAndMakeRequest } from '../utils/checkLimitsAndMakeRequest';\n\n/**\n * Parameters for creating a local room\n */\nexport interface CreateLocalRoomParameters {\n eventID: string;\n duration: number;\n capacity: number;\n userName: string;\n scheduledDate: Date;\n secureCode: string;\n waitRoom?: boolean;\n recordingParams?: RecordingParams;\n eventRoomParams?: MeetingRoomParams;\n videoPreference?: string | null;\n audioPreference?: string | null;\n audioOutputPreference?: string | null;\n mediasfuURL?: string;\n}\n\n/**\n * Options for creating a local room\n */\nexport interface CreateLocalRoomOptions {\n createData: CreateLocalRoomParameters;\n link?: string;\n}\n\n/**\n * Response from creating/joining a local room\n */\nexport interface CreateJoinLocalRoomResponse {\n success: boolean;\n secret: string;\n reason?: string;\n url?: string;\n}\n\n/**\n * Options for handleCreateRoom function\n */\nexport interface HandleCreateRoomOptions {\n payload: CreateMediaSFURoomOptions;\n localLink?: string;\n connectMediaSFU?: boolean;\n apiUserName: string;\n apiKey: string;\n validate?: boolean;\n parameters: PreJoinPageParameters;\n initSocket?: Socket;\n localData?: ResponseLocalConnectionData;\n createMediaSFURoom: CreateRoomOnMediaSFUType;\n}\n\n/**\n * Handles room creation with MediaSFU and/or local server\n * \n * @param {HandleCreateRoomOptions} options - Configuration for creating a room\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleCreateRoom({\n * payload: {\n * action: 'create',\n * duration: 30,\n * capacity: 10,\n * eventType: 'conference',\n * userName: 'John Doe',\n * recordOnly: false,\n * },\n * apiUserName: 'user123',\n * apiKey: 'key123',\n * parameters,\n * createMediaSFURoom,\n * });\n * ```\n */\nexport async function handleCreateRoom({\n payload,\n localLink = '',\n connectMediaSFU = true,\n apiUserName,\n apiKey,\n validate = true,\n parameters,\n initSocket,\n localData,\n createMediaSFURoom,\n}: HandleCreateRoomOptions): Promise<void> {\n const {\n updateIsLoadingModalVisible,\n updateSocket,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n updateValidated,\n showAlert,\n } = parameters;\n\n /**\n * Creates a local room by emitting to the socket\n */\n const createLocalRoom = async ({\n createData,\n link = localLink,\n }: CreateLocalRoomOptions) => {\n initSocket?.emit('createRoom', createData, (response: CreateJoinLocalRoomResponse) => {\n if (response.success) {\n updateSocket(initSocket!);\n updateApiUserName(localData?.apiUserName || '');\n updateApiToken(response.secret);\n updateLink(link);\n updateRoomName(createData.eventID);\n // local needs islevel updated from here\n // we update member as `userName` + \"_2\" and split it in the room\n updateMember(createData.userName + '_2');\n updateIsLoadingModalVisible(false);\n updateValidated(true);\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${response.reason}`,\n type: 'danger',\n duration: 3000,\n });\n }\n });\n };\n\n /**\n * Creates a room on MediaSFU\n */\n const roomCreator = async ({\n payload: createPayload,\n apiUserName: userName,\n apiKey: key,\n validate: shouldValidate = true,\n }: {\n payload: CreateMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n validate?: boolean;\n }) => {\n const response = await createMediaSFURoom({\n payload: createPayload,\n apiUserName: userName,\n apiKey: key,\n localLink: localLink,\n });\n if (response.success && response.data && 'roomName' in response.data) {\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response!.data.link,\n userName: createPayload.userName,\n parameters: parameters,\n validate: shouldValidate,\n });\n return response;\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${\n response.data ? ('error' in response.data ? response.data.error : '') : ''\n }`,\n type: 'danger',\n duration: 3000,\n });\n }\n };\n\n updateIsLoadingModalVisible(true);\n\n if (localLink.length > 0) {\n const secureCode =\n Math.random().toString(30).substring(2, 14) +\n Math.random().toString(30).substring(2, 14);\n let eventID =\n new Date().getTime().toString(30) +\n new Date().getUTCMilliseconds() +\n Math.floor(10 + Math.random() * 99).toString();\n eventID = 'm' + eventID;\n const eventRoomParams = localData?.meetingRoomParams_;\n if (eventRoomParams && payload.eventType) {\n eventRoomParams.type = payload.eventType;\n }\n\n const createData: CreateLocalRoomParameters = {\n eventID: eventID,\n duration: payload.duration,\n capacity: payload.capacity,\n userName: payload.userName,\n scheduledDate: new Date(),\n secureCode: secureCode,\n waitRoom: false,\n recordingParams: localData?.recordingParams_,\n eventRoomParams: eventRoomParams,\n videoPreference: null,\n audioPreference: null,\n audioOutputPreference: null,\n mediasfuURL: '',\n };\n\n if (connectMediaSFU && initSocket && localData && localData.apiUserName && localData.apiKey) {\n // Store references to prevent race conditions\n const localApiUserName = localData.apiUserName;\n const localApiKey = localData.apiKey;\n\n // Build a unique identifier for this create request\n const roomIdentifier = `local_create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n const pendingKey = `prejoin_pending_${roomIdentifier}`;\n const PENDING_TIMEOUT = 30 * 1000; // 30 seconds\n\n // Check pending status to prevent duplicate requests\n try {\n const pendingRequest = localStorage.getItem(pendingKey);\n if (pendingRequest) {\n const pendingData = JSON.parse(pendingRequest);\n const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);\n if (timeSincePending < PENDING_TIMEOUT) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: 'Room creation already in progress',\n type: 'danger',\n duration: 3000,\n });\n return;\n } else {\n // Stale lock, clear it\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n } catch {\n // Ignore localStorage read/JSON errors\n }\n\n // Mark request as pending\n try {\n localStorage.setItem(\n pendingKey,\n JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: 'create',\n userName: payload.userName,\n duration: payload.duration,\n capacity: payload.capacity,\n },\n })\n );\n\n // Auto-clear the pending flag after timeout to avoid stale locks\n setTimeout(() => {\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }, PENDING_TIMEOUT);\n } catch {\n // Ignore localStorage write errors\n }\n\n payload.recordOnly = true; // allow production to mediasfu only; no consumption\n\n try {\n const response = await roomCreator({\n payload,\n apiUserName: localApiUserName,\n apiKey: localApiKey,\n validate: false,\n });\n\n // Clear pending status on completion\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n\n if (response && response.success && response.data && 'roomName' in response.data) {\n createData.eventID = response.data.roomName;\n createData.secureCode = response.data.secureCode || '';\n createData.mediasfuURL = response.data.publicURL;\n await createLocalRoom({\n createData: createData,\n link: response.data.link,\n });\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room on MediaSFU.`,\n type: 'danger',\n duration: 3000,\n });\n try {\n updateSocket(initSocket);\n await createLocalRoom({ createData: createData });\n } catch (error) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n // Clear pending status on error\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room on MediaSFU. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n } else {\n try {\n updateSocket(initSocket!);\n await createLocalRoom({ createData: createData });\n } catch (error) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } else {\n // Build a unique identifier for this create request (non-local)\n const roomIdentifier = `mediasfu_create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n const pendingKey = `prejoin_pending_${roomIdentifier}`;\n const PENDING_TIMEOUT = 30 * 1000; // 30 seconds\n\n // Check pending status to prevent duplicate requests\n try {\n const pendingRequest = localStorage.getItem(pendingKey);\n if (pendingRequest) {\n const pendingData = JSON.parse(pendingRequest);\n const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);\n if (timeSincePending < PENDING_TIMEOUT) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: 'Room creation already in progress',\n type: 'danger',\n duration: 3000,\n });\n return;\n } else {\n // Stale lock, clear it\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n } catch {\n // Ignore localStorage read/JSON errors\n }\n\n // Mark request as pending\n try {\n localStorage.setItem(\n pendingKey,\n JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: 'create',\n userName: payload.userName,\n duration: payload.duration,\n capacity: payload.capacity,\n },\n })\n );\n\n // Auto-clear the pending flag after timeout to avoid stale locks\n setTimeout(() => {\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }, PENDING_TIMEOUT);\n } catch {\n // Ignore localStorage write errors\n }\n\n try {\n await roomCreator({\n payload,\n apiUserName: apiUserName,\n apiKey: apiKey,\n validate: validate,\n });\n\n // Clear pending status on completion\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n } catch (error) {\n // Clear pending status on error\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n}\n","import { Socket } from 'socket.io-client';\nimport type {\n JoinMediaSFURoomOptions,\n JoinRoomOnMediaSFUType,\n PreJoinPageParameters,\n} from '../../types/types';\nimport { checkLimitsAndMakeRequest } from '../utils/checkLimitsAndMakeRequest';\nimport type { CreateJoinLocalRoomResponse } from './handleCreateRoom';\n\n/**\n * Parameters for joining a local event room\n */\nexport interface JoinLocalEventRoomParameters {\n eventID: string;\n userName: string;\n secureCode?: string;\n videoPreference?: string | null;\n audioPreference?: string | null;\n audioOutputPreference?: string | null;\n}\n\n/**\n * Options for joining a local event room\n */\nexport interface JoinLocalEventRoomOptions {\n joinData: JoinLocalEventRoomParameters;\n link?: string;\n}\n\n/**\n * Options for handleJoinRoom function\n */\nexport interface HandleJoinRoomOptions {\n payload: JoinMediaSFURoomOptions;\n localLink?: string;\n apiUserName: string;\n apiKey: string;\n parameters: PreJoinPageParameters;\n initSocket?: Socket;\n localData?: any;\n joinMediaSFURoom: JoinRoomOnMediaSFUType;\n}\n\n/**\n * Handles joining an existing room on MediaSFU or local server\n * \n * @param {HandleJoinRoomOptions} options - Configuration for joining a room\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleJoinRoom({\n * payload: {\n * action: 'join',\n * meetingID: 'room123',\n * userName: 'John Doe',\n * },\n * apiUserName: 'user123',\n * apiKey: 'key123',\n * parameters,\n * joinMediaSFURoom,\n * });\n * ```\n */\nexport async function handleJoinRoom({\n payload,\n localLink = '',\n apiUserName,\n apiKey,\n parameters,\n initSocket,\n localData,\n joinMediaSFURoom,\n}: HandleJoinRoomOptions): Promise<void> {\n const {\n updateIsLoadingModalVisible,\n updateSocket,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n updateValidated,\n showAlert,\n } = parameters;\n\n /**\n * Joins a local room by emitting to the socket\n */\n const joinLocalRoom = async ({ joinData, link = localLink }: JoinLocalEventRoomOptions) => {\n initSocket?.emit('joinEventRoom', joinData, (response: CreateJoinLocalRoomResponse) => {\n if (response.success) {\n updateSocket(initSocket!);\n updateApiUserName(localData?.apiUserName || '');\n updateApiToken(response.secret);\n updateLink(link);\n updateRoomName(joinData.eventID);\n updateMember(joinData.userName);\n updateIsLoadingModalVisible(false);\n updateValidated(true);\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to join room. ${response.reason}`,\n type: 'danger',\n duration: 3000,\n });\n }\n });\n };\n\n if (localLink.length > 0 && !localLink.includes('mediasfu.com')) {\n const joinData: JoinLocalEventRoomParameters = {\n eventID: payload.meetingID,\n userName: payload.userName,\n secureCode: '',\n videoPreference: null,\n audioPreference: null,\n audioOutputPreference: null,\n };\n\n await joinLocalRoom({ joinData: joinData });\n return;\n }\n\n updateIsLoadingModalVisible(true);\n\n const response = await joinMediaSFURoom({\n payload,\n apiUserName: apiUserName,\n apiKey: apiKey,\n localLink: localLink,\n });\n\n if (response.success && response.data && 'roomName' in response.data) {\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response.data.link,\n userName: payload.userName,\n parameters: parameters,\n });\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to join room. ${\n response.data ? ('error' in response.data ? response.data.error : '') : ''\n }`,\n type: 'danger',\n duration: 3000,\n });\n }\n}\n","import type { ShowAlert } from '../../types/types';\n\nexport interface ClickChatOptions {\n isMessagesModalVisible: boolean;\n updateIsMessagesModalVisible: (isVisible: boolean) => void;\n chatSetting: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport type ClickChatType = (options: ClickChatOptions) => Promise<void>;\n\nexport const clickChat = async ({\n isMessagesModalVisible,\n updateIsMessagesModalVisible,\n chatSetting,\n islevel,\n showAlert,\n}: ClickChatOptions): Promise<void> => {\n if (isMessagesModalVisible) {\n updateIsMessagesModalVisible(false);\n return;\n }\n\n if (chatSetting !== 'allow' && islevel !== '2') {\n updateIsMessagesModalVisible(false);\n showAlert?.({\n message: 'Chat is disabled for this event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n updateIsMessagesModalVisible(true);\n};\n","export interface TranslationTranscriptData {\n speakerId: string;\n speakerName?: string;\n language: string;\n originalText: string;\n translatedText?: string;\n timestamp?: number;\n targetLanguage?: string;\n isFinal?: boolean;\n [key: string]: any;\n}\n\nexport interface LiveSubtitle {\n text: string;\n language: string;\n timestamp: number;\n expiresAt: number;\n speakerId: string;\n speakerName?: string;\n}\n\nexport interface UpdateLiveSubtitlesOptions {\n currentSubtitles: Map<string, LiveSubtitle>;\n transcript: TranslationTranscriptData;\n now?: number;\n}\n\nexport const createLiveSubtitle = (params: {\n text: string;\n language: string;\n speakerId: string;\n speakerName?: string;\n timestamp?: number;\n}): LiveSubtitle => {\n const timestamp = params.timestamp ?? Date.now();\n const duration = Math.min(8000, Math.max(3000, 3000 + params.text.length * 50));\n\n return {\n text: params.text,\n language: params.language,\n timestamp,\n expiresAt: timestamp + duration,\n speakerId: params.speakerId,\n speakerName: params.speakerName,\n };\n};\n\nexport const isSubtitleExpired = (subtitle: LiveSubtitle, now = Date.now()): boolean => {\n return now >= subtitle.expiresAt;\n};\n\nexport const pruneExpiredSubtitles = (\n subtitles: Map<string, LiveSubtitle>,\n now = Date.now(),\n): Map<string, LiveSubtitle> => {\n const next = new Map(subtitles);\n\n for (const [key, subtitle] of next.entries()) {\n if (isSubtitleExpired(subtitle, now)) {\n next.delete(key);\n }\n }\n\n return next;\n};\n\nexport const updateLiveSubtitlesFromTranscript = ({\n currentSubtitles,\n transcript,\n now,\n}: UpdateLiveSubtitlesOptions): Map<string, LiveSubtitle> => {\n const subtitle = createLiveSubtitle({\n text: transcript.translatedText || transcript.originalText,\n language: transcript.language,\n speakerId: transcript.speakerId,\n speakerName: transcript.speakerName,\n timestamp: now ?? transcript.timestamp,\n });\n\n const next = pruneExpiredSubtitles(currentSubtitles, subtitle.timestamp);\n next.set(transcript.speakerId, subtitle);\n\n if (transcript.speakerName) {\n next.set(transcript.speakerName, subtitle);\n }\n\n return next;\n};\n\nexport const getSubtitleForSpeaker = (\n subtitles: Map<string, LiveSubtitle>,\n speakerId: string,\n speakerName?: string,\n now = Date.now(),\n): LiveSubtitle | null => {\n const activeSubtitles = pruneExpiredSubtitles(subtitles, now);\n\n if (speakerId && activeSubtitles.has(speakerId)) {\n return activeSubtitles.get(speakerId) || null;\n }\n\n if (speakerName && activeSubtitles.has(speakerName)) {\n return activeSubtitles.get(speakerName) || null;\n }\n\n return null;\n};","export type VoiceGender = 'male' | 'female' | 'neutral';\n\nexport type TTSSupport = 'excellent' | 'good' | 'moderate' | 'limited' | 'unknown' | 'n/a';\n\nexport type LanguageRegion =\n | 'global'\n | 'europe'\n | 'asia'\n | 'south-asia'\n | 'mena'\n | 'africa'\n | 'caucasus'\n | 'central-asia'\n | 'constructed'\n | 'special'\n | 'other';\n\nexport interface LanguageMetadata {\n name: string;\n nativeName: string;\n region: LanguageRegion;\n ttsSupport: TTSSupport;\n}\n\nexport interface LanguageOption {\n code: string;\n name: string;\n nativeName: string;\n region: LanguageRegion;\n ttsSupport: TTSSupport;\n}\n\nexport interface VoiceOption {\n id: string;\n name: string;\n gender: VoiceGender;\n provider: string;\n language: string;\n style?: string;\n}\n\nexport interface VoiceSelectionPreference {\n gender: VoiceGender;\n voiceId?: string;\n style?: string;\n}\n\nexport interface TranslationVoiceConfig {\n voiceGender?: VoiceGender;\n voiceId?: string;\n voiceClone?: {\n provider: 'elevenlabs' | 'playht' | 'coqui' | 'cartesia';\n voiceId: string;\n stability?: number;\n similarity?: number;\n };\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n ttsProvider?: string;\n sttParams?: Record<string, string | number | boolean>;\n llmParams?: Record<string, string | number | boolean>;\n ttsParams?: Record<string, string | number | boolean>;\n}\n\nexport interface TranslationLanguageEntry {\n code: string;\n nickname?: string;\n voiceConfig?: TranslationVoiceConfig;\n}\n\nexport const SUPPORTED_LANGUAGE_CODES: string[] = [\n 'en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'zh', 'ja', 'ko', 'ar',\n 'hi', 'bn', 'pa', 'te', 'mr', 'ta', 'ur', 'gu', 'kn', 'ml', 'ne', 'si',\n 'nl', 'pl', 'tr', 'cs', 'el', 'hu', 'ro', 'sv', 'da', 'fi', 'no', 'sk',\n 'uk', 'bg', 'hr', 'et', 'lt', 'lv', 'sl', 'sr', 'bs', 'mk', 'is',\n 'ga', 'cy', 'mt', 'lb', 'sq', 'be',\n 'he', 'fa', 'ps', 'ku',\n 'vi', 'th', 'id', 'ms', 'tl', 'km', 'lo', 'my',\n 'sw', 'yo', 'ig', 'ha', 'zu', 'xh', 'af', 'st', 'tn', 'sn', 'am', 'so', 'rw', 'mg', 'ny',\n 'ee', 'tw', 'gaa',\n 'ka', 'hy', 'az',\n 'eu', 'gl', 'ca', 'la', 'eo',\n 'kk', 'uz', 'tg', 'ky', 'tk', 'mn',\n 'auto',\n];\n\nconst REGION_BY_LANGUAGE: Record<string, LanguageRegion> = {\n en: 'global', es: 'global', fr: 'europe', de: 'europe', it: 'europe', pt: 'global', ru: 'europe', zh: 'asia', ja: 'asia', ko: 'asia', ar: 'mena',\n hi: 'south-asia', bn: 'south-asia', pa: 'south-asia', te: 'south-asia', mr: 'south-asia', ta: 'south-asia', ur: 'south-asia', gu: 'south-asia', kn: 'south-asia', ml: 'south-asia', ne: 'south-asia', si: 'south-asia',\n nl: 'europe', pl: 'europe', tr: 'europe', cs: 'europe', el: 'europe', hu: 'europe', ro: 'europe', sv: 'europe', da: 'europe', fi: 'europe', no: 'europe', sk: 'europe', uk: 'europe', bg: 'europe', hr: 'europe', et: 'europe', lt: 'europe', lv: 'europe', sl: 'europe', sr: 'europe', bs: 'europe', mk: 'europe', is: 'europe', ga: 'europe', cy: 'europe', mt: 'europe', lb: 'europe', sq: 'europe', be: 'europe',\n he: 'mena', fa: 'mena', ps: 'mena', ku: 'mena',\n vi: 'asia', th: 'asia', id: 'asia', ms: 'asia', tl: 'asia', km: 'asia', lo: 'asia', my: 'asia',\n sw: 'africa', yo: 'africa', ig: 'africa', ha: 'africa', zu: 'africa', xh: 'africa', af: 'africa', st: 'africa', tn: 'africa', sn: 'africa', am: 'africa', so: 'africa', rw: 'africa', mg: 'africa', ny: 'africa', ee: 'africa', tw: 'africa', gaa: 'africa',\n ka: 'caucasus', hy: 'caucasus', az: 'caucasus',\n eu: 'europe', gl: 'europe', ca: 'europe', la: 'europe', eo: 'constructed',\n kk: 'central-asia', uz: 'central-asia', tg: 'central-asia', ky: 'central-asia', tk: 'central-asia', mn: 'central-asia',\n auto: 'special',\n};\n\nconst TTS_SUPPORT_BY_LANGUAGE: Record<string, TTSSupport> = {\n en: 'excellent', es: 'excellent', fr: 'excellent', de: 'excellent', it: 'excellent', pt: 'excellent', ru: 'excellent', zh: 'excellent', ja: 'excellent', ko: 'excellent', ar: 'excellent',\n hi: 'good', bn: 'good', te: 'good', mr: 'good', ta: 'good', ur: 'good', nl: 'excellent', pl: 'excellent', tr: 'excellent', cs: 'good', el: 'good', hu: 'good', ro: 'good', sv: 'excellent',\n da: 'good', fi: 'good', no: 'good', uk: 'good', he: 'good', vi: 'good', th: 'good', id: 'good', ms: 'good', af: 'good', ca: 'good',\n auto: 'n/a',\n};\n\n/** Static English language names used as a fallback when Intl.DisplayNames is\n * unavailable or returns an empty string (e.g. older Hermes on Android). */\nconst LANGUAGE_NAMES_EN: Record<string, string> = {\n en: 'English', es: 'Spanish', fr: 'French', de: 'German', it: 'Italian',\n pt: 'Portuguese', nl: 'Dutch', ru: 'Russian', zh: 'Chinese', ja: 'Japanese',\n ko: 'Korean', ar: 'Arabic', hi: 'Hindi', bn: 'Bengali', pa: 'Punjabi',\n te: 'Telugu', mr: 'Marathi', ta: 'Tamil', ur: 'Urdu', gu: 'Gujarati',\n kn: 'Kannada', ml: 'Malayalam', ne: 'Nepali', si: 'Sinhala',\n tr: 'Turkish', pl: 'Polish', vi: 'Vietnamese', th: 'Thai',\n id: 'Indonesian', ms: 'Malay', tl: 'Filipino', km: 'Khmer',\n lo: 'Lao', my: 'Burmese',\n sw: 'Swahili', yo: 'Yoruba', ha: 'Hausa', ig: 'Igbo', zu: 'Zulu',\n xh: 'Xhosa', af: 'Afrikaans', st: 'Sesotho', tn: 'Tswana', sn: 'Shona',\n am: 'Amharic', so: 'Somali', rw: 'Kinyarwanda', mg: 'Malagasy',\n ny: 'Chichewa', ee: 'Ewe', tw: 'Twi', gaa: 'Ga',\n he: 'Hebrew', fa: 'Persian', ps: 'Pashto', ku: 'Kurdish',\n uk: 'Ukrainian', el: 'Greek', cs: 'Czech', ro: 'Romanian',\n hu: 'Hungarian', sv: 'Swedish', da: 'Danish', no: 'Norwegian',\n fi: 'Finnish', sk: 'Slovak', bg: 'Bulgarian', hr: 'Croatian',\n et: 'Estonian', lt: 'Lithuanian', lv: 'Latvian', sl: 'Slovenian',\n sr: 'Serbian', bs: 'Bosnian', mk: 'Macedonian', is: 'Icelandic',\n ga: 'Irish', cy: 'Welsh', mt: 'Maltese', lb: 'Luxembourgish',\n sq: 'Albanian', be: 'Belarusian',\n ka: 'Georgian', hy: 'Armenian', az: 'Azerbaijani',\n eu: 'Basque', gl: 'Galician', ca: 'Catalan', la: 'Latin', eo: 'Esperanto',\n kk: 'Kazakh', uz: 'Uzbek', tg: 'Tajik', ky: 'Kyrgyz', tk: 'Turkmen',\n mn: 'Mongolian',\n};\n\nconst getDisplayName = (code: string, locale: string, fallback: string) => {\n try {\n const displayNames = new Intl.DisplayNames([locale], { type: 'language' });\n const result = displayNames.of(code);\n if (result) return result;\n } catch {\n // Intl.DisplayNames unavailable on this runtime (e.g. older Hermes)\n }\n // Fall back to the static English map, then the uppercase-code fallback.\n return LANGUAGE_NAMES_EN[code] ?? fallback;\n};\n\nexport const normalizeLanguageCode = (code: string): string => {\n if (!code || typeof code !== 'string') {\n return 'en';\n }\n\n return code.trim().toLowerCase().split('-')[0];\n};\n\nexport const isLanguageSupported = (code: string): boolean => {\n const normalized = normalizeLanguageCode(code);\n return SUPPORTED_LANGUAGE_CODES.includes(normalized);\n};\n\nexport const getLanguageName = (code: string, displayLocale = 'en'): string => {\n const normalized = normalizeLanguageCode(code);\n if (normalized === 'auto') {\n return 'Auto-detect';\n }\n\n return getDisplayName(normalized, displayLocale, normalized.toUpperCase());\n};\n\nexport const getLanguageNativeName = (code: string): string => {\n const normalized = normalizeLanguageCode(code);\n if (normalized === 'auto') {\n return 'Auto';\n }\n\n return getDisplayName(normalized, normalized, getLanguageName(normalized));\n};\n\nexport const getLanguageMetadata = (code: string): LanguageMetadata => {\n const normalized = normalizeLanguageCode(code);\n\n return {\n name: getLanguageName(normalized),\n nativeName: getLanguageNativeName(normalized),\n region: REGION_BY_LANGUAGE[normalized] || 'other',\n ttsSupport: TTS_SUPPORT_BY_LANGUAGE[normalized] || 'unknown',\n };\n};\n\nexport const getSupportedLanguages = (displayLocale = 'en'): LanguageOption[] => {\n return SUPPORTED_LANGUAGE_CODES.map((code) => {\n const metadata = getLanguageMetadata(code);\n return {\n code,\n name: getLanguageName(code, displayLocale),\n nativeName: metadata.nativeName,\n region: metadata.region,\n ttsSupport: metadata.ttsSupport,\n };\n }).sort((left, right) => left.name.localeCompare(right.name));\n};\n\n/**\n * Curated list of the most widely-supported language codes for real-time translation.\n * This set covers the languages supported by major STT/TTS/translation providers\n * (Google, Azure, Deepgram, OpenAI, DeepL, etc.) and is the default shown in UI pickers.\n * Use getSupportedLanguages() if you need the full extended list.\n */\nexport const COMMON_LANGUAGE_CODES: string[] = [\n 'en', 'es', 'fr', 'de', 'it', 'pt', 'nl', 'ru', 'zh', 'ja', 'ko', 'ar',\n 'hi', 'bn', 'tr', 'pl', 'vi', 'th', 'id', 'ms',\n 'sw', 'yo', 'ha', 'ig', 'zu', 'am', 'tw',\n 'he', 'fa', 'uk', 'el', 'cs', 'ro', 'hu', 'sv', 'da', 'no', 'fi',\n];\n\n/**\n * Returns the curated list of commonly-supported languages for translation UI pickers.\n * Sorted alphabetically by display name.\n */\nexport const getCommonLanguages = (displayLocale = 'en'): LanguageOption[] => {\n return COMMON_LANGUAGE_CODES.map((code) => {\n const metadata = getLanguageMetadata(code);\n return {\n code,\n name: getLanguageName(code, displayLocale),\n nativeName: metadata.nativeName,\n region: metadata.region,\n ttsSupport: metadata.ttsSupport,\n };\n }).sort((left, right) => left.name.localeCompare(right.name));\n};\n\nexport type TTSProvider =\n | 'deepgram'\n | 'openai'\n | 'azure'\n | 'google'\n | 'aws'\n | 'elevenlabs'\n | 'playht'\n | 'cartesia'\n | 'rime'\n | 'kokoro'\n | 'gemini'\n | 'assemblyai';\n\nexport const TTS_PROVIDERS: Record<TTSProvider, { name: string; supportsSSML: boolean; multilingual?: boolean; isDefault?: boolean }> = {\n deepgram: { name: 'Deepgram Aura', supportsSSML: false, isDefault: true },\n openai: { name: 'OpenAI TTS', supportsSSML: false, multilingual: true },\n azure: { name: 'Azure Neural TTS', supportsSSML: true },\n google: { name: 'Google Cloud TTS', supportsSSML: true },\n aws: { name: 'AWS Polly', supportsSSML: true },\n elevenlabs: { name: 'ElevenLabs', supportsSSML: false, multilingual: true },\n playht: { name: 'PlayHT', supportsSSML: false, multilingual: true },\n cartesia: { name: 'Cartesia Sonic', supportsSSML: false, multilingual: true },\n rime: { name: 'Rime AI', supportsSSML: false, multilingual: true },\n kokoro: { name: 'Kokoro', supportsSSML: false, multilingual: true },\n gemini: { name: 'Google Gemini TTS', supportsSSML: false, multilingual: true },\n assemblyai: { name: 'AssemblyAI', supportsSSML: false },\n};\n\nexport interface SocketVoiceResponse {\n provider: string;\n language: string;\n voices: { male: VoiceOption[]; female: VoiceOption[] };\n providers?: Record<string, unknown>;\n error?: string;\n}\n\nconst buildFallbackVoices = (langCode: string, provider: string): { male: VoiceOption[]; female: VoiceOption[] } => {\n const normalizedLanguage = normalizeLanguageCode(langCode === 'auto' ? 'en' : langCode);\n const providerKey = provider.toLowerCase();\n const providerName = TTS_PROVIDERS[providerKey as TTSProvider]?.name || provider;\n const languageName = getLanguageName(normalizedLanguage);\n\n return {\n female: [\n {\n id: `${providerKey}-${normalizedLanguage}-female-1`,\n name: `${providerName} ${languageName} Female`,\n gender: 'female',\n provider: providerKey,\n language: normalizedLanguage,\n },\n {\n id: `${providerKey}-${normalizedLanguage}-female-2`,\n name: `${providerName} ${languageName} Female 2`,\n gender: 'female',\n provider: providerKey,\n language: normalizedLanguage,\n },\n ],\n male: [\n {\n id: `${providerKey}-${normalizedLanguage}-male-1`,\n name: `${providerName} ${languageName} Male`,\n gender: 'male',\n provider: providerKey,\n language: normalizedLanguage,\n },\n {\n id: `${providerKey}-${normalizedLanguage}-male-2`,\n name: `${providerName} ${languageName} Male 2`,\n gender: 'male',\n provider: providerKey,\n language: normalizedLanguage,\n },\n ],\n };\n};\n\nexport const getAvailableVoices = (\n langCode: string,\n provider: TTSProvider | string = 'deepgram'\n): { male: VoiceOption[]; female: VoiceOption[] } => {\n return buildFallbackVoices(langCode, provider.toString());\n};\n\nexport const fetchVoicesViaSocket = (\n socket: { emit: (event: string, data: unknown, callback?: (response: SocketVoiceResponse) => void) => void },\n provider: TTSProvider | string = 'deepgram',\n language: string = 'en'\n): Promise<SocketVoiceResponse> => {\n return new Promise((resolve) => {\n const providerName = provider.toString();\n const fallbackVoices = getAvailableVoices(language, providerName);\n\n const timeout = setTimeout(() => {\n resolve({\n provider: providerName,\n language,\n voices: fallbackVoices,\n error: 'Request timed out, using shared fallback voices',\n });\n }, 5000);\n\n socket.emit('translation:getVoices', { provider, language }, (response: SocketVoiceResponse) => {\n clearTimeout(timeout);\n\n if (response?.voices) {\n resolve(response);\n return;\n }\n\n resolve({\n provider: response?.provider || providerName,\n language: response?.language || language,\n voices: fallbackVoices,\n error: response?.error || 'No voices returned, using shared fallback voices',\n });\n });\n });\n};\n\nexport const fetchLanguagesViaSocket = (\n socket: { emit: (event: string, data: unknown, callback?: (response: { languages?: LanguageOption[] }) => void) => void },\n displayLocale: string = 'en'\n): Promise<LanguageOption[]> => {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(getSupportedLanguages(displayLocale));\n }, 5000);\n\n socket.emit('translation:getLanguages', { displayLocale }, (response: { languages?: LanguageOption[] }) => {\n clearTimeout(timeout);\n resolve(response?.languages?.length ? response.languages : getSupportedLanguages(displayLocale));\n });\n });\n};","export interface SoundPlayerOptions {\n soundUrl: string;\n}\n\nexport type SoundPlayerType = (options: SoundPlayerOptions) => void | Promise<void>;\n\n/**\n * Attempts to play a remote sound asset when the runtime supports browser audio playback.\n *\n * @param {SoundPlayerOptions} options - The sound asset URL to play.\n * @returns {void | Promise<void>} Completes after playback attempt starts/completes or is skipped.\n *\n * @example\n * ```typescript\n * await SoundPlayer({\n * soundUrl: 'https://www.mediasfu.com/sounds/record-progress.mp3',\n * });\n * ```\n */\nexport const SoundPlayer = async ({ soundUrl }: SoundPlayerOptions): Promise<void> => {\n if (!soundUrl || typeof Audio === 'undefined') {\n return;\n }\n\n try {\n const audio = new Audio(soundUrl);\n await audio.play();\n } catch (error) {\n console.error('Error playing sound:', error);\n }\n};","import type { OverlayPositionStyle } from '../../types/types';\n\nexport interface GetOverlayPositionOptions {\n position: string;\n}\n\nexport type GetOverlayPositionType = (options: GetOverlayPositionOptions) => OverlayPositionStyle;\n\n/**\n * Maps a symbolic overlay position to CSS-style edge coordinates.\n *\n * This is used by display card components to anchor badges, audio indicators,\n * or auxiliary overlays to a participant tile corner.\n *\n * @param options Overlay position options.\n * @returns A partial coordinate object suitable for inline style application.\n *\n * @example\n * ```typescript\n * const style = getOverlayPosition({ position: 'bottomRight' });\n * // style === { bottom: 0, right: 0 }\n * ```\n */\nexport const getOverlayPosition = ({ position }: GetOverlayPositionOptions): OverlayPositionStyle => {\n switch (position) {\n case 'topLeft':\n return { top: 0, left: 0 };\n case 'topRight':\n return { top: 0, right: 0 };\n case 'bottomLeft':\n return { bottom: 0, left: 0 };\n case 'bottomRight':\n return { bottom: 0, right: 0 };\n default:\n return {};\n }\n};","export interface SleepOptions {\n ms: number;\n}\n\nexport type SleepType = (options: SleepOptions) => Promise<void>;\n\n/**\n * Delays execution for a specified number of milliseconds.\n *\n * This helper is used throughout MediaSFU to wait for short transport or media\n * lifecycle transitions before continuing work.\n *\n * @param options Delay configuration.\n * @returns A promise that resolves after the requested delay.\n *\n * @example\n * ```typescript\n * await sleep({ ms: 500 });\n * // Continue after a half-second pause.\n * ```\n */\nexport function sleep({ ms }: SleepOptions): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}","export interface FormatNumberOptions {\n number: number;\n}\n\nexport type FormatNumberType = (options: FormatNumberOptions) => Promise<string | undefined>;\n\n/**\n * Formats large numbers into compact display strings.\n *\n * Values are converted to `K`, `M`, or `B` suffixes for UI-friendly display.\n * Falsy values return `undefined` to match existing MediaSFU display behavior.\n *\n * @param options Number formatting options.\n * @returns A compact string such as `1.2K` or `3.4M`, or `undefined` for empty input.\n *\n * @example\n * ```typescript\n * const viewers = await formatNumber({ number: 1530 });\n * // viewers === '1.5K'\n * ```\n */\nexport const formatNumber = async ({ number }: FormatNumberOptions): Promise<string | undefined> => {\n if (number) {\n if (number < 1e3) {\n return number.toString();\n }\n\n if (number < 1e6) {\n return `${(number / 1e3).toFixed(1)}K`;\n }\n\n if (number < 1e9) {\n return `${(number / 1e6).toFixed(1)}M`;\n }\n\n if (number < 1e12) {\n return `${(number / 1e9).toFixed(1)}B`;\n }\n }\n\n return undefined;\n};","import type { Message, Participant } from '../../types/shared-base-types';\n\nexport interface GenerateRandomMessagesOptions {\n participants: Participant[];\n member: string;\n coHost?: string;\n host: string;\n forChatBroadcast?: boolean;\n}\n\nexport type GenerateRandomMessagesType = (options: GenerateRandomMessagesOptions) => Message[];\n\nexport const generateRandomMessages = ({\n participants,\n member,\n coHost = '',\n host,\n forChatBroadcast = false,\n}: GenerateRandomMessagesOptions): Message[] => {\n const messages: Message[] = [];\n\n const getRandomReceiver = (sender: string): string => {\n const potentialReceivers = participants.filter((participant) => participant.name !== sender);\n const randomReceiver = potentialReceivers[Math.floor(Math.random() * potentialReceivers.length)];\n return randomReceiver?.name || '';\n };\n\n let refNames: string[] = [];\n if (forChatBroadcast) {\n refNames = [member, host];\n } else if (coHost) {\n refNames = [\n member,\n coHost,\n host,\n ...participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),\n ];\n } else {\n refNames = [\n member,\n host,\n ...participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),\n ];\n }\n\n refNames = [...new Set(refNames)];\n\n let timeIncrement = 0;\n refNames.forEach((sender) => {\n messages.push({\n sender,\n receivers: [getRandomReceiver(sender)],\n message: `Direct message from ${sender}`,\n timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),\n group: false,\n });\n\n messages.push({\n sender,\n receivers: participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),\n message: `Group message from ${sender}`,\n timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),\n group: true,\n });\n\n timeIncrement += 15000;\n });\n\n return messages;\n};\n","import type { Participant } from '../../types/shared-base-types';\n\nexport interface GenerateRandomParticipantsOptions {\n member: string;\n coHost?: string;\n host: string;\n forChatBroadcast?: boolean;\n}\n\nexport type GenerateRandomParticipantsType = (\n options: GenerateRandomParticipantsOptions,\n) => Participant[];\n\nexport const generateRandomParticipants = ({\n member,\n coHost = '',\n host,\n forChatBroadcast = false,\n}: GenerateRandomParticipantsOptions): Participant[] => {\n const participants: Participant[] = [];\n let names: string[] = [\n 'Alice',\n 'Bob',\n 'Charlie',\n 'David',\n 'Eve',\n 'Frank',\n 'Grace',\n 'Hank',\n 'Ivy',\n 'Jack',\n 'Kate',\n 'Liam',\n 'Mia',\n 'Nina',\n 'Olivia',\n 'Pete',\n 'Quinn',\n 'Rachel',\n 'Steve',\n 'Tina',\n 'Ursula',\n 'Vince',\n 'Wendy',\n 'Xander',\n 'Yvonne',\n 'Zack',\n ];\n\n if (forChatBroadcast) {\n names.splice(2);\n }\n\n if (!names.includes(member)) {\n names.unshift(member);\n }\n\n if (!names.includes(coHost) && !forChatBroadcast) {\n names.unshift(coHost);\n }\n\n if (!names.includes(host)) {\n names.unshift(host);\n }\n\n if (forChatBroadcast) {\n names.splice(2);\n }\n\n names = names.filter((name) => name.length > 1);\n\n const shuffledNames = [...names];\n for (let index = shuffledNames.length - 1; index > 0; index -= 1) {\n const randomIndex = Math.floor(Math.random() * (index + 1));\n [shuffledNames[index], shuffledNames[randomIndex]] = [shuffledNames[randomIndex], shuffledNames[index]];\n }\n\n let hasLevel2Participant = false;\n\n for (let index = 0; index < shuffledNames.length; index += 1) {\n const randomName = shuffledNames[index];\n const randomLevel = hasLevel2Participant ? '1' : randomName === host ? '2' : '1';\n const randomMuted = forChatBroadcast ? true : Math.random() < 0.5;\n\n if (randomLevel === '2') {\n hasLevel2Participant = true;\n }\n\n participants.push({\n name: randomName,\n islevel: randomLevel,\n muted: randomMuted,\n id: index.toString(),\n audioID: `audio-${index}`,\n videoID: `video-${index}`,\n });\n }\n\n return participants;\n};\n","import type { Poll } from '../../types/shared-base-types';\n\nexport interface GenerateRandomPollsOptions {\n numberOfPolls: number;\n}\n\nexport type GenerateRandomPollsType = (options: GenerateRandomPollsOptions) => Poll[];\n\nexport const generateRandomPolls = ({ numberOfPolls }: GenerateRandomPollsOptions): Poll[] => {\n const pollTypes: string[] = ['trueFalse', 'yesNo', 'custom'];\n const polls: Poll[] = [];\n\n for (let index = 0; index < numberOfPolls; index += 1) {\n const type = pollTypes[Math.floor(Math.random() * pollTypes.length)];\n let options: string[];\n\n switch (type) {\n case 'trueFalse':\n options = ['True', 'False'];\n break;\n case 'yesNo':\n options = ['Yes', 'No'];\n break;\n case 'custom':\n options = Array.from({ length: Math.floor(Math.random() * 5) + 2 }, (_, optionIndex) => `Option ${optionIndex + 1}`);\n break;\n default:\n options = [];\n }\n\n polls.push({\n id: `${index + 1}`,\n question: `Random Question ${index + 1}`,\n type,\n options,\n votes: Array(options.length).fill(0),\n status: 'inactive',\n voters: {},\n });\n }\n\n return polls;\n};\n","import type { Participant, Request } from '../../types/shared-base-types';\n\nexport interface GenerateRandomRequestListOptions {\n participants: Participant[];\n hostName: string;\n coHostName?: string;\n numberOfRequests: number;\n}\n\nexport type GenerateRandomRequestListType = (options: GenerateRandomRequestListOptions) => Request[];\n\nexport const generateRandomRequestList = ({\n participants,\n hostName,\n coHostName,\n numberOfRequests,\n}: GenerateRandomRequestListOptions): Request[] => {\n const filteredParticipants = participants.filter(\n (participant) => participant.name !== hostName && participant.name !== coHostName,\n );\n\n const requestIcons = ['fa-video', 'fa-desktop', 'fa-microphone'];\n\n for (let index = requestIcons.length - 1; index > 0; index -= 1) {\n const randomIndex = Math.floor(Math.random() * (index + 1));\n [requestIcons[index], requestIcons[randomIndex]] = [requestIcons[randomIndex], requestIcons[index]];\n }\n\n return filteredParticipants.flatMap((participant) => {\n const uniqueIcons = new Set<string>();\n const requests: Request[] = [];\n\n for (let index = 0; index < numberOfRequests; index += 1) {\n let randomIcon: string;\n do {\n randomIcon = requestIcons[Math.floor(Math.random() * requestIcons.length)];\n } while (uniqueIcons.has(randomIcon));\n\n uniqueIcons.add(randomIcon);\n\n requests.push({\n id: participant.id || '',\n name: participant.name ? participant.name.toLowerCase().replace(/\\s/g, '_') : '',\n icon: randomIcon,\n username: participant.name ? participant.name.toLowerCase().replace(/\\s/g, '_') : '',\n });\n }\n\n return requests;\n });\n};\n","import type { WaitingRoomParticipant } from '../../types/shared-base-types';\n\nexport type GenerateRandomWaitingRoomListType = () => WaitingRoomParticipant[];\n\nexport const generateRandomWaitingRoomList = (): WaitingRoomParticipant[] => {\n const names = ['Dimen', 'Nore', 'Ker', 'Lor', 'Mik'];\n\n const waitingRoomList: WaitingRoomParticipant[] = [];\n for (let index = 0; index < names.length; index += 1) {\n waitingRoomList.push({\n name: names[index],\n id: index.toString(),\n });\n }\n\n return waitingRoomList;\n};\n","export const initialValuesState = {\n // The following are the initial values\n\n roomName: '',\n member: '',\n adminPasscode: '',\n islevel: '1',\n coHost: 'No coHost',\n coHostResponsibility: [\n { name: 'participants', value: false, dedicated: false },\n { name: 'media', value: false, dedicated: false },\n { name: 'waiting', value: false, dedicated: false },\n { name: 'chat', value: false, dedicated: false },\n ],\n youAreCoHost: false,\n youAreHost: false,\n confirmedToRecord: false,\n meetingDisplayType: 'media',\n meetingVideoOptimized: false,\n eventType: 'webinar',\n participants: [],\n filteredParticipants: [],\n participantsCounter: 0,\n participantsFilter: '',\n\n validated: false,\n localUIMode: false,\n socket: {},\n localSocket: undefined,\n roomData: null,\n device: null,\n apiKey: '',\n apiUserName: '',\n apiToken: '',\n link: '',\n\n consume_sockets: [],\n rtpCapabilities: null,\n roomRecvIPs: [],\n meetingRoomParams: null,\n itemPageLimit: 4,\n audioOnlyRoom: false,\n addForBasic: false,\n screenPageLimit: 4,\n shareScreenStarted: false,\n shared: false,\n targetOrientation: 'landscape',\n targetResolution: 'sd',\n targetResolutionHost: 'sd',\n vidCons: { width: 640, height: 360 },\n frameRate: 10,\n hParams: {},\n vParams: {},\n screenParams: {},\n aParams: {},\n\n // Initial Values for New Recording Fields\n recordingAudioPausesLimit: 0,\n recordingAudioPausesCount: 0,\n recordingAudioSupport: false,\n recordingAudioPeopleLimit: 0,\n recordingAudioParticipantsTimeLimit: 0,\n recordingVideoPausesCount: 0,\n recordingVideoPausesLimit: 0,\n recordingVideoSupport: false,\n recordingVideoPeopleLimit: 0,\n recordingVideoParticipantsTimeLimit: 0,\n recordingAllParticipantsSupport: false,\n recordingVideoParticipantsSupport: false,\n recordingAllParticipantsFullRoomSupport: false,\n recordingVideoParticipantsFullRoomSupport: false,\n recordingPreferredOrientation: 'landscape',\n recordingSupportForOtherOrientation: false,\n recordingMultiFormatsSupport: false,\n\n userRecordingParams: {\n mainSpecs: {\n mediaOptions: 'video',\n audioOptions: 'all',\n videoOptions: 'all',\n videoType: 'fullDisplay',\n videoOptimized: false,\n recordingDisplayType: 'media',\n addHLS: false,\n },\n dispSpecs: {\n nameTags: true,\n backgroundColor: '#000000',\n nameTagsColor: '#ffffff',\n orientationVideo: 'portrait',\n },\n },\n\n canRecord: false,\n startReport: false,\n endReport: false,\n recordTimerInterval: null,\n recordStartTime: 0,\n recordElapsedTime: 0,\n isTimerRunning: false,\n canPauseResume: false,\n recordChangeSeconds: 15000,\n pauseLimit: 0,\n pauseRecordCount: 0,\n canLaunchRecord: true,\n stopLaunchRecord: false,\n\n // Room properties\n participantsAll: [],\n firstAll: false,\n updateMainWindow: false,\n first_round: false,\n landScaped: false,\n lock_screen: false,\n screenId: '',\n allVideoStreams: [],\n newLimitedStreams: [],\n newLimitedStreamsIDs: [],\n activeSounds: [],\n screenShareIDStream: '',\n screenShareNameStream: '',\n adminIDStream: '',\n adminNameStream: '',\n youYouStream: [],\n youYouStreamIDs: [],\n localStream: null,\n recordStarted: false,\n recordResumed: false,\n recordPaused: false,\n recordStopped: false,\n adminRestrictSetting: false,\n videoRequestState: null,\n videoRequestTime: 0,\n videoAction: false,\n localStreamVideo: null,\n userDefaultVideoInputDevice: '',\n currentFacingMode: 'user',\n prevFacingMode: 'user',\n defVideoID: '',\n allowed: false,\n dispActiveNames: [],\n activeNames: [],\n prevActiveNames: [],\n p_activeNames: [],\n p_dispActiveNames: [],\n membersReceived: false,\n deferScreenReceived: false,\n hostFirstSwitch: false,\n micAction: false,\n screenAction: false,\n chatAction: false,\n audioRequestState: null,\n screenRequestState: null,\n chatRequestState: null,\n audioRequestTime: 0,\n screenRequestTime: 0,\n chatRequestTime: 0,\n updateRequestIntervalSeconds: 240,\n oldSoundIds: [],\n hostLabel: 'Host',\n mainScreenFilled: false,\n localStreamScreen: null,\n screenAlreadyOn: false,\n chatAlreadyOn: false,\n redirectURL: '',\n oldAllStreams: [],\n adminVidID: '',\n streamNames: [],\n non_alVideoStreams: [],\n sortAudioLoudness: false,\n audioDecibels: [],\n mixed_alVideoStreams: [],\n non_alVideoStreams_muted: [],\n paginatedStreams: [],\n localStreamAudio: null,\n defAudioID: '',\n userDefaultAudioInputDevice: '',\n userDefaultAudioOutputDevice: '',\n prevAudioInputDevice: '',\n prevVideoInputDevice: '',\n audioPaused: false,\n mainScreenPerson: '',\n adminOnMainScreen: false,\n screenStates: [{\n mainScreenPerson: '',\n mainScreenProducerId: '',\n mainScreenFilled: false,\n adminOnMainScreen: false,\n }],\n prevScreenStates: [{\n mainScreenPerson: '',\n mainScreenProducerId: '',\n mainScreenFilled: false,\n adminOnMainScreen: false,\n }],\n updateDateState: null,\n lastUpdate: null,\n nForReadjustRecord: 0,\n fixedPageLimit: 4,\n removeAltGrid: false,\n nForReadjust: 0,\n reorderInterval: 30000,\n fastReorderInterval: 10000,\n lastReorderTime: 0,\n audStreamNames: [],\n currentUserPage: 0,\n mainHeightWidth: 0,\n prevMainHeightWidth: 0,\n prevDoPaginate: false,\n doPaginate: false,\n shareEnded: false,\n lStreams: [],\n chatRefStreams: [],\n controlHeight: 0,\n isWideScreen: false,\n isMediumScreen: false,\n isSmallScreen: false,\n addGrid: false,\n addAltGrid: false,\n gridRows: 0,\n gridCols: 0,\n altGridRows: 0,\n altGridCols: 0,\n numberPages: 0,\n currentStreams: [],\n showMiniView: false,\n nStream: null,\n defer_receive: false,\n allAudioStreams: [],\n remoteScreenStream: [],\n screenProducer: null,\n localScreenProducer: null,\n gotAllVids: false,\n paginationHeightWidth: 40,\n paginationDirection: 'horizontal',\n gridSizes: {\n gridWidth: 0, gridHeight: 0, altGridWidth: 0, altGridHeight: 0,\n },\n screenForceFullDisplay: false,\n mainGridStream: [],\n otherGridStreams: [[], []],\n audioOnlyStreams: [],\n videoInputs: [],\n audioInputs: [],\n meetingProgressTime: '00:00:00',\n meetingElapsedTime: 0,\n ref_participants: [],\n\n // Messaging, event, modals, and other UI states\n messages: [],\n startDirectMessage: false,\n directMessageDetails: null,\n showMessagesBadge: false,\n audioSetting: 'allow',\n videoSetting: 'allow',\n screenshareSetting: 'allow',\n chatSetting: 'allow',\n displayOption: 'media',\n autoWave: true,\n forceFullDisplay: true,\n prevForceFullDisplay: false,\n prevMeetingDisplayType: 'video',\n waitingRoomFilter: '',\n waitingRoomList: [],\n waitingRoomCounter: 0,\n filteredWaitingRoomList: [],\n requestFilter: '',\n requestList: [],\n requestCounter: 0,\n filteredRequestList: [],\n totalReqWait: 0,\n alertVisible: false,\n alertMessage: '',\n alertType: 'success',\n alertDuration: 3000,\n progressTimerVisible: true,\n progressTimerValue: 0,\n isMenuModalVisible: false,\n isRecordingModalVisible: false,\n isSettingsModalVisible: false,\n isRequestsModalVisible: false,\n isWaitingModalVisible: false,\n isCoHostModalVisible: false,\n isMediaSettingsModalVisible: false,\n isDisplaySettingsModalVisible: false,\n isParticipantsModalVisible: false,\n isMessagesModalVisible: false,\n isConfirmExitModalVisible: false,\n isConfirmHereModalVisible: false,\n isShareEventModalVisible: false,\n isLoadingModalVisible: false,\n\n recordingMediaOptions: 'video',\n recordingAudioOptions: 'all',\n recordingVideoOptions: 'all',\n recordingVideoType: 'fullDisplay',\n recordingVideoOptimized: false,\n recordingDisplayType: 'video',\n recordingAddHLS: true,\n recordingNameTags: true,\n recordingBackgroundColor: '#83c0e9',\n recordingNameTagsColor: '#ffffff',\n recordingAddText: false,\n recordingCustomText: 'Add Text',\n recordingCustomTextPosition: 'top',\n recordingCustomTextColor: '#ffffff',\n recordingOrientationVideo: 'landscape',\n clearedToResume: true,\n clearedToRecord: true,\n recordState: 'green',\n showRecordButtons: false,\n recordingProgressTime: '00:00:00',\n audioSwitching: false,\n videoSwitching: false,\n videoAlreadyOn: false,\n audioAlreadyOn: false,\n componentSizes: {\n mainHeight: 0, otherHeight: 0, mainWidth: 0, otherWidth: 0,\n },\n hasCameraPermission: false,\n hasAudioPermission: false,\n transportCreated: false,\n localTransportCreated: false,\n transportCreatedVideo: false,\n transportCreatedAudio: false,\n transportCreatedScreen: false,\n producerTransport: null,\n localProducerTransport: null,\n videoProducer: null,\n localVideoProducer: null,\n params: {},\n videoParams: {},\n audioParams: {},\n audioProducer: null,\n localAudioProducer: null,\n consumerTransports: [],\n consumingTransports: [],\n\n // Polls\n polls: [],\n poll: null,\n isPollModalVisible: false,\n\n // Background\n customImage: '',\n selectedImage: '',\n segmentVideo: null,\n selfieSegmentation: null,\n pauseSegmentation: false,\n processedStream: null,\n keepBackground: false,\n backgroundHasChanged: false,\n virtualStream: null,\n mainCanvas: null,\n prevKeepBackground: false,\n appliedBackground: false,\n isBackgroundModalVisible: false,\n autoClickBackground: false,\n\n // Breakout Rooms\n breakoutRooms: [],\n currentRoomIndex: 0,\n canStartBreakout: false,\n breakOutRoomStarted: false,\n breakOutRoomEnded: false,\n hostNewRoom: -1,\n limitedBreakRoom: [],\n mainRoomsLength: 0,\n memberRoom: -1,\n isBreakoutRoomsModalVisible: false,\n\n // Whiteboard\n whiteboardUsers: [],\n currentWhiteboardIndex: 0,\n canStartWhiteboard: false,\n whiteboardStarted: false,\n whiteboardEnded: false,\n whiteboardLimit: 4,\n isWhiteboardModalVisible: false,\n isConfigureWhiteboardModalVisible: false,\n shapes: [],\n useImageBackground: true,\n redoStack: [],\n undoStack: [],\n canvasStream: null,\n canvasWhiteboard: null,\n\n // Screenboard\n canvasScreenboard: null,\n processedScreenStream: null,\n annotateScreenStream: false,\n mainScreenCanvas: null,\n isScreenboardModalVisible: false,\n\n // Control Buttons\n micActive: false,\n videoActive: false,\n screenShareActive: false,\n endCallActive: false,\n participantsActive: false,\n menuActive: false,\n commentsActive: false,\n};\n\nexport type InitialValuesStateType = typeof initialValuesState;\n","// Default fallback\n// Fallback for mediaDevices with support for getUserMedia\nexport const mediaDevices = {\n getUserMedia: async (_constraints: MediaStreamConstraints): Promise<MediaStream> => {\n // Fallback logic or mock implementation for getUserMedia\n console.warn('getUserMedia is not implemented in this environment.');\n return new MediaStream(); // Return an empty MediaStream as a fallback\n },\n\n getDisplayMedia: async (_constraints: MediaStreamConstraints): Promise<MediaStream> => {\n // Fallback logic or mock implementation for getDisplayMedia\n console.warn('getDisplayMedia is not implemented in this environment.');\n return new MediaStream(); // Return an empty MediaStream as a fallback\n },\n\n enumerateDevices: async (): Promise<MediaDeviceInfo[]> => {\n // Fallback logic or mock implementation for enumerateDevices\n console.warn('enumerateDevices is not implemented in this environment.');\n return []; // Return an empty array as a fallback\n },\n};\n\nexport function registerGlobals() {}\n\nexport class MediaStream {\n tracks: any[];\n\n constructor(tracks: any[] = []) {\n this.tracks = tracks; // Assign tracks to the MediaStream instance\n }\n\n // You can add additional methods or properties if needed\n [key: string]: any;\n}\n\nexport class MediaStreamTrack {\n [key: string]: any;\n}\n\nexport class RTCView {\n render(): null {\n return null; // Empty RTCView implementation\n }\n}\n","import type { ResponseJoinLocalRoom, ResponseJoinRoom } from '../../types/types';\n\nexport interface CreateResponseJoinRoomOptions {\n localRoom: ResponseJoinLocalRoom;\n}\n\nexport type CreateResponseJoinRoomType = (options: CreateResponseJoinRoomOptions) => Promise<ResponseJoinRoom>;\n\n/**\n * Converts a local-room join response into the broader MediaSFU join response shape.\n *\n * This helper is useful when local/demo or self-hosted room flows need to be\n * normalized to the same response contract consumed by the main runtime.\n *\n * @param options Response conversion options.\n * @returns A normalized `ResponseJoinRoom` object.\n *\n * @example\n * ```typescript\n * const normalized = await createResponseJoinRoom({ localRoom });\n * if (normalized.success) {\n * console.log(normalized.meetingRoomParams);\n * }\n * ```\n */\nexport const createResponseJoinRoom: CreateResponseJoinRoomType = async ({\n localRoom,\n}: CreateResponseJoinRoomOptions): Promise<ResponseJoinRoom> => {\n return {\n rtpCapabilities: localRoom.rtpCapabilities ?? null,\n success: localRoom.rtpCapabilities !== null,\n roomRecvIPs: [],\n meetingRoomParams: localRoom.eventRoomParams,\n recordingParams: localRoom.recordingParams,\n secureCode: localRoom.secureCode,\n recordOnly: false,\n isHost: localRoom.isHost,\n safeRoom: false,\n autoStartSafeRoom: false,\n safeRoomStarted: false,\n safeRoomEnded: false,\n reason: localRoom.isBanned ? 'User is banned from the room.' : undefined,\n banned: localRoom.isBanned,\n suspended: false,\n noAdmin: localRoom.hostNotJoined,\n };\n};","import type {\n CreateRoomOnMediaSFUOptions,\n CreateRoomOnMediaSFUType,\n PendingRequestStorage,\n} from '../../types/types';\nimport type { CreateJoinRoomError, CreateJoinRoomResponse } from './joinRoomOnMediaSFU';\nimport { resolveMediaSFURoomApi } from './resolveMediaSFURoomApi';\n\nconst readResponseError = async (response: Response): Promise<string> => {\n const fallbackMessage = `HTTP error! Status: ${response.status}`;\n\n try {\n const responseText = await response.text();\n\n if (!responseText) {\n return fallbackMessage;\n }\n\n const parsedResponse = JSON.parse(responseText) as { error?: string; message?: string };\n return parsedResponse.error || parsedResponse.message || responseText;\n } catch {\n return fallbackMessage;\n }\n};\n\nconst createBrowserPendingRequestStorage = (): PendingRequestStorage | undefined => {\n if (typeof localStorage === 'undefined') {\n return undefined;\n }\n\n return {\n getItem: async (key: string) => localStorage.getItem(key),\n setItem: async (key: string, value: string) => {\n localStorage.setItem(key, value);\n },\n removeItem: async (key: string) => {\n localStorage.removeItem(key);\n },\n };\n};\n\n/**\n * Calls the MediaSFU create-room API and guards against duplicate in-flight room requests.\n *\n * A short-lived `localStorage` marker is used to prevent accidental duplicate\n * submissions while a room create request is still pending.\n *\n * @param options API request options including credentials and create payload.\n * @returns A result object containing either parsed response data or an error payload.\n *\n * @example\n * ```typescript\n * const created = await createRoomOnMediaSFU({\n * payload: {\n * action: 'create',\n * userName: 'Ada',\n * duration: 60,\n * capacity: 10,\n * } as CreateMediaSFURoomOptions,\n * apiUserName: 'sampleuser',\n * apiKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n * });\n *\n * console.log(created.success);\n * ```\n */\nexport const createRoomOnMediaSFU: CreateRoomOnMediaSFUType = async ({\n payload,\n apiUserName,\n apiKey,\n localLink = '',\n pendingRequestStorage,\n}: CreateRoomOnMediaSFUOptions): Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}> => {\n const storage = pendingRequestStorage ?? createBrowserPendingRequestStorage();\n const roomIdentifier = `create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n\n const pendingKey = `mediasfu_pending_${roomIdentifier}`;\n const pendingTimeout = 30 * 1000;\n\n try {\n const pendingRequest = storage ? await storage.getItem(pendingKey) : null;\n if (storage && pendingRequest) {\n const pendingData = JSON.parse(pendingRequest) as { timestamp: number };\n const timeSincePending = Date.now() - pendingData.timestamp;\n\n if (timeSincePending < pendingTimeout) {\n return {\n data: { error: 'Room creation already in progress' },\n success: false,\n };\n }\n\n await storage.removeItem(pendingKey);\n }\n\n if (\n !apiUserName ||\n !apiKey ||\n apiUserName === 'yourAPIUSERNAME' ||\n apiKey === 'yourAPIKEY' ||\n apiKey.length !== 64 ||\n apiUserName.length < 6\n ) {\n return { data: { error: 'Invalid credentials' }, success: false };\n }\n\n const finalLink = resolveMediaSFURoomApi(localLink, 'createRoom');\n\n if (storage) {\n await storage.setItem(pendingKey, JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: payload.action,\n userName: payload.userName,\n meetingID: 'create',\n },\n }));\n\n setTimeout(() => {\n storage.removeItem(pendingKey).catch(() => {\n });\n }, pendingTimeout);\n }\n\n const response = await fetch(finalLink, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiUserName}:${apiKey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(await readResponseError(response));\n }\n\n const data: CreateJoinRoomResponse = await response.json();\n if (storage) {\n await storage.removeItem(pendingKey);\n }\n return { data, success: true };\n } catch (error) {\n if (storage) {\n try {\n await storage.removeItem(pendingKey);\n } catch {\n }\n }\n\n const errorMessage = (error as Error).message || 'unknown error';\n return {\n data: { error: `Unable to create room, ${errorMessage}` },\n success: false,\n };\n }\n};","export interface StartMeetingProgressTimerParameters {\n updateMeetingProgressTime: (formattedTime: string) => void;\n validated: boolean;\n roomName: string;\n getUpdatedAllParams: () => StartMeetingProgressTimerParameters;\n [key: string]: any;\n}\n\nexport interface StartMeetingProgressTimerOptions {\n startTime: number;\n parameters: StartMeetingProgressTimerParameters;\n}\n\nexport type StartMeetingProgressTimerType = (options: StartMeetingProgressTimerOptions) => void;\n\n/**\n * Starts a one-second meeting progress timer and updates a formatted elapsed-time string.\n *\n * The timer automatically stops when the current runtime parameters indicate the\n * meeting is no longer validated or no room is active.\n *\n * @param options Timer start options.\n *\n * @example\n * ```typescript\n * startMeetingProgressTimer({\n * startTime: Math.floor(Date.now() / 1000),\n * parameters: {\n * validated: true,\n * roomName: 'room123',\n * updateMeetingProgressTime: setMeetingTime,\n * getUpdatedAllParams: () => currentParams,\n * },\n * });\n * ```\n */\nexport function startMeetingProgressTimer({\n startTime,\n parameters,\n}: StartMeetingProgressTimerOptions): void {\n let { updateMeetingProgressTime, getUpdatedAllParams } = parameters;\n\n function calculateElapsedTime(currentStartTime: number): number {\n const currentTime = Math.floor(new Date().getTime() / 1000);\n return currentTime - currentStartTime;\n }\n\n function padNumber(value: number): string {\n return value.toString().padStart(2, '0');\n }\n\n function formatTime(time: number): string {\n const hours = Math.floor(time / 3600);\n const minutes = Math.floor((time % 3600) / 60);\n const seconds = Math.floor(time % 60);\n return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`;\n }\n\n let elapsedTime = calculateElapsedTime(startTime);\n\n let timeProgress: ReturnType<typeof setInterval> | null = setInterval(() => {\n elapsedTime++;\n updateMeetingProgressTime(formatTime(elapsedTime));\n\n parameters = getUpdatedAllParams();\n\n if (!parameters.validated || !parameters.roomName) {\n clearInterval(timeProgress!);\n timeProgress = null;\n }\n }, 1000);\n}","import type { EventType, ShowAlert } from '../../types/types';\n\nexport interface MeetingTimeRemainingOptions {\n timeRemaining: number;\n showAlert?: ShowAlert;\n eventType: EventType;\n}\n\nexport type MeetingTimeRemainingType = (options: MeetingTimeRemainingOptions) => Promise<void>;\n\n/**\n * Shows a meeting countdown alert for non-chat event types.\n *\n * @param options Function options including the remaining time in milliseconds.\n * @returns A promise that resolves after the alert has been evaluated and dispatched.\n */\nexport const meetingTimeRemaining = async ({\n timeRemaining,\n showAlert,\n eventType,\n}: MeetingTimeRemainingOptions): Promise<void> => {\n const minutes = Math.floor(timeRemaining / 60000);\n const seconds = Math.floor((timeRemaining % 60000) / 1000);\n const timeRemainingString = `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n\n if (eventType !== 'chat') {\n showAlert?.({\n message: `The event will end in ${timeRemainingString} minutes.`,\n type: 'success',\n duration: 3000,\n });\n }\n};","import type { WaitingRoomParticipant } from '../../types/types';\n\nexport interface AllWaitingRoomMembersOptions {\n waitingParticipants: WaitingRoomParticipant[];\n updateWaitingRoomList: (participants: WaitingRoomParticipant[]) => void;\n updateTotalReqWait: (totalReqs: number) => void;\n}\n\nexport type AllWaitingRoomMembersType = (\n options: AllWaitingRoomMembersOptions,\n) => Promise<void>;\n\n/**\n * Replaces the waiting-room list and recalculates the combined waiting count.\n *\n * @param {AllWaitingRoomMembersOptions} options - Waiting-room state setters.\n * @returns {Promise<void>} Resolves after the state updates run.\n *\n * @example\n * ```typescript\n * await allWaitingRoomMembers({\n * waitingParticipants,\n * updateWaitingRoomList: setWaitingRoomList,\n * updateTotalReqWait: setTotalReqWait,\n * });\n * ```\n */\nexport const allWaitingRoomMembers = async ({\n waitingParticipants,\n updateWaitingRoomList,\n updateTotalReqWait,\n}: AllWaitingRoomMembersOptions): Promise<void> => {\n updateWaitingRoomList(waitingParticipants);\n updateTotalReqWait(waitingParticipants.length);\n};\n","import type { Socket } from 'socket.io-client';\nimport type {\n ConnectIpsParameters,\n ConnectLocalIpsParameters,\n OnScreenChangesParameters,\n ReorderStreamsParameters,\n} from '../../types/types';\n\nexport interface AllMembersParticipantLike {\n id?: string | number;\n isBanned?: boolean;\n isSuspended?: boolean;\n name?: string | null;\n audioID?: string | null;\n videoID?: string | null;\n}\n\nexport interface AllMembersRequestLike {\n id?: string | number;\n}\n\nexport interface AllMembersOnScreenChangesOptions<TParameters = unknown> {\n parameters: TParameters;\n}\n\nexport type AllMembersOnScreenChangesType<TParameters = unknown> = (\n options: AllMembersOnScreenChangesOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersConnectIpsOptions<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> {\n consume_sockets: TConsumeSocket[];\n remIP: string[];\n parameters: TParameters;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersConnectIpsType<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> = (\n options: AllMembersConnectIpsOptions<TParameters, TConsumeSocket>,\n) => Promise<[TConsumeSocket[], string[]]>;\n\nexport interface AllMembersConnectLocalIpsOptions<\n TParameters = unknown,\n TSocket = Socket,\n> {\n socket: TSocket;\n parameters: TParameters;\n}\n\nexport type AllMembersConnectLocalIpsType<\n TParameters = unknown,\n TSocket = Socket,\n> = (\n options: AllMembersConnectLocalIpsOptions<TParameters, TSocket>,\n) => Promise<unknown>;\n\nexport interface AllMembersSleepOptions {\n ms: number;\n}\n\nexport type AllMembersSleepType = (\n options: AllMembersSleepOptions,\n) => Promise<unknown>;\n\nexport interface AllMembersReorderStreamsOptions<TParameters = unknown> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type AllMembersReorderStreamsType<TParameters = unknown> = (\n options: AllMembersReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersParameters<\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n> {\n participantsAll: TParticipantSummary[];\n participants: TParticipant[];\n dispActiveNames: string[];\n requestList: TRequest[];\n coHost: string;\n coHostResponsibility: TCoHostResponsibility[];\n lock_screen: boolean;\n firstAll: boolean;\n membersReceived: boolean;\n roomRecvIPs: string[];\n deferScreenReceived: boolean;\n screenId?: string;\n shareScreenStarted: boolean;\n meetingDisplayType: string;\n hostFirstSwitch: boolean;\n waitingRoomList: TWaitingRoomParticipant[];\n islevel: string;\n socket: TSocket;\n updateParticipantsAll: (participantsAll: TParticipantSummary[]) => void;\n updateParticipants: (participants: TParticipant[]) => void;\n updateRequestList: (requestList: TRequest[]) => void;\n updateCoHost: (coHost: string) => void;\n updateCoHostResponsibility: (coHostRes: TCoHostResponsibility[]) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateMembersReceived: (membersReceived: boolean) => void;\n updateDeferScreenReceived: (deferScreenReceived: boolean) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateHostFirstSwitch: (hostFirstSwitch: boolean) => void;\n updateConsume_sockets: (sockets: TConsumeSocket[]) => void;\n updateRoomRecvIPs: (ips: string[]) => void;\n updateIsLoadingModalVisible: (visible: boolean) => void;\n updateTotalReqWait: (total: number) => void;\n onScreenChanges: AllMembersOnScreenChangesType<TOnScreenChangesParameters>;\n connectIps: AllMembersConnectIpsType<TConnectIpsParameters, TConsumeSocket>;\n connectLocalIps?: AllMembersConnectLocalIpsType<TConnectLocalIpsParameters, TSocket>;\n sleep: AllMembersSleepType;\n reorderStreams: AllMembersReorderStreamsType<TReorderStreamsParameters>;\n getUpdatedAllParams: () =>\n AllMembersParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface AllMembersOptions<\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n> {\n members: TParticipant[];\n requestss: TRequest[];\n coHoste: string;\n coHostRes: TCoHostResponsibility[];\n parameters:\n AllMembersParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n consume_sockets: TConsumeSocket[];\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersType<\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n> = (\n options: AllMembersOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Reconciles the authoritative member list with local UI state and receiver-domain setup.\n *\n * @param {AllMembersOptions} options - Member payload, host metadata, and receiver connection helpers.\n * @returns {Promise<void>} Resolves once participant state, requests, and receiver sockets are synchronized.\n *\n * @example\n * ```typescript\n * await allMembers({\n * members,\n * requestss,\n * coHoste: 'host-2',\n * coHostRes,\n * parameters,\n * consume_sockets,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * });\n * ```\n */\nexport const allMembers = async <\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n>({\n members,\n requestss,\n coHoste,\n coHostRes,\n parameters,\n consume_sockets,\n apiUserName,\n apiKey,\n apiToken,\n}: AllMembersOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n>): Promise<void> => {\n let {\n participantsAll,\n participants,\n dispActiveNames,\n requestList,\n lock_screen,\n firstAll,\n membersReceived,\n roomRecvIPs,\n deferScreenReceived,\n screenId,\n shareScreenStarted,\n meetingDisplayType,\n hostFirstSwitch,\n waitingRoomList,\n islevel,\n socket,\n updateParticipantsAll,\n updateParticipants,\n updateRequestList,\n updateCoHost,\n updateCoHostResponsibility,\n updateFirstAll,\n updateMembersReceived,\n updateDeferScreenReceived,\n updateShareScreenStarted,\n updateHostFirstSwitch,\n updateConsume_sockets,\n updateRoomRecvIPs,\n updateIsLoadingModalVisible,\n updateTotalReqWait,\n onScreenChanges,\n connectIps,\n connectLocalIps,\n sleep,\n reorderStreams,\n } = parameters;\n\n participantsAll = members.map(({ isBanned, isSuspended, name, audioID, videoID }) => ({\n isBanned,\n isSuspended,\n name,\n audioID,\n videoID,\n })) as TParticipantSummary[];\n updateParticipantsAll(participantsAll);\n\n participants = members.filter(\n (participant) => !participant.isBanned && !participant.isSuspended,\n );\n updateParticipants(participants);\n\n if (dispActiveNames.length > 0) {\n const missingDisplayedParticipants = dispActiveNames.filter(\n (name) => !participants.some((participant) => participant.name === name),\n );\n\n if (missingDisplayedParticipants.length > 0) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n\n const onLocal = roomRecvIPs.length === 1 && roomRecvIPs[0] === 'none';\n\n if (!membersReceived && !onLocal) {\n if (roomRecvIPs.length < 1) {\n const checkIPs = setInterval(async () => {\n if (roomRecvIPs.length > 0) {\n clearInterval(checkIPs);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n membersReceived = true;\n updateMembersReceived(membersReceived);\n\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n }, 10);\n } else {\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n membersReceived = true;\n updateMembersReceived(membersReceived);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n }\n\n if (onLocal && !membersReceived) {\n if (connectLocalIps) {\n await connectLocalIps({ socket, parameters });\n }\n await sleep({ ms: 50 });\n updateIsLoadingModalVisible(false);\n }\n\n requestList = requestss.filter((request) =>\n participants.some((participant) => participant.id === request.id),\n );\n updateRequestList(requestList);\n updateTotalReqWait(requestList.length + waitingRoomList.length);\n\n updateCoHost(coHoste);\n updateCoHostResponsibility(coHostRes);\n\n if (!lock_screen && !firstAll) {\n await onScreenChanges({ parameters });\n if (meetingDisplayType !== 'all') {\n updateFirstAll(true);\n }\n } else if (islevel === '2' && !hostFirstSwitch) {\n await onScreenChanges({ parameters });\n updateHostFirstSwitch(true);\n }\n};\n","import type { Socket } from 'socket.io-client';\nimport type {\n ConnectIpsParameters,\n ConnectLocalIpsParameters,\n OnScreenChangesParameters,\n ReorderStreamsParameters,\n Settings,\n} from '../../types/types';\n\nexport interface AllMembersRestParticipantLike {\n id?: string | number;\n isBanned?: boolean;\n isSuspended?: boolean;\n name?: string | null;\n audioID?: string | null;\n videoID?: string | null;\n ScreenID?: string | null;\n ScreenOn?: boolean;\n}\n\nexport interface AllMembersRestRequestLike {\n id?: string | number;\n}\n\nexport interface AllMembersRestOnScreenChangesOptions<TParameters = unknown> {\n parameters: TParameters;\n}\n\nexport type AllMembersRestOnScreenChangesType<TParameters = unknown> = (\n options: AllMembersRestOnScreenChangesOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersRestConnectIpsOptions<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> {\n consume_sockets: TConsumeSocket[];\n remIP: string[];\n parameters: TParameters;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersRestConnectIpsType<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> = (\n options: AllMembersRestConnectIpsOptions<TParameters, TConsumeSocket>,\n) => Promise<[TConsumeSocket[], string[]]>;\n\nexport interface AllMembersRestConnectLocalIpsOptions<\n TParameters = unknown,\n TSocket = Socket,\n> {\n socket: TSocket;\n parameters: TParameters;\n}\n\nexport type AllMembersRestConnectLocalIpsType<\n TParameters = unknown,\n TSocket = Socket,\n> = (\n options: AllMembersRestConnectLocalIpsOptions<TParameters, TSocket>,\n) => Promise<unknown>;\n\nexport interface AllMembersRestSleepOptions {\n ms: number;\n}\n\nexport type AllMembersRestSleepType = (\n options: AllMembersRestSleepOptions,\n) => Promise<unknown>;\n\nexport interface AllMembersRestReorderStreamsOptions<TParameters = unknown> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type AllMembersRestReorderStreamsType<TParameters = unknown> = (\n options: AllMembersRestReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersRestParameters<\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n> {\n participantsAll: TParticipantSummary[];\n participants: TParticipant[];\n dispActiveNames: string[];\n requestList: TRequest[];\n coHost: string;\n coHostResponsibility: TCoHostResponsibility[];\n lock_screen: boolean;\n firstAll: boolean;\n membersReceived: boolean;\n roomRecvIPs: string[];\n deferScreenReceived: boolean;\n screenId?: string;\n shareScreenStarted: boolean;\n meetingDisplayType: string;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n socket: TSocket;\n updateParticipantsAll: (participantsAll: TParticipantSummary[]) => void;\n updateParticipants: (participants: TParticipant[]) => void;\n updateRequestList: (requestList: TRequest[]) => void;\n updateCoHost: (coHost: string) => void;\n updateCoHostResponsibility: (\n coHostResponsibility: TCoHostResponsibility[],\n ) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateMembersReceived: (membersReceived: boolean) => void;\n updateDeferScreenReceived: (deferScreenReceived: boolean) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateAudioSetting: (audioSetting: string) => void;\n updateVideoSetting: (videoSetting: string) => void;\n updateScreenshareSetting: (screenshareSetting: string) => void;\n updateChatSetting: (chatSetting: string) => void;\n updateConsume_sockets: (consume_sockets: TConsumeSocket[]) => void;\n updateRoomRecvIPs: (ips: string[]) => void;\n updateIsLoadingModalVisible: (visible: boolean) => void;\n onScreenChanges: AllMembersRestOnScreenChangesType<TOnScreenChangesParameters>;\n connectIps: AllMembersRestConnectIpsType<TConnectIpsParameters, TConsumeSocket>;\n connectLocalIps?: AllMembersRestConnectLocalIpsType<TConnectLocalIpsParameters, TSocket>;\n sleep: AllMembersRestSleepType;\n reorderStreams: AllMembersRestReorderStreamsType<TReorderStreamsParameters>;\n getUpdatedAllParams: () =>\n AllMembersRestParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface AllMembersRestOptions<\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n> {\n members: TParticipant[];\n settings: Settings;\n coHoste?: string;\n coHostRes?: TCoHostResponsibility[];\n parameters:\n AllMembersRestParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n > & TAllParameters;\n consume_sockets: TConsumeSocket[];\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersRestType<\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n> = (\n options: AllMembersRestOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Reconciles incremental member updates, consume-domain setup, and room media settings.\n *\n * @param {AllMembersRestOptions} options - Member payload, room settings, and receiver connection helpers.\n * @returns {Promise<void>} Resolves once participant state, co-host state, and settings are synchronized.\n *\n * @example\n * ```typescript\n * await allMembersRest({\n * members,\n * settings,\n * coHoste,\n * coHostRes,\n * parameters,\n * consume_sockets,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * });\n * ```\n */\nexport const allMembersRest = async <\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n>({\n members,\n settings,\n coHoste,\n coHostRes,\n parameters,\n consume_sockets,\n apiUserName,\n apiKey,\n apiToken,\n}: AllMembersRestOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n>): Promise<void> => {\n let {\n participantsAll,\n participants,\n dispActiveNames,\n requestList,\n coHost,\n coHostResponsibility,\n lock_screen,\n firstAll,\n membersReceived,\n roomRecvIPs,\n deferScreenReceived,\n screenId,\n shareScreenStarted,\n meetingDisplayType,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n socket,\n updateParticipantsAll,\n updateParticipants,\n updateRequestList,\n updateCoHost,\n updateCoHostResponsibility,\n updateFirstAll,\n updateMembersReceived,\n updateDeferScreenReceived,\n updateShareScreenStarted,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateChatSetting,\n updateConsume_sockets,\n updateRoomRecvIPs,\n updateIsLoadingModalVisible,\n onScreenChanges,\n connectIps,\n connectLocalIps,\n sleep,\n reorderStreams,\n } = parameters;\n\n participantsAll = members.map((participant) => ({\n isBanned: participant.isBanned,\n isSuspended: participant.isSuspended,\n name: participant.name,\n audioID: participant.audioID,\n videoID: participant.videoID,\n })) as TParticipantSummary[];\n updateParticipantsAll(participantsAll);\n\n participants = members.filter(\n (participant) => !participant.isBanned && !participant.isSuspended,\n );\n updateParticipants(participants);\n\n if (dispActiveNames.length > 0) {\n const missingDisplayedParticipants = dispActiveNames.filter(\n (name) => !participants.some((participant) => participant.name === name),\n );\n if (missingDisplayedParticipants.length > 0 && membersReceived) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n\n const onLocal = roomRecvIPs.length === 1 && roomRecvIPs[0] === 'none';\n\n if (!onLocal) {\n if (!membersReceived) {\n if (roomRecvIPs.length < 1) {\n const checkIPs = setInterval(async () => {\n if (roomRecvIPs.length > 0) {\n clearInterval(checkIPs);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n if (sockets_ && ips_) {\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n }\n\n membersReceived = true;\n updateMembersReceived(membersReceived);\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n }, 10);\n } else {\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n if (sockets_ && ips_) {\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n }\n membersReceived = true;\n updateMembersReceived(membersReceived);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n } else if (screenId) {\n const host = participants.find(\n (participant) =>\n participant.ScreenID === screenId && participant.ScreenOn === true,\n );\n if (deferScreenReceived && host) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n }\n }\n\n if (onLocal && !membersReceived) {\n if (connectLocalIps) {\n await connectLocalIps({ socket, parameters });\n }\n await sleep({ ms: 50 });\n updateIsLoadingModalVisible(false);\n }\n\n requestList = requestList.filter((request) =>\n participants.some((participant) => participant.id === request.id),\n );\n updateRequestList(requestList);\n\n coHost = coHoste!;\n updateCoHost(coHost);\n coHostResponsibility = coHostRes!;\n updateCoHostResponsibility(coHostResponsibility);\n\n if (!lock_screen && !firstAll) {\n await onScreenChanges({ parameters });\n if (meetingDisplayType !== 'all') {\n firstAll = true;\n updateFirstAll(firstAll);\n }\n }\n\n try {\n if (membersReceived) {\n [audioSetting, videoSetting, screenshareSetting, chatSetting] = settings;\n updateAudioSetting(audioSetting);\n updateVideoSetting(videoSetting);\n updateScreenshareSetting(screenshareSetting);\n updateChatSetting(chatSetting);\n }\n } catch {\n // no-op\n }\n};\n","import type { Participant } from '../../types/types';\n\nexport interface BanParticipantReorderOptions<TParameters = unknown> {\n add?: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type BanParticipantReorderType<TParameters = unknown> = (\n options: BanParticipantReorderOptions<TParameters>,\n) => Promise<void>;\n\nexport interface BanParticipantParameters<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n> {\n activeNames: string[];\n dispActiveNames: string[];\n participants: TParticipant[];\n updateParticipants: (participants: TParticipant[]) => void;\n reorderStreams: BanParticipantReorderType<TParameters>;\n [key: string]: any;\n}\n\nexport interface BanParticipantOptions<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n> {\n name: string;\n parameters: BanParticipantParameters<TParameters, TParticipant> & TParameters;\n}\n\nexport type BanParticipantType<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n> = (options: BanParticipantOptions<TParameters, TParticipant>) => Promise<void>;\n\n/**\n * Removes a banned participant from the rendered participant list and reorders streams if needed.\n *\n * @param {BanParticipantOptions} options - Participant name and stream reordering helpers.\n * @returns {Promise<void>} Resolves when participant state is updated.\n *\n * @example\n * ```typescript\n * await banParticipant({\n * name: 'John Doe',\n * parameters,\n * });\n * ```\n */\nexport const banParticipant = async <\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n>({\n name,\n parameters,\n}: BanParticipantOptions<TParameters, TParticipant>): Promise<void> => {\n const {\n activeNames,\n dispActiveNames,\n participants,\n updateParticipants,\n reorderStreams,\n } = parameters;\n\n if (activeNames.includes(name) || dispActiveNames.includes(name)) {\n updateParticipants(\n participants.filter((participant) => participant.name !== name),\n );\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n};\n","export interface ControlMediaHostNestedOptions<TParameters = unknown> {\n parameters: TParameters;\n}\n\nexport interface ControlMediaHostTrackLike {\n enabled: boolean;\n kind?: string;\n}\n\nexport interface ControlMediaHostMediaStreamLike {\n getAudioTracks?: () => ControlMediaHostTrackLike[];\n getVideoTracks?: () => ControlMediaHostTrackLike[];\n tracks?: ControlMediaHostTrackLike[];\n [key: string]: any;\n}\n\nexport interface ControlMediaHostOnScreenChangesOptions<TParameters = unknown>\n extends ControlMediaHostNestedOptions<TParameters> {\n changed?: boolean;\n}\n\nexport type ControlMediaHostOnScreenChangesType<TParameters = unknown> = (\n options: ControlMediaHostOnScreenChangesOptions<TParameters>,\n) => Promise<void>;\n\nexport type ControlMediaHostStopShareScreenType<TParameters = unknown> = (\n options: ControlMediaHostNestedOptions<TParameters>,\n) => Promise<void>;\n\nexport type ControlMediaHostDisconnectSendTransportVideoType<\n TParameters = unknown,\n> = (options: ControlMediaHostNestedOptions<TParameters>) => Promise<void>;\n\nexport type ControlMediaHostDisconnectSendTransportAudioType<\n TParameters = unknown,\n> = (options: ControlMediaHostNestedOptions<TParameters>) => Promise<void>;\n\nexport type ControlMediaHostDisconnectSendTransportScreenType<\n TParameters = unknown,\n> = (options: ControlMediaHostNestedOptions<TParameters>) => Promise<void>;\n\nexport interface ControlMediaHostParameters<\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n> {\n updateAdminRestrictSetting: (value: boolean) => void;\n localStream: TMediaStream | null;\n updateLocalStream: (stream: TMediaStream | null) => void;\n updateAudioAlreadyOn: (value: boolean) => void;\n localStreamScreen: TMediaStream | null;\n updateLocalStreamScreen: (stream: TMediaStream | null) => void;\n localStreamVideo: TMediaStream | null;\n updateLocalStreamVideo: (stream: TMediaStream | null) => void;\n updateScreenAlreadyOn: (value: boolean) => void;\n updateVideoAlreadyOn: (value: boolean) => void;\n updateChatAlreadyOn: (value: boolean) => void;\n onScreenChanges: ControlMediaHostOnScreenChangesType<TOnScreenChangesParameters>;\n stopShareScreen: ControlMediaHostStopShareScreenType<TStopShareScreenParameters>;\n disconnectSendTransportVideo: ControlMediaHostDisconnectSendTransportVideoType<TDisconnectSendTransportVideoParameters>;\n disconnectSendTransportAudio: ControlMediaHostDisconnectSendTransportAudioType<TDisconnectSendTransportAudioParameters>;\n disconnectSendTransportScreen: ControlMediaHostDisconnectSendTransportScreenType<TDisconnectSendTransportScreenParameters>;\n getUpdatedAllParams: () =>\n ControlMediaHostParameters<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ControlMediaHostOptions<\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n> {\n type: 'audio' | 'video' | 'screenshare' | 'chat' | 'all';\n parameters:\n ControlMediaHostParameters<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n > & TAllParameters;\n}\n\nexport type ControlMediaHostType<\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n> = (\n options: ControlMediaHostOptions<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n >,\n) => Promise<void>;\n\n/**\n * Applies host-enforced media restrictions across local audio, video, screenshare, and chat state.\n *\n * @param {ControlMediaHostOptions} options - Restriction type and shared transport/screen callbacks.\n * @returns {Promise<void>} Resolves once the requested host restriction is applied.\n *\n * @example\n * ```typescript\n * await controlMediaHost({\n * type: 'video',\n * parameters,\n * });\n * ```\n */\nexport const controlMediaHost = async <\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n>({\n type,\n parameters,\n}: ControlMediaHostOptions<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n>): Promise<void> => {\n const {\n updateAdminRestrictSetting,\n updateLocalStream,\n updateAudioAlreadyOn,\n updateLocalStreamScreen,\n updateLocalStreamVideo,\n updateScreenAlreadyOn,\n updateVideoAlreadyOn,\n updateChatAlreadyOn,\n onScreenChanges,\n stopShareScreen,\n disconnectSendTransportVideo,\n disconnectSendTransportAudio,\n disconnectSendTransportScreen,\n } = parameters;\n\n const { localStream, localStreamScreen, localStreamVideo } =\n parameters.getUpdatedAllParams();\n\n const disableTrack = (\n stream: TMediaStream | null,\n kind: 'audio' | 'video',\n ): boolean => {\n const getTracks =\n kind === 'audio' ? stream?.getAudioTracks : stream?.getVideoTracks;\n const tracks =\n typeof getTracks === 'function'\n ? getTracks.call(stream)\n : stream?.tracks?.filter((track) => track.kind === kind) ?? [];\n const track = tracks && tracks[0];\n if (track) {\n track.enabled = false;\n return true;\n }\n return false;\n };\n\n try {\n updateAdminRestrictSetting(true);\n\n if (type === 'audio') {\n disableTrack(localStream, 'audio');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportAudio({ parameters });\n updateAudioAlreadyOn(false);\n } else if (type === 'video') {\n disableTrack(localStream, 'video');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n disableTrack(localStreamVideo, 'video');\n updateLocalStreamVideo(localStreamVideo ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n updateVideoAlreadyOn(false);\n } else if (type === 'screenshare') {\n disableTrack(localStreamScreen, 'video');\n updateLocalStreamScreen(localStreamScreen ?? null);\n await disconnectSendTransportScreen({ parameters });\n await stopShareScreen({ parameters });\n updateScreenAlreadyOn(false);\n } else if (type === 'chat') {\n updateChatAlreadyOn(false);\n } else if (type === 'all') {\n disableTrack(localStream, 'audio');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportAudio({ parameters });\n updateAudioAlreadyOn(false);\n\n disableTrack(localStreamScreen, 'video');\n updateLocalStreamScreen(localStreamScreen ?? null);\n await disconnectSendTransportScreen({ parameters });\n await stopShareScreen({ parameters });\n updateScreenAlreadyOn(false);\n\n disableTrack(localStream, 'video');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n disableTrack(localStreamVideo, 'video');\n updateLocalStreamVideo(localStreamVideo ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n updateVideoAlreadyOn(false);\n }\n } catch (error) {\n console.error('Error in controlMediaHost:', error);\n }\n};\n","import type { ShowAlert } from '../../types/types';\n\nexport interface DisconnectOptions {\n showAlert?: ShowAlert;\n redirectURL?: string;\n onWeb: boolean;\n updateValidated?: (isValidated: boolean) => void;\n}\n\nexport type DisconnectType = (options: DisconnectOptions) => Promise<void>;\n\n/**\n * Handles a forced session disconnect by redirecting web users or showing a local alert fallback.\n *\n * @param {DisconnectOptions} options - Redirect and alert handlers for the disconnect flow.\n * @returns {Promise<void>} Resolves after the redirect or alert side effect is applied.\n *\n * @example\n * ```typescript\n * await disconnect({\n * onWeb: true,\n * redirectURL: 'https://example.com/exit',\n * });\n * ```\n */\nexport const disconnect = async ({\n showAlert,\n redirectURL,\n onWeb,\n}: DisconnectOptions): Promise<void> => {\n if (onWeb && redirectURL && typeof window !== 'undefined') {\n window.location.href = redirectURL;\n } else {\n showAlert?.({\n message: 'You have been disconnected from the session.',\n type: 'danger',\n duration: 2000,\n });\n }\n};\n","export interface DisconnectUserSelfSocketLike {\n id?: string;\n emit: (event: string, ...args: any[]) => void;\n}\n\nexport interface DisconnectUserSelfOptions {\n member: string;\n roomName: string;\n socket: DisconnectUserSelfSocketLike;\n localSocket?: DisconnectUserSelfSocketLike;\n}\n\nexport type DisconnectUserSelfType = (\n options: DisconnectUserSelfOptions,\n) => Promise<void>;\n\n/**\n * Emits a self-disconnect request, including the optional mirrored local socket.\n *\n * @param {DisconnectUserSelfOptions} options - Socket targets and participant identity.\n * @returns {Promise<void>} Resolves after the disconnect events are emitted.\n *\n * @example\n * ```typescript\n * await disconnectUserSelf({\n * member: 'user123',\n * roomName: 'main-room',\n * socket,\n * localSocket,\n * });\n * ```\n */\nexport async function disconnectUserSelf({\n member,\n roomName,\n socket,\n localSocket,\n}: DisconnectUserSelfOptions): Promise<void> {\n socket.emit('disconnectUser', {\n member,\n roomName,\n ban: true,\n });\n\n try {\n if (localSocket?.id) {\n localSocket.emit('disconnectUser', {\n member,\n roomName,\n ban: true,\n });\n }\n } catch {\n // no-op\n }\n}\n","import type { RtpCapabilities } from 'mediasoup-client/types';\nimport type {\n AltDomains,\n ConsumeSocket,\n} from '../../types/types';\n\nexport interface ConnectIpsLikeOptions<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n> {\n consume_sockets: TConsumeSocket[];\n remIP: string[];\n apiUserName: string;\n apiKey?: string;\n apiToken: string;\n parameters: TParameters;\n}\n\nexport type ConnectIpsLikeType<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n> = (\n options: ConnectIpsLikeOptions<TParameters, TConsumeSocket>,\n) => Promise<[unknown[], string[]]>;\n\nexport interface GetDomainsParameters<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n> {\n roomRecvIPs: string[];\n rtpCapabilities: TRtpCapabilities | null;\n consume_sockets: TConsumeSocket[];\n connectIps: ConnectIpsLikeType<TParameters, TConsumeSocket>;\n getUpdatedAllParams: () => GetDomainsParameters<TParameters, TConsumeSocket, TRtpCapabilities> & TParameters;\n [key: string]: any;\n}\n\nexport interface GetDomainsOptions<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n> {\n domains: string[];\n alt_domains: AltDomains;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n parameters: GetDomainsParameters<TParameters, TConsumeSocket, TRtpCapabilities> & TParameters;\n}\n\nexport type GetDomainsType<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n> = (options: GetDomainsOptions<TParameters, TConsumeSocket, TRtpCapabilities>) => Promise<void>;\n\n/**\n * Resolves newly announced consuming domains to connection targets and connects missing ones.\n *\n * @param {GetDomainsOptions} options - Domain payload and shared consume-socket connection helpers.\n * @returns {Promise<void>} Resolves after any missing consume domains are connected.\n *\n * @example\n * ```typescript\n * await getDomains({\n * domains: ['recv-1', 'recv-2'],\n * alt_domains,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * parameters,\n * });\n * ```\n */\nexport const getDomains = async <\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n>({\n domains,\n alt_domains,\n apiUserName,\n apiKey,\n apiToken,\n parameters,\n}: GetDomainsOptions<TParameters, TConsumeSocket, TRtpCapabilities>): Promise<void> => {\n let { roomRecvIPs, consume_sockets, connectIps } = parameters;\n const ipsToConnect: string[] = [];\n\n try {\n consume_sockets = parameters.getUpdatedAllParams().consume_sockets;\n\n for (const domain of domains) {\n const ipToCheck = alt_domains[domain] || domain;\n if (!roomRecvIPs.includes(ipToCheck)) {\n ipsToConnect.push(ipToCheck);\n }\n }\n\n await connectIps({\n consume_sockets,\n remIP: ipsToConnect,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n } catch (error) {\n console.error('Error in getDomains: ', error);\n }\n};\n","import type { EventType, ShowAlert } from '../../types/types';\n\nexport interface MeetingEndedOptions {\n showAlert?: ShowAlert;\n redirectURL?: string;\n onWeb: boolean;\n eventType: EventType;\n updateValidated?: (isValid: boolean) => void;\n}\n\nexport type MeetingEndedType = (options: MeetingEndedOptions) => Promise<void>;\n\n/**\n * Announces that the current event has ended and optionally redirects on web.\n *\n * @param {MeetingEndedOptions} options - Event-end behavior settings.\n * @returns {Promise<void>} Resolves after alerts and redirect scheduling are configured.\n *\n * @example\n * ```typescript\n * await meetingEnded({\n * onWeb: true,\n * eventType: 'conference',\n * redirectURL: 'https://example.com',\n * showAlert,\n * });\n * ```\n */\nexport const meetingEnded = async ({\n showAlert,\n redirectURL,\n onWeb,\n eventType,\n}: MeetingEndedOptions): Promise<void> => {\n if (eventType !== 'chat') {\n showAlert?.({\n message:\n 'The event has ended. You will be redirected to the home page in 2 seconds.',\n type: 'danger',\n duration: 2000,\n });\n }\n\n if (onWeb && redirectURL) {\n setTimeout(() => {\n window.location.href = redirectURL;\n }, 2000);\n }\n};\n","export interface MeetingStillThereOptions {\n updateIsConfirmHereModalVisible: (isVisible: boolean) => void;\n}\n\nexport type MeetingStillThereType = (\n options: MeetingStillThereOptions,\n) => Promise<void>;\n\n/**\n * Shows the \"still there\" confirmation modal.\n *\n * @param {MeetingStillThereOptions} options - Visibility setter for the confirmation modal.\n * @returns {Promise<void>} Resolves after the modal is shown.\n *\n * @example\n * ```typescript\n * await meetingStillThere({\n * updateIsConfirmHereModalVisible: setIsConfirmHereModalVisible,\n * });\n * ```\n */\nexport const meetingStillThere = async ({\n updateIsConfirmHereModalVisible,\n}: MeetingStillThereOptions): Promise<void> => {\n updateIsConfirmHereModalVisible(true);\n};\n","import type { Participant, ShowAlert } from '../../types/types';\n\nexport interface PanelistData {\n id: string;\n name: string;\n}\n\nexport interface PanelistsUpdatedData {\n panelists: PanelistData[];\n}\n\nexport interface PanelistFocusChangedData {\n focusEnabled: boolean;\n panelists: PanelistData[];\n muteOthersMic: boolean;\n muteOthersCamera: boolean;\n}\n\nexport interface ControlMediaData {\n type: 'audio' | 'video';\n action: 'mute' | 'unmute';\n reason?: string;\n}\n\nexport interface AddedAsPanelistData {\n message: string;\n}\n\nexport interface RemovedFromPanelistsData {\n message: string;\n}\n\nexport interface PanelistsUpdatedOptions {\n data: PanelistsUpdatedData;\n updatePanelists?: (panelists: Participant[]) => void;\n}\n\nexport interface PanelistFocusChangedOptions {\n data: PanelistFocusChangedData;\n updatePanelistsFocused?: (focused: boolean) => void;\n updateMuteOthersMic?: (mute: boolean) => void;\n updateMuteOthersCamera?: (mute: boolean) => void;\n updatePanelists?: (panelists: Participant[]) => void;\n currentPanelistsFocused?: boolean;\n currentPanelists?: Participant[];\n onScreenChanges?: () => Promise<void>;\n}\n\nexport interface ControlMediaOptions {\n data: ControlMediaData;\n showAlert?: ShowAlert;\n clickAudio?: () => void;\n clickVideo?: () => void;\n audioAlreadyOn?: boolean;\n videoAlreadyOn?: boolean;\n}\n\nexport interface AddedAsPanelistOptions {\n data: AddedAsPanelistData;\n showAlert?: ShowAlert;\n}\n\nexport interface RemovedFromPanelistsOptions {\n data: RemovedFromPanelistsData;\n showAlert?: ShowAlert;\n}\n\nexport type PanelistsUpdatedType = (options: PanelistsUpdatedOptions) => Promise<void>;\nexport type PanelistFocusChangedType = (options: PanelistFocusChangedOptions) => Promise<void>;\nexport type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;\nexport type AddedAsPanelistType = (options: AddedAsPanelistOptions) => Promise<void>;\nexport type RemovedFromPanelistsType = (options: RemovedFromPanelistsOptions) => Promise<void>;\n\nexport const panelistsUpdated: PanelistsUpdatedType = async ({\n data,\n updatePanelists,\n}): Promise<void> => {\n try {\n const { panelists } = data;\n\n if (updatePanelists) {\n updatePanelists(\n panelists.map((panelist) => ({\n id: panelist.id,\n name: panelist.name,\n audioID: '',\n videoID: '',\n } as Participant)),\n );\n }\n } catch (error) {\n console.error('Error handling panelistsUpdated:', error);\n }\n};\n\nexport const panelistFocusChanged: PanelistFocusChangedType = async ({\n data,\n updatePanelistsFocused,\n updateMuteOthersMic,\n updateMuteOthersCamera,\n updatePanelists,\n currentPanelistsFocused,\n currentPanelists,\n onScreenChanges,\n}): Promise<void> => {\n try {\n const { focusEnabled, panelists, muteOthersMic, muteOthersCamera } = data;\n const focusChanged = currentPanelistsFocused !== undefined && currentPanelistsFocused !== focusEnabled;\n const currentPanelistIds = (currentPanelists || []).map((panelist) => panelist.id).sort().join(',');\n const newPanelistIds = panelists.map((panelist) => panelist.id).sort().join(',');\n const panelistsChanged = currentPanelistIds !== newPanelistIds;\n\n updatePanelistsFocused?.(focusEnabled);\n updateMuteOthersMic?.(muteOthersMic);\n updateMuteOthersCamera?.(muteOthersCamera);\n\n if (updatePanelists) {\n updatePanelists(\n panelists.map((panelist) => ({\n id: panelist.id,\n name: panelist.name,\n audioID: '',\n videoID: '',\n } as Participant)),\n );\n }\n\n if ((focusChanged || panelistsChanged) && onScreenChanges) {\n await onScreenChanges();\n }\n } catch (error) {\n console.error('Error handling panelistFocusChanged:', error);\n }\n};\n\nexport const panelistControlMedia: ControlMediaType = async ({\n data,\n showAlert,\n clickAudio,\n clickVideo,\n audioAlreadyOn,\n videoAlreadyOn,\n}: ControlMediaOptions): Promise<void> => {\n try {\n const { type, action, reason } = data;\n\n if (action === 'mute') {\n if (type === 'audio' && audioAlreadyOn && clickAudio) {\n clickAudio();\n } else if (type === 'video' && videoAlreadyOn && clickVideo) {\n clickVideo();\n }\n\n if (showAlert && reason) {\n showAlert({\n message: `Your ${type === 'audio' ? 'microphone' : 'camera'} has been muted. ${reason}`,\n type: 'info',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n console.error('Error handling controlMedia:', error);\n }\n};\n\nexport const addedAsPanelist: AddedAsPanelistType = async ({\n data,\n showAlert,\n}: AddedAsPanelistOptions): Promise<void> => {\n try {\n showAlert?.({\n message: data.message || 'You have been added as a panelist',\n type: 'success',\n duration: 3000,\n });\n } catch (error) {\n console.error('Error handling addedAsPanelist:', error);\n }\n};\n\nexport const removedFromPanelists: RemovedFromPanelistsType = async ({\n data,\n showAlert,\n}: RemovedFromPanelistsOptions): Promise<void> => {\n try {\n showAlert?.({\n message: data.message || 'You have been removed from panelists',\n type: 'info',\n duration: 3000,\n });\n } catch (error) {\n console.error('Error handling removedFromPanelists:', error);\n }\n};","import type { Request, WaitingRoomParticipant } from '../../types/types';\n\nexport interface ParticipantRequestedOptions {\n userRequest: Request;\n requestList: Request[];\n waitingRoomList: WaitingRoomParticipant[];\n updateTotalReqWait: (count: number) => void;\n updateRequestList: (list: Request[]) => void;\n}\n\nexport type ParticipantRequestedType = (\n options: ParticipantRequestedOptions,\n) => Promise<void>;\n\n/**\n * Appends a new participant request and refreshes the combined request/waiting count.\n *\n * @param {ParticipantRequestedOptions} options - Request payload and state setters.\n * @returns {Promise<void>} Resolves after the request state is updated.\n *\n * @example\n * ```typescript\n * await participantRequested({\n * userRequest,\n * requestList,\n * waitingRoomList,\n * updateRequestList: setRequestList,\n * updateTotalReqWait: setTotalReqWait,\n * });\n * ```\n */\nexport const participantRequested = async ({\n userRequest,\n requestList,\n waitingRoomList,\n updateTotalReqWait,\n updateRequestList,\n}: ParticipantRequestedOptions): Promise<void> => {\n const hasMatchingRequest = requestList.some(\n (request) => request.id === userRequest.id && request.icon === userRequest.icon,\n );\n\n const updatedRequestList = hasMatchingRequest\n ? requestList\n : [...requestList, userRequest];\n updateRequestList(updatedRequestList);\n updateTotalReqWait(updatedRequestList.length + waitingRoomList.length);\n};\n","import type { ShowAlert } from '../../types/types';\nimport type {\n PermissionConfig,\n} from '../permissions/updatePermissionConfig';\n\nexport interface PermissionUpdatedData {\n newLevel: string;\n message?: string;\n}\n\nexport interface PermissionConfigUpdatedData {\n config: PermissionConfig;\n}\n\nexport interface PermissionUpdatedOptions {\n data: PermissionUpdatedData;\n showAlert?: ShowAlert;\n updateIslevel?: (level: string) => void;\n}\n\nexport interface PermissionConfigUpdatedOptions {\n data: PermissionConfigUpdatedData;\n updatePermissionConfig?: (config: PermissionConfig) => void;\n}\n\nexport type PermissionUpdatedType = (options: PermissionUpdatedOptions) => Promise<void>;\nexport type PermissionConfigUpdatedType = (options: PermissionConfigUpdatedOptions) => Promise<void>;\n\nexport const permissionUpdated: PermissionUpdatedType = async ({\n data,\n showAlert,\n updateIslevel,\n}: PermissionUpdatedOptions): Promise<void> => {\n try {\n const { newLevel, message } = data;\n updateIslevel?.(newLevel);\n\n if (showAlert && message) {\n showAlert({\n message,\n type: newLevel === '1' ? 'success' : 'info',\n duration: 3000,\n });\n }\n } catch (error) {\n console.error('Error handling permissionUpdated:', error);\n }\n};\n\nexport const permissionConfigUpdated: PermissionConfigUpdatedType = async ({\n data,\n updatePermissionConfig,\n}: PermissionConfigUpdatedOptions): Promise<void> => {\n try {\n updatePermissionConfig?.(data.config);\n } catch (error) {\n console.error('Error handling permissionConfigUpdated:', error);\n }\n};","import type { ShowAlert } from '../../types/types';\n\nexport interface PersonJoinedOptions {\n showAlert?: ShowAlert;\n name: string;\n}\n\nexport type PersonJoinedType = (options: PersonJoinedOptions) => Promise<void>;\n\n/**\n * Announces that a participant has joined the event.\n *\n * @param {PersonJoinedOptions} options - Join alert settings.\n * @param {string} options.name - Participant name to display.\n * @param {ShowAlert} [options.showAlert] - Optional alert presenter.\n * @returns {Promise<void>} Resolves after the alert is dispatched.\n *\n * @example\n * ```typescript\n * await personJoined({\n * name: 'Alice',\n * showAlert: ({ message }) => console.log(message),\n * });\n * ```\n */\nexport const personJoined = async ({\n name,\n showAlert,\n}: PersonJoinedOptions): Promise<void> => {\n showAlert?.({\n message: `${name} joined the event.`,\n type: 'success',\n duration: 3000,\n });\n};\n","import type {\n CloseAndResizeParameters,\n PrepopulateUserMediaParameters,\n ReorderStreamsParameters,\n} from '../../types/types';\n\nexport interface ProducerMediaClosedCloseAndResizeOptions<TParameters = unknown> {\n producerId: string;\n kind: 'video' | 'screen' | 'audio' | 'screenshare';\n parameters: TParameters;\n}\n\nexport type ProducerMediaClosedCloseAndResizeType<TParameters = unknown> = (\n options: ProducerMediaClosedCloseAndResizeOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaClosedPrepopulateUserMediaOptions<\n TParameters = unknown,\n> {\n name: string;\n parameters: TParameters;\n}\n\nexport type ProducerMediaClosedPrepopulateUserMediaType<\n TParameters = unknown,\n> = (\n options: ProducerMediaClosedPrepopulateUserMediaOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaClosedReorderStreamsOptions<\n TParameters = unknown,\n> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaClosedReorderStreamsType<TParameters = unknown> = (\n options: ProducerMediaClosedReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaClosedTransportLike {\n producerId: string;\n consumerTransport?: {\n close: () => Promise<void> | void;\n };\n consumer: {\n close: () => Promise<void> | void;\n };\n [key: string]: any;\n}\n\nexport interface ProducerMediaClosedParameters<\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n consumerTransports: TTransport[];\n updateConsumerTransports: (transports: TTransport[]) => void;\n hostLabel: string;\n shared: boolean;\n updateShared: (shared: boolean) => void;\n updateShareScreenStarted: (started: boolean) => void;\n updateScreenId: (screenId: string) => void;\n updateShareEnded: (ended: boolean) => void;\n closeAndResize: ProducerMediaClosedCloseAndResizeType<TCloseAndResizeParameters>;\n prepopulateUserMedia: ProducerMediaClosedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;\n reorderStreams: ProducerMediaClosedReorderStreamsType<TReorderStreamsParameters>;\n getUpdatedAllParams: () =>\n ProducerMediaClosedParameters<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ProducerMediaClosedOptions<\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n producerId: string;\n kind: 'video' | 'screen' | 'audio' | 'screenshare';\n parameters:\n ProducerMediaClosedParameters<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n}\n\nexport type ProducerMediaClosedType<\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> = (\n options: ProducerMediaClosedOptions<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Tears down a producer consumer transport and reconciles shared screen state when a producer closes.\n *\n * @param {ProducerMediaClosedOptions} options - Producer identity and shared room/media callbacks.\n * @returns {Promise<void>} Resolves once transport teardown and UI cleanup are complete.\n *\n * @example\n * ```typescript\n * await producerMediaClosed({\n * producerId: '12345',\n * kind: 'screenshare',\n * parameters,\n * });\n * ```\n */\nexport const producerMediaClosed = async <\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n>({\n producerId,\n kind,\n parameters,\n}: ProducerMediaClosedOptions<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n>): Promise<void> => {\n const updatedParameters = parameters.getUpdatedAllParams();\n\n const {\n consumerTransports,\n updateConsumerTransports,\n hostLabel,\n shared,\n updateShared,\n updateShareScreenStarted,\n updateScreenId,\n updateShareEnded,\n closeAndResize,\n prepopulateUserMedia,\n reorderStreams,\n } = updatedParameters;\n\n const producerToClose = consumerTransports.find(\n (transportData) => transportData.producerId === producerId,\n );\n\n if (producerToClose) {\n try {\n await producerToClose.consumerTransport?.close();\n } catch (error) {\n console.error('Error closing consumer transport:', error);\n }\n\n try {\n producerToClose.consumer.close();\n } catch (error) {\n console.error('Error closing consumer:', error);\n }\n\n const updatedTransports = consumerTransports.filter(\n (transportData) => transportData.producerId !== producerId,\n );\n updateConsumerTransports(updatedTransports);\n\n await closeAndResize({\n producerId,\n kind,\n parameters: updatedParameters,\n });\n } else if (kind === 'screenshare' || kind === 'screen') {\n if (shared) {\n updateShared(false);\n } else {\n updateShareScreenStarted(false);\n updateScreenId('');\n }\n updateShareEnded(true);\n await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });\n await reorderStreams({\n add: false,\n screenChanged: true,\n parameters: updatedParameters,\n });\n }\n};\n","import type {\n PrepopulateUserMediaParameters,\n ReorderStreamsParameters,\n ReUpdateInterParameters,\n} from '../../types/types';\n\nexport interface ProducerMediaPausedPrepopulateUserMediaOptions<\n TParameters = unknown,\n> {\n name: string;\n parameters: TParameters;\n}\n\nexport type ProducerMediaPausedPrepopulateUserMediaType<\n TParameters = unknown,\n> = (\n options: ProducerMediaPausedPrepopulateUserMediaOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaPausedReorderStreamsOptions<\n TParameters = unknown,\n> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaPausedReorderStreamsType<TParameters = unknown> = (\n options: ProducerMediaPausedReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaPausedReUpdateInterOptions<\n TParameters = unknown,\n> {\n name: string;\n add: boolean;\n force?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaPausedReUpdateInterType<TParameters = unknown> = (\n options: ProducerMediaPausedReUpdateInterOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaPausedParticipantLike {\n name?: string | null;\n muted?: boolean;\n islevel?: string | null;\n videoID?: string | null;\n audioID?: string | null;\n}\n\nexport interface ProducerMediaPausedParameters<\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n>\n {\n activeSounds: string[];\n meetingDisplayType: string;\n meetingVideoOptimized: boolean;\n participants: TParticipant[];\n oldSoundIds: string[];\n shared: boolean;\n shareScreenStarted: boolean;\n updateMainWindow: boolean;\n hostLabel: string;\n islevel: string;\n updateActiveSounds: (activeSounds: string[]) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n reorderStreams: ProducerMediaPausedReorderStreamsType<TReorderStreamsParameters>;\n prepopulateUserMedia: ProducerMediaPausedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;\n reUpdateInter: ProducerMediaPausedReUpdateInterType<TReUpdateInterParameters>;\n getUpdatedAllParams: () =>\n ProducerMediaPausedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ProducerMediaPausedOptions<\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n> {\n producerId: string;\n kind: 'audio' | 'video' | 'screenshare' | 'screen';\n name: string;\n parameters:\n ProducerMediaPausedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n > & TAllParameters;\n}\n\nexport type ProducerMediaPausedType<\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n> = (\n options: ProducerMediaPausedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Reacts to a producer pause event by reconciling waveform state, main-window media, and layout ordering.\n *\n * @param {ProducerMediaPausedOptions} options - Producer identity and shared room/media callbacks.\n * @returns {Promise<void>} Resolves once paused-media side effects are synchronized.\n *\n * @example\n * ```typescript\n * await producerMediaPaused({\n * producerId: 'abc123',\n * kind: 'audio',\n * name: 'Participant1',\n * parameters,\n * });\n * ```\n */\nexport const producerMediaPaused = async <\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n>({\n producerId,\n kind,\n name,\n parameters,\n}: ProducerMediaPausedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n>): Promise<void> => {\n parameters = parameters.getUpdatedAllParams();\n\n let {\n activeSounds,\n meetingDisplayType,\n meetingVideoOptimized,\n participants,\n oldSoundIds,\n shared,\n shareScreenStarted,\n updateMainWindow,\n hostLabel,\n islevel,\n updateActiveSounds,\n updateUpdateMainWindow,\n reorderStreams,\n prepopulateUserMedia,\n reUpdateInter,\n } = parameters;\n\n await Promise.all(\n participants.map(async (participant) => {\n if (participant.muted) {\n try {\n if (\n participant.islevel === '2' &&\n !participant.videoID &&\n !shared &&\n !shareScreenStarted &&\n islevel !== '2'\n ) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n } catch {\n // no-op\n }\n\n if (shareScreenStarted || shared) {\n if (participant.name && activeSounds.includes(participant.name)) {\n activeSounds = activeSounds.filter(\n (audioStream) => audioStream !== participant.name,\n );\n updateActiveSounds(activeSounds);\n }\n\n reUpdateInter({\n name: participant.name!,\n add: false,\n force: true,\n parameters,\n });\n }\n }\n }),\n );\n\n if (\n meetingDisplayType === 'media' ||\n (meetingDisplayType === 'video' && !meetingVideoOptimized)\n ) {\n const participant = participants.find((item) => item.name === name);\n const hasVideo = participant?.videoID !== null && participant?.videoID !== '';\n\n if (!hasVideo && !(shareScreenStarted || shared)) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n\n if (kind === 'audio') {\n try {\n const participant =\n participants.find((item) => item.audioID === producerId) ||\n participants.find((item) => item.name === name);\n\n if (\n participant &&\n ((participant.name && oldSoundIds.includes(participant.name)) ||\n (name && oldSoundIds.includes(name)))\n ) {\n reUpdateInter({\n name: participant.name!,\n add: false,\n force: true,\n parameters,\n });\n }\n } catch {\n // no-op\n }\n }\n};\n","import type {\n PrepopulateUserMediaParameters,\n ReorderStreamsParameters,\n} from '../../types/types';\n\nexport interface ProducerMediaResumedPrepopulateUserMediaOptions<\n TParameters = unknown,\n> {\n name: string;\n parameters: TParameters;\n}\n\nexport type ProducerMediaResumedPrepopulateUserMediaType<\n TParameters = unknown,\n> = (\n options: ProducerMediaResumedPrepopulateUserMediaOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaResumedReorderStreamsOptions<\n TParameters = unknown,\n> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaResumedReorderStreamsType<TParameters = unknown> = (\n options: ProducerMediaResumedReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaResumedParticipantLike {\n name?: string | null;\n islevel?: string | null;\n videoID?: string | null;\n}\n\nexport interface ProducerMediaResumedParameters<\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n meetingDisplayType: string;\n participants: TParticipant[];\n shared: boolean;\n shareScreenStarted: boolean;\n mainScreenFilled: boolean;\n hostLabel: string;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n reorderStreams: ProducerMediaResumedReorderStreamsType<TReorderStreamsParameters>;\n prepopulateUserMedia: ProducerMediaResumedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;\n getUpdatedAllParams: () =>\n ProducerMediaResumedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ProducerMediaResumedOptions<\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n name: string;\n kind: 'audio';\n parameters:\n ProducerMediaResumedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n}\n\nexport type ProducerMediaResumedType<\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> = (\n options: ProducerMediaResumedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Restores paused producer media state and refills the main window when needed.\n *\n * @param {ProducerMediaResumedOptions} options - Producer identity and shared room/media callbacks.\n * @returns {Promise<void>} Resolves once the resumed-media UI state is synchronized.\n *\n * @example\n * ```typescript\n * await producerMediaResumed({\n * name: 'John Doe',\n * kind: 'audio',\n * parameters,\n * });\n * ```\n */\nexport const producerMediaResumed = async <\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n>({\n name,\n parameters,\n}: ProducerMediaResumedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n>): Promise<void> => {\n const {\n meetingDisplayType,\n participants,\n shared,\n shareScreenStarted,\n mainScreenFilled,\n hostLabel,\n updateUpdateMainWindow,\n reorderStreams,\n prepopulateUserMedia,\n } = parameters;\n\n const participant = participants.find((item) => item.name === name);\n\n if (participant && !mainScreenFilled && participant.islevel === '2') {\n updateUpdateMainWindow(true);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateUpdateMainWindow(false);\n }\n\n if (meetingDisplayType === 'media' && participant) {\n const hasVideo = participant.videoID !== null && participant.videoID !== '';\n\n if (!hasVideo && !(shareScreenStarted || shared)) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n};\n","import type { EventType, Message, Participant } from '../../types/types';\n\nexport interface ReceiveMessageOptions {\n message: Message;\n messages: Message[];\n participantsAll: Participant[];\n member: string;\n eventType: EventType;\n islevel: string;\n coHost: string;\n updateMessages: (messages: Message[]) => void;\n updateShowMessagesBadge: (showBadge: boolean) => void;\n}\n\nexport type ReceiveMessageType = (options: ReceiveMessageOptions) => Promise<void>;\n\n/**\n * Appends an inbound chat message, filters banned senders, and updates unread badge state.\n *\n * @param {ReceiveMessageOptions} options - Message payload, participant state, and update callbacks.\n * @returns {Promise<void>} Resolves after message state is reconciled.\n *\n * @example\n * ```typescript\n * await receiveMessage({\n * message,\n * messages,\n * participantsAll,\n * member: 'Ada',\n * eventType: 'conference',\n * islevel: '1',\n * coHost: '',\n * updateMessages: setMessages,\n * updateShowMessagesBadge: setShowMessagesBadge,\n * });\n * ```\n */\nexport const receiveMessage = async ({\n message,\n messages,\n participantsAll,\n member,\n eventType,\n islevel,\n coHost,\n updateMessages,\n updateShowMessagesBadge,\n}: ReceiveMessageOptions): Promise<void> => {\n const { sender, receivers, message: content, timestamp, group } = message;\n const oldMessages = messages;\n messages = [...messages, { sender, receivers, message: content, timestamp, group }];\n\n if (eventType !== 'broadcast' && eventType !== 'chat') {\n messages = messages.filter((msg) =>\n participantsAll.some(\n (participant) => participant.name === msg.sender && !participant.isBanned,\n ),\n );\n } else {\n messages = messages.filter((msg) => {\n const participant = participantsAll.find((p) => p.name === msg.sender);\n return !participant || !participant.isBanned;\n });\n }\n\n updateMessages(messages);\n\n const oldGroupMessages = oldMessages.filter((msg) => msg.group);\n const oldDirectMessages = oldMessages.filter((msg) => !msg.group);\n const groupMessages = messages.filter((msg) => msg.group);\n const directMessages = messages.filter((msg) => !msg.group);\n\n if (eventType !== 'broadcast' && eventType !== 'chat') {\n if (oldGroupMessages.length !== groupMessages.length) {\n const newGroupMessages = groupMessages.filter(\n (msg) => !oldGroupMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp),\n );\n const relevantGroupMessages = newGroupMessages.filter(\n (msg) => msg.sender === member || msg.receivers.includes(member),\n );\n const selfSentGroupMessages = relevantGroupMessages.filter(\n (msg) => msg.sender === member,\n );\n\n if (\n newGroupMessages.length > 0 &&\n relevantGroupMessages.length > selfSentGroupMessages.length\n ) {\n updateShowMessagesBadge(true);\n }\n }\n\n if (oldDirectMessages.length !== directMessages.length) {\n const newDirectMessages = directMessages.filter(\n (msg) => !oldDirectMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp),\n );\n const relevantDirectMessages = newDirectMessages.filter(\n (msg) => msg.sender === member || msg.receivers.includes(member),\n );\n const selfSentDirectMessages = relevantDirectMessages.filter(\n (msg) => msg.sender === member,\n );\n\n const isPrivileged = islevel === '2' || coHost === member;\n const hasRelevantDirectMessages = isPrivileged\n ? newDirectMessages.length > 0\n : relevantDirectMessages.length > 0;\n\n if (\n hasRelevantDirectMessages &&\n newDirectMessages.length > selfSentDirectMessages.length\n ) {\n updateShowMessagesBadge(true);\n }\n }\n }\n};\n","import type { EventType, UserRecordingParams } from '../../types/types';\nimport { SoundPlayer, type SoundPlayerType } from '../utils/SoundPlayer';\n\nexport interface RecordingNoticeUserRecordingParamsLike {\n mainSpecs: {\n mediaOptions: string;\n audioOptions: string;\n videoOptions: string;\n videoType: string;\n videoOptimized: boolean;\n recordingDisplayType: 'video' | 'media' | 'all';\n addHLS: boolean;\n };\n dispSpecs: {\n nameTags: boolean;\n backgroundColor: string;\n nameTagsColor: string;\n orientationVideo: string;\n };\n textSpecs?: {\n addText?: boolean;\n customText?: string;\n customTextPosition?: string;\n customTextColor?: string;\n };\n}\n\nexport interface RecordingNoticeParameters<\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n> {\n islevel: string;\n userRecordingParams: TUserRecordingParams;\n pauseRecordCount?: number;\n recordElapsedTime: number;\n recordStartTime: number;\n recordStarted: boolean;\n recordPaused: boolean;\n canLaunchRecord: boolean;\n stopLaunchRecord: boolean;\n recordStopped: boolean;\n isTimerRunning: boolean;\n canPauseResume: boolean;\n eventType: TEventType;\n updateRecordingProgressTime: (time: string) => void;\n updateShowRecordButtons: (show: boolean) => void;\n updateUserRecordingParams: (params: TUserRecordingParams) => void;\n updateRecordingMediaOptions: (options: string) => void;\n updateRecordingAudioOptions: (options: string) => void;\n updateRecordingVideoOptions: (options: string) => void;\n updateRecordingVideoType: (type: string) => void;\n updateRecordingVideoOptimized: (optimized: boolean) => void;\n updateRecordingDisplayType: (type: 'video' | 'media' | 'all') => void;\n updateRecordingAddHLS: (addHLS: boolean) => void;\n updateRecordingNameTags: (nameTags: boolean) => void;\n updateRecordingBackgroundColor: (color: string) => void;\n updateRecordingNameTagsColor: (color: string) => void;\n updateRecordingOrientationVideo: (orientation: string) => void;\n updateRecordingAddText: (addText: boolean) => void;\n updateRecordingCustomText: (text: string) => void;\n updateRecordingCustomTextPosition: (position: string) => void;\n updateRecordingCustomTextColor: (color: string) => void;\n updatePauseRecordCount: (count: number) => void;\n updateRecordElapsedTime: (time: number) => void;\n updateRecordStarted: (started: boolean) => void;\n updateRecordPaused: (paused: boolean) => void;\n updateCanLaunchRecord: (canLaunch: boolean) => void;\n updateStopLaunchRecord: (stop: boolean) => void;\n updateRecordStopped: (stopped: boolean) => void;\n updateIsTimerRunning: (running: boolean) => void;\n updateCanPauseResume: (canPause: boolean) => void;\n updateRecordStartTime: (startTime: number) => void;\n updateRecordState: (state: string) => void;\n [key: string]: any;\n}\n\nexport interface RecordingNoticeOptions<\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n> {\n state: string;\n userRecordingParam: TUserRecordingParams | null;\n pauseCount: number;\n timeDone: number;\n parameters: RecordingNoticeParameters<TUserRecordingParams, TEventType>;\n soundPlayer?: SoundPlayerType;\n}\n\nexport type RecordingNoticeType<\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n> = (\n options: RecordingNoticeOptions<TUserRecordingParams, TEventType>,\n) => Promise<void>;\n\n/**\n * Reconciles recording state updates, user recording settings, and progress UI after a recording socket notice.\n *\n * @param {RecordingNoticeOptions} options - Recording state payload and room-level update callbacks.\n * @returns {Promise<void>} Resolves once recording state, UI flags, and progress text are synchronized.\n *\n * @example\n * ```typescript\n * await recordingNotice({\n * state: 'pause',\n * userRecordingParam,\n * pauseCount: 2,\n * timeDone: 3600,\n * parameters,\n * });\n * ```\n */\nexport const recordingNotice = async <\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n>({\n state,\n userRecordingParam,\n pauseCount,\n timeDone,\n parameters,\n soundPlayer,\n}: RecordingNoticeOptions<TUserRecordingParams, TEventType>): Promise<void> => {\n let {\n islevel,\n userRecordingParams,\n pauseRecordCount,\n recordElapsedTime,\n recordStartTime,\n recordStarted,\n recordPaused,\n canLaunchRecord,\n stopLaunchRecord,\n recordStopped,\n isTimerRunning,\n canPauseResume,\n eventType,\n updateRecordingProgressTime,\n updateShowRecordButtons,\n updateUserRecordingParams,\n updateRecordingMediaOptions,\n updateRecordingAudioOptions,\n updateRecordingVideoOptions,\n updateRecordingVideoType,\n updateRecordingVideoOptimized,\n updateRecordingDisplayType,\n updateRecordingAddHLS,\n updateRecordingNameTags,\n updateRecordingBackgroundColor,\n updateRecordingNameTagsColor,\n updateRecordingOrientationVideo,\n updateRecordingAddText,\n updateRecordingCustomText,\n updateRecordingCustomTextPosition,\n updateRecordingCustomTextColor,\n updatePauseRecordCount,\n updateRecordElapsedTime,\n updateRecordStartTime,\n updateRecordStarted,\n updateRecordPaused,\n updateCanLaunchRecord,\n updateStopLaunchRecord,\n updateRecordStopped,\n updateIsTimerRunning,\n updateCanPauseResume,\n updateRecordState,\n } = parameters;\n\n const playSound = async (soundUrl: string): Promise<void> => {\n await (soundPlayer ?? SoundPlayer)({ soundUrl });\n };\n\n try {\n if (islevel !== '2') {\n if (state === 'pause') {\n updateRecordStarted(true);\n updateRecordPaused(true);\n updateRecordState('yellow');\n if (eventType !== 'broadcast') {\n await playSound('https://www.mediasfu.com/sounds/record-paused.mp3');\n }\n } else if (state === 'stop') {\n updateRecordStarted(true);\n updateRecordStopped(true);\n updateRecordState('green');\n if (eventType !== 'broadcast') {\n await playSound('https://www.mediasfu.com/sounds/record-stopped.mp3');\n }\n } else {\n updateRecordState('red');\n updateRecordStarted(true);\n updateRecordPaused(false);\n if (eventType !== 'broadcast') {\n await playSound('https://www.mediasfu.com/sounds/record-progress.mp3');\n }\n }\n } else {\n if (state === 'pause') {\n updateRecordState('yellow');\n if (userRecordingParam) {\n userRecordingParams.mainSpecs = userRecordingParam.mainSpecs;\n userRecordingParams.dispSpecs = userRecordingParam.dispSpecs;\n userRecordingParams.textSpecs = userRecordingParam.textSpecs;\n\n updateUserRecordingParams(userRecordingParams);\n updateRecordingMediaOptions(userRecordingParams.mainSpecs.mediaOptions);\n updateRecordingAudioOptions(userRecordingParams.mainSpecs.audioOptions);\n updateRecordingVideoOptions(userRecordingParams.mainSpecs.videoOptions);\n updateRecordingVideoType(userRecordingParams.mainSpecs.videoType);\n updateRecordingVideoOptimized(userRecordingParams.mainSpecs.videoOptimized);\n updateRecordingDisplayType(userRecordingParams.mainSpecs.recordingDisplayType);\n updateRecordingAddHLS(userRecordingParams.mainSpecs.addHLS);\n updateRecordingNameTags(userRecordingParams.dispSpecs.nameTags);\n updateRecordingBackgroundColor(userRecordingParams.dispSpecs.backgroundColor);\n updateRecordingNameTagsColor(userRecordingParams.dispSpecs.nameTagsColor);\n updateRecordingOrientationVideo(userRecordingParams.dispSpecs.orientationVideo);\n updateRecordingAddText(userRecordingParams.textSpecs?.addText ?? false);\n updateRecordingCustomText(userRecordingParams.textSpecs?.customText ?? '');\n updateRecordingCustomTextPosition(\n userRecordingParams.textSpecs?.customTextPosition ?? '',\n );\n updateRecordingCustomTextColor(\n userRecordingParams.textSpecs?.customTextColor ?? '',\n );\n\n pauseRecordCount = pauseCount;\n updatePauseRecordCount(pauseRecordCount);\n\n recordElapsedTime = Math.floor(timeDone / 1000);\n recordStartTime = Math.floor(Date.now() / 1000) - recordElapsedTime;\n updateRecordStartTime(recordStartTime);\n updateRecordElapsedTime(recordElapsedTime);\n\n recordStarted = true;\n recordPaused = true;\n canLaunchRecord = false;\n recordStopped = false;\n\n updateRecordStarted(recordStarted);\n updateRecordPaused(recordPaused);\n updateCanLaunchRecord(canLaunchRecord);\n updateRecordStopped(recordStopped);\n updateShowRecordButtons(true);\n\n isTimerRunning = false;\n canPauseResume = true;\n\n updateIsTimerRunning(isTimerRunning);\n updateCanPauseResume(canPauseResume);\n updateRecordingProgressTime(formatElapsedTime(recordElapsedTime));\n }\n await playSound('https://www.mediasfu.com/sounds/record-paused.mp3');\n } else if (state === 'stop') {\n recordStarted = true;\n recordStopped = true;\n canLaunchRecord = false;\n stopLaunchRecord = true;\n\n updateRecordStarted(recordStarted);\n updateRecordStopped(recordStopped);\n updateCanLaunchRecord(canLaunchRecord);\n updateStopLaunchRecord(stopLaunchRecord);\n updateShowRecordButtons(false);\n updateRecordState('green');\n await playSound('https://www.mediasfu.com/sounds/record-stopped.mp3');\n } else {\n updateRecordState('red');\n updateRecordStarted(true);\n updateRecordPaused(false);\n await playSound('https://www.mediasfu.com/sounds/record-progress.mp3');\n }\n }\n } catch (error) {\n console.log('Error in RecordingNotice: ', error);\n }\n};\n\nconst formatElapsedTime = (recordElapsedTime: number): string => {\n const hours = Math.floor(recordElapsedTime / 3600);\n const minutes = Math.floor((recordElapsedTime % 3600) / 60);\n const seconds = recordElapsedTime % 60;\n\n return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`;\n};\n\nconst padNumber = (value: number): string => value.toString().padStart(2, '0');\n","export interface ReInitiateRecordingSocketLike {\n emit: (\n event: string,\n payload: { roomName: string; member: string },\n callback?: (response: { success: boolean }) => void,\n ) => void;\n}\n\nexport interface ReInitiateRecordingOptions {\n roomName: string;\n member: string;\n socket: ReInitiateRecordingSocketLike;\n adminRestrictSetting: boolean;\n}\n\nexport type ReInitiateRecordingType = (\n options: ReInitiateRecordingOptions,\n) => Promise<void>;\n\n/**\n * Re-requests recording startup when host controls allow it.\n *\n * @param {ReInitiateRecordingOptions} options - Room identity, socket, and admin restriction state.\n * @returns {Promise<void>} Resolves after the emit request is sent or skipped.\n *\n * @example\n * ```typescript\n * await reInitiateRecording({\n * roomName: 'exampleRoom',\n * member: 'adminUser',\n * socket,\n * adminRestrictSetting: false,\n * });\n * ```\n */\nexport const reInitiateRecording = async ({\n roomName,\n member,\n socket,\n adminRestrictSetting,\n}: ReInitiateRecordingOptions): Promise<void> => {\n if (!adminRestrictSetting) {\n socket.emit(\n 'startRecordIng',\n { roomName, member },\n ({ success }: { success: boolean }) => {\n if (!success) {\n // no-op: caller-controlled UX\n }\n },\n );\n }\n};\n","export interface RecordParams {\n recordingAudioPausesLimit: number;\n recordingAudioPausesCount: number;\n recordingAudioSupport: boolean;\n recordingAudioPeopleLimit: number;\n recordingAudioParticipantsTimeLimit: number;\n recordingVideoPausesCount: number;\n recordingVideoPausesLimit: number;\n recordingVideoSupport: boolean;\n recordingVideoPeopleLimit: number;\n recordingVideoParticipantsTimeLimit: number;\n recordingAllParticipantsSupport: boolean;\n recordingVideoParticipantsSupport: boolean;\n recordingAllParticipantsFullRoomSupport: boolean;\n recordingVideoParticipantsFullRoomSupport: boolean;\n recordingPreferredOrientation: string;\n recordingSupportForOtherOrientation: boolean;\n recordingMultiFormatsSupport: boolean;\n}\n\nexport interface RoomRecordParamsParameters {\n updateRecordingAudioPausesLimit: (value: number) => void;\n updateRecordingAudioPausesCount: (value: number) => void;\n updateRecordingAudioSupport: (value: boolean) => void;\n updateRecordingAudioPeopleLimit: (value: number) => void;\n updateRecordingAudioParticipantsTimeLimit: (value: number) => void;\n updateRecordingVideoPausesCount: (value: number) => void;\n updateRecordingVideoPausesLimit: (value: number) => void;\n updateRecordingVideoSupport: (value: boolean) => void;\n updateRecordingVideoPeopleLimit: (value: number) => void;\n updateRecordingVideoParticipantsTimeLimit: (value: number) => void;\n updateRecordingAllParticipantsSupport: (value: boolean) => void;\n updateRecordingVideoParticipantsSupport: (value: boolean) => void;\n updateRecordingAllParticipantsFullRoomSupport: (value: boolean) => void;\n updateRecordingVideoParticipantsFullRoomSupport: (value: boolean) => void;\n updateRecordingPreferredOrientation: (value: string) => void;\n updateRecordingSupportForOtherOrientation: (value: boolean) => void;\n updateRecordingMultiFormatsSupport: (value: boolean) => void;\n [key: string]: any;\n}\n\nexport interface RoomRecordParamsOptions {\n recordParams: RecordParams;\n parameters: RoomRecordParamsParameters;\n}\n\nexport type RoomRecordParamsType = (\n options: RoomRecordParamsOptions,\n) => Promise<void>;\n\n/**\n * Applies room-level recording capability limits and toggles to UI state.\n *\n * @param {RoomRecordParamsOptions} options - Recording capability payload and setters.\n * @returns {Promise<void>} Resolves after all setters are applied.\n *\n * @example\n * ```typescript\n * await roomRecordParams({\n * recordParams,\n * parameters: recordingSetters,\n * });\n * ```\n */\nexport const roomRecordParams = async ({\n recordParams,\n parameters,\n}: RoomRecordParamsOptions): Promise<void> => {\n const {\n updateRecordingAudioPausesLimit,\n updateRecordingAudioPausesCount,\n updateRecordingAudioSupport,\n updateRecordingAudioPeopleLimit,\n updateRecordingAudioParticipantsTimeLimit,\n updateRecordingVideoPausesCount,\n updateRecordingVideoPausesLimit,\n updateRecordingVideoSupport,\n updateRecordingVideoPeopleLimit,\n updateRecordingVideoParticipantsTimeLimit,\n updateRecordingAllParticipantsSupport,\n updateRecordingVideoParticipantsSupport,\n updateRecordingAllParticipantsFullRoomSupport,\n updateRecordingVideoParticipantsFullRoomSupport,\n updateRecordingPreferredOrientation,\n updateRecordingSupportForOtherOrientation,\n updateRecordingMultiFormatsSupport,\n } = parameters;\n\n updateRecordingAudioPausesLimit(recordParams.recordingAudioPausesLimit);\n updateRecordingAudioPausesCount(recordParams.recordingAudioPausesCount);\n updateRecordingAudioSupport(recordParams.recordingAudioSupport);\n updateRecordingAudioPeopleLimit(recordParams.recordingAudioPeopleLimit);\n updateRecordingAudioParticipantsTimeLimit(\n recordParams.recordingAudioParticipantsTimeLimit,\n );\n updateRecordingVideoPausesCount(recordParams.recordingVideoPausesCount);\n updateRecordingVideoPausesLimit(recordParams.recordingVideoPausesLimit);\n updateRecordingVideoSupport(recordParams.recordingVideoSupport);\n updateRecordingVideoPeopleLimit(recordParams.recordingVideoPeopleLimit);\n updateRecordingVideoParticipantsTimeLimit(\n recordParams.recordingVideoParticipantsTimeLimit,\n );\n updateRecordingAllParticipantsSupport(\n recordParams.recordingAllParticipantsSupport,\n );\n updateRecordingVideoParticipantsSupport(\n recordParams.recordingVideoParticipantsSupport,\n );\n updateRecordingAllParticipantsFullRoomSupport(\n recordParams.recordingAllParticipantsFullRoomSupport,\n );\n updateRecordingVideoParticipantsFullRoomSupport(\n recordParams.recordingVideoParticipantsFullRoomSupport,\n );\n updateRecordingPreferredOrientation(\n recordParams.recordingPreferredOrientation,\n );\n updateRecordingSupportForOtherOrientation(\n recordParams.recordingSupportForOtherOrientation,\n );\n updateRecordingMultiFormatsSupport(recordParams.recordingMultiFormatsSupport);\n};\n","import type { Participant } from '../../types/types';\n\nexport interface ScreenProducerIdOptions {\n producerId: string;\n screenId: string;\n membersReceived: boolean;\n shareScreenStarted: boolean;\n deferScreenReceived: boolean;\n participants: Participant[];\n updateScreenId: (id: string) => void;\n updateShareScreenStarted: (started: boolean) => void;\n updateDeferScreenReceived: (received: boolean) => void;\n}\n\nexport type ScreenProducerIdType = (options: ScreenProducerIdOptions) => void;\n\n/**\n * Reconciles a screen-share producer id with current participant state.\n *\n * @param {ScreenProducerIdOptions} options - Screen-share identifiers and setters.\n * @returns {void} Updates screen state synchronously.\n *\n * @example\n * ```typescript\n * screenProducerId({\n * producerId: 'screen-producer',\n * screenId: 'host-screen',\n * membersReceived: true,\n * shareScreenStarted: false,\n * deferScreenReceived: false,\n * participants,\n * updateScreenId: setScreenId,\n * updateShareScreenStarted: setShareScreenStarted,\n * updateDeferScreenReceived: setDeferScreenReceived,\n * });\n * ```\n */\nexport const screenProducerId = ({\n producerId,\n screenId,\n membersReceived,\n participants,\n updateScreenId,\n updateShareScreenStarted,\n updateDeferScreenReceived,\n}: ScreenProducerIdOptions): void => {\n const host = participants.find(\n (participant) =>\n participant.ScreenID === screenId && participant.ScreenOn === true,\n );\n\n if (host && membersReceived) {\n updateScreenId(producerId);\n updateShareScreenStarted(true);\n updateDeferScreenReceived(false);\n return;\n }\n\n updateScreenId(producerId);\n updateDeferScreenReceived(true);\n};\n","export interface StartRecordsSocketLike {\n emit: (\n event: string,\n payload: { roomName: string; member: string },\n callback?: (response: { success: boolean }) => void,\n ) => void;\n}\n\nexport interface StartRecordsOptions {\n roomName: string;\n member: string;\n socket: StartRecordsSocketLike;\n}\n\nexport type StartRecordsType = (options: StartRecordsOptions) => Promise<void>;\n\n/**\n * Requests recording startup for the current room.\n *\n * @param {StartRecordsOptions} options - Room, member, and socket details.\n * @returns {Promise<void>} Resolves after the emit request is sent.\n *\n * @example\n * ```typescript\n * await startRecords({\n * roomName: 'RoomA',\n * member: 'AdminUser',\n * socket,\n * });\n * ```\n */\nexport const startRecords = async ({\n roomName,\n member,\n socket,\n}: StartRecordsOptions): Promise<void> => {\n socket.emit(\n 'startRecordIng',\n { roomName, member },\n ({ success }: { success: boolean }) => {\n if (!success) {\n // no-op: caller-controlled UX\n }\n },\n );\n};\n","import type { ShowAlert } from '../../types/types';\n\nexport interface StoppedRecordingOptions {\n state: string;\n reason: string;\n showAlert?: ShowAlert;\n}\n\nexport type StoppedRecordingType = (\n options: StoppedRecordingOptions,\n) => Promise<void>;\n\n/**\n * Shows a reasoned alert when the backend reports that recording has stopped.\n *\n * @param {StoppedRecordingOptions} options - Recording stop state and alert helper.\n * @returns {Promise<void>} Resolves after the alert is dispatched.\n *\n * @example\n * ```typescript\n * await stoppedRecording({\n * state: 'stop',\n * reason: 'The session ended',\n * showAlert,\n * });\n * ```\n */\nexport const stoppedRecording = async ({\n state,\n reason,\n showAlert,\n}: StoppedRecordingOptions): Promise<void> => {\n try {\n if (state === 'stop') {\n showAlert?.({\n message: `The recording has stopped - ${reason}.`,\n duration: 3000,\n type: 'danger',\n });\n }\n } catch (error) {\n console.log('Error in stoppedRecording: ', error);\n }\n};\n","import type { ShowAlert } from '../../types/types';\nimport type {\n TranslationTranscriptData,\n} from '../utils/liveSubtitle';\nimport type { TranslationVoiceConfig } from '../utils/translationLanguages';\nimport { getLanguageName } from '../utils/translationLanguages';\n\nexport type LanguageMode = 'allowlist' | 'blocklist' | 'any';\n\nexport interface LanguageEntry {\n code: string;\n nickname?: string;\n voiceConfig?: TranslationVoiceConfig;\n}\n\nexport interface TranslationRoomConfig {\n supportTranslation: boolean;\n spokenLanguageMode: LanguageMode;\n allowedSpokenLanguages?: LanguageEntry[];\n blockedSpokenLanguages?: string[];\n listenLanguageMode: LanguageMode;\n allowedListenLanguages?: LanguageEntry[];\n blockedListenLanguages?: string[];\n maxActiveChannelsPerSpeaker: number;\n autoDetectSpokenLanguage: boolean;\n allowSpokenLanguageChange?: boolean;\n allowListenLanguageChange?: boolean;\n translationVoiceConfig?: TranslationVoiceConfig | null;\n providerGroups?: {\n groupA?: {\n languages: string[];\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n };\n groupB?: {\n languages: string[];\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n };\n default?: {\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n };\n } | null;\n}\n\nexport interface TranslationRoomConfigData {\n config: TranslationRoomConfig;\n}\n\nexport interface TranslationConfigUpdatedData {\n config: TranslationRoomConfig;\n}\n\nexport interface TranslationLanguageSetData {\n success: boolean;\n language: string;\n enabled: boolean;\n error?: string;\n}\n\nexport interface TranslationSubscribedData {\n speakerId: string;\n speakerName?: string;\n language: string;\n channelCreated: boolean;\n producerId?: string;\n originalProducerId?: string;\n}\n\nexport interface TranslationUnsubscribedData {\n speakerId: string;\n language: string;\n channelClosed: boolean;\n}\n\nexport interface TranslationProducerReadyData {\n speakerId: string;\n speakerName?: string;\n language: string;\n producerId: string;\n originalProducerId: string;\n}\n\nexport interface TranslationProducerClosedData {\n speakerId: string;\n language: string;\n producerId: string;\n reason?: string;\n}\n\nexport interface TranslationChannelsAvailableData {\n speakerId: string;\n speakerName?: string;\n languages: string[];\n originalProducerId: string;\n}\n\nexport interface TranslationMemberStateData {\n memberId: string;\n memberName?: string;\n state: {\n speaking?: {\n enabled: boolean;\n inputLanguage: string;\n originalProducerId: string;\n };\n listening?: {\n [speakerId: string]: {\n language: string;\n producerId: string | null;\n };\n };\n };\n}\n\nexport interface TranslationErrorData {\n error: string;\n code?: string;\n details?: unknown;\n availableChannels?: string[];\n maxChannels?: number;\n message?: string;\n}\n\nexport interface TranslationSpeakerOutputChangedData {\n speakerId: string;\n speakerName: string;\n inputLanguage: string;\n outputLanguage: string | null;\n originalProducerId: string;\n enabled: boolean;\n}\n\nexport interface TranslationProducerMap {\n [originalProducerId: string]: {\n [languageCode: string]: string;\n };\n}\n\nexport interface TranslationRoomConfigOptions {\n data: TranslationRoomConfigData;\n updateTranslationConfig?: (config: TranslationRoomConfig) => void;\n updateTranslationSupported?: (supported: boolean) => void;\n}\n\nexport interface TranslationConfigUpdatedOptions {\n data: TranslationConfigUpdatedData;\n updateTranslationConfig?: (config: TranslationRoomConfig) => void;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationLanguageSetOptions {\n data: TranslationLanguageSetData;\n updateMySpokenLanguage?: (lang: string) => void;\n updateMySpokenLanguageEnabled?: (enabled: boolean) => void;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationSubscribedOptions {\n data: TranslationSubscribedData;\n updateListenPreferences?: (updater: (prev: Map<string, string>) => Map<string, string>) => void;\n updateTranslationProducerMap?: (updater: (prev: TranslationProducerMap) => TranslationProducerMap) => void;\n startConsumingTranslation?: (producerId: string, speakerId: string, language: string, originalProducerId?: string) => Promise<void>;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationUnsubscribedOptions {\n data: TranslationUnsubscribedData;\n updateListenPreferences?: (updater: (prev: Map<string, string>) => Map<string, string>) => void;\n stopConsumingTranslation?: (speakerId: string, language: string) => Promise<void>;\n}\n\nexport interface TranslationProducerReadyOptions {\n data: TranslationProducerReadyData;\n updateTranslationProducerMap?: (updater: (prev: TranslationProducerMap) => TranslationProducerMap) => void;\n startConsumingTranslation?: (producerId: string, speakerId: string, language: string, originalProducerId: string) => Promise<void>;\n pauseOriginalProducer?: (originalProducerId: string) => Promise<void>;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationProducerClosedOptions {\n data: TranslationProducerClosedData;\n updateTranslationProducerMap?: (updater: (prev: TranslationProducerMap) => TranslationProducerMap) => void;\n stopConsumingTranslation?: (producerId: string) => Promise<void>;\n resumeOriginalProducer?: (speakerId: string) => Promise<void>;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationChannelsAvailableOptions {\n data: TranslationChannelsAvailableData;\n updateAvailableTranslationChannels?: (speakerId: string, languages: string[], originalProducerId: string) => void;\n myDefaultListenLanguage?: string | null;\n socket?: {\n emit: (event: string, payload: Record<string, unknown>) => void;\n } | null;\n roomName?: string;\n}\n\nexport interface TranslationMemberStateOptions {\n data: TranslationMemberStateData;\n updateParticipantTranslationState?: (memberId: string, state: TranslationMemberStateData['state']) => void;\n}\n\nexport interface TranslationErrorOptions {\n data: TranslationErrorData;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationTranscriptOptions {\n data: TranslationTranscriptData;\n updateTranscripts?: (updater: (prev: TranslationTranscriptData[]) => TranslationTranscriptData[]) => void;\n onTranscriptReceived?: (transcript: TranslationTranscriptData) => void;\n maxTranscripts?: number;\n}\n\nexport interface TranslationSpeakerOutputChangedOptions {\n data: TranslationSpeakerOutputChangedData;\n pauseOriginalProducer?: (originalProducerId: string, speakerId: string) => Promise<void>;\n resumeOriginalProducer?: (originalProducerId: string, speakerId: string) => Promise<void>;\n stopConsumingTranslationForSpeaker?: (speakerId: string) => Promise<void>;\n updateSpeakerTranslationState?: (speakerId: string, outputLanguage: string | null, originalProducerId: string) => void;\n showAlert?: ShowAlert;\n listenerOverride?: { speakerId: string; wantOriginal: boolean; preferredLanguage?: string } | null;\n}\n\nexport type TranslationRoomConfigType = (options: TranslationRoomConfigOptions) => Promise<void>;\nexport type TranslationConfigUpdatedType = (options: TranslationConfigUpdatedOptions) => Promise<void>;\nexport type TranslationLanguageSetType = (options: TranslationLanguageSetOptions) => Promise<void>;\nexport type TranslationSubscribedType = (options: TranslationSubscribedOptions) => Promise<void>;\nexport type TranslationUnsubscribedType = (options: TranslationUnsubscribedOptions) => Promise<void>;\nexport type TranslationProducerReadyType = (options: TranslationProducerReadyOptions) => Promise<void>;\nexport type TranslationProducerClosedType = (options: TranslationProducerClosedOptions) => Promise<void>;\nexport type TranslationChannelsAvailableType = (options: TranslationChannelsAvailableOptions) => Promise<void>;\nexport type TranslationMemberStateType = (options: TranslationMemberStateOptions) => Promise<void>;\nexport type TranslationErrorType = (options: TranslationErrorOptions) => Promise<void>;\nexport type TranslationTranscriptType = (options: TranslationTranscriptOptions) => Promise<void>;\nexport type TranslationSpeakerOutputChangedType = (options: TranslationSpeakerOutputChangedOptions) => Promise<void>;\n\nexport const translationRoomConfig: TranslationRoomConfigType = async ({\n data,\n updateTranslationConfig,\n updateTranslationSupported,\n}): Promise<void> => {\n try {\n const { config } = data;\n updateTranslationSupported?.(config.supportTranslation);\n\n if (updateTranslationConfig && config.supportTranslation) {\n updateTranslationConfig(config);\n }\n } catch (error) {\n console.error('Error handling translation:roomConfig:', error);\n }\n};\n\nexport const translationConfigUpdated: TranslationConfigUpdatedType = async ({\n data,\n updateTranslationConfig,\n showAlert,\n}): Promise<void> => {\n try {\n updateTranslationConfig?.(data.config);\n showAlert?.({\n message: 'Translation settings updated by host',\n type: 'info',\n duration: 2000,\n });\n } catch (error) {\n console.error('Error handling translation:configUpdated:', error);\n }\n};\n\nexport const translationLanguageSet: TranslationLanguageSetType = async ({\n data,\n updateMySpokenLanguage,\n updateMySpokenLanguageEnabled,\n showAlert,\n}): Promise<void> => {\n try {\n if (data.success) {\n updateMySpokenLanguage?.(data.language);\n updateMySpokenLanguageEnabled?.(data.enabled);\n } else if (showAlert && data.error) {\n showAlert({\n message: data.error,\n type: 'danger',\n duration: 3000,\n });\n }\n } catch (error) {\n console.error('Error handling translation:languageSet:', error);\n }\n};\n\nexport const translationSubscribed: TranslationSubscribedType = async ({\n data,\n updateListenPreferences,\n updateTranslationProducerMap,\n startConsumingTranslation,\n showAlert,\n}): Promise<void> => {\n try {\n const { speakerId, language, channelCreated, producerId, originalProducerId } = data;\n\n updateListenPreferences?.((prev) => {\n const next = new Map(prev);\n next.set(speakerId, language);\n return next;\n });\n\n if (producerId && originalProducerId && updateTranslationProducerMap) {\n updateTranslationProducerMap((prev) => ({\n ...prev,\n [originalProducerId]: {\n ...(prev[originalProducerId] || {}),\n [language]: producerId,\n },\n }));\n }\n\n if (producerId && startConsumingTranslation) {\n await startConsumingTranslation(producerId, speakerId, language, originalProducerId);\n }\n\n if (showAlert && channelCreated) {\n showAlert({\n message: `Translation channel created for ${language}`,\n type: 'success',\n duration: 2000,\n });\n }\n } catch (error) {\n console.error('Error handling translation:subscribed:', error);\n }\n};\n\nexport const translationUnsubscribed: TranslationUnsubscribedType = async ({\n data,\n updateListenPreferences,\n stopConsumingTranslation,\n}): Promise<void> => {\n try {\n updateListenPreferences?.((prev) => {\n const next = new Map(prev);\n next.delete(data.speakerId);\n return next;\n });\n\n if (stopConsumingTranslation) {\n await stopConsumingTranslation(data.speakerId, data.language);\n }\n } catch (error) {\n console.error('Error handling translation:unsubscribed:', error);\n }\n};\n\nexport const translationProducerReady: TranslationProducerReadyType = async ({\n data,\n updateTranslationProducerMap,\n pauseOriginalProducer,\n}): Promise<void> => {\n try {\n updateTranslationProducerMap?.((prev) => ({\n ...prev,\n [data.originalProducerId]: {\n ...(prev[data.originalProducerId] || {}),\n [data.language]: data.producerId,\n },\n }));\n\n if (pauseOriginalProducer) {\n await pauseOriginalProducer(data.originalProducerId);\n }\n } catch (error) {\n console.error('Error handling translation:producerReady:', error);\n }\n};\n\nexport const translationProducerClosed: TranslationProducerClosedType = async ({\n data,\n updateTranslationProducerMap,\n stopConsumingTranslation,\n resumeOriginalProducer,\n showAlert,\n}): Promise<void> => {\n try {\n if (updateTranslationProducerMap) {\n updateTranslationProducerMap((prev) => {\n const next = { ...prev };\n for (const [originalProducerId, languageMap] of Object.entries(next)) {\n if (languageMap[data.language] === data.producerId) {\n delete languageMap[data.language];\n if (Object.keys(languageMap).length === 0) {\n delete next[originalProducerId];\n }\n }\n }\n return next;\n });\n }\n\n if (stopConsumingTranslation) {\n await stopConsumingTranslation(data.producerId);\n }\n\n if (resumeOriginalProducer) {\n await resumeOriginalProducer(data.speakerId);\n }\n\n if (showAlert && data.reason) {\n showAlert({\n message: `Translation stopped: ${data.reason}`,\n type: 'info',\n duration: 2000,\n });\n }\n } catch (error) {\n console.error('Error handling translation:producerClosed:', error);\n }\n};\n\nexport const translationChannelsAvailable: TranslationChannelsAvailableType = async ({\n data,\n updateAvailableTranslationChannels,\n myDefaultListenLanguage,\n socket,\n roomName,\n}): Promise<void> => {\n try {\n updateAvailableTranslationChannels?.(data.speakerId, data.languages, data.originalProducerId);\n\n if (myDefaultListenLanguage && data.languages.includes(myDefaultListenLanguage) && socket && roomName) {\n socket.emit('translation:subscribe', {\n roomName,\n speakerId: data.speakerId,\n language: myDefaultListenLanguage,\n originalProducerId: data.originalProducerId,\n });\n }\n } catch (error) {\n console.error('Error handling translation:channelsAvailable:', error);\n }\n};\n\nexport const translationMemberState: TranslationMemberStateType = async ({\n data,\n updateParticipantTranslationState,\n}): Promise<void> => {\n try {\n updateParticipantTranslationState?.(data.memberId, data.state);\n } catch (error) {\n console.error('Error handling translation:memberState:', error);\n }\n};\n\nexport const translationError: TranslationErrorType = async ({\n data,\n showAlert,\n}): Promise<void> => {\n try {\n if (showAlert) {\n let message = data.error;\n\n switch (data.code) {\n case 'max_channels':\n if (data.availableChannels && data.availableChannels.length > 0) {\n message = `Maximum ${data.maxChannels || 5} translation channels reached. Available: ${data.availableChannels.join(', ')}`;\n } else {\n message = data.message || 'Maximum translation channels reached. Please wait for a slot to open.';\n }\n break;\n case 'speaker_not_found':\n message = 'Speaker not found or has left the meeting.';\n break;\n case 'language_not_allowed':\n message = 'This language is not available for translation in this room.';\n break;\n default:\n message = data.error || 'Translation error occurred';\n }\n\n showAlert({\n message,\n type: 'danger',\n duration: 5000,\n });\n }\n } catch (err) {\n console.error('Error handling translation:error:', err);\n }\n};\n\nexport const translationTranscript: TranslationTranscriptType = async ({\n data,\n updateTranscripts,\n onTranscriptReceived,\n maxTranscripts = 100,\n}): Promise<void> => {\n try {\n if (updateTranscripts) {\n updateTranscripts((prev) => {\n const next = [...prev, data];\n return next.length > maxTranscripts ? next.slice(-maxTranscripts) : next;\n });\n }\n\n onTranscriptReceived?.(data);\n } catch (err) {\n console.error('Error handling translation:transcript:', err);\n }\n};\n\nexport const translationSpeakerOutputChanged: TranslationSpeakerOutputChangedType = async ({\n data,\n pauseOriginalProducer,\n resumeOriginalProducer,\n stopConsumingTranslationForSpeaker,\n updateSpeakerTranslationState,\n showAlert,\n listenerOverride,\n}): Promise<void> => {\n try {\n updateSpeakerTranslationState?.(data.speakerId, data.outputLanguage, data.originalProducerId);\n\n const listenerWantsOriginal = listenerOverride?.wantOriginal === true;\n const listenerWantsDifferentLanguage = Boolean(\n listenerOverride?.preferredLanguage &&\n listenerOverride.preferredLanguage.toLowerCase() !== data.outputLanguage?.toLowerCase(),\n );\n\n if (listenerWantsOriginal) {\n showAlert?.({\n message: `${data.speakerName} is speaking in ${data.outputLanguage ? getLanguageName(data.outputLanguage) : 'translated'} but you're hearing original`,\n type: 'info',\n duration: 3000,\n });\n return;\n }\n\n if (listenerWantsDifferentLanguage) {\n if (pauseOriginalProducer && data.originalProducerId) {\n await pauseOriginalProducer(data.originalProducerId, data.speakerId);\n }\n return;\n }\n\n if (data.enabled && data.outputLanguage && data.originalProducerId) {\n if (pauseOriginalProducer) {\n await pauseOriginalProducer(data.originalProducerId, data.speakerId);\n }\n\n showAlert?.({\n message: `${data.speakerName} is now speaking in ${getLanguageName(data.outputLanguage)}`,\n type: 'info',\n duration: 3000,\n });\n } else if (!data.enabled || !data.outputLanguage) {\n if (stopConsumingTranslationForSpeaker) {\n await stopConsumingTranslationForSpeaker(data.speakerId);\n }\n\n if (resumeOriginalProducer && data.originalProducerId) {\n await resumeOriginalProducer(data.originalProducerId, data.speakerId);\n }\n\n if (showAlert && !data.enabled) {\n showAlert({\n message: `${data.speakerName} returned to original language`,\n type: 'info',\n duration: 3000,\n });\n }\n }\n } catch (err) {\n console.error('Error handling translation:speakerOutputChanged:', err);\n }\n};","import type { Settings } from '../../types/types';\n\nexport interface UpdateMediaSettingsOptions {\n settings: Settings;\n updateAudioSetting: (value: string) => void;\n updateVideoSetting: (value: string) => void;\n updateScreenshareSetting: (value: string) => void;\n updateChatSetting: (value: string) => void;\n}\n\nexport type UpdateMediaSettingsType = (\n options: UpdateMediaSettingsOptions,\n) => void;\n\n/**\n * Expands the shared `Settings` tuple into individual media setting updaters.\n *\n * @param {UpdateMediaSettingsOptions} options - Settings tuple and update callbacks.\n * @returns {void} Updates state synchronously.\n *\n * @example\n * ```typescript\n * updateMediaSettings({\n * settings: ['allow', 'allow', 'deny', 'allow'],\n * updateAudioSetting: setAudioSetting,\n * updateVideoSetting: setVideoSetting,\n * updateScreenshareSetting: setScreenshareSetting,\n * updateChatSetting: setChatSetting,\n * });\n * ```\n */\nexport const updateMediaSettings = ({\n settings,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateChatSetting,\n}: UpdateMediaSettingsOptions): void => {\n const [audioSetting, videoSetting, screenshareSetting, chatSetting] = settings;\n\n updateAudioSetting(audioSetting);\n updateVideoSetting(videoSetting);\n updateScreenshareSetting(screenshareSetting);\n updateChatSetting(chatSetting);\n};\n","import type {\n AltDomains,\n ConsumeSocket,\n Participant,\n} from '../../types/types';\nimport type { ConnectIpsLikeType } from './getDomains';\n\nexport interface UpdateConsumingDomainsGetDomainsOptions<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> {\n domains: string[];\n alt_domains: AltDomains;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n parameters:\n UpdateConsumingDomainsParameters<TParameters, TParticipant, TConsumeSocket> &\n TParameters;\n}\n\nexport type UpdateConsumingDomainsGetDomainsType<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> = (\n options: UpdateConsumingDomainsGetDomainsOptions<TParameters, TParticipant, TConsumeSocket>,\n) => Promise<void>;\n\nexport interface UpdateConsumingDomainsParameters\n <\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n > {\n participants: TParticipant[];\n consume_sockets: TConsumeSocket[];\n connectIps: ConnectIpsLikeType<TParameters, TConsumeSocket>;\n getDomains: UpdateConsumingDomainsGetDomainsType<TParameters, TParticipant, TConsumeSocket>;\n getUpdatedAllParams: () =>\n UpdateConsumingDomainsParameters<TParameters, TParticipant, TConsumeSocket> &\n TParameters;\n [key: string]: any;\n}\n\nexport interface UpdateConsumingDomainsOptions<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> {\n domains: string[];\n alt_domains: AltDomains;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n parameters:\n UpdateConsumingDomainsParameters<TParameters, TParticipant, TConsumeSocket> &\n TParameters;\n}\n\nexport type UpdateConsumingDomainsType<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> = (\n options: UpdateConsumingDomainsOptions<TParameters, TParticipant, TConsumeSocket>,\n) => Promise<void>;\n\n/**\n * Connects newly announced consuming domains, routing through alternate-domain lookup when needed.\n *\n * @param {UpdateConsumingDomainsOptions} options - Domain payload and consume-domain connection helpers.\n * @returns {Promise<void>} Resolves once the needed consume domains are connected.\n *\n * @example\n * ```typescript\n * await updateConsumingDomains({\n * domains,\n * alt_domains,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * parameters,\n * });\n * ```\n */\nexport const updateConsumingDomains = async <\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n>({\n domains,\n alt_domains,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n}: UpdateConsumingDomainsOptions<TParameters, TParticipant, TConsumeSocket>): Promise<void> => {\n let { participants, getDomains, consume_sockets, connectIps } = parameters;\n consume_sockets = parameters.getUpdatedAllParams().consume_sockets;\n\n try {\n if (participants.length > 0) {\n if (Object.keys(alt_domains).length > 0) {\n await getDomains({\n domains,\n alt_domains,\n apiUserName,\n apiKey,\n apiToken,\n parameters,\n });\n } else {\n await connectIps({\n consume_sockets,\n remIP: domains,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n }\n }\n } catch (error) {\n console.log('Error in updateConsumingDomains: ', error);\n }\n};\n","import type {\n CoHostResponsibility,\n EventType,\n ShowAlert,\n} from '../../types/types';\n\nexport interface UpdatedCoHostOptions {\n coHost: string;\n coHostResponsibility: CoHostResponsibility[];\n showAlert?: ShowAlert;\n eventType: EventType;\n islevel: string;\n member: string;\n youAreCoHost: boolean;\n updateCoHost: (coHost: string) => void;\n updateCoHostResponsibility: (responsibility: CoHostResponsibility[]) => void;\n updateYouAreCoHost: (youAreCoHost: boolean) => void;\n}\n\nexport type UpdatedCoHostType = (options: UpdatedCoHostOptions) => Promise<void>;\n\n/**\n * Synchronizes co-host assignment state and optionally alerts the newly assigned co-host.\n *\n * @param {UpdatedCoHostOptions} options - Co-host payload and state setters.\n * @returns {Promise<void>} Resolves after co-host state is synchronized.\n *\n * @example\n * ```typescript\n * await updatedCoHost({\n * coHost: 'user123',\n * coHostResponsibility: responsibilities,\n * eventType: 'conference',\n * islevel: '1',\n * member: 'user123',\n * youAreCoHost: false,\n * updateCoHost: setCoHost,\n * updateCoHostResponsibility: setCoHostResponsibility,\n * updateYouAreCoHost: setYouAreCoHost,\n * showAlert,\n * });\n * ```\n */\nexport const updatedCoHost = async ({\n coHost,\n coHostResponsibility,\n showAlert,\n eventType,\n islevel,\n member,\n youAreCoHost,\n updateCoHost,\n updateCoHostResponsibility,\n updateYouAreCoHost,\n}: UpdatedCoHostOptions): Promise<void> => {\n if (eventType !== 'broadcast' && eventType !== 'chat') {\n updateCoHost(coHost);\n updateCoHostResponsibility(coHostResponsibility);\n\n if (member === coHost) {\n if (!youAreCoHost) {\n updateYouAreCoHost(true);\n showAlert?.({\n message: 'You are now a co-host.',\n type: 'success',\n duration: 3000,\n });\n }\n } else {\n updateYouAreCoHost(false);\n }\n } else if (islevel !== '2') {\n updateYouAreCoHost(true);\n }\n};\n","import type { ShowAlert } from '../../types/types';\n\nexport interface UserWaitingOptions {\n name: string;\n showAlert?: ShowAlert;\n totalReqWait: number;\n updateTotalReqWait: (total: number) => void;\n}\n\nexport type UserWaitingType = (options: UserWaitingOptions) => Promise<void>;\n\n/**\n * Handles a participant joining the waiting room by notifying the UI and bumping the pending total.\n *\n * @param {UserWaitingOptions} options - Waiting-room notification settings.\n * @param {string} options.name - Participant name shown in the alert.\n * @param {ShowAlert} [options.showAlert] - Optional alert presenter.\n * @param {number} options.totalReqWait - Current combined waiting/request count.\n * @param {(total: number) => void} options.updateTotalReqWait - Updates the combined waiting/request count.\n * @returns {Promise<void>} Resolves after state updates complete.\n *\n * @example\n * ```typescript\n * await userWaiting({\n * name: 'Ada',\n * totalReqWait: 2,\n * updateTotalReqWait: setTotalReqWait,\n * showAlert: ({ message }) => console.log(message),\n * });\n * ```\n */\nexport const userWaiting = async ({\n name,\n showAlert,\n totalReqWait,\n updateTotalReqWait,\n}: UserWaitingOptions): Promise<void> => {\n showAlert?.({\n message: `${name} joined the waiting room.`,\n type: 'success',\n duration: 3000,\n });\n\n updateTotalReqWait(totalReqWait + 1);\n};\n","import type { Socket } from 'socket.io-client';\nimport Cookies from 'universal-cookie';\nimport type { PreJoinPageParameters } from '../../types/types';\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10;\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours\n\nconst hasConnectedSocketId = (socket: unknown): socket is Socket & { id: string } => {\n if (!socket || typeof socket !== 'object') {\n return false;\n }\n\n const candidate = socket as { id?: unknown };\n return typeof candidate.id === 'string' && candidate.id.length > 0;\n};\n\n/**\n * Options for handleWelcomeRequest function\n */\nexport interface HandleWelcomeRequestOptions {\n apiUserName: string;\n apiToken: string;\n link: string;\n userName: string;\n parameters: PreJoinPageParameters;\n}\n\n/**\n * Validates alphanumeric strings\n */\nexport function validateAlphanumeric(str: string): boolean {\n if (str.length === 0) return true;\n const alphanumericRegex = /^[a-zA-Z0-9]+$/;\n return alphanumericRegex.test(str);\n}\n\n/**\n * Validates welcome page form inputs\n */\nexport interface ValidateWelcomeInputsOptions {\n name: string;\n secret: string;\n eventID: string;\n link: string;\n}\n\nexport function validateWelcomeInputs({\n name,\n secret,\n eventID,\n link,\n}: ValidateWelcomeInputsOptions): { valid: boolean; message?: string } {\n if (name.length === 0 || secret.length === 0 || eventID.length === 0 || link.length === 0) {\n return { valid: false, message: 'Please fill all the fields.' };\n }\n\n if (\n !validateAlphanumeric(name) ||\n !validateAlphanumeric(secret) ||\n !validateAlphanumeric(eventID) ||\n !link.includes('mediasfu.com') ||\n eventID.toLowerCase().startsWith('d')\n ) {\n return { valid: false, message: 'Please enter valid details.' };\n }\n\n if (\n secret.length != 64 ||\n name.length > 12 ||\n name.length < 2 ||\n eventID.length > 32 ||\n eventID.length < 8 ||\n link.length < 12\n ) {\n return { valid: false, message: 'Please enter valid details.' };\n }\n\n return { valid: true };\n}\n\n/**\n * Handles connection request with rate limiting for welcome page\n * \n * @param {HandleWelcomeRequestOptions} options - Configuration for the request\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleWelcomeRequest({\n * apiUserName: 'room123',\n * apiToken: 'secret123',\n * link: 'https://mediasfu.com/meeting',\n * userName: 'John Doe',\n * parameters,\n * });\n * ```\n */\nexport async function handleWelcomeRequest({\n apiUserName,\n apiToken,\n link,\n userName,\n parameters,\n}: HandleWelcomeRequestOptions): Promise<void> {\n const {\n showAlert,\n updateIsLoadingModalVisible,\n connectSocket,\n updateSocket,\n updateValidated,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n } = parameters;\n\n const TIMEOUT_DURATION = 10000; // 10 seconds\n\n let unsuccessfulAttempts = parseInt(cookies.get('unsuccessfulAttempts') || '0');\n let lastRequestTimestamp = parseInt(cookies.get('lastRequestTimestamp') || '0');\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n if (Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {\n showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n cookies.set('lastRequestTimestamp', Date.now().toString());\n return;\n } else {\n unsuccessfulAttempts = 0;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n }\n }\n\n try {\n updateIsLoadingModalVisible(true);\n\n const socketPromise = connectSocket({\n apiUserName,\n apiKey: '',\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Request timed out')), TIMEOUT_DURATION)\n );\n\n const socket = await Promise.race([socketPromise, timeoutPromise]);\n\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateSocket(socket);\n updateApiUserName(apiUserName);\n updateApiToken(apiToken);\n updateLink(link);\n updateRoomName(apiUserName);\n updateMember(userName);\n updateValidated(true);\n } else {\n unsuccessfulAttempts += 1;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateIsLoadingModalVisible(false);\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n } else {\n showAlert?.({\n message: 'Invalid credentials.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch {\n showAlert?.({\n message: 'Unable to connect. Check your credentials and try again.',\n type: 'danger',\n duration: 3000,\n });\n\n unsuccessfulAttempts += 1;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateIsLoadingModalVisible(false);\n }\n}\n"],"names":["p","response","padNumber","sleep","track","updatePanelists","updatePermissionConfig","getDomains"],"mappings":";;;AAOO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AACF,MAAoC;AAClC,gCAA8B,CAAC,uBAAuB;AACxD;ACwBO,MAAM,kBAAkB,OAAO;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,MAA6C;AAC3C,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,sCAAsC,MAAM,UAAU,UAAU,KAAM;AAC7F;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,WAAW,UAAU,IAAI,CAACA,QAAO,EAAE,IAAIA,GAAE,IAAI,MAAMA,GAAE,KAAA,EAAO;AAAA,MAC5D;AAAA,IAAA;AAAA,IAEF,CAAC,aAAoD;AACnD,UAAI,CAAC,UAAU,SAAS;AACtB,oBAAY,EAAE,SAAS,UAAU,UAAU,8BAA8B,MAAM,UAAU,UAAU,KAAM;AAAA,MAC3G;AAAA,IACF;AAAA,EAAA;AAEJ;AAEO,MAAM,cAAc,OAAO;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,MAA4C;AAC1C,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,mCAAmC,MAAM,UAAU,UAAU,KAAM;AAC1F,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,KAAK,CAACA,OAAMA,GAAE,OAAO,YAAY,EAAE,GAAG;AACzD,gBAAY,EAAE,SAAS,GAAG,YAAY,IAAI,0BAA0B,MAAM,WAAW,UAAU,IAAA,CAAM;AACrG,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,UAAU,cAAc;AAC3C,gBAAY,EAAE,SAAS,2BAA2B,YAAY,aAAa,MAAM,UAAU,UAAU,IAAA,CAAM;AAC3G,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,eAAe,YAAY;AAAA,QAC3B,iBAAiB,YAAY;AAAA,QAC7B;AAAA,MAAA;AAAA,MAEF,CAAC,aAAoD;AACnD,YAAI,CAAC,UAAU,SAAS;AACtB,sBAAY,EAAE,SAAS,UAAU,UAAU,0BAA0B,MAAM,UAAU,UAAU,KAAM;AACrG,kBAAQ,KAAK;AAAA,QACf,OAAO;AACL,kBAAQ,IAAI;AAAA,QACd;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAEO,MAAM,iBAAiB,OAAO;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,MAA4C;AAC1C,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,sCAAsC,MAAM,UAAU,UAAU,KAAM;AAC7F;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,eAAe,YAAY;AAAA,MAC3B,iBAAiB,YAAY;AAAA,MAC7B;AAAA,IAAA;AAAA,IAEF,CAAC,aAAoD;AACnD,UAAI,CAAC,UAAU,SAAS;AACtB,oBAAY,EAAE,SAAS,UAAU,UAAU,6BAA6B,MAAM,UAAU,UAAU,KAAM;AAAA,MAC1G;AAAA,IACF;AAAA,EAAA;AAEJ;AC7GO,MAAM,iBAAiB,OAAO;AAAA,EACnC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB;AACF,MAA4C;AAC1C,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,qCAAqC,MAAM,UAAU,UAAU,KAAM;AAC5F;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,CAAC,aAAoD;AACnD,UAAI,CAAC,UAAU,SAAS;AACtB,oBAAY,EAAE,SAAS,UAAU,UAAU,6BAA6B,MAAM,UAAU,UAAU,KAAM;AAAA,MAC1G;AAAA,IACF;AAAA,EAAA;AAEJ;AAEO,MAAM,mBAAmB,OAAO;AAAA,EACrC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,MAA8C;AAC5C,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,uCAAuC,MAAM,UAAU,UAAU,KAAM;AAC9F;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,MACf,kBAAkB;AAAA,IAAA;AAAA,IAEpB,CAAC,aAAoD;AACnD,UAAI,CAAC,UAAU,SAAS;AACtB,oBAAY,EAAE,SAAS,UAAU,UAAU,+BAA+B,MAAM,UAAU,UAAU,KAAM;AAAA,MAC5G;AAAA,IACF;AAAA,EAAA;AAEJ;AC3EO,MAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAAsC;AACpC,kCAAgC,CAAC,yBAAyB;AAC5D;ACcO,MAAM,8BAA8B,OAAO;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF,MAAyD;AACvD,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,oDAAoD,MAAM,UAAU,UAAU,KAAM;AAC3G;AAAA,EACF;AAEA,MAAI,YAAY,YAAY,KAAK;AAC/B,gBAAY,EAAE,SAAS,6CAA6C,MAAM,UAAU,UAAU,KAAM;AACpG;AAAA,EACF;AAEA,MAAI,YAAY,YAAY,SAAU;AAEtC,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,eAAe,YAAY;AAAA,QAC3B,iBAAiB,YAAY;AAAA,QAC7B;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,CAAC,aAAoD;AACnD,YAAI,CAAC,UAAU,SAAS;AACtB,sBAAY,EAAE,SAAS,UAAU,UAAU,+BAA+B,MAAM,UAAU,UAAU,KAAM;AAAA,QAC5G;AACA,gBAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAEO,MAAM,mCAAmC,OAAO;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,MAA8D;AAC5D,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,oDAAoD,MAAM,UAAU,UAAU,KAAM;AAC3G;AAAA,EACF;AAEA,QAAM,uBAAuB,aAAa;AAAA,IACxC,CAACA,OAAMA,GAAE,YAAY,OAAOA,GAAE,YAAY;AAAA,EAAA;AAG5C,MAAI,qBAAqB,WAAW,GAAG;AACrC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AACD;AAAA,EACF;AAEA,QAAM,QAAQ,qBAAqB,MAAM,GAAG,YAAY;AAExD,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,SAAS,MAAM,IAAI,CAACA,QAAO;AAAA,UACzB,eAAeA,GAAE;AAAA,UACjB,iBAAiBA,GAAE;AAAA,UACnB;AAAA,QAAA,EACA;AAAA,QACF;AAAA,MAAA;AAAA,MAEF,CAAC,aAAoD;AACnD,YAAI,CAAC,UAAU,SAAS;AACtB,sBAAY;AAAA,YACV,SAAS,UAAU,UAAU;AAAA,YAC7B,MAAM;AAAA,YACN,UAAU;AAAA,UAAA,CACX;AAAA,QACH,WAAW,qBAAqB,SAAS,cAAc;AACrD,sBAAY;AAAA,YACV,SAAS,WAAW,MAAM,MAAM,kBAAkB,qBAAqB,SAAS,YAAY;AAAA,YAC5F,MAAM;AAAA,YACN,UAAU;AAAA,UAAA,CACX;AAAA,QACH;AAEA,gBAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;ACtGO,MAAM,yBAAyB,OAAO;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAoD;AAClD,MAAI,YAAY,KAAK;AACnB,gBAAY,EAAE,SAAS,qDAAqD,MAAM,UAAU,UAAU,KAAM;AAC5G;AAAA,EACF;AAEA,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,CAAC,aAAoD;AACnD,YAAI,CAAC,UAAU,SAAS;AACtB,sBAAY,EAAE,SAAS,UAAU,UAAU,sCAAsC,MAAM,UAAU,UAAU,KAAM;AAAA,QACnH;AACA,gBAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;ACZO,MAAM,cAAc,OAAO;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAyC;AACvC,MAAI;AACF,QAAI,KAAK,OAAO;AACd,cAAQ,KAAK;AACb,kBAAY,KAAK,KAAK;AAAA,IACxB,OAAO;AACL,cAAQ,CAAC,KAAK,IAAI;AAClB,kBAAY,KAAK;AAAA,IACnB;AAEA,QAAI,WAAkC,EAAE,IAAI,GAAA;AAE5C,QAAI,MAAM;AACR,iBAAW,EAAE,GAAG,KAAA;AAAA,IAClB;AAEA,QAAI,KAAK,WAAW,SAAS;AAC3B,aAAO,KAAK;AACZ,iBAAW,KAAK,IAAI;AAAA,IACtB;AAEA,QAAI,KAAK,WAAW,aAAa,YAAY,KAAK;AAChD,UAAI,CAAC,KAAK,UAAW,KAAK,UAAU,CAAC,KAAK,OAAO,MAAM,GAAI;AACzD,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AACD,iCAAyB,IAAI;AAAA,MAC/B;AAAA,IACF,WAAW,KAAK,WAAW,SAAS;AAClC,UAAI,SAAS,OAAO,KAAK,KAAK,IAAI;AAChC,oBAAY,EAAE,SAAS,cAAc,MAAM,UAAU,UAAU,KAAM;AACrE,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EACR;AACF;ACCA,eAAsB,iBAAiB;AAAA,EACrC;AAAA,EACA,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2C;AACzC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAKJ,QAAM,kBAAkB,OAAO;AAAA,IAC7B;AAAA,IACA,OAAO;AAAA,EAAA,MACqB;AAC5B,gBAAY,KAAK,cAAc,YAAY,CAAC,aAA0C;AACpF,UAAI,SAAS,SAAS;AACpB,qBAAa,UAAW;AACxB,0BAAkB,WAAW,eAAe,EAAE;AAC9C,uBAAe,SAAS,MAAM;AAC9B,mBAAW,IAAI;AACf,uBAAe,WAAW,OAAO;AAGjC,qBAAa,WAAW,WAAW,IAAI;AACvC,oCAA4B,KAAK;AACjC,wBAAgB,IAAI;AAAA,MACtB,OAAO;AACL,oCAA4B,KAAK;AACjC,oBAAY;AAAA,UACV,SAAS,0BAA0B,SAAS,MAAM;AAAA,UAClD,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAKA,QAAM,cAAc,OAAO;AAAA,IACzB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU,iBAAiB;AAAA,EAAA,MAMvB;AACJ,UAAM,WAAW,MAAM,mBAAmB;AAAA,MACxC,SAAS;AAAA,MACT,aAAa;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,IAAA,CACD;AACD,QAAI,SAAS,WAAW,SAAS,QAAQ,cAAc,SAAS,MAAM;AACpE,YAAM,0BAA0B;AAAA,QAC9B,aAAa,SAAS,KAAK;AAAA,QAC3B,UAAU,SAAS,KAAK;AAAA,QACxB,MAAM,SAAU,KAAK;AAAA,QACrB,UAAU,cAAc;AAAA,QACxB;AAAA,QACA,UAAU;AAAA,MAAA,CACX;AACD,aAAO;AAAA,IACT,OAAO;AACL,kCAA4B,KAAK;AACjC,kBAAY;AAAA,QACV,SAAS,0BACP,SAAS,OAAQ,WAAW,SAAS,OAAO,SAAS,KAAK,QAAQ,KAAM,EAC1E;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF;AAEA,8BAA4B,IAAI;AAEhC,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,aACJ,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,IAC1C,KAAK,SAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC5C,QAAI,+BACE,KAAA,GAAO,UAAU,SAAS,EAAE,KAChC,oBAAI,KAAA,GAAO,mBAAA,IACX,KAAK,MAAM,KAAK,KAAK,OAAA,IAAW,EAAE,EAAE,SAAA;AACtC,cAAU,MAAM;AAChB,UAAM,kBAAkB,WAAW;AACnC,QAAI,mBAAmB,QAAQ,WAAW;AACxC,sBAAgB,OAAO,QAAQ;AAAA,IACjC;AAEA,UAAM,aAAwC;AAAA,MAC5C;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,mCAAmB,KAAA;AAAA,MACnB;AAAA,MACA,UAAU;AAAA,MACV,iBAAiB,WAAW;AAAA,MAC5B;AAAA,MACA,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,aAAa;AAAA,IAAA;AAGf,QAAI,mBAAmB,cAAc,aAAa,UAAU,eAAe,UAAU,QAAQ;AAE3F,YAAM,mBAAmB,UAAU;AACnC,YAAM,cAAc,UAAU;AAG9B,YAAM,iBAAiB,gBAAgB,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;AAC/F,YAAM,aAAa,mBAAmB,cAAc;AACpD,YAAM,kBAAkB,KAAK;AAG7B,UAAI;AACF,cAAM,iBAAiB,aAAa,QAAQ,UAAU;AACtD,YAAI,gBAAgB;AAClB,gBAAM,cAAc,KAAK,MAAM,cAAc;AAC7C,gBAAM,mBAAmB,KAAK,IAAA,KAAS,aAAa,aAAa;AACjE,cAAI,mBAAmB,iBAAiB;AACtC,wCAA4B,KAAK;AACjC,wBAAY;AAAA,cACV,SAAS;AAAA,cACT,MAAM;AAAA,cACN,UAAU;AAAA,YAAA,CACX;AACD;AAAA,UACF,OAAO;AAEL,gBAAI;AACF,2BAAa,WAAW,UAAU;AAAA,YACpC,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAGA,UAAI;AACF,qBAAa;AAAA,UACX;AAAA,UACA,KAAK,UAAU;AAAA,YACb,WAAW,KAAK,IAAA;AAAA,YAChB,SAAS;AAAA,cACP,QAAQ;AAAA,cACR,UAAU,QAAQ;AAAA,cAClB,UAAU,QAAQ;AAAA,cAClB,UAAU,QAAQ;AAAA,YAAA;AAAA,UACpB,CACD;AAAA,QAAA;AAIH,mBAAW,MAAM;AACf,cAAI;AACF,yBAAa,WAAW,UAAU;AAAA,UACpC,QAAQ;AAAA,UAER;AAAA,QACF,GAAG,eAAe;AAAA,MACpB,QAAQ;AAAA,MAER;AAEA,cAAQ,aAAa;AAErB,UAAI;AACF,cAAM,WAAW,MAAM,YAAY;AAAA,UACjC;AAAA,UACA,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,UAAU;AAAA,QAAA,CACX;AAGD,YAAI;AACF,uBAAa,WAAW,UAAU;AAAA,QACpC,QAAQ;AAAA,QAER;AAEA,YAAI,YAAY,SAAS,WAAW,SAAS,QAAQ,cAAc,SAAS,MAAM;AAChF,qBAAW,UAAU,SAAS,KAAK;AACnC,qBAAW,aAAa,SAAS,KAAK,cAAc;AACpD,qBAAW,cAAc,SAAS,KAAK;AACvC,gBAAM,gBAAgB;AAAA,YACpB;AAAA,YACA,MAAM,SAAS,KAAK;AAAA,UAAA,CACrB;AAAA,QACH,OAAO;AACL,sCAA4B,KAAK;AACjC,sBAAY;AAAA,YACV,SAAS;AAAA,YACT,MAAM;AAAA,YACN,UAAU;AAAA,UAAA,CACX;AACD,cAAI;AACF,yBAAa,UAAU;AACvB,kBAAM,gBAAgB,EAAE,YAAwB;AAAA,UAClD,SAAS,OAAO;AACd,wCAA4B,KAAK;AACjC,wBAAY;AAAA,cACV,SAAS,0BAA0B,KAAK;AAAA,cACxC,MAAM;AAAA,cACN,UAAU;AAAA,YAAA,CACX;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AAEd,YAAI;AACF,uBAAa,WAAW,UAAU;AAAA,QACpC,QAAQ;AAAA,QAER;AACA,oCAA4B,KAAK;AACjC,oBAAY;AAAA,UACV,SAAS,sCAAsC,KAAK;AAAA,UACpD,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF,OAAO;AACL,UAAI;AACF,qBAAa,UAAW;AACxB,cAAM,gBAAgB,EAAE,YAAwB;AAAA,MAClD,SAAS,OAAO;AACd,oCAA4B,KAAK;AACjC,oBAAY;AAAA,UACV,SAAS,0BAA0B,KAAK;AAAA,UACxC,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,iBAAiB,mBAAmB,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;AAClG,UAAM,aAAa,mBAAmB,cAAc;AACpD,UAAM,kBAAkB,KAAK;AAG7B,QAAI;AACF,YAAM,iBAAiB,aAAa,QAAQ,UAAU;AACtD,UAAI,gBAAgB;AAClB,cAAM,cAAc,KAAK,MAAM,cAAc;AAC7C,cAAM,mBAAmB,KAAK,IAAA,KAAS,aAAa,aAAa;AACjE,YAAI,mBAAmB,iBAAiB;AACtC,sCAA4B,KAAK;AACjC,sBAAY;AAAA,YACV,SAAS;AAAA,YACT,MAAM;AAAA,YACN,UAAU;AAAA,UAAA,CACX;AACD;AAAA,QACF,OAAO;AAEL,cAAI;AACF,yBAAa,WAAW,UAAU;AAAA,UACpC,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAGA,QAAI;AACF,mBAAa;AAAA,QACX;AAAA,QACA,KAAK,UAAU;AAAA,UACb,WAAW,KAAK,IAAA;AAAA,UAChB,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,UAAU,QAAQ;AAAA,YAClB,UAAU,QAAQ;AAAA,YAClB,UAAU,QAAQ;AAAA,UAAA;AAAA,QACpB,CACD;AAAA,MAAA;AAIH,iBAAW,MAAM;AACf,YAAI;AACF,uBAAa,WAAW,UAAU;AAAA,QACpC,QAAQ;AAAA,QAER;AAAA,MACF,GAAG,eAAe;AAAA,IACpB,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAGD,UAAI;AACF,qBAAa,WAAW,UAAU;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,IACF,SAAS,OAAO;AAEd,UAAI;AACF,qBAAa,WAAW,UAAU;AAAA,MACpC,QAAQ;AAAA,MAER;AACA,kCAA4B,KAAK;AACjC,kBAAY;AAAA,QACV,SAAS,0BAA0B,KAAK;AAAA,QACxC,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF;AACF;ACxXA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAKJ,QAAM,gBAAgB,OAAO,EAAE,UAAU,OAAO,gBAA2C;AACzF,gBAAY,KAAK,iBAAiB,UAAU,CAACC,cAA0C;AACrF,UAAIA,UAAS,SAAS;AACpB,qBAAa,UAAW;AACxB,0BAAkB,WAAW,eAAe,EAAE;AAC9C,uBAAeA,UAAS,MAAM;AAC9B,mBAAW,IAAI;AACf,uBAAe,SAAS,OAAO;AAC/B,qBAAa,SAAS,QAAQ;AAC9B,oCAA4B,KAAK;AACjC,wBAAgB,IAAI;AAAA,MACtB,OAAO;AACL,oCAA4B,KAAK;AACjC,oBAAY;AAAA,UACV,SAAS,wBAAwBA,UAAS,MAAM;AAAA,UAChD,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,UAAU,SAAS,KAAK,CAAC,UAAU,SAAS,cAAc,GAAG;AAC/D,UAAM,WAAyC;AAAA,MAC7C,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,IAAA;AAGzB,UAAM,cAAc,EAAE,UAAoB;AAC1C;AAAA,EACF;AAEA,8BAA4B,IAAI;AAEhC,QAAM,WAAW,MAAM,iBAAiB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAED,MAAI,SAAS,WAAW,SAAS,QAAQ,cAAc,SAAS,MAAM;AACpE,UAAM,0BAA0B;AAAA,MAC9B,aAAa,SAAS,KAAK;AAAA,MAC3B,UAAU,SAAS,KAAK;AAAA,MACxB,MAAM,SAAS,KAAK;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB;AAAA,IAAA,CACD;AAAA,EACH,OAAO;AACL,gCAA4B,KAAK;AACjC,gBAAY;AAAA,MACV,SAAS,wBACP,SAAS,OAAQ,WAAW,SAAS,OAAO,SAAS,KAAK,QAAQ,KAAM,EAC1E;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AACF;AC5IO,MAAM,YAAY,OAAO;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuC;AACrC,MAAI,wBAAwB;AAC1B,iCAA6B,KAAK;AAClC;AAAA,EACF;AAEA,MAAI,gBAAgB,WAAW,YAAY,KAAK;AAC9C,iCAA6B,KAAK;AAClC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AACD;AAAA,EACF;AAEA,+BAA6B,IAAI;AACnC;ACRO,MAAM,qBAAqB,CAAC,WAMf;AAClB,QAAM,YAAY,OAAO,aAAa,KAAK,IAAA;AAC3C,QAAM,WAAW,KAAK,IAAI,KAAM,KAAK,IAAI,KAAM,MAAO,OAAO,KAAK,SAAS,EAAE,CAAC;AAE9E,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,WAAW,YAAY;AAAA,IACvB,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,EAAA;AAExB;AAEO,MAAM,oBAAoB,CAAC,UAAwB,MAAM,KAAK,UAAmB;AACtF,SAAO,OAAO,SAAS;AACzB;AAEO,MAAM,wBAAwB,CACnC,WACA,MAAM,KAAK,UACmB;AAC9B,QAAM,OAAO,IAAI,IAAI,SAAS;AAE9B,aAAW,CAAC,KAAK,QAAQ,KAAK,KAAK,WAAW;AAC5C,QAAI,kBAAkB,UAAU,GAAG,GAAG;AACpC,WAAK,OAAO,GAAG;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,MAAM,oCAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AACF,MAA6D;AAC3D,QAAM,WAAW,mBAAmB;AAAA,IAClC,MAAM,WAAW,kBAAkB,WAAW;AAAA,IAC9C,UAAU,WAAW;AAAA,IACrB,WAAW,WAAW;AAAA,IACtB,aAAa,WAAW;AAAA,IACxB,WAAW,OAAO,WAAW;AAAA,EAAA,CAC9B;AAED,QAAM,OAAO,sBAAsB,kBAAkB,SAAS,SAAS;AACvE,OAAK,IAAI,WAAW,WAAW,QAAQ;AAEvC,MAAI,WAAW,aAAa;AAC1B,SAAK,IAAI,WAAW,aAAa,QAAQ;AAAA,EAC3C;AAEA,SAAO;AACT;AAEO,MAAM,wBAAwB,CACnC,WACA,WACA,aACA,MAAM,KAAK,UACa;AACxB,QAAM,kBAAkB,sBAAsB,WAAW,GAAG;AAE5D,MAAI,aAAa,gBAAgB,IAAI,SAAS,GAAG;AAC/C,WAAO,gBAAgB,IAAI,SAAS,KAAK;AAAA,EAC3C;AAEA,MAAI,eAAe,gBAAgB,IAAI,WAAW,GAAG;AACnD,WAAO,gBAAgB,IAAI,WAAW,KAAK;AAAA,EAC7C;AAEA,SAAO;AACT;ACnCO,MAAM,2BAAqC;AAAA,EAChD;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC5D;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC5D;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC9B;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClB;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1C;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACpF;AAAA,EAAM;AAAA,EAAM;AAAA,EACZ;AAAA,EAAM;AAAA,EAAM;AAAA,EACZ;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxB;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC9B;AACF;AAEA,MAAM,qBAAqD;AAAA,EACzD,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAC1I,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAAc,IAAI;AAAA,EAC1M,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAC5Y,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EACxC,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EACxF,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,KAAK;AAAA,EACnP,IAAI;AAAA,EAAY,IAAI;AAAA,EAAY,IAAI;AAAA,EACpC,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAC5D,IAAI;AAAA,EAAgB,IAAI;AAAA,EAAgB,IAAI;AAAA,EAAgB,IAAI;AAAA,EAAgB,IAAI;AAAA,EAAgB,IAAI;AAAA,EACxG,MAAM;AACR;AAEA,MAAM,0BAAsD;AAAA,EAC1D,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAC9K,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAa,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAC/K,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAAQ,IAAI;AAAA,EAC5H,MAAM;AACR;AAIA,MAAM,oBAA4C;AAAA,EAChD,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAC9D,IAAI;AAAA,EAAc,IAAI;AAAA,EAAS,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EACjE,IAAI;AAAA,EAAU,IAAI;AAAA,EAAU,IAAI;AAAA,EAAS,IAAI;AAAA,EAAW,IAAI;AAAA,EAC5D,IAAI;AAAA,EAAU,IAAI;AAAA,EAAW,IAAI;AAAA,EAAS,IAAI;AAAA,EAAQ,IAAI;AAAA,EAC1D,IAAI;AAAA,EAAW,IAAI;AAAA,EAAa,IAAI;AAAA,EAAU,IAAI;AAAA,EAClD,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAAc,IAAI;AAAA,EACnD,IAAI;AAAA,EAAc,IAAI;AAAA,EAAS,IAAI;AAAA,EAAY,IAAI;AAAA,EACnD,IAAI;AAAA,EAAO,IAAI;AAAA,EACf,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAAS,IAAI;AAAA,EAAQ,IAAI;AAAA,EAC1D,IAAI;AAAA,EAAS,IAAI;AAAA,EAAa,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAC/D,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAAe,IAAI;AAAA,EACpD,IAAI;AAAA,EAAY,IAAI;AAAA,EAAO,IAAI;AAAA,EAAO,KAAK;AAAA,EAC3C,IAAI;AAAA,EAAU,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAC/C,IAAI;AAAA,EAAa,IAAI;AAAA,EAAS,IAAI;AAAA,EAAS,IAAI;AAAA,EAC/C,IAAI;AAAA,EAAa,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAClD,IAAI;AAAA,EAAW,IAAI;AAAA,EAAU,IAAI;AAAA,EAAa,IAAI;AAAA,EAClD,IAAI;AAAA,EAAY,IAAI;AAAA,EAAc,IAAI;AAAA,EAAW,IAAI;AAAA,EACrD,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAc,IAAI;AAAA,EACpD,IAAI;AAAA,EAAS,IAAI;AAAA,EAAS,IAAI;AAAA,EAAW,IAAI;AAAA,EAC7C,IAAI;AAAA,EAAY,IAAI;AAAA,EACpB,IAAI;AAAA,EAAY,IAAI;AAAA,EAAY,IAAI;AAAA,EACpC,IAAI;AAAA,EAAU,IAAI;AAAA,EAAY,IAAI;AAAA,EAAW,IAAI;AAAA,EAAS,IAAI;AAAA,EAC9D,IAAI;AAAA,EAAU,IAAI;AAAA,EAAS,IAAI;AAAA,EAAS,IAAI;AAAA,EAAU,IAAI;AAAA,EAC1D,IAAI;AACN;AAEA,MAAM,iBAAiB,CAAC,MAAc,QAAgB,aAAqB;AACzE,MAAI;AACF,UAAM,eAAe,IAAI,KAAK,aAAa,CAAC,MAAM,GAAG,EAAE,MAAM,YAAY;AACzE,UAAM,SAAS,aAAa,GAAG,IAAI;AACnC,QAAI,OAAQ,QAAO;AAAA,EACrB,QAAQ;AAAA,EAER;AAEA,SAAO,kBAAkB,IAAI,KAAK;AACpC;AAEO,MAAM,wBAAwB,CAAC,SAAyB;AAC7D,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,OAAO,YAAA,EAAc,MAAM,GAAG,EAAE,CAAC;AAC/C;AAEO,MAAM,sBAAsB,CAAC,SAA0B;AAC5D,QAAM,aAAa,sBAAsB,IAAI;AAC7C,SAAO,yBAAyB,SAAS,UAAU;AACrD;AAEO,MAAM,kBAAkB,CAAC,MAAc,gBAAgB,SAAiB;AAC7E,QAAM,aAAa,sBAAsB,IAAI;AAC7C,MAAI,eAAe,QAAQ;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,YAAY,eAAe,WAAW,aAAa;AAC3E;AAEO,MAAM,wBAAwB,CAAC,SAAyB;AAC7D,QAAM,aAAa,sBAAsB,IAAI;AAC7C,MAAI,eAAe,QAAQ;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,YAAY,YAAY,gBAAgB,UAAU,CAAC;AAC3E;AAEO,MAAM,sBAAsB,CAAC,SAAmC;AACrE,QAAM,aAAa,sBAAsB,IAAI;AAE7C,SAAO;AAAA,IACL,MAAM,gBAAgB,UAAU;AAAA,IAChC,YAAY,sBAAsB,UAAU;AAAA,IAC5C,QAAQ,mBAAmB,UAAU,KAAK;AAAA,IAC1C,YAAY,wBAAwB,UAAU,KAAK;AAAA,EAAA;AAEvD;AAEO,MAAM,wBAAwB,CAAC,gBAAgB,SAA2B;AAC/E,SAAO,yBAAyB,IAAI,CAAC,SAAS;AAC5C,UAAM,WAAW,oBAAoB,IAAI;AACzC,WAAO;AAAA,MACL;AAAA,MACA,MAAM,gBAAgB,MAAM,aAAa;AAAA,MACzC,YAAY,SAAS;AAAA,MACrB,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,IAAA;AAAA,EAEzB,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAC9D;AAQO,MAAM,wBAAkC;AAAA,EAC7C;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAClE;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1C;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACpC;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAC9D;AAMO,MAAM,qBAAqB,CAAC,gBAAgB,SAA2B;AAC5E,SAAO,sBAAsB,IAAI,CAAC,SAAS;AACzC,UAAM,WAAW,oBAAoB,IAAI;AACzC,WAAO;AAAA,MACL;AAAA,MACA,MAAM,gBAAgB,MAAM,aAAa;AAAA,MACzC,YAAY,SAAS;AAAA,MACrB,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,IAAA;AAAA,EAEzB,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAC9D;AAgBO,MAAM,gBAA2H;AAAA,EACtI,UAAU,EAAE,MAAM,iBAAiB,cAAc,OAAO,WAAW,KAAA;AAAA,EACnE,QAAQ,EAAE,MAAM,cAAc,cAAc,OAAO,cAAc,KAAA;AAAA,EACjE,OAAO,EAAE,MAAM,oBAAoB,cAAc,KAAA;AAAA,EACjD,QAAQ,EAAE,MAAM,oBAAoB,cAAc,KAAA;AAAA,EAClD,KAAK,EAAE,MAAM,aAAa,cAAc,KAAA;AAAA,EACxC,YAAY,EAAE,MAAM,cAAc,cAAc,OAAO,cAAc,KAAA;AAAA,EACrE,QAAQ,EAAE,MAAM,UAAU,cAAc,OAAO,cAAc,KAAA;AAAA,EAC7D,UAAU,EAAE,MAAM,kBAAkB,cAAc,OAAO,cAAc,KAAA;AAAA,EACvE,MAAM,EAAE,MAAM,WAAW,cAAc,OAAO,cAAc,KAAA;AAAA,EAC5D,QAAQ,EAAE,MAAM,UAAU,cAAc,OAAO,cAAc,KAAA;AAAA,EAC7D,QAAQ,EAAE,MAAM,qBAAqB,cAAc,OAAO,cAAc,KAAA;AAAA,EACxE,YAAY,EAAE,MAAM,cAAc,cAAc,MAAA;AAClD;AAUA,MAAM,sBAAsB,CAAC,UAAkB,aAAqE;AAClH,QAAM,qBAAqB,sBAAsB,aAAa,SAAS,OAAO,QAAQ;AACtF,QAAM,cAAc,SAAS,YAAA;AAC7B,QAAM,eAAe,cAAc,WAA0B,GAAG,QAAQ;AACxE,QAAM,eAAe,gBAAgB,kBAAkB;AAEvD,SAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,QACE,IAAI,GAAG,WAAW,IAAI,kBAAkB;AAAA,QACxC,MAAM,GAAG,YAAY,IAAI,YAAY;AAAA,QACrC,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI,GAAG,WAAW,IAAI,kBAAkB;AAAA,QACxC,MAAM,GAAG,YAAY,IAAI,YAAY;AAAA,QACrC,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,MAAM;AAAA,MACJ;AAAA,QACE,IAAI,GAAG,WAAW,IAAI,kBAAkB;AAAA,QACxC,MAAM,GAAG,YAAY,IAAI,YAAY;AAAA,QACrC,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,MAEZ;AAAA,QACE,IAAI,GAAG,WAAW,IAAI,kBAAkB;AAAA,QACxC,MAAM,GAAG,YAAY,IAAI,YAAY;AAAA,QACrC,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EACF;AAEJ;AAEO,MAAM,qBAAqB,CAChC,UACA,WAAiC,eACkB;AACnD,SAAO,oBAAoB,UAAU,SAAS,SAAA,CAAU;AAC1D;AAEO,MAAM,uBAAuB,CAClC,QACA,WAAiC,YACjC,WAAmB,SACc;AACjC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,eAAe,SAAS,SAAA;AAC9B,UAAM,iBAAiB,mBAAmB,UAAU,YAAY;AAEhE,UAAM,UAAU,WAAW,MAAM;AAC/B,cAAQ;AAAA,QACN,UAAU;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,QACR,OAAO;AAAA,MAAA,CACR;AAAA,IACH,GAAG,GAAI;AAEP,WAAO,KAAK,yBAAyB,EAAE,UAAU,SAAA,GAAY,CAAC,aAAkC;AAC9F,mBAAa,OAAO;AAEpB,UAAI,UAAU,QAAQ;AACpB,gBAAQ,QAAQ;AAChB;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,UAAU,UAAU,YAAY;AAAA,QAChC,UAAU,UAAU,YAAY;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO,UAAU,SAAS;AAAA,MAAA,CAC3B;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEO,MAAM,0BAA0B,CACrC,QACA,gBAAwB,SACM;AAC9B,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,UAAU,WAAW,MAAM;AAC/B,cAAQ,sBAAsB,aAAa,CAAC;AAAA,IAC9C,GAAG,GAAI;AAEP,WAAO,KAAK,4BAA4B,EAAE,cAAA,GAAiB,CAAC,aAA+C;AACzG,mBAAa,OAAO;AACpB,cAAQ,UAAU,WAAW,SAAS,SAAS,YAAY,sBAAsB,aAAa,CAAC;AAAA,IACjG,CAAC;AAAA,EACH,CAAC;AACH;AC9VO,MAAM,cAAc,OAAO,EAAE,eAAkD;AACpF,MAAI,CAAC,YAAY,OAAO,UAAU,aAAa;AAC7C;AAAA,EACF;AAEA,MAAI;AACF,UAAM,QAAQ,IAAI,MAAM,QAAQ;AAChC,UAAM,MAAM,KAAA;AAAA,EACd,SAAS,OAAO;AACd,YAAQ,MAAM,wBAAwB,KAAK;AAAA,EAC7C;AACF;ACPO,MAAM,qBAAqB,CAAC,EAAE,eAAgE;AACnG,UAAQ,UAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,KAAK,GAAG,MAAM,EAAA;AAAA,IACzB,KAAK;AACH,aAAO,EAAE,KAAK,GAAG,OAAO,EAAA;AAAA,IAC1B,KAAK;AACH,aAAO,EAAE,QAAQ,GAAG,MAAM,EAAA;AAAA,IAC5B,KAAK;AACH,aAAO,EAAE,QAAQ,GAAG,OAAO,EAAA;AAAA,IAC7B;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;ACfO,SAAS,MAAM,EAAE,MAAmC;AACzD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;ACFO,MAAM,eAAe,OAAO,EAAE,aAA+D;AAClG,MAAI,QAAQ;AACV,QAAI,SAAS,KAAK;AAChB,aAAO,OAAO,SAAA;AAAA,IAChB;AAEA,QAAI,SAAS,KAAK;AAChB,aAAO,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,IACrC;AAEA,QAAI,SAAS,KAAK;AAChB,aAAO,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,IACrC;AAEA,QAAI,SAAS,MAAM;AACjB,aAAO,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AC7BO,MAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,mBAAmB;AACrB,MAAgD;AAC9C,QAAM,WAAsB,CAAA;AAE5B,QAAM,oBAAoB,CAAC,WAA2B;AACpD,UAAM,qBAAqB,aAAa,OAAO,CAAC,gBAAgB,YAAY,SAAS,MAAM;AAC3F,UAAM,iBAAiB,mBAAmB,KAAK,MAAM,KAAK,OAAA,IAAW,mBAAmB,MAAM,CAAC;AAC/F,WAAO,gBAAgB,QAAQ;AAAA,EACjC;AAEA,MAAI,WAAqB,CAAA;AACzB,MAAI,kBAAkB;AACpB,eAAW,CAAC,QAAQ,IAAI;AAAA,EAC1B,WAAW,QAAQ;AACjB,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,aAAa,IAAI,CAAC,gBAAgB,YAAY,IAAI,EAAE,OAAO,CAAC,SAAyB,SAAS,MAAS;AAAA,IAAA;AAAA,EAE9G,OAAO;AACL,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA,GAAG,aAAa,IAAI,CAAC,gBAAgB,YAAY,IAAI,EAAE,OAAO,CAAC,SAAyB,SAAS,MAAS;AAAA,IAAA;AAAA,EAE9G;AAEA,aAAW,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAEhC,MAAI,gBAAgB;AACpB,WAAS,QAAQ,CAAC,WAAW;AAC3B,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,WAAW,CAAC,kBAAkB,MAAM,CAAC;AAAA,MACrC,SAAS,uBAAuB,MAAM;AAAA,MACtC,WAAW,IAAI,KAAK,KAAK,QAAQ,aAAa,EAAE,mBAAA;AAAA,MAChD,OAAO;AAAA,IAAA,CACR;AAED,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,WAAW,aAAa,IAAI,CAAC,gBAAgB,YAAY,IAAI,EAAE,OAAO,CAAC,SAAyB,SAAS,MAAS;AAAA,MAClH,SAAS,sBAAsB,MAAM;AAAA,MACrC,WAAW,IAAI,KAAK,KAAK,QAAQ,aAAa,EAAE,mBAAA;AAAA,MAChD,OAAO;AAAA,IAAA,CACR;AAED,qBAAiB;AAAA,EACnB,CAAC;AAED,SAAO;AACT;ACxDO,MAAM,6BAA6B,CAAC;AAAA,EACzC;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,mBAAmB;AACrB,MAAwD;AACtD,QAAM,eAA8B,CAAA;AACpC,MAAI,QAAkB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAI,kBAAkB;AACpB,UAAM,OAAO,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,MAAM,SAAS,MAAM,GAAG;AAC3B,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,MAAI,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC,kBAAkB;AAChD,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,MAAI,CAAC,MAAM,SAAS,IAAI,GAAG;AACzB,UAAM,QAAQ,IAAI;AAAA,EACpB;AAEA,MAAI,kBAAkB;AACpB,UAAM,OAAO,CAAC;AAAA,EAChB;AAEA,UAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAE9C,QAAM,gBAAgB,CAAC,GAAG,KAAK;AAC/B,WAAS,QAAQ,cAAc,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG;AAChE,UAAM,cAAc,KAAK,MAAM,KAAK,YAAY,QAAQ,EAAE;AAC1D,KAAC,cAAc,KAAK,GAAG,cAAc,WAAW,CAAC,IAAI,CAAC,cAAc,WAAW,GAAG,cAAc,KAAK,CAAC;AAAA,EACxG;AAEA,MAAI,uBAAuB;AAE3B,WAAS,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS,GAAG;AAC5D,UAAM,aAAa,cAAc,KAAK;AACtC,UAAM,cAAc,uBAAuB,MAAM,eAAe,OAAO,MAAM;AAC7E,UAAM,cAAc,mBAAmB,OAAO,KAAK,WAAW;AAE9D,QAAI,gBAAgB,KAAK;AACvB,6BAAuB;AAAA,IACzB;AAEA,iBAAa,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,IAAI,MAAM,SAAA;AAAA,MACV,SAAS,SAAS,KAAK;AAAA,MACvB,SAAS,SAAS,KAAK;AAAA,IAAA,CACxB;AAAA,EACH;AAEA,SAAO;AACT;AC3FO,MAAM,sBAAsB,CAAC,EAAE,oBAAwD;AAC5F,QAAM,YAAsB,CAAC,aAAa,SAAS,QAAQ;AAC3D,QAAM,QAAgB,CAAA;AAEtB,WAAS,QAAQ,GAAG,QAAQ,eAAe,SAAS,GAAG;AACrD,UAAM,OAAO,UAAU,KAAK,MAAM,KAAK,OAAA,IAAW,UAAU,MAAM,CAAC;AACnE,QAAI;AAEJ,YAAQ,MAAA;AAAA,MACN,KAAK;AACH,kBAAU,CAAC,QAAQ,OAAO;AAC1B;AAAA,MACF,KAAK;AACH,kBAAU,CAAC,OAAO,IAAI;AACtB;AAAA,MACF,KAAK;AACH,kBAAU,MAAM,KAAK,EAAE,QAAQ,KAAK,MAAM,KAAK,OAAA,IAAW,CAAC,IAAI,EAAA,GAAK,CAAC,GAAG,gBAAgB,UAAU,cAAc,CAAC,EAAE;AACnH;AAAA,MACF;AACE,kBAAU,CAAA;AAAA,IAAC;AAGf,UAAM,KAAK;AAAA,MACT,IAAI,GAAG,QAAQ,CAAC;AAAA,MAChB,UAAU,mBAAmB,QAAQ,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,MACA,OAAO,MAAM,QAAQ,MAAM,EAAE,KAAK,CAAC;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ,CAAA;AAAA,IAAC,CACV;AAAA,EACH;AAEA,SAAO;AACT;AC/BO,MAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAmD;AACjD,QAAM,uBAAuB,aAAa;AAAA,IACxC,CAAC,gBAAgB,YAAY,SAAS,YAAY,YAAY,SAAS;AAAA,EAAA;AAGzE,QAAM,eAAe,CAAC,YAAY,cAAc,eAAe;AAE/D,WAAS,QAAQ,aAAa,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG;AAC/D,UAAM,cAAc,KAAK,MAAM,KAAK,YAAY,QAAQ,EAAE;AAC1D,KAAC,aAAa,KAAK,GAAG,aAAa,WAAW,CAAC,IAAI,CAAC,aAAa,WAAW,GAAG,aAAa,KAAK,CAAC;AAAA,EACpG;AAEA,SAAO,qBAAqB,QAAQ,CAAC,gBAAgB;AACnD,UAAM,kCAAkB,IAAA;AACxB,UAAM,WAAsB,CAAA;AAE5B,aAAS,QAAQ,GAAG,QAAQ,kBAAkB,SAAS,GAAG;AACxD,UAAI;AACJ,SAAG;AACD,qBAAa,aAAa,KAAK,MAAM,KAAK,WAAW,aAAa,MAAM,CAAC;AAAA,MAC3E,SAAS,YAAY,IAAI,UAAU;AAEnC,kBAAY,IAAI,UAAU;AAE1B,eAAS,KAAK;AAAA,QACZ,IAAI,YAAY,MAAM;AAAA,QACtB,MAAM,YAAY,OAAO,YAAY,KAAK,cAAc,QAAQ,OAAO,GAAG,IAAI;AAAA,QAC9E,MAAM;AAAA,QACN,UAAU,YAAY,OAAO,YAAY,KAAK,cAAc,QAAQ,OAAO,GAAG,IAAI;AAAA,MAAA,CACnF;AAAA,IACH;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AC9CO,MAAM,gCAAgC,MAAgC;AAC3E,QAAM,QAAQ,CAAC,SAAS,QAAQ,OAAO,OAAO,KAAK;AAEnD,QAAM,kBAA4C,CAAA;AAClD,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,oBAAgB,KAAK;AAAA,MACnB,MAAM,MAAM,KAAK;AAAA,MACjB,IAAI,MAAM,SAAA;AAAA,IAAS,CACpB;AAAA,EACH;AAEA,SAAO;AACT;AChBO,MAAM,qBAAqB;AAAA;AAAA,EAGhC,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,sBAAsB;AAAA,IACpB,EAAE,MAAM,gBAAgB,OAAO,OAAO,WAAW,MAAA;AAAA,IACjD,EAAE,MAAM,SAAS,OAAO,OAAO,WAAW,MAAA;AAAA,IAC1C,EAAE,MAAM,WAAW,OAAO,OAAO,WAAW,MAAA;AAAA,IAC5C,EAAE,MAAM,QAAQ,OAAO,OAAO,WAAW,MAAA;AAAA,EAAM;AAAA,EAEjD,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,cAAc,CAAA;AAAA,EACd,sBAAsB,CAAA;AAAA,EACtB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EAEpB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,QAAQ,CAAA;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU;AAAA,EACV,MAAM;AAAA,EAEN,iBAAiB,CAAA;AAAA,EACjB,iBAAiB;AAAA,EACjB,aAAa,CAAA;AAAA,EACb,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAA;AAAA,EAC/B,WAAW;AAAA,EACX,SAAS,CAAA;AAAA,EACT,SAAS,CAAA;AAAA,EACT,cAAc,CAAA;AAAA,EACd,SAAS,CAAA;AAAA;AAAA,EAGT,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,qCAAqC;AAAA,EACrC,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,qCAAqC;AAAA,EACrC,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,yCAAyC;AAAA,EACzC,2CAA2C;AAAA,EAC3C,+BAA+B;AAAA,EAC/B,qCAAqC;AAAA,EACrC,8BAA8B;AAAA,EAE9B,qBAAqB;AAAA,IACnB,WAAW;AAAA,MACT,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,QAAQ;AAAA,IAAA;AAAA,IAEV,WAAW;AAAA,MACT,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,kBAAkB;AAAA,IAAA;AAAA,EACpB;AAAA,EAGF,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA;AAAA,EAGlB,iBAAiB,CAAA;AAAA,EACjB,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,iBAAiB,CAAA;AAAA,EACjB,mBAAmB,CAAA;AAAA,EACnB,sBAAsB,CAAA;AAAA,EACtB,cAAc,CAAA;AAAA,EACd,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,cAAc,CAAA;AAAA,EACd,iBAAiB,CAAA;AAAA,EACjB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,iBAAiB,CAAA;AAAA,EACjB,aAAa,CAAA;AAAA,EACb,iBAAiB,CAAA;AAAA,EACjB,eAAe,CAAA;AAAA,EACf,mBAAmB,CAAA;AAAA,EACnB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,aAAa,CAAA;AAAA,EACb,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe,CAAA;AAAA,EACf,YAAY;AAAA,EACZ,aAAa,CAAA;AAAA,EACb,oBAAoB,CAAA;AAAA,EACpB,mBAAmB;AAAA,EACnB,eAAe,CAAA;AAAA,EACf,sBAAsB,CAAA;AAAA,EACtB,0BAA0B,CAAA;AAAA,EAC1B,kBAAkB,CAAA;AAAA,EAClB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,cAAc,CAAC;AAAA,IACb,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,EAAA,CACpB;AAAA,EACD,kBAAkB,CAAC;AAAA,IACjB,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,EAAA,CACpB;AAAA,EACD,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,gBAAgB,CAAA;AAAA,EAChB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU,CAAA;AAAA,EACV,gBAAgB,CAAA;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB,CAAA;AAAA,EAChB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,eAAe;AAAA,EACf,iBAAiB,CAAA;AAAA,EACjB,oBAAoB,CAAA;AAAA,EACpB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,WAAW;AAAA,IACT,WAAW;AAAA,IAAG,YAAY;AAAA,IAAG,cAAc;AAAA,IAAG,eAAe;AAAA,EAAA;AAAA,EAE/D,wBAAwB;AAAA,EACxB,gBAAgB,CAAA;AAAA,EAChB,kBAAkB,CAAC,CAAA,GAAI,EAAE;AAAA,EACzB,kBAAkB,CAAA;AAAA,EAClB,aAAa,CAAA;AAAA,EACb,aAAa,CAAA;AAAA,EACb,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,kBAAkB,CAAA;AAAA;AAAA,EAGlB,UAAU,CAAA;AAAA,EACV,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,iBAAiB,CAAA;AAAA,EACjB,oBAAoB;AAAA,EACpB,yBAAyB,CAAA;AAAA,EACzB,eAAe;AAAA,EACf,aAAa,CAAA;AAAA,EACb,gBAAgB;AAAA,EAChB,qBAAqB,CAAA;AAAA,EACrB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EAEvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,IACd,YAAY;AAAA,IAAG,aAAa;AAAA,IAAG,WAAW;AAAA,IAAG,YAAY;AAAA,EAAA;AAAA,EAE3D,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,QAAQ,CAAA;AAAA,EACR,aAAa,CAAA;AAAA,EACb,aAAa,CAAA;AAAA,EACb,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,oBAAoB,CAAA;AAAA,EACpB,qBAAqB,CAAA;AAAA;AAAA,EAGrB,OAAO,CAAA;AAAA,EACP,MAAM;AAAA,EACN,oBAAoB;AAAA;AAAA,EAGpB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA;AAAA,EAGrB,eAAe,CAAA;AAAA,EACf,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,kBAAkB,CAAA;AAAA,EAClB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,6BAA6B;AAAA;AAAA,EAG7B,iBAAiB,CAAA;AAAA,EACjB,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,0BAA0B;AAAA,EAC1B,mCAAmC;AAAA,EACnC,QAAQ,CAAA;AAAA,EACR,oBAAoB;AAAA,EACpB,WAAW,CAAA;AAAA,EACX,WAAW,CAAA;AAAA,EACX,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAGlB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,2BAA2B;AAAA;AAAA,EAG3B,WAAW;AAAA,EACX,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,gBAAgB;AAClB;AChZO,MAAM,eAAe;AAAA,EAC1B,cAAc,OAAO,iBAA+D;AAElF,YAAQ,KAAK,sDAAsD;AACnE,WAAO,IAAI,YAAA;AAAA,EACb;AAAA,EAEA,iBAAiB,OAAO,iBAA+D;AAErF,YAAQ,KAAK,yDAAyD;AACtE,WAAO,IAAI,YAAA;AAAA,EACb;AAAA,EAEA,kBAAkB,YAAwC;AAExD,YAAQ,KAAK,0DAA0D;AACvE,WAAO,CAAA;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB;AAAC;AAE5B,MAAM,YAAY;AAAA,EACvB;AAAA,EAEA,YAAY,SAAgB,IAAI;AAC9B,SAAK,SAAS;AAAA,EAChB;AAIF;AAEO,MAAM,iBAAiB;AAE9B;AAEO,MAAM,QAAQ;AAAA,EACnB,SAAe;AACb,WAAO;AAAA,EACT;AACF;AClBO,MAAM,yBAAqD,OAAO;AAAA,EACvE;AACF,MAAgE;AAC9D,SAAO;AAAA,IACL,iBAAiB,UAAU,mBAAmB;AAAA,IAC9C,SAAS,UAAU,oBAAoB;AAAA,IACvC,aAAa,CAAA;AAAA,IACb,mBAAmB,UAAU;AAAA,IAC7B,iBAAiB,UAAU;AAAA,IAC3B,YAAY,UAAU;AAAA,IACtB,YAAY;AAAA,IACZ,QAAQ,UAAU;AAAA,IAClB,UAAU;AAAA,IACV,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,QAAQ,UAAU,WAAW,kCAAkC;AAAA,IAC/D,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,IACX,SAAS,UAAU;AAAA,EAAA;AAEvB;ACtCA,MAAM,oBAAoB,OAAO,aAAwC;AACvE,QAAM,kBAAkB,uBAAuB,SAAS,MAAM;AAE9D,MAAI;AACF,UAAM,eAAe,MAAM,SAAS,KAAA;AAEpC,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,KAAK,MAAM,YAAY;AAC9C,WAAO,eAAe,SAAS,eAAe,WAAW;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,MAAM,qCAAqC,MAAyC;AAClF,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,QAAgB,aAAa,QAAQ,GAAG;AAAA,IACxD,SAAS,OAAO,KAAa,UAAkB;AAC7C,mBAAa,QAAQ,KAAK,KAAK;AAAA,IACjC;AAAA,IACA,YAAY,OAAO,QAAgB;AACjC,mBAAa,WAAW,GAAG;AAAA,IAC7B;AAAA,EAAA;AAEJ;AA2BO,MAAM,uBAAiD,OAAO;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,MAGM;AACJ,QAAM,UAAU,yBAAyB,mCAAA;AACzC,QAAM,iBAAiB,UAAU,QAAQ,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;AAEzF,QAAM,aAAa,oBAAoB,cAAc;AACrD,QAAM,iBAAiB,KAAK;AAE5B,MAAI;AACF,UAAM,iBAAiB,UAAU,MAAM,QAAQ,QAAQ,UAAU,IAAI;AACrE,QAAI,WAAW,gBAAgB;AAC7B,YAAM,cAAc,KAAK,MAAM,cAAc;AAC7C,YAAM,mBAAmB,KAAK,IAAA,IAAQ,YAAY;AAElD,UAAI,mBAAmB,gBAAgB;AACrC,eAAO;AAAA,UACL,MAAM,EAAE,OAAO,oCAAA;AAAA,UACf,SAAS;AAAA,QAAA;AAAA,MAEb;AAEA,YAAM,QAAQ,WAAW,UAAU;AAAA,IACrC;AAEA,QACE,CAAC,eACD,CAAC,UACD,gBAAgB,qBAChB,WAAW,gBACX,OAAO,WAAW,MAClB,YAAY,SAAS,GACrB;AACA,aAAO,EAAE,MAAM,EAAE,OAAO,sBAAA,GAAyB,SAAS,MAAA;AAAA,IAC5D;AAEA,UAAM,YAAY,uBAAuB,WAAW,YAAY;AAEhE,QAAI,SAAS;AACX,YAAM,QAAQ,QAAQ,YAAY,KAAK,UAAU;AAAA,QAC/C,WAAW,KAAK,IAAA;AAAA,QAChB,SAAS;AAAA,UACP,QAAQ,QAAQ;AAAA,UAChB,UAAU,QAAQ;AAAA,UAClB,WAAW;AAAA,QAAA;AAAA,MACb,CACD,CAAC;AAEF,iBAAW,MAAM;AACf,gBAAQ,WAAW,UAAU,EAAE,MAAM,MAAM;AAAA,QAC3C,CAAC;AAAA,MACH,GAAG,cAAc;AAAA,IACnB;AAEA,UAAM,WAAW,MAAM,MAAM,WAAW;AAAA,MACtC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,WAAW,IAAI,MAAM;AAAA,MAAA;AAAA,MAEhD,MAAM,KAAK,UAAU,OAAO;AAAA,IAAA,CAC7B;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,MAAM,kBAAkB,QAAQ,CAAC;AAAA,IACnD;AAEA,UAAM,OAA+B,MAAM,SAAS,KAAA;AACpD,QAAI,SAAS;AACX,YAAM,QAAQ,WAAW,UAAU;AAAA,IACrC;AACA,WAAO,EAAE,MAAM,SAAS,KAAA;AAAA,EAC1B,SAAS,OAAO;AACd,QAAI,SAAS;AACX,UAAI;AACF,cAAM,QAAQ,WAAW,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,UAAM,eAAgB,MAAgB,WAAW;AACjD,WAAO;AAAA,MACL,MAAM,EAAE,OAAO,0BAA0B,YAAY,GAAA;AAAA,MACrD,SAAS;AAAA,IAAA;AAAA,EAEb;AACF;AC3HO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AACF,GAA2C;AACzC,MAAI,EAAE,2BAA2B,oBAAA,IAAwB;AAEzD,WAAS,qBAAqB,kBAAkC;AAC9D,UAAM,cAAc,KAAK,OAAM,oBAAI,QAAO,QAAA,IAAY,GAAI;AAC1D,WAAO,cAAc;AAAA,EACvB;AAEA,WAASC,WAAU,OAAuB;AACxC,WAAO,MAAM,SAAA,EAAW,SAAS,GAAG,GAAG;AAAA,EACzC;AAEA,WAAS,WAAW,MAAsB;AACxC,UAAM,QAAQ,KAAK,MAAM,OAAO,IAAI;AACpC,UAAM,UAAU,KAAK,MAAO,OAAO,OAAQ,EAAE;AAC7C,UAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,WAAO,GAAGA,WAAU,KAAK,CAAC,IAAIA,WAAU,OAAO,CAAC,IAAIA,WAAU,OAAO,CAAC;AAAA,EACxE;AAEA,MAAI,cAAc,qBAAqB,SAAS;AAEhD,MAAI,eAAsD,YAAY,MAAM;AAC1E;AACA,8BAA0B,WAAW,WAAW,CAAC;AAEjD,iBAAa,oBAAA;AAEb,QAAI,CAAC,WAAW,aAAa,CAAC,WAAW,UAAU;AACjD,oBAAc,YAAa;AAC3B,qBAAe;AAAA,IACjB;AAAA,EACF,GAAG,GAAI;AACT;ACvDO,MAAM,uBAAuB,OAAO;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,MAAkD;AAChD,QAAM,UAAU,KAAK,MAAM,gBAAgB,GAAK;AAChD,QAAM,UAAU,KAAK,MAAO,gBAAgB,MAAS,GAAI;AACzD,QAAM,sBAAsB,GAAG,OAAO,IAAI,UAAU,KAAK,MAAM,EAAE,GAAG,OAAO;AAE3E,MAAI,cAAc,QAAQ;AACxB,gBAAY;AAAA,MACV,SAAS,yBAAyB,mBAAmB;AAAA,MACrD,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AACF;ACLO,MAAM,wBAAwB,OAAO;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,MAAmD;AACjD,wBAAsB,mBAAmB;AACzC,qBAAmB,oBAAoB,MAAM;AAC/C;ACgOO,MAAM,aAAa,OAmBxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAaqB;AACnB,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAAC;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,oBAAkB,QAAQ,IAAI,CAAC,EAAE,UAAU,aAAa,MAAM,SAAS,eAAe;AAAA,IACpF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA;AACF,wBAAsB,eAAe;AAErC,iBAAe,QAAQ;AAAA,IACrB,CAAC,gBAAgB,CAAC,YAAY,YAAY,CAAC,YAAY;AAAA,EAAA;AAEzD,qBAAmB,YAAY;AAE/B,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,+BAA+B,gBAAgB;AAAA,MACnD,CAAC,SAAS,CAAC,aAAa,KAAK,CAAC,gBAAgB,YAAY,SAAS,IAAI;AAAA,IAAA;AAGzE,QAAI,6BAA6B,SAAS,GAAG;AAC3C,YAAM,eAAe,EAAE,KAAK,OAAO,eAAe,MAAM,YAAY;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,UAAU,YAAY,WAAW,KAAK,YAAY,CAAC,MAAM;AAE/D,MAAI,CAAC,mBAAmB,CAAC,SAAS;AAChC,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,WAAW,YAAY,YAAY;AACvC,YAAI,YAAY,SAAS,GAAG;AAC1B,wBAAc,QAAQ;AAEtB,cAAI,uBAAuB,UAAU;AACnC,iCAAqB;AACrB,qCAAyB,kBAAkB;AAAA,UAC7C;AAEA,gBAAM,CAAC,UAAU,IAAI,IAAI,MAAM,WAAW;AAAA,YACxC;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,CACD;AAED,gCAAsB,QAAQ;AAC9B,4BAAkB,IAAI;AACtB,4BAAkB;AAClB,gCAAsB,eAAe;AAErC,gBAAMA,OAAM,EAAE,IAAI,KAAK;AACvB,sCAA4B,KAAK;AACjC,gCAAsB;AACtB,oCAA0B,mBAAmB;AAAA,QAC/C;AAAA,MACF,GAAG,EAAE;AAAA,IACP,OAAO;AACL,YAAM,CAAC,UAAU,IAAI,IAAI,MAAM,WAAW;AAAA,QACxC;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAED,4BAAsB,QAAQ;AAC9B,wBAAkB,IAAI;AACtB,wBAAkB;AAClB,4BAAsB,eAAe;AAErC,UAAI,uBAAuB,UAAU;AACnC,6BAAqB;AACrB,iCAAyB,kBAAkB;AAAA,MAC7C;AAEA,YAAMA,OAAM,EAAE,IAAI,KAAK;AACvB,kCAA4B,KAAK;AACjC,4BAAsB;AACtB,gCAA0B,mBAAmB;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,WAAW,CAAC,iBAAiB;AAC/B,QAAI,iBAAiB;AACnB,YAAM,gBAAgB,EAAE,QAAQ,YAAY;AAAA,IAC9C;AACA,UAAMA,OAAM,EAAE,IAAI,IAAI;AACtB,gCAA4B,KAAK;AAAA,EACnC;AAEA,gBAAc,UAAU;AAAA,IAAO,CAAC,YAC9B,aAAa,KAAK,CAAC,gBAAgB,YAAY,OAAO,QAAQ,EAAE;AAAA,EAAA;AAElE,oBAAkB,WAAW;AAC7B,qBAAmB,YAAY,SAAS,gBAAgB,MAAM;AAE9D,eAAa,OAAO;AACpB,6BAA2B,SAAS;AAEpC,MAAI,CAAC,eAAe,CAAC,UAAU;AAC7B,UAAM,gBAAgB,EAAE,YAAY;AACpC,QAAI,uBAAuB,OAAO;AAChC,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF,WAAW,YAAY,OAAO,CAAC,iBAAiB;AAC9C,UAAM,gBAAgB,EAAE,YAAY;AACpC,0BAAsB,IAAI;AAAA,EAC5B;AACF;AC7LO,MAAM,iBAAiB,OAkB5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAYqB;AACnB,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAAA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,oBAAkB,QAAQ,IAAI,CAAC,iBAAiB;AAAA,IAC9C,UAAU,YAAY;AAAA,IACtB,aAAa,YAAY;AAAA,IACzB,MAAM,YAAY;AAAA,IAClB,SAAS,YAAY;AAAA,IACrB,SAAS,YAAY;AAAA,EAAA,EACrB;AACF,wBAAsB,eAAe;AAErC,iBAAe,QAAQ;AAAA,IACrB,CAAC,gBAAgB,CAAC,YAAY,YAAY,CAAC,YAAY;AAAA,EAAA;AAEzD,qBAAmB,YAAY;AAE/B,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,+BAA+B,gBAAgB;AAAA,MACnD,CAAC,SAAS,CAAC,aAAa,KAAK,CAAC,gBAAgB,YAAY,SAAS,IAAI;AAAA,IAAA;AAEzE,QAAI,6BAA6B,SAAS,KAAK,iBAAiB;AAC9D,YAAM,eAAe,EAAE,KAAK,OAAO,eAAe,MAAM,YAAY;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,UAAU,YAAY,WAAW,KAAK,YAAY,CAAC,MAAM;AAE/D,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,iBAAiB;AACpB,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,WAAW,YAAY,YAAY;AACvC,cAAI,YAAY,SAAS,GAAG;AAC1B,0BAAc,QAAQ;AAEtB,gBAAI,uBAAuB,UAAU;AACnC,mCAAqB;AACrB,uCAAyB,kBAAkB;AAAA,YAC7C;AAEA,kBAAM,CAAC,UAAU,IAAI,IAAI,MAAM,WAAW;AAAA,cACxC;AAAA,cACA,OAAO;AAAA,cACP;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA,CACD;AAED,gBAAI,YAAY,MAAM;AACpB,oCAAsB,QAAQ;AAC9B,gCAAkB,IAAI;AAAA,YACxB;AAEA,8BAAkB;AAClB,kCAAsB,eAAe;AACrC,kBAAMA,OAAM,EAAE,IAAI,KAAK;AACvB,wCAA4B,KAAK;AACjC,kCAAsB;AACtB,sCAA0B,mBAAmB;AAAA,UAC/C;AAAA,QACF,GAAG,EAAE;AAAA,MACP,OAAO;AACL,cAAM,CAAC,UAAU,IAAI,IAAI,MAAM,WAAW;AAAA,UACxC;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAED,YAAI,YAAY,MAAM;AACpB,gCAAsB,QAAQ;AAC9B,4BAAkB,IAAI;AAAA,QACxB;AACA,0BAAkB;AAClB,8BAAsB,eAAe;AAErC,YAAI,uBAAuB,UAAU;AACnC,+BAAqB;AACrB,mCAAyB,kBAAkB;AAAA,QAC7C;AAEA,cAAMA,OAAM,EAAE,IAAI,KAAK;AACvB,oCAA4B,KAAK;AACjC,8BAAsB;AACtB,kCAA0B,mBAAmB;AAAA,MAC/C;AAAA,IACF,WAAW,UAAU;AACnB,YAAM,OAAO,aAAa;AAAA,QACxB,CAAC,gBACC,YAAY,aAAa,YAAY,YAAY,aAAa;AAAA,MAAA;AAElE,UAAI,uBAAuB,MAAM;AAC/B,6BAAqB;AACrB,iCAAyB,kBAAkB;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,CAAC,iBAAiB;AAC/B,QAAI,iBAAiB;AACnB,YAAM,gBAAgB,EAAE,QAAQ,YAAY;AAAA,IAC9C;AACA,UAAMA,OAAM,EAAE,IAAI,IAAI;AACtB,gCAA4B,KAAK;AAAA,EACnC;AAEA,gBAAc,YAAY;AAAA,IAAO,CAAC,YAChC,aAAa,KAAK,CAAC,gBAAgB,YAAY,OAAO,QAAQ,EAAE;AAAA,EAAA;AAElE,oBAAkB,WAAW;AAE7B,WAAS;AACT,eAAa,MAAM;AACnB,yBAAuB;AACvB,6BAA2B,oBAAoB;AAE/C,MAAI,CAAC,eAAe,CAAC,UAAU;AAC7B,UAAM,gBAAgB,EAAE,YAAY;AACpC,QAAI,uBAAuB,OAAO;AAChC,iBAAW;AACX,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,MAAI;AACF,QAAI,iBAAiB;AACnB,OAAC,cAAc,cAAc,oBAAoB,WAAW,IAAI;AAChE,yBAAmB,YAAY;AAC/B,yBAAmB,YAAY;AAC/B,+BAAyB,kBAAkB;AAC3C,wBAAkB,WAAW;AAAA,IAC/B;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AC5aO,MAAM,iBAAiB,OAG5B;AAAA,EACA;AAAA,EACA;AACF,MAAuE;AACrE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,MAAI,YAAY,SAAS,IAAI,KAAK,gBAAgB,SAAS,IAAI,GAAG;AAChE;AAAA,MACE,aAAa,OAAO,CAAC,gBAAgB,YAAY,SAAS,IAAI;AAAA,IAAA;AAEhE,UAAM,eAAe,EAAE,KAAK,OAAO,eAAe,MAAM,YAAY;AAAA,EACtE;AACF;ACuFO,MAAM,mBAAmB,OAgB9B;AAAA,EACA;AAAA,EACA;AACF,MAQqB;AACnB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,EAAE,aAAa,mBAAmB,iBAAA,IACtC,WAAW,oBAAA;AAEb,QAAM,eAAe,CACnB,QACA,SACY;AACZ,UAAM,YACJ,SAAS,UAAU,QAAQ,iBAAiB,QAAQ;AACtD,UAAM,SACJ,OAAO,cAAc,aACjB,UAAU,KAAK,MAAM,IACrB,QAAQ,QAAQ,OAAO,CAACC,WAAUA,OAAM,SAAS,IAAI,KAAK,CAAA;AAChE,UAAM,QAAQ,UAAU,OAAO,CAAC;AAChC,QAAI,OAAO;AACT,YAAM,UAAU;AAChB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACF,+BAA2B,IAAI;AAE/B,QAAI,SAAS,SAAS;AACpB,mBAAa,aAAa,OAAO;AACjC,wBAAkB,eAAe,IAAI;AACrC,YAAM,6BAA6B,EAAE,YAAY;AACjD,2BAAqB,KAAK;AAAA,IAC5B,WAAW,SAAS,SAAS;AAC3B,mBAAa,aAAa,OAAO;AACjC,wBAAkB,eAAe,IAAI;AACrC,YAAM,6BAA6B,EAAE,YAAY;AACjD,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AAEnD,mBAAa,kBAAkB,OAAO;AACtC,6BAAuB,oBAAoB,IAAI;AAC/C,YAAM,6BAA6B,EAAE,YAAY;AACjD,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AAEnD,2BAAqB,KAAK;AAAA,IAC5B,WAAW,SAAS,eAAe;AACjC,mBAAa,mBAAmB,OAAO;AACvC,8BAAwB,qBAAqB,IAAI;AACjD,YAAM,8BAA8B,EAAE,YAAY;AAClD,YAAM,gBAAgB,EAAE,YAAY;AACpC,4BAAsB,KAAK;AAAA,IAC7B,WAAW,SAAS,QAAQ;AAC1B,0BAAoB,KAAK;AAAA,IAC3B,WAAW,SAAS,OAAO;AACzB,mBAAa,aAAa,OAAO;AACjC,wBAAkB,eAAe,IAAI;AACrC,YAAM,6BAA6B,EAAE,YAAY;AACjD,2BAAqB,KAAK;AAE1B,mBAAa,mBAAmB,OAAO;AACvC,8BAAwB,qBAAqB,IAAI;AACjD,YAAM,8BAA8B,EAAE,YAAY;AAClD,YAAM,gBAAgB,EAAE,YAAY;AACpC,4BAAsB,KAAK;AAE3B,mBAAa,aAAa,OAAO;AACjC,wBAAkB,eAAe,IAAI;AACrC,YAAM,6BAA6B,EAAE,YAAY;AACjD,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AAEnD,mBAAa,kBAAkB,OAAO;AACtC,6BAAuB,oBAAoB,IAAI;AAC/C,YAAM,6BAA6B,EAAE,YAAY;AACjD,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AAEnD,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AAAA,EACnD;AACF;AC9PO,MAAM,aAAa,OAAO;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,MAAwC;AACtC,MAAI,SAAS,eAAe,OAAO,WAAW,aAAa;AACzD,WAAO,SAAS,OAAO;AAAA,EACzB,OAAO;AACL,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AACF;ACPA,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAC3C,SAAO,KAAK,kBAAkB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EAAA,CACN;AAED,MAAI;AACF,QAAI,aAAa,IAAI;AACnB,kBAAY,KAAK,kBAAkB;AAAA,QACjC;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MAAA,CACN;AAAA,IACH;AAAA,EACF,QAAQ;AAAA,EAER;AACF;ACoBO,MAAM,aAAa,OAIxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuF;AACrF,MAAI,EAAE,aAAa,iBAAiB,WAAA,IAAe;AACnD,QAAM,eAAyB,CAAA;AAE/B,MAAI;AACF,sBAAkB,WAAW,sBAAsB;AAEnD,eAAW,UAAU,SAAS;AAC5B,YAAM,YAAY,YAAY,MAAM,KAAK;AACzC,UAAI,CAAC,YAAY,SAAS,SAAS,GAAG;AACpC,qBAAa,KAAK,SAAS;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,yBAAyB,KAAK;AAAA,EAC9C;AACF;ACnFO,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0C;AACxC,MAAI,cAAc,QAAQ;AACxB,gBAAY;AAAA,MACV,SACE;AAAA,MACF,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AAEA,MAAI,SAAS,aAAa;AACxB,eAAW,MAAM;AACf,aAAO,SAAS,OAAO;AAAA,IACzB,GAAG,GAAI;AAAA,EACT;AACF;AC3BO,MAAM,oBAAoB,OAAO;AAAA,EACtC;AACF,MAA+C;AAC7C,kCAAgC,IAAI;AACtC;ACgDO,MAAM,mBAAyC,OAAO;AAAA,EAC3D;AAAA,EACA,iBAAAC;AACF,MAAqB;AACnB,MAAI;AACF,UAAM,EAAE,cAAc;AAEtB,QAAIA,kBAAiB;AACnB,MAAAA;AAAA,QACE,UAAU,IAAI,CAAC,cAAc;AAAA,UAC3B,IAAI,SAAS;AAAA,UACb,MAAM,SAAS;AAAA,UACf,SAAS;AAAA,UACT,SAAS;AAAA,QAAA,EACM;AAAA,MAAA;AAAA,IAErB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,oCAAoC,KAAK;AAAA,EACzD;AACF;AAEO,MAAM,uBAAiD,OAAO;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,UAAM,EAAE,cAAc,WAAW,eAAe,qBAAqB;AACrE,UAAM,eAAe,4BAA4B,UAAa,4BAA4B;AAC1F,UAAM,sBAAsB,oBAAoB,CAAA,GAAI,IAAI,CAAC,aAAa,SAAS,EAAE,EAAE,OAAO,KAAK,GAAG;AAClG,UAAM,iBAAiB,UAAU,IAAI,CAAC,aAAa,SAAS,EAAE,EAAE,OAAO,KAAK,GAAG;AAC/E,UAAM,mBAAmB,uBAAuB;AAEhD,6BAAyB,YAAY;AACrC,0BAAsB,aAAa;AACnC,6BAAyB,gBAAgB;AAEzC,QAAIA,kBAAiB;AACnB,MAAAA;AAAA,QACE,UAAU,IAAI,CAAC,cAAc;AAAA,UAC3B,IAAI,SAAS;AAAA,UACb,MAAM,SAAS;AAAA,UACf,SAAS;AAAA,UACT,SAAS;AAAA,QAAA,EACM;AAAA,MAAA;AAAA,IAErB;AAEA,SAAK,gBAAgB,qBAAqB,iBAAiB;AACzD,YAAM,gBAAA;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,wCAAwC,KAAK;AAAA,EAC7D;AACF;AAEO,MAAM,uBAAyC,OAAO;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0C;AACxC,MAAI;AACF,UAAM,EAAE,MAAM,QAAQ,OAAA,IAAW;AAEjC,QAAI,WAAW,QAAQ;AACrB,UAAI,SAAS,WAAW,kBAAkB,YAAY;AACpD,mBAAA;AAAA,MACF,WAAW,SAAS,WAAW,kBAAkB,YAAY;AAC3D,mBAAA;AAAA,MACF;AAEA,UAAI,aAAa,QAAQ;AACvB,kBAAU;AAAA,UACR,SAAS,QAAQ,SAAS,UAAU,eAAe,QAAQ,oBAAoB,MAAM;AAAA,UACrF,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AAAA,EACrD;AACF;AAEO,MAAM,kBAAuC,OAAO;AAAA,EACzD;AAAA,EACA;AACF,MAA6C;AAC3C,MAAI;AACF,gBAAY;AAAA,MACV,SAAS,KAAK,WAAW;AAAA,MACzB,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AAAA,EACxD;AACF;AAEO,MAAM,uBAAiD,OAAO;AAAA,EACnE;AAAA,EACA;AACF,MAAkD;AAChD,MAAI;AACF,gBAAY;AAAA,MACV,SAAS,KAAK,WAAW;AAAA,MACzB,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,wCAAwC,KAAK;AAAA,EAC7D;AACF;ACnKO,MAAM,uBAAuB,OAAO;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAkD;AAChD,QAAM,qBAAqB,YAAY;AAAA,IACrC,CAAC,YAAY,QAAQ,OAAO,YAAY,MAAM,QAAQ,SAAS,YAAY;AAAA,EAAA;AAG7E,QAAM,qBAAqB,qBACvB,cACA,CAAC,GAAG,aAAa,WAAW;AAChC,oBAAkB,kBAAkB;AACpC,qBAAmB,mBAAmB,SAAS,gBAAgB,MAAM;AACvE;ACnBO,MAAM,oBAA2C,OAAO;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AACF,MAA+C;AAC7C,MAAI;AACF,UAAM,EAAE,UAAU,QAAA,IAAY;AAC9B,oBAAgB,QAAQ;AAExB,QAAI,aAAa,SAAS;AACxB,gBAAU;AAAA,QACR;AAAA,QACA,MAAM,aAAa,MAAM,YAAY;AAAA,QACrC,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,qCAAqC,KAAK;AAAA,EAC1D;AACF;AAEO,MAAM,0BAAuD,OAAO;AAAA,EACzE;AAAA,EACA,wBAAAC;AACF,MAAqD;AACnD,MAAI;AACF,IAAAA,0BAAyB,KAAK,MAAM;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,MAAM,2CAA2C,KAAK;AAAA,EAChE;AACF;ACjCO,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA;AACF,MAA0C;AACxC,cAAY;AAAA,IACV,SAAS,GAAG,IAAI;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,EAAA,CACX;AACH;AC6GO,MAAM,sBAAsB,OAUjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAMqB;AACnB,QAAM,oBAAoB,WAAW,oBAAA;AAErC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,kBAAkB,mBAAmB;AAAA,IACzC,CAAC,kBAAkB,cAAc,eAAe;AAAA,EAAA;AAGlD,MAAI,iBAAiB;AACnB,QAAI;AACF,YAAM,gBAAgB,mBAAmB,MAAA;AAAA,IAC3C,SAAS,OAAO;AACd,cAAQ,MAAM,qCAAqC,KAAK;AAAA,IAC1D;AAEA,QAAI;AACF,sBAAgB,SAAS,MAAA;AAAA,IAC3B,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAAA,IAChD;AAEA,UAAM,oBAAoB,mBAAmB;AAAA,MAC3C,CAAC,kBAAkB,cAAc,eAAe;AAAA,IAAA;AAElD,6BAAyB,iBAAiB;AAE1C,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IAAA,CACb;AAAA,EACH,WAAW,SAAS,iBAAiB,SAAS,UAAU;AACtD,QAAI,QAAQ;AACV,mBAAa,KAAK;AAAA,IACpB,OAAO;AACL,+BAAyB,KAAK;AAC9B,qBAAe,EAAE;AAAA,IACnB;AACA,qBAAiB,IAAI;AACrB,UAAM,qBAAqB,EAAE,MAAM,WAAW,YAAY,mBAAmB;AAC7E,UAAM,eAAe;AAAA,MACnB,KAAK;AAAA,MACL,eAAe;AAAA,MACf,YAAY;AAAA,IAAA,CACb;AAAA,EACH;AACF;ACxEO,MAAM,sBAAsB,OAUjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAMqB;AACnB,eAAa,WAAW,oBAAA;AAExB,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,QAAQ;AAAA,IACZ,aAAa,IAAI,OAAO,gBAAgB;AACtC,UAAI,YAAY,OAAO;AACrB,YAAI;AACF,cACE,YAAY,YAAY,OACxB,CAAC,YAAY,WACb,CAAC,UACD,CAAC,sBACD,YAAY,KACZ;AACA,+BAAmB;AACnB,mCAAuB,gBAAgB;AACvC,kBAAM,qBAAqB,EAAE,MAAM,WAAW,YAAY;AAC1D,+BAAmB;AACnB,mCAAuB,gBAAgB;AAAA,UACzC;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,YAAI,sBAAsB,QAAQ;AAChC,cAAI,YAAY,QAAQ,aAAa,SAAS,YAAY,IAAI,GAAG;AAC/D,2BAAe,aAAa;AAAA,cAC1B,CAAC,gBAAgB,gBAAgB,YAAY;AAAA,YAAA;AAE/C,+BAAmB,YAAY;AAAA,UACjC;AAEA,wBAAc;AAAA,YACZ,MAAM,YAAY;AAAA,YAClB,KAAK;AAAA,YACL,OAAO;AAAA,YACP;AAAA,UAAA,CACD;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EAAA;AAGH,MACE,uBAAuB,WACtB,uBAAuB,WAAW,CAAC,uBACpC;AACA,UAAM,cAAc,aAAa,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAClE,UAAM,WAAW,aAAa,YAAY,QAAQ,aAAa,YAAY;AAE3E,QAAI,CAAC,YAAY,EAAE,sBAAsB,SAAS;AAChD,YAAM,eAAe,EAAE,KAAK,OAAO,eAAe,MAAM,YAAY;AAAA,IACtE;AAAA,EACF;AAEA,MAAI,SAAS,SAAS;AACpB,QAAI;AACF,YAAM,cACJ,aAAa,KAAK,CAAC,SAAS,KAAK,YAAY,UAAU,KACvD,aAAa,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAEhD,UACE,gBACE,YAAY,QAAQ,YAAY,SAAS,YAAY,IAAI,KACxD,QAAQ,YAAY,SAAS,IAAI,IACpC;AACA,sBAAc;AAAA,UACZ,MAAM,YAAY;AAAA,UAClB,KAAK;AAAA,UACL,OAAO;AAAA,UACP;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACF;ACzJO,MAAM,uBAAuB,OAOlC;AAAA,EACA;AAAA,EACA;AACF,MAKqB;AACnB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,cAAc,aAAa,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAElE,MAAI,eAAe,CAAC,oBAAoB,YAAY,YAAY,KAAK;AACnE,2BAAuB,IAAI;AAC3B,UAAM,qBAAqB,EAAE,MAAM,WAAW,YAAY;AAC1D,2BAAuB,KAAK;AAAA,EAC9B;AAEA,MAAI,uBAAuB,WAAW,aAAa;AACjD,UAAM,WAAW,YAAY,YAAY,QAAQ,YAAY,YAAY;AAEzE,QAAI,CAAC,YAAY,EAAE,sBAAsB,SAAS;AAChD,YAAM,eAAe,EAAE,KAAK,OAAO,eAAe,MAAM,YAAY;AAAA,IACtE;AAAA,EACF;AACF;ACvHO,MAAM,iBAAiB,OAAO;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4C;AAC1C,QAAM,EAAE,QAAQ,WAAW,SAAS,SAAS,WAAW,UAAU;AAClE,QAAM,cAAc;AACpB,aAAW,CAAC,GAAG,UAAU,EAAE,QAAQ,WAAW,SAAS,SAAS,WAAW,OAAO;AAElF,MAAI,cAAc,eAAe,cAAc,QAAQ;AACrD,eAAW,SAAS;AAAA,MAAO,CAAC,QAC1B,gBAAgB;AAAA,QACd,CAAC,gBAAgB,YAAY,SAAS,IAAI,UAAU,CAAC,YAAY;AAAA,MAAA;AAAA,IACnE;AAAA,EAEJ,OAAO;AACL,eAAW,SAAS,OAAO,CAAC,QAAQ;AAClC,YAAM,cAAc,gBAAgB,KAAK,CAACN,OAAMA,GAAE,SAAS,IAAI,MAAM;AACrE,aAAO,CAAC,eAAe,CAAC,YAAY;AAAA,IACtC,CAAC;AAAA,EACH;AAEA,iBAAe,QAAQ;AAEvB,QAAM,mBAAmB,YAAY,OAAO,CAAC,QAAQ,IAAI,KAAK;AAC9D,QAAM,oBAAoB,YAAY,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK;AAChE,QAAM,gBAAgB,SAAS,OAAO,CAAC,QAAQ,IAAI,KAAK;AACxD,QAAM,iBAAiB,SAAS,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK;AAE1D,MAAI,cAAc,eAAe,cAAc,QAAQ;AACrD,QAAI,iBAAiB,WAAW,cAAc,QAAQ;AACpD,YAAM,mBAAmB,cAAc;AAAA,QACrC,CAAC,QAAQ,CAAC,iBAAiB,KAAK,CAAC,WAAW,OAAO,cAAc,IAAI,SAAS;AAAA,MAAA;AAEhF,YAAM,wBAAwB,iBAAiB;AAAA,QAC7C,CAAC,QAAQ,IAAI,WAAW,UAAU,IAAI,UAAU,SAAS,MAAM;AAAA,MAAA;AAEjE,YAAM,wBAAwB,sBAAsB;AAAA,QAClD,CAAC,QAAQ,IAAI,WAAW;AAAA,MAAA;AAG1B,UACE,iBAAiB,SAAS,KAC1B,sBAAsB,SAAS,sBAAsB,QACrD;AACA,gCAAwB,IAAI;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,kBAAkB,WAAW,eAAe,QAAQ;AACtD,YAAM,oBAAoB,eAAe;AAAA,QACvC,CAAC,QAAQ,CAAC,kBAAkB,KAAK,CAAC,WAAW,OAAO,cAAc,IAAI,SAAS;AAAA,MAAA;AAEjF,YAAM,yBAAyB,kBAAkB;AAAA,QAC/C,CAAC,QAAQ,IAAI,WAAW,UAAU,IAAI,UAAU,SAAS,MAAM;AAAA,MAAA;AAEjE,YAAM,yBAAyB,uBAAuB;AAAA,QACpD,CAAC,QAAQ,IAAI,WAAW;AAAA,MAAA;AAG1B,YAAM,eAAe,YAAY,OAAO,WAAW;AACnD,YAAM,4BAA4B,eAC9B,kBAAkB,SAAS,IAC3B,uBAAuB,SAAS;AAEpC,UACE,6BACA,kBAAkB,SAAS,uBAAuB,QAClD;AACA,gCAAwB,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;ACJO,MAAM,kBAAkB,OAG7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+E;AAC7E,MAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,YAAY,OAAO,aAAoC;AAC3D,WAAO,eAAe,aAAa,EAAE,SAAA,CAAU;AAAA,EACjD;AAEA,MAAI;AACF,QAAI,YAAY,KAAK;AACnB,UAAI,UAAU,SAAS;AACrB,4BAAoB,IAAI;AACxB,2BAAmB,IAAI;AACvB,0BAAkB,QAAQ;AAC1B,YAAI,cAAc,aAAa;AAC7B,gBAAM,UAAU,mDAAmD;AAAA,QACrE;AAAA,MACF,WAAW,UAAU,QAAQ;AAC3B,4BAAoB,IAAI;AACxB,4BAAoB,IAAI;AACxB,0BAAkB,OAAO;AACzB,YAAI,cAAc,aAAa;AAC7B,gBAAM,UAAU,oDAAoD;AAAA,QACtE;AAAA,MACF,OAAO;AACL,0BAAkB,KAAK;AACvB,4BAAoB,IAAI;AACxB,2BAAmB,KAAK;AACxB,YAAI,cAAc,aAAa;AAC7B,gBAAM,UAAU,qDAAqD;AAAA,QACvE;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,UAAU,SAAS;AACrB,0BAAkB,QAAQ;AAC1B,YAAI,oBAAoB;AACtB,8BAAoB,YAAY,mBAAmB;AACnD,8BAAoB,YAAY,mBAAmB;AACnD,8BAAoB,YAAY,mBAAmB;AAEnD,oCAA0B,mBAAmB;AAC7C,sCAA4B,oBAAoB,UAAU,YAAY;AACtE,sCAA4B,oBAAoB,UAAU,YAAY;AACtE,sCAA4B,oBAAoB,UAAU,YAAY;AACtE,mCAAyB,oBAAoB,UAAU,SAAS;AAChE,wCAA8B,oBAAoB,UAAU,cAAc;AAC1E,qCAA2B,oBAAoB,UAAU,oBAAoB;AAC7E,gCAAsB,oBAAoB,UAAU,MAAM;AAC1D,kCAAwB,oBAAoB,UAAU,QAAQ;AAC9D,yCAA+B,oBAAoB,UAAU,eAAe;AAC5E,uCAA6B,oBAAoB,UAAU,aAAa;AACxE,0CAAgC,oBAAoB,UAAU,gBAAgB;AAC9E,iCAAuB,oBAAoB,WAAW,WAAW,KAAK;AACtE,oCAA0B,oBAAoB,WAAW,cAAc,EAAE;AACzE;AAAA,YACE,oBAAoB,WAAW,sBAAsB;AAAA,UAAA;AAEvD;AAAA,YACE,oBAAoB,WAAW,mBAAmB;AAAA,UAAA;AAGpD,6BAAmB;AACnB,iCAAuB,gBAAgB;AAEvC,8BAAoB,KAAK,MAAM,WAAW,GAAI;AAC9C,4BAAkB,KAAK,MAAM,KAAK,IAAA,IAAQ,GAAI,IAAI;AAClD,gCAAsB,eAAe;AACrC,kCAAwB,iBAAiB;AAEzC,0BAAgB;AAChB,yBAAe;AACf,4BAAkB;AAClB,0BAAgB;AAEhB,8BAAoB,aAAa;AACjC,6BAAmB,YAAY;AAC/B,gCAAsB,eAAe;AACrC,8BAAoB,aAAa;AACjC,kCAAwB,IAAI;AAE5B,2BAAiB;AACjB,2BAAiB;AAEjB,+BAAqB,cAAc;AACnC,+BAAqB,cAAc;AACnC,sCAA4B,kBAAkB,iBAAiB,CAAC;AAAA,QAClE;AACA,cAAM,UAAU,mDAAmD;AAAA,MACrE,WAAW,UAAU,QAAQ;AAC3B,wBAAgB;AAChB,wBAAgB;AAChB,0BAAkB;AAClB,2BAAmB;AAEnB,4BAAoB,aAAa;AACjC,4BAAoB,aAAa;AACjC,8BAAsB,eAAe;AACrC,+BAAuB,gBAAgB;AACvC,gCAAwB,KAAK;AAC7B,0BAAkB,OAAO;AACzB,cAAM,UAAU,oDAAoD;AAAA,MACtE,OAAO;AACL,0BAAkB,KAAK;AACvB,4BAAoB,IAAI;AACxB,2BAAmB,KAAK;AACxB,cAAM,UAAU,qDAAqD;AAAA,MACvE;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAI,8BAA8B,KAAK;AAAA,EACjD;AACF;AAEA,MAAM,oBAAoB,CAAC,sBAAsC;AAC/D,QAAM,QAAQ,KAAK,MAAM,oBAAoB,IAAI;AACjD,QAAM,UAAU,KAAK,MAAO,oBAAoB,OAAQ,EAAE;AAC1D,QAAM,UAAU,oBAAoB;AAEpC,SAAO,GAAG,UAAU,KAAK,CAAC,IAAI,UAAU,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC;AACxE;AAEA,MAAM,YAAY,CAAC,UAA0B,MAAM,WAAW,SAAS,GAAG,GAAG;AC1PtE,MAAM,sBAAsB,OAAO;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAiD;AAC/C,MAAI,CAAC,sBAAsB;AACzB,WAAO;AAAA,MACL;AAAA,MACA,EAAE,UAAU,OAAA;AAAA,MACZ,CAAC,EAAE,QAAA,MAAoC;AAAA,MAIvC;AAAA,IAAA;AAAA,EAEJ;AACF;ACYO,MAAM,mBAAmB,OAAO;AAAA,EACrC;AAAA,EACA;AACF,MAA8C;AAC5C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,kCAAgC,aAAa,yBAAyB;AACtE,kCAAgC,aAAa,yBAAyB;AACtE,8BAA4B,aAAa,qBAAqB;AAC9D,kCAAgC,aAAa,yBAAyB;AACtE;AAAA,IACE,aAAa;AAAA,EAAA;AAEf,kCAAgC,aAAa,yBAAyB;AACtE,kCAAgC,aAAa,yBAAyB;AACtE,8BAA4B,aAAa,qBAAqB;AAC9D,kCAAgC,aAAa,yBAAyB;AACtE;AAAA,IACE,aAAa;AAAA,EAAA;AAEf;AAAA,IACE,aAAa;AAAA,EAAA;AAEf;AAAA,IACE,aAAa;AAAA,EAAA;AAEf;AAAA,IACE,aAAa;AAAA,EAAA;AAEf;AAAA,IACE,aAAa;AAAA,EAAA;AAEf;AAAA,IACE,aAAa;AAAA,EAAA;AAEf;AAAA,IACE,aAAa;AAAA,EAAA;AAEf,qCAAmC,aAAa,4BAA4B;AAC9E;ACpFO,MAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqC;AACnC,QAAM,OAAO,aAAa;AAAA,IACxB,CAAC,gBACC,YAAY,aAAa,YAAY,YAAY,aAAa;AAAA,EAAA;AAGlE,MAAI,QAAQ,iBAAiB;AAC3B,mBAAe,UAAU;AACzB,6BAAyB,IAAI;AAC7B,8BAA0B,KAAK;AAC/B;AAAA,EACF;AAEA,iBAAe,UAAU;AACzB,4BAA0B,IAAI;AAChC;AC7BO,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,MAA0C;AACxC,SAAO;AAAA,IACL;AAAA,IACA,EAAE,UAAU,OAAA;AAAA,IACZ,CAAC,EAAE,QAAA,MAAoC;AAAA,IAIvC;AAAA,EAAA;AAEJ;AClBO,MAAM,mBAAmB,OAAO;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,MAA8C;AAC5C,MAAI;AACF,QAAI,UAAU,QAAQ;AACpB,kBAAY;AAAA,QACV,SAAS,+BAA+B,MAAM;AAAA,QAC9C,UAAU;AAAA,QACV,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAI,+BAA+B,KAAK;AAAA,EAClD;AACF;ACuMO,MAAM,wBAAmD,OAAO;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,UAAM,EAAE,WAAW;AACnB,iCAA6B,OAAO,kBAAkB;AAEtD,QAAI,2BAA2B,OAAO,oBAAoB;AACxD,8BAAwB,MAAM;AAAA,IAChC;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,0CAA0C,KAAK;AAAA,EAC/D;AACF;AAEO,MAAM,2BAAyD,OAAO;AAAA,EAC3E;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,8BAA0B,KAAK,MAAM;AACrC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,6CAA6C,KAAK;AAAA,EAClE;AACF;AAEO,MAAM,yBAAqD,OAAO;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,QAAI,KAAK,SAAS;AAChB,+BAAyB,KAAK,QAAQ;AACtC,sCAAgC,KAAK,OAAO;AAAA,IAC9C,WAAW,aAAa,KAAK,OAAO;AAClC,gBAAU;AAAA,QACR,SAAS,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,2CAA2C,KAAK;AAAA,EAChE;AACF;AAEO,MAAM,wBAAmD,OAAO;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,UAAM,EAAE,WAAW,UAAU,gBAAgB,YAAY,uBAAuB;AAEhF,8BAA0B,CAAC,SAAS;AAClC,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,WAAW,QAAQ;AAC5B,aAAO;AAAA,IACT,CAAC;AAED,QAAI,cAAc,sBAAsB,8BAA8B;AACpE,mCAA6B,CAAC,UAAU;AAAA,QACtC,GAAG;AAAA,QACH,CAAC,kBAAkB,GAAG;AAAA,UACpB,GAAI,KAAK,kBAAkB,KAAK,CAAA;AAAA,UAChC,CAAC,QAAQ,GAAG;AAAA,QAAA;AAAA,MACd,EACA;AAAA,IACJ;AAEA,QAAI,cAAc,2BAA2B;AAC3C,YAAM,0BAA0B,YAAY,WAAW,UAAU,kBAAkB;AAAA,IACrF;AAEA,QAAI,aAAa,gBAAgB;AAC/B,gBAAU;AAAA,QACR,SAAS,mCAAmC,QAAQ;AAAA,QACpD,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,0CAA0C,KAAK;AAAA,EAC/D;AACF;AAEO,MAAM,0BAAuD,OAAO;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,8BAA0B,CAAC,SAAS;AAClC,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,OAAO,KAAK,SAAS;AAC1B,aAAO;AAAA,IACT,CAAC;AAED,QAAI,0BAA0B;AAC5B,YAAM,yBAAyB,KAAK,WAAW,KAAK,QAAQ;AAAA,IAC9D;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4CAA4C,KAAK;AAAA,EACjE;AACF;AAEO,MAAM,2BAAyD,OAAO;AAAA,EAC3E;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,mCAA+B,CAAC,UAAU;AAAA,MACxC,GAAG;AAAA,MACH,CAAC,KAAK,kBAAkB,GAAG;AAAA,QACzB,GAAI,KAAK,KAAK,kBAAkB,KAAK,CAAA;AAAA,QACrC,CAAC,KAAK,QAAQ,GAAG,KAAK;AAAA,MAAA;AAAA,IACxB,EACA;AAEF,QAAI,uBAAuB;AACzB,YAAM,sBAAsB,KAAK,kBAAkB;AAAA,IACrD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,6CAA6C,KAAK;AAAA,EAClE;AACF;AAEO,MAAM,4BAA2D,OAAO;AAAA,EAC7E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,QAAI,8BAA8B;AAChC,mCAA6B,CAAC,SAAS;AACrC,cAAM,OAAO,EAAE,GAAG,KAAA;AAClB,mBAAW,CAAC,oBAAoB,WAAW,KAAK,OAAO,QAAQ,IAAI,GAAG;AACpE,cAAI,YAAY,KAAK,QAAQ,MAAM,KAAK,YAAY;AAClD,mBAAO,YAAY,KAAK,QAAQ;AAChC,gBAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,qBAAO,KAAK,kBAAkB;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,QAAI,0BAA0B;AAC5B,YAAM,yBAAyB,KAAK,UAAU;AAAA,IAChD;AAEA,QAAI,wBAAwB;AAC1B,YAAM,uBAAuB,KAAK,SAAS;AAAA,IAC7C;AAEA,QAAI,aAAa,KAAK,QAAQ;AAC5B,gBAAU;AAAA,QACR,SAAS,wBAAwB,KAAK,MAAM;AAAA,QAC5C,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,8CAA8C,KAAK;AAAA,EACnE;AACF;AAEO,MAAM,+BAAiE,OAAO;AAAA,EACnF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,yCAAqC,KAAK,WAAW,KAAK,WAAW,KAAK,kBAAkB;AAE5F,QAAI,2BAA2B,KAAK,UAAU,SAAS,uBAAuB,KAAK,UAAU,UAAU;AACrG,aAAO,KAAK,yBAAyB;AAAA,QACnC;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,UAAU;AAAA,QACV,oBAAoB,KAAK;AAAA,MAAA,CAC1B;AAAA,IACH;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,iDAAiD,KAAK;AAAA,EACtE;AACF;AAEO,MAAM,yBAAqD,OAAO;AAAA,EACvE;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,wCAAoC,KAAK,UAAU,KAAK,KAAK;AAAA,EAC/D,SAAS,OAAO;AACd,YAAQ,MAAM,2CAA2C,KAAK;AAAA,EAChE;AACF;AAEO,MAAM,mBAAyC,OAAO;AAAA,EAC3D;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,QAAI,WAAW;AACb,UAAI,UAAU,KAAK;AAEnB,cAAQ,KAAK,MAAA;AAAA,QACX,KAAK;AACH,cAAI,KAAK,qBAAqB,KAAK,kBAAkB,SAAS,GAAG;AAC/D,sBAAU,WAAW,KAAK,eAAe,CAAC,6CAA6C,KAAK,kBAAkB,KAAK,IAAI,CAAC;AAAA,UAC1H,OAAO;AACL,sBAAU,KAAK,WAAW;AAAA,UAC5B;AACA;AAAA,QACF,KAAK;AACH,oBAAU;AACV;AAAA,QACF,KAAK;AACH,oBAAU;AACV;AAAA,QACF;AACE,oBAAU,KAAK,SAAS;AAAA,MAAA;AAG5B,gBAAU;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,qCAAqC,GAAG;AAAA,EACxD;AACF;AAEO,MAAM,wBAAmD,OAAO;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,MAAqB;AACnB,MAAI;AACF,QAAI,mBAAmB;AACrB,wBAAkB,CAAC,SAAS;AAC1B,cAAM,OAAO,CAAC,GAAG,MAAM,IAAI;AAC3B,eAAO,KAAK,SAAS,iBAAiB,KAAK,MAAM,CAAC,cAAc,IAAI;AAAA,MACtE,CAAC;AAAA,IACH;AAEA,2BAAuB,IAAI;AAAA,EAC7B,SAAS,KAAK;AACZ,YAAQ,MAAM,0CAA0C,GAAG;AAAA,EAC7D;AACF;AAEO,MAAM,kCAAuE,OAAO;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,MAAI;AACF,oCAAgC,KAAK,WAAW,KAAK,gBAAgB,KAAK,kBAAkB;AAE5F,UAAM,wBAAwB,kBAAkB,iBAAiB;AACjE,UAAM,iCAAiC;AAAA,MACrC,kBAAkB,qBAClB,iBAAiB,kBAAkB,kBAAkB,KAAK,gBAAgB,YAAA;AAAA,IAAY;AAGxF,QAAI,uBAAuB;AACzB,kBAAY;AAAA,QACV,SAAS,GAAG,KAAK,WAAW,mBAAmB,KAAK,iBAAiB,gBAAgB,KAAK,cAAc,IAAI,YAAY;AAAA,QACxH,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AACD;AAAA,IACF;AAEA,QAAI,gCAAgC;AAClC,UAAI,yBAAyB,KAAK,oBAAoB;AACpD,cAAM,sBAAsB,KAAK,oBAAoB,KAAK,SAAS;AAAA,MACrE;AACA;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,KAAK,kBAAkB,KAAK,oBAAoB;AAClE,UAAI,uBAAuB;AACzB,cAAM,sBAAsB,KAAK,oBAAoB,KAAK,SAAS;AAAA,MACrE;AAEA,kBAAY;AAAA,QACV,SAAS,GAAG,KAAK,WAAW,uBAAuB,gBAAgB,KAAK,cAAc,CAAC;AAAA,QACvF,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AAAA,IACH,WAAW,CAAC,KAAK,WAAW,CAAC,KAAK,gBAAgB;AAChD,UAAI,oCAAoC;AACtC,cAAM,mCAAmC,KAAK,SAAS;AAAA,MACzD;AAEA,UAAI,0BAA0B,KAAK,oBAAoB;AACrD,cAAM,uBAAuB,KAAK,oBAAoB,KAAK,SAAS;AAAA,MACtE;AAEA,UAAI,aAAa,CAAC,KAAK,SAAS;AAC9B,kBAAU;AAAA,UACR,SAAS,GAAG,KAAK,WAAW;AAAA,UAC5B,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,oDAAoD,GAAG;AAAA,EACvE;AACF;ACriBO,MAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAwC;AACtC,QAAM,CAAC,cAAc,cAAc,oBAAoB,WAAW,IAAI;AAEtE,qBAAmB,YAAY;AAC/B,qBAAmB,YAAY;AAC/B,2BAAyB,kBAAkB;AAC3C,oBAAkB,WAAW;AAC/B;AC2CO,MAAM,yBAAyB,OAIpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+F;AAC7F,MAAI,EAAE,cAAc,YAAAO,aAAY,iBAAiB,eAAe;AAChE,oBAAkB,WAAW,sBAAsB;AAEnD,MAAI;AACF,QAAI,aAAa,SAAS,GAAG;AAC3B,UAAI,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AACvC,cAAMA,YAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH,OAAO;AACL,cAAM,WAAW;AAAA,UACf;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,IAAI,qCAAqC,KAAK;AAAA,EACxD;AACF;ACpFO,MAAM,gBAAgB,OAAO;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA2C;AACzC,MAAI,cAAc,eAAe,cAAc,QAAQ;AACrD,iBAAa,MAAM;AACnB,+BAA2B,oBAAoB;AAE/C,QAAI,WAAW,QAAQ;AACrB,UAAI,CAAC,cAAc;AACjB,2BAAmB,IAAI;AACvB,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF,OAAO;AACL,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF,WAAW,YAAY,KAAK;AAC1B,uBAAmB,IAAI;AAAA,EACzB;AACF;AC3CO,MAAM,cAAc,OAAO;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAyC;AACvC,cAAY;AAAA,IACV,SAAS,GAAG,IAAI;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,EAAA,CACX;AAED,qBAAmB,eAAe,CAAC;AACrC;ACxCA,MAAM,UAAU,IAAI,QAAA;AACpB,MAAM,eAAe;AACrB,MAAM,sBAAsB,IAAI,KAAK,KAAK;AAE1C,MAAM,uBAAuB,CAAC,WAAuD;AACnF,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,OAAO,YAAY,UAAU,GAAG,SAAS;AACnE;AAgBO,SAAS,qBAAqB,KAAsB;AACzD,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAM,oBAAoB;AAC1B,SAAO,kBAAkB,KAAK,GAAG;AACnC;AAYO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuE;AACrE,MAAI,KAAK,WAAW,KAAK,OAAO,WAAW,KAAK,QAAQ,WAAW,KAAK,KAAK,WAAW,GAAG;AACzF,WAAO,EAAE,OAAO,OAAO,SAAS,8BAAA;AAAA,EAClC;AAEA,MACE,CAAC,qBAAqB,IAAI,KAC1B,CAAC,qBAAqB,MAAM,KAC5B,CAAC,qBAAqB,OAAO,KAC7B,CAAC,KAAK,SAAS,cAAc,KAC7B,QAAQ,cAAc,WAAW,GAAG,GACpC;AACA,WAAO,EAAE,OAAO,OAAO,SAAS,8BAAA;AAAA,EAClC;AAEA,MACE,OAAO,UAAU,MACjB,KAAK,SAAS,MACd,KAAK,SAAS,KACd,QAAQ,SAAS,MACjB,QAAQ,SAAS,KACjB,KAAK,SAAS,IACd;AACA,WAAO,EAAE,OAAO,OAAO,SAAS,8BAAA;AAAA,EAClC;AAEA,SAAO,EAAE,OAAO,KAAA;AAClB;AAmBA,eAAsB,qBAAqB;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,mBAAmB;AAEzB,MAAI,uBAAuB,SAAS,QAAQ,IAAI,sBAAsB,KAAK,GAAG;AAC9E,MAAI,uBAAuB,SAAS,QAAQ,IAAI,sBAAsB,KAAK,GAAG;AAE9E,MAAI,wBAAwB,cAAc;AACxC,QAAI,KAAK,QAAQ,uBAAuB,qBAAqB;AAC3D,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AACD,cAAQ,IAAI,wBAAwB,KAAK,IAAA,EAAM,UAAU;AACzD;AAAA,IACF,OAAO;AACL,6BAAuB;AACvB,cAAQ,IAAI,wBAAwB,qBAAqB,SAAA,CAAU;AACnE,cAAQ,IAAI,wBAAwB,KAAK,IAAA,EAAM,UAAU;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI;AACF,gCAA4B,IAAI;AAEhC,UAAM,gBAAgB,cAAc;AAAA,MAClC;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IAAA,CACD;AACD,UAAM,iBAAiB,IAAI;AAAA,MAAe,CAAC,GAAG,WAC5C,WAAW,MAAM,OAAO,IAAI,MAAM,mBAAmB,CAAC,GAAG,gBAAgB;AAAA,IAAA;AAG3E,UAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,eAAe,cAAc,CAAC;AAEjE,QAAI,qBAAqB,MAAM,GAAG;AAChC,6BAAuB;AACvB,cAAQ,IAAI,wBAAwB,qBAAqB,SAAA,CAAU;AACnE,cAAQ,IAAI,wBAAwB,KAAK,IAAA,EAAM,UAAU;AACzD,mBAAa,MAAM;AACnB,wBAAkB,WAAW;AAC7B,qBAAe,QAAQ;AACvB,iBAAW,IAAI;AACf,qBAAe,WAAW;AAC1B,mBAAa,QAAQ;AACrB,sBAAgB,IAAI;AAAA,IACtB,OAAO;AACL,8BAAwB;AACxB,cAAQ,IAAI,wBAAwB,qBAAqB,SAAA,CAAU;AACnE,cAAQ,IAAI,wBAAwB,KAAK,IAAA,EAAM,UAAU;AACzD,kCAA4B,KAAK;AAEjC,UAAI,wBAAwB,cAAc;AACxC,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH,OAAO;AACL,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAAA,MACH;AAAA,IACF;AAAA,EACF,QAAQ;AACN,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAED,4BAAwB;AACxB,YAAQ,IAAI,wBAAwB,qBAAqB,SAAA,CAAU;AACnE,YAAQ,IAAI,wBAAwB,KAAK,IAAA,EAAM,UAAU;AACzD,gCAA4B,KAAK;AAAA,EACnC;AACF;"}
|