{"version":3,"file":"openvidu-components-angular.mjs","sources":["../../src/lib/models/recording.model.ts","../../src/lib/models/storage.model.ts","../../src/lib/services/config/global-config.service.ts","../../src/lib/services/logger/logger.service.ts","../../src/lib/services/storage/storage.service.ts","../../src/lib/services/translate/translate.service.ts","../../src/lib/pipes/translate.pipe.ts","../../src/lib/components/dialogs/delete-recording.component.ts","../../src/lib/components/dialogs/dialog.component.ts","../../src/lib/components/dialogs/recording-dialog.component.ts","../../src/lib/services/action/action.service.ts","../../src/lib/models/toolbar.model.ts","../../src/lib/services/config/directive-config.service.ts","../../src/lib/services/recording/recording.service.ts","../../src/lib/pipes/recording.pipe.ts","../../src/lib/admin/admin-dashboard/admin-dashboard.component.ts","../../src/lib/admin/admin-dashboard/admin-dashboard.component.html","../../src/lib/admin/admin-login/admin-login.component.ts","../../src/lib/admin/admin-login/admin-login.component.html","../../src/lib/components/landscape-warning/landscape-warning.component.ts","../../src/lib/components/landscape-warning/landscape-warning.component.html","../../src/lib/directives/template/internals.directive.ts","../../src/lib/directives/template/openvidu-components-angular.directive.ts","../../src/lib/models/layout/layout-types.model.ts","../../src/lib/models/layout/layout-dimensions-cache.model.ts","../../src/lib/models/layout/layout-calculator.model.ts","../../src/lib/models/layout/layout-renderer.model.ts","../../src/lib/models/layout/layout.model.ts","../../src/lib/services/platform/platform.service.ts","../../src/lib/services/viewport/viewport.service.ts","../../src/lib/services/layout/layout.service.ts","../../src/lib/models/panel.model.ts","../../src/lib/services/panel/panel.service.ts","../../src/lib/models/device.model.ts","../../src/lib/models/participant.model.ts","../../src/lib/services/e2ee/e2ee.service.ts","../../src/lib/services/device/device.service.ts","../../src/lib/services/openvidu/openvidu.service.ts","../../src/lib/services/participant/participant.service.ts","../../src/lib/services/template/template-manager.service.ts","../../src/lib/pipes/participant.pipe.ts","../../src/lib/components/layout/layout.component.ts","../../src/lib/components/layout/layout.component.html","../../src/lib/components/panel/activities-panel/recording-activity/recording-activity.component.ts","../../src/lib/components/panel/activities-panel/recording-activity/recording-activity.component.html","../../src/lib/models/broadcasting.model.ts","../../src/lib/services/broadcasting/broadcasting.service.ts","../../src/lib/components/panel/activities-panel/broadcasting-activity/broadcasting-activity.component.ts","../../src/lib/components/panel/activities-panel/broadcasting-activity/broadcasting-activity.component.html","../../src/lib/components/panel/activities-panel/activities-panel.component.ts","../../src/lib/components/panel/activities-panel/activities-panel.component.html","../../src/lib/models/data-topic.model.ts","../../src/lib/services/chat/chat.service.ts","../../src/lib/models/linkifier.model.ts","../../src/lib/pipes/linkify.pipe.ts","../../src/lib/components/panel/chat-panel/chat-panel.component.ts","../../src/lib/components/panel/chat-panel/chat-panel.component.html","../../src/lib/components/panel/panel.component.ts","../../src/lib/components/panel/panel.component.html","../../src/lib/components/panel/participants-panel/participant-panel-item/participant-panel-item.component.ts","../../src/lib/components/panel/participants-panel/participant-panel-item/participant-panel-item.component.html","../../src/lib/components/panel/participants-panel/participants-panel/participants-panel.component.ts","../../src/lib/components/panel/participants-panel/participants-panel/participants-panel.component.html","../../src/lib/config/custom-cdk-overlay.ts","../../src/lib/services/cdk-overlay/cdk-overlay.service.ts","../../src/lib/components/audio-wave/audio-wave.component.ts","../../src/lib/components/video-poster/video-poster.component.ts","../../src/lib/components/video-poster/video-poster.component.html","../../src/lib/components/media-element/media-element.component.ts","../../src/lib/components/stream/stream.component.ts","../../src/lib/components/stream/stream.component.html","../../src/lib/components/toolbar/toolbar-media-buttons/toolbar-media-buttons.component.ts","../../src/lib/components/toolbar/toolbar-media-buttons/toolbar-media-buttons.component.html","../../src/lib/components/toolbar/toolbar-panel-buttons/toolbar-panel-buttons.component.ts","../../src/lib/components/toolbar/toolbar-panel-buttons/toolbar-panel-buttons.component.html","../../src/lib/services/document/document.service.ts","../../src/lib/directives/api/internals.directive.ts","../../src/lib/components/toolbar/toolbar.component.ts","../../src/lib/components/toolbar/toolbar.component.html","../../src/lib/models/videoconference-state.model.ts","../../src/lib/models/theme.model.ts","../../src/lib/services/theme/theme.service.ts","../../src/lib/models/background-effect.model.ts","../../src/lib/services/virtual-background/virtual-background.service.ts","../../src/lib/components/panel/background-effects-panel/background-effects-panel.component.ts","../../src/lib/components/panel/background-effects-panel/background-effects-panel.component.html","../../src/lib/components/settings/video-devices/video-devices.component.ts","../../src/lib/components/settings/video-devices/video-devices.component.html","../../src/lib/components/settings/audio-devices/audio-devices.component.ts","../../src/lib/components/settings/audio-devices/audio-devices.component.html","../../src/lib/components/settings/participant-name-input/participant-name-input.component.ts","../../src/lib/components/settings/participant-name-input/participant-name-input.component.html","../../src/lib/components/settings/lang-selector/lang-selector.component.ts","../../src/lib/components/settings/lang-selector/lang-selector.component.html","../../src/lib/components/pre-join/pre-join.component.ts","../../src/lib/components/pre-join/pre-join.component.html","../../src/lib/utils/utils.ts","../../src/lib/components/session/session.component.ts","../../src/lib/components/session/session.component.html","../../src/lib/components/settings/theme-selector/theme-selector.component.ts","../../src/lib/components/panel/settings-panel/settings-panel.component.ts","../../src/lib/components/panel/settings-panel/settings-panel.component.html","../../src/lib/components/videoconference/videoconference.component.ts","../../src/lib/components/videoconference/videoconference.component.html","../../src/lib/directives/api/activities-panel.directive.ts","../../src/lib/directives/api/admin.directive.ts","../../src/lib/directives/api/participant-panel-item.directive.ts","../../src/lib/directives/api/stream.directive.ts","../../src/lib/directives/api/toolbar.directive.ts","../../src/lib/directives/api/videoconference.directive.ts","../../src/lib/directives/api/api.directive.module.ts","../../src/lib/directives/template/openvidu-components-angular.directive.module.ts","../../src/lib/components/dialogs/pro-feature-dialog.component.ts","../../src/lib/openvidu-components-angular.material.module.ts","../../src/lib/openvidu-components-angular-ui.module.ts","../../src/lib/openvidu-components-angular.module.ts","../../src/public-api.ts","../../src/openvidu-components-angular.ts"],"sourcesContent":["/**\n * Enum representing the possible status of a recording\n */\nexport enum RecordingStatus {\n\tSTARTING = 'STARTING',\n\tSTARTED = 'STARTED',\n\tSTOPPING = 'STOPPING',\n\tSTOPPED = 'STOPPED',\n\tFAILED = 'FAILED',\n\tREADY = 'READY'\n}\n\nexport enum RecordingOutputMode {\n\tCOMPOSED = 'COMPOSED',\n\tINDIVIDUAL = 'INDIVIDUAL'\n}\n\n/**\n * Interface representing information related to the recording status\n */\nexport interface RecordingStatusInfo {\n\tstatus: RecordingStatus;\n\trecordingList: RecordingInfo[];\n\tstartedAt?: Date;\n\terror?: string;\n}\n\n/**\n * Interface representing a recording\n */\nexport interface RecordingInfo {\n\tid: string;\n\troomName: string;\n\troomId: string;\n\toutputMode: RecordingOutputMode;\n\tstatus: RecordingStatus;\n\tfilename?: string;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tduration?: number;\n\tsize?: number;\n\tlocation?: string;\n\t// Frontend only property to mark the recording as deleted\n\tmarkedForDeletion?: boolean;\n}\n\n/**\n * Interface representing a recording event\n */\ninterface RecordingEvent {\n\troomName: string;\n\trecordingId?: string;\n}\n\nexport interface RecordingStartRequestedEvent extends RecordingEvent {}\nexport interface RecordingStopRequestedEvent extends RecordingEvent {}\nexport interface RecordingDeleteRequestedEvent extends RecordingEvent {}\nexport interface RecordingDownloadClickedEvent extends RecordingEvent {}\n\nexport interface RecordingPlayClickedEvent extends RecordingEvent {}\n","/**\n * @internal\n */\nexport enum StorageKeys {\n\tPARTICIPANT_NAME = 'participantName',\n\tVIDEO_DEVICE = 'videoDevice',\n\tAUDIO_DEVICE = 'audioDevice',\n\tMICROPHONE_ENABLED = 'microphoneEnabled',\n\tCAMERA_ENABLED = 'cameraEnabled',\n\tLANG = 'lang',\n\tCAPTION_LANG = 'captionLang',\n\tBACKGROUND = 'virtualBg',\n\tTHEME = 'theme',\n\tTAB_ID = 'tabId',\n\tACTIVE_TABS = 'activeTabs'\n}\n\nexport const SESSION_KEYS: StorageKeys[] = [StorageKeys.TAB_ID];\n\nexport const TAB_MANAGEMENT_KEYS: StorageKeys[] = [StorageKeys.TAB_ID, StorageKeys.ACTIVE_TABS];\n\n// Data that should be unique per tab (stored in localStorage with tabId prefix)\nexport const TAB_SPECIFIC_KEYS: StorageKeys[] = [StorageKeys.PARTICIPANT_NAME, StorageKeys.MICROPHONE_ENABLED, StorageKeys.CAMERA_ENABLED];\n\n// Data that should be truly persistent and shared between tabs\nexport const SHARED_PERSISTENT_KEYS: StorageKeys[] = [\n\tStorageKeys.VIDEO_DEVICE,\n\tStorageKeys.AUDIO_DEVICE,\n\tStorageKeys.LANG,\n\tStorageKeys.CAPTION_LANG,\n\tStorageKeys.BACKGROUND\n];\n\nexport const STORAGE_PREFIX = 'ovComponents-';\n","\nimport { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { ParticipantFactoryFunction, OpenViduComponentsConfig } from '../../config/openvidu-components-angular.config';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class GlobalConfigService {\n\tprivate configuration: OpenViduComponentsConfig;\n\n\tconstructor(\n\t\t@Inject('OPENVIDU_COMPONENTS_CONFIG') config: OpenViduComponentsConfig,\n\t\t@Inject(DOCUMENT) private document: Document\n\t) {\n\t\tthis.configuration = config;\n\t\tif (this.isProduction()) console.log('OpenVidu Angular Production Mode');\n\t}\n\n\t/**\n\t * Retrieves the base href of the application.\n\t *\n\t * @returns The base href of the application as a string.\n\t */\n\tgetBaseHref(): string {\n\t\tconst base = this.document.getElementsByTagName('base');\n\t\tif (!base || base.length === 0) {\n\t\t\treturn '/';\n\t\t}\n\n\t\tconst baseHref = base[0].href;\n\t\tif (baseHref) {\n\t\t\treturn baseHref;\n\t\t}\n\t\treturn '/';\n\t}\n\n\thasParticipantFactory(): boolean {\n\t\treturn typeof this.getConfig().participantFactory === 'function';\n\t}\n\n\tgetParticipantFactory(): ParticipantFactoryFunction {\n\t\treturn this.getConfig().participantFactory;\n\t}\n\n\tgetConfig(): OpenViduComponentsConfig {\n\t\treturn this.configuration;\n\t}\n\tisProduction(): boolean {\n\t\treturn this.configuration?.production || false;\n\t}\n}\n","import { Injectable } from '@angular/core';\nimport { ILogService, ILogger } from '../../models/logger.model';\nimport { GlobalConfigService } from '../config/global-config.service';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class LoggerService implements ILogService {\n\tprivate log: Console;\n\tprivate LOG_FNS: Function[] = [];\n\tprivate MSG_PREFIXES: string[][] = [\n\t\t['[', '] DEBUG: '],\n\t\t['[', '] VERBOSE: '],\n\t\t['[', '] WARN: '],\n\t\t['[', '] ERROR: ']\n\t];\n\tprivate loggerCache: Map<string, ILogger> = new Map();\n\n\tconstructor(private globalService: GlobalConfigService) {\n\t\tthis.initializeLogger();\n\t}\n\n\tprivate initializeLogger(): void {\n\t\tthis.log = window.console;\n\t\tthis.LOG_FNS = [\n\t\t\tthis.log.log.bind(this.log),\n\t\t\tthis.log.debug.bind(this.log),\n\t\t\tthis.log.warn.bind(this.log),\n\t\t\tthis.log.error.bind(this.log)\n\t\t];\n\t}\n\n\tprivate createLoggerFunctions(\n\t\tprefix: string\n\t): [(...args: any[]) => void, (...args: any[]) => void, (...args: any[]) => void, (...args: any[]) => void] {\n\t\tconst prodMode = this.globalService.isProduction();\n\n\t\tconst debugFn = (...args: any[]): void => {\n\t\t\tif (!prodMode) {\n\t\t\t\t// Only log debug messages in non-production mode\n\t\t\t\tthis.LOG_FNS[0](this.MSG_PREFIXES[0][0] + prefix + this.MSG_PREFIXES[0][1], ...args);\n\t\t\t}\n\t\t};\n\n\t\tconst verboseFn = (...args: any[]): void => {\n\t\t\tif (!prodMode) {\n\t\t\t\t// Only log verbose messages in non-production mode and when verbose is enabled\n\t\t\t\tthis.LOG_FNS[1](this.MSG_PREFIXES[1][0] + prefix + this.MSG_PREFIXES[1][1], ...args);\n\t\t\t}\n\t\t};\n\n\t\tconst warnFn = (...args: any[]): void => {\n\t\t\tthis.LOG_FNS[2](this.MSG_PREFIXES[2][0] + prefix + this.MSG_PREFIXES[2][1], ...args);\n\t\t};\n\n\t\tconst errorFn = (...args: any[]): void => {\n\t\t\tthis.LOG_FNS[3](this.MSG_PREFIXES[3][0] + prefix + this.MSG_PREFIXES[3][1], ...args);\n\t\t};\n\n\t\treturn [debugFn, verboseFn, warnFn, errorFn];\n\t}\n\n\tpublic get(prefix: string): ILogger {\n\t\t// Check cache first\n\t\tif (this.loggerCache.has(prefix)) {\n\t\t\treturn this.loggerCache.get(prefix)!;\n\t\t}\n\n\t\t// Create new logger functions\n\t\tconst [debugFn, verboseFn, warnFn, errorFn] = this.createLoggerFunctions(prefix);\n\n\t\tconst logger: ILogger = {\n\t\t\td: debugFn,\n\t\t\tv: verboseFn,\n\t\t\tw: warnFn,\n\t\t\te: errorFn\n\t\t};\n\n\t\t// Cache the logger\n\t\tthis.loggerCache.set(prefix, logger);\n\n\t\treturn logger;\n\t}\n\n\t/**\n\t * Clears the logger cache. Useful for testing or when configuration changes.\n\t * @internal\n\t */\n\tpublic clearCache(): void {\n\t\tthis.loggerCache.clear();\n\t}\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { ILogger } from '../../models/logger.model';\nimport {\n\tSTORAGE_PREFIX,\n\tStorageKeys,\n\tSESSION_KEYS,\n\tTAB_MANAGEMENT_KEYS,\n\tTAB_SPECIFIC_KEYS,\n\tSHARED_PERSISTENT_KEYS\n} from '../../models/storage.model';\nimport { LoggerService } from '../logger/logger.service';\nimport { CustomDevice } from '../../models/device.model';\nimport { OpenViduThemeMode } from '../../models/theme.model';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class StorageService implements OnDestroy {\n\tpublic log: ILogger;\n\tprotected PREFIX_KEY = STORAGE_PREFIX;\n\tprivate readonly tabId: string;\n\tprivate readonly TAB_CLEANUP_INTERVAL = 30000; // 30 seconds\n\tprivate readonly TAB_TIMEOUT_THRESHOLD = 60000; // 60 seconds\n\tprivate cleanupInterval: NodeJS.Timeout | null = null;\n\tprivate broadcastChannel: BroadcastChannel | null = null;\n\tprivate isStorageAvailable = false;\n\tprivate lastHeartbeat = 0;\n\n\t// Cache for parsed values to avoid repeated JSON operations\n\tprivate cache = new Map<string, any>();\n\tprivate cacheTimeout = new Map<string, number>();\n\tprivate readonly CACHE_TTL = 5000; // 5 seconds cache TTL\n\n\tconstructor(protected loggerSrv: LoggerService) {\n\t\tthis.log = this.loggerSrv.get('StorageService');\n\n\t\t// Generate unique tab ID\n\t\tthis.tabId = this.generateUniqueTabId();\n\n\t\t// Check storage availability\n\t\tthis.isStorageAvailable = this.checkStorageAvailability();\n\n\t\tif (this.isStorageAvailable) {\n\t\t\tthis.initializeTabManagement();\n\t\t} else {\n\t\t\tthis.log.w('Storage not available - service will operate in limited mode');\n\t\t}\n\t}\n\n\t/**\n\t * Check if localStorage and sessionStorage are available\n\t */\n\tprivate checkStorageAvailability(): boolean {\n\t\ttry {\n\t\t\tconst test = '__storage_test__';\n\t\t\twindow.localStorage.setItem(test, test);\n\t\t\twindow.localStorage.removeItem(test);\n\t\t\twindow.sessionStorage.setItem(test, test);\n\t\t\twindow.sessionStorage.removeItem(test);\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Safe access to localStorage\n\t */\n\tprivate get localStorage(): Storage {\n\t\treturn window.localStorage;\n\t}\n\n\t/**\n\t * Safe access to sessionStorage\n\t */\n\tprivate get sessionStorage(): Storage {\n\t\treturn window.sessionStorage;\n\t}\n\n\t/**\n\t * Initializes tab management system with improved efficiency\n\t */\n\tprivate initializeTabManagement(): void {\n\t\t// Store tab ID in session storage\n\t\tthis.setSessionValue(StorageKeys.TAB_ID, this.tabId);\n\n\t\t// Initialize BroadcastChannel for inter-tab communication\n\t\tthis.initializeBroadcastChannel();\n\n\t\t// Register this tab as active\n\t\tthis.registerActiveTab();\n\n\t\t// Set up optimized cleanup mechanism\n\t\tthis.setupTabCleanup();\n\n\t\t// Listen for page unload to clean up this tab\n\t\twindow.addEventListener('beforeunload', () => {\n\t\t\tthis.unregisterActiveTab();\n\t\t});\n\n\t\t// Listen for page visibility changes to optimize heartbeat\n\t\tdocument.addEventListener('visibilitychange', () => {\n\t\t\tif (!document.hidden) {\n\t\t\t\tthis.updateHeartbeat();\n\t\t\t}\n\t\t});\n\n\t\tthis.log.d(`Tab initialized with ID: ${this.tabId}`);\n\t}\n\n\t/**\n\t * Initialize BroadcastChannel for efficient inter-tab communication\n\t */\n\tprivate initializeBroadcastChannel(): void {\n\t\ttry {\n\t\t\tif ('BroadcastChannel' in window) {\n\t\t\t\tthis.broadcastChannel = new BroadcastChannel(`${this.PREFIX_KEY}tabs`);\n\t\t\t\tthis.broadcastChannel.addEventListener('message', (event) => {\n\t\t\t\t\tif (event.data.type === 'tab-cleanup') {\n\t\t\t\t\t\t// Another tab is performing cleanup, update our heartbeat\n\t\t\t\t\t\tthis.updateHeartbeat();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.w('BroadcastChannel not available, using fallback communication');\n\t\t}\n\t}\n\n\t/**\n\t * Generates a more unique tab identifier with better collision resistance\n\t */\n\tprivate generateUniqueTabId(): string {\n\t\tconst timestamp = Date.now();\n\t\tconst random = Math.random().toString(36).substring(2, 12);\n\t\tconst performance = typeof window.performance !== 'undefined' ? window.performance.now() : 0;\n\t\treturn `tab_${timestamp}_${random}_${Math.floor(performance)}`;\n\t}\n\n\t/**\n\t * Updates heartbeat for current tab\n\t */\n\tprivate updateHeartbeat(): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tthis.lastHeartbeat = Date.now();\n\t\tconst activeTabs = this.getActiveTabsFromStorage() || {};\n\t\tactiveTabs[this.tabId] = this.lastHeartbeat;\n\t\tthis.setLocalValue(StorageKeys.ACTIVE_TABS, activeTabs, false); // Skip cache for critical data\n\t}\n\n\t/**\n\t * Registers current tab as active with optimized approach\n\t */\n\tprivate registerActiveTab(): void {\n\t\tthis.updateHeartbeat();\n\t}\n\n\t/**\n\t * Unregisters current tab from active tabs\n\t */\n\tprivate unregisterActiveTab(): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tconst activeTabs = this.getActiveTabsFromStorage() || {};\n\t\tdelete activeTabs[this.tabId];\n\t\tthis.setLocalValue(StorageKeys.ACTIVE_TABS, activeTabs, false);\n\t\tthis.cleanupTabData(this.tabId);\n\t}\n\n\t/**\n\t * Sets up optimized cleanup with reduced frequency\n\t */\n\tprivate setupTabCleanup(): void {\n\t\tthis.cleanupInterval = setInterval(() => {\n\t\t\tthis.cleanupInactiveTabs();\n\t\t}, this.TAB_CLEANUP_INTERVAL);\n\t}\n\n\t/**\n\t * Optimized cleanup of inactive tabs with better performance\n\t */\n\tprivate cleanupInactiveTabs(): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tconst activeTabs = this.getActiveTabsFromStorage() || {};\n\t\tconst currentTime = Date.now();\n\t\tconst tabsToCleanup: string[] = [];\n\t\tlet hasChanges = false;\n\n\t\t// Find tabs to cleanup without modifying the object during iteration\n\t\tfor (const [tabId, lastActivity] of Object.entries(activeTabs)) {\n\t\t\tif (currentTime - lastActivity > this.TAB_TIMEOUT_THRESHOLD) {\n\t\t\t\ttabsToCleanup.push(tabId);\n\t\t\t\thasChanges = true;\n\t\t\t}\n\t\t}\n\n\t\t// Clean up inactive tabs\n\t\tif (tabsToCleanup.length > 0) {\n\t\t\tthis.log.d(`Cleaning up ${tabsToCleanup.length} inactive tabs`);\n\n\t\t\t// Notify other tabs about cleanup via BroadcastChannel\n\t\t\tif (this.broadcastChannel) {\n\t\t\t\tthis.broadcastChannel.postMessage({ type: 'tab-cleanup', tabs: tabsToCleanup });\n\t\t\t}\n\n\t\t\t// Remove inactive tabs\n\t\t\tfor (const tabId of tabsToCleanup) {\n\t\t\t\tdelete activeTabs[tabId];\n\t\t\t\tthis.cleanupTabData(tabId);\n\t\t\t}\n\t\t}\n\n\t\t// Update heartbeat for current tab\n\t\tactiveTabs[this.tabId] = currentTime;\n\t\tthis.lastHeartbeat = currentTime;\n\n\t\tif (hasChanges || currentTime - this.lastHeartbeat > this.TAB_CLEANUP_INTERVAL / 2) {\n\t\t\tthis.setLocalValue(StorageKeys.ACTIVE_TABS, activeTabs, false);\n\t\t}\n\t}\n\n\t/**\n\t * Optimized cleanup of tab-specific data\n\t */\n\tprivate cleanupTabData(tabId: string): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\t// Use batch removal for better performance\n\t\tconst keysToRemove = TAB_SPECIFIC_KEYS.map((key) => `${this.PREFIX_KEY}${tabId}_${key}`);\n\n\t\tfor (const storageKey of keysToRemove) {\n\t\t\ttry {\n\t\t\t\tthis.localStorage.removeItem(storageKey);\n\t\t\t\t// Clear from cache if exists\n\t\t\t\tthis.cache.delete(storageKey);\n\t\t\t\tthis.cacheTimeout.delete(storageKey);\n\t\t\t} catch (e) {\n\t\t\t\tthis.log.w(`Failed to remove storage key: ${storageKey}`, e);\n\t\t\t}\n\t\t}\n\n\t\tthis.log.d(`Cleaned up data for tab: ${tabId}`);\n\t}\n\n\t/**\n\t * Gets active tabs with caching\n\t */\n\tprivate getActiveTabsFromStorage(): { [key: string]: number } | null {\n\t\treturn this.getLocalValue(StorageKeys.ACTIVE_TABS, false); // Don't cache tab management data\n\t}\n\n\t/**\n\t * Gets the current tab ID\n\t */\n\tpublic getTabId(): string {\n\t\treturn this.tabId;\n\t}\n\n\t// Simplified API methods with consistent patterns\n\tgetParticipantName(): string | null {\n\t\treturn this.get(StorageKeys.PARTICIPANT_NAME);\n\t}\n\n\tsetParticipantName(name: string): void {\n\t\tthis.set(StorageKeys.PARTICIPANT_NAME, name);\n\t}\n\n\tgetVideoDevice(): CustomDevice | null {\n\t\treturn this.get(StorageKeys.VIDEO_DEVICE);\n\t}\n\n\tsetVideoDevice(device: CustomDevice): void {\n\t\tthis.set(StorageKeys.VIDEO_DEVICE, device);\n\t}\n\n\tgetAudioDevice(): CustomDevice | null {\n\t\treturn this.get(StorageKeys.AUDIO_DEVICE);\n\t}\n\n\tsetAudioDevice(device: CustomDevice): void {\n\t\tthis.set(StorageKeys.AUDIO_DEVICE, device);\n\t}\n\n\t/**\n\t * @internal\n\t * Returns true only if the participant has the camera deliberately enabled\n\t */\n\tisCameraEnabled(): boolean {\n\t\tconst value = this.get(StorageKeys.CAMERA_ENABLED);\n\t\treturn value === null ? true : value === true;\n\t}\n\n\tsetCameraEnabled(enabled: boolean): void {\n\t\tthis.set(StorageKeys.CAMERA_ENABLED, enabled);\n\t}\n\n\t/**\n\t * @internal\n\t * Returns true only if the participant has the microphone deliberately enabled\n\t */\n\tisMicrophoneEnabled(): boolean {\n\t\tconst value = this.get(StorageKeys.MICROPHONE_ENABLED);\n\t\treturn value === null ? true : value === true;\n\t}\n\n\tsetMicrophoneEnabled(enabled: boolean): void {\n\t\tthis.set(StorageKeys.MICROPHONE_ENABLED, enabled);\n\t}\n\n\tsetLang(lang: string): void {\n\t\tthis.set(StorageKeys.LANG, lang);\n\t}\n\n\tgetLang(): string {\n\t\treturn this.get(StorageKeys.LANG);\n\t}\n\n\tsetCaptionLang(lang: string): void {\n\t\tthis.set(StorageKeys.CAPTION_LANG, lang);\n\t}\n\n\tgetCaptionsLang(): string {\n\t\treturn this.get(StorageKeys.CAPTION_LANG);\n\t}\n\n\tsetBackground(id: string): void {\n\t\tthis.set(StorageKeys.BACKGROUND, id);\n\t}\n\n\tgetBackground(): string {\n\t\treturn this.get(StorageKeys.BACKGROUND);\n\t}\n\n\tremoveBackground(): void {\n\t\tthis.remove(StorageKeys.BACKGROUND);\n\t}\n\n\tsetTheme(theme: OpenViduThemeMode): void {\n\t\tthis.set(StorageKeys.THEME, theme);\n\t}\n\n\tgetTheme(): OpenViduThemeMode | null {\n\t\treturn this.get(StorageKeys.THEME);\n\t}\n\n\tremoveTheme(): void {\n\t\tthis.remove(StorageKeys.THEME);\n\t}\n\n\t// Core storage methods with improved error handling and caching\n\tprotected set(key: string, item: any): void {\n\t\tif (!this.isStorageAvailable) {\n\t\t\tthis.log.w(`Storage not available, cannot set key: ${key}`);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tif (SESSION_KEYS.includes(key as StorageKeys)) {\n\t\t\t\tthis.setSessionValue(key, item);\n\t\t\t} else {\n\t\t\t\tthis.setLocalValue(key, item);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to set storage key: ${key}`, e);\n\t\t}\n\t}\n\n\tprotected get(key: string): any {\n\t\tif (!this.isStorageAvailable) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tif (SESSION_KEYS.includes(key as StorageKeys)) {\n\t\t\t\treturn this.getSessionValue(key);\n\t\t\t} else {\n\t\t\t\treturn this.getLocalValue(key);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to get storage key: ${key}`, e);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprotected remove(key: string): void {\n\t\tif (!this.isStorageAvailable) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tif (SESSION_KEYS.includes(key as StorageKeys)) {\n\t\t\t\tthis.removeSessionValue(key);\n\t\t\t} else {\n\t\t\t\tthis.removeLocalValue(key);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to remove storage key: ${key}`, e);\n\t\t}\n\t}\n\n\t/**\n\t * Determines if a key should use tab-specific storage in localStorage\n\t */\n\tprivate shouldUseTabSpecificKey(key: string): boolean {\n\t\treturn TAB_SPECIFIC_KEYS.includes(key as StorageKeys);\n\t}\n\n\t/**\n\t * Sets value in localStorage with optimized serialization and caching\n\t */\n\tprivate setLocalValue(key: string, item: any, useCache: boolean = true): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tconst storageKey = this.shouldUseTabSpecificKey(key) ? `${this.PREFIX_KEY}${this.tabId}_${key}` : `${this.PREFIX_KEY}${key}`;\n\n\t\ttry {\n\t\t\t// Optimize serialization for primitive types\n\t\t\tlet value: string;\n\t\t\tif (item === null || item === undefined) {\n\t\t\t\tvalue = JSON.stringify({ item: null });\n\t\t\t} else if (typeof item === 'string' || typeof item === 'number' || typeof item === 'boolean') {\n\t\t\t\tvalue = JSON.stringify({ item: item });\n\t\t\t} else {\n\t\t\t\tvalue = JSON.stringify({ item: item });\n\t\t\t}\n\n\t\t\tthis.localStorage.setItem(storageKey, value);\n\n\t\t\t// Update cache\n\t\t\tif (useCache) {\n\t\t\t\tthis.cache.set(storageKey, item);\n\t\t\t\tthis.cacheTimeout.set(storageKey, Date.now() + this.CACHE_TTL);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to set localStorage key: ${storageKey}`, e);\n\t\t}\n\t}\n\n\t/**\n\t * Gets value from localStorage with caching optimization\n\t */\n\tprivate getLocalValue(key: string, useCache: boolean = true): any {\n\t\tif (!this.isStorageAvailable) return null;\n\n\t\tconst storageKey = this.shouldUseTabSpecificKey(key) ? `${this.PREFIX_KEY}${this.tabId}_${key}` : `${this.PREFIX_KEY}${key}`;\n\n\t\t// Check cache first\n\t\tif (useCache && this.cache.has(storageKey)) {\n\t\t\tconst timeout = this.cacheTimeout.get(storageKey);\n\t\t\tif (timeout && Date.now() < timeout) {\n\t\t\t\treturn this.cache.get(storageKey);\n\t\t\t} else {\n\t\t\t\t// Cache expired\n\t\t\t\tthis.cache.delete(storageKey);\n\t\t\t\tthis.cacheTimeout.delete(storageKey);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst str = this.localStorage.getItem(storageKey);\n\t\t\tif (str) {\n\t\t\t\tconst parsed = JSON.parse(str);\n\t\t\t\tconst value = parsed.item;\n\n\t\t\t\t// Update cache\n\t\t\t\tif (useCache) {\n\t\t\t\t\tthis.cache.set(storageKey, value);\n\t\t\t\t\tthis.cacheTimeout.set(storageKey, Date.now() + this.CACHE_TTL);\n\t\t\t\t}\n\n\t\t\t\treturn value;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to parse localStorage key: ${storageKey}`, e);\n\t\t\t// Remove corrupted data\n\t\t\ttry {\n\t\t\t\tthis.localStorage.removeItem(storageKey);\n\t\t\t} catch (removeError) {\n\t\t\t\tthis.log.e(`Failed to remove corrupted key: ${storageKey}`, removeError);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Removes value from localStorage with cache cleanup\n\t */\n\tprivate removeLocalValue(key: string): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tconst storageKey = this.shouldUseTabSpecificKey(key) ? `${this.PREFIX_KEY}${this.tabId}_${key}` : `${this.PREFIX_KEY}${key}`;\n\n\t\ttry {\n\t\t\tthis.localStorage.removeItem(storageKey);\n\t\t\t// Clear from cache\n\t\t\tthis.cache.delete(storageKey);\n\t\t\tthis.cacheTimeout.delete(storageKey);\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to remove localStorage key: ${storageKey}`, e);\n\t\t}\n\t}\n\n\t/**\n\t * Sets value in sessionStorage with error handling\n\t */\n\tprivate setSessionValue(key: string, item: any): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\ttry {\n\t\t\tconst value = JSON.stringify({ item: item });\n\t\t\tthis.sessionStorage.setItem(this.PREFIX_KEY + key, value);\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to set sessionStorage key: ${key}`, e);\n\t\t}\n\t}\n\n\t/**\n\t * Gets value from sessionStorage with error handling\n\t */\n\tprivate getSessionValue(key: string): any {\n\t\tif (!this.isStorageAvailable) return null;\n\n\t\ttry {\n\t\t\tconst str = this.sessionStorage.getItem(this.PREFIX_KEY + key);\n\t\t\tif (str) {\n\t\t\t\tconst parsed = JSON.parse(str);\n\t\t\t\treturn parsed.item;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to parse sessionStorage key: ${key}`, e);\n\t\t\t// Remove corrupted data\n\t\t\ttry {\n\t\t\t\tthis.sessionStorage.removeItem(this.PREFIX_KEY + key);\n\t\t\t} catch (removeError) {\n\t\t\t\tthis.log.e(`Failed to remove corrupted sessionStorage key: ${key}`, removeError);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Removes value from sessionStorage\n\t */\n\tprivate removeSessionValue(key: string): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\ttry {\n\t\t\tthis.sessionStorage.removeItem(this.PREFIX_KEY + key);\n\t\t} catch (e) {\n\t\t\tthis.log.e(`Failed to remove sessionStorage key: ${key}`, e);\n\t\t}\n\t}\n\n\t/**\n\t * Optimized clear method that safely iterates and removes items\n\t */\n\tpublic clear(): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tthis.log.d('Clearing localStorage and sessionStorage');\n\n\t\t// Clear localStorage with safe iteration\n\t\tthis.clearStorageByPrefix(this.localStorage, this.PREFIX_KEY);\n\n\t\t// Clear sessionStorage with safe iteration\n\t\tthis.clearStorageByPrefix(this.sessionStorage, this.PREFIX_KEY);\n\n\t\t// Clear caches\n\t\tthis.cache.clear();\n\t\tthis.cacheTimeout.clear();\n\t}\n\n\t/**\n\t * Safely clears storage by collecting keys first, then removing\n\t */\n\tprivate clearStorageByPrefix(storage: Storage, prefix: string): void {\n\t\ttry {\n\t\t\tconst keysToRemove: string[] = [];\n\n\t\t\t// Collect keys to remove\n\t\t\tfor (let i = 0; i < storage.length; i++) {\n\t\t\t\tconst key = storage.key(i);\n\t\t\t\tif (key && key.startsWith(prefix)) {\n\t\t\t\t\tkeysToRemove.push(key);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove collected keys\n\t\t\tfor (const key of keysToRemove) {\n\t\t\t\tstorage.removeItem(key);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.log.e('Failed to clear storage', e);\n\t\t}\n\t}\n\n\t/**\n\t * Clears only session data (tab-specific data)\n\t */\n\tpublic clearSessionData(): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tthis.log.d('Clearing session data');\n\t\tthis.clearStorageByPrefix(this.sessionStorage, this.PREFIX_KEY);\n\t}\n\n\t/**\n\t * Clears only tab-specific data for current tab\n\t */\n\tpublic clearTabSpecificData(): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tthis.log.d('Clearing tab-specific data');\n\t\tTAB_SPECIFIC_KEYS.forEach((key) => {\n\t\t\tthis.removeLocalValue(key);\n\t\t});\n\t}\n\n\t/**\n\t * Clears only persistent data\n\t */\n\tpublic clearPersistentData(): void {\n\t\tif (!this.isStorageAvailable) return;\n\n\t\tthis.log.d('Clearing persistent data');\n\n\t\t// Clear shared persistent keys\n\t\tSHARED_PERSISTENT_KEYS.forEach((key) => {\n\t\t\tthis.removeLocalValue(key);\n\t\t});\n\n\t\t// Clear tab management keys\n\t\tTAB_MANAGEMENT_KEYS.forEach((key) => {\n\t\t\tthis.removeLocalValue(key);\n\t\t});\n\t}\n\n\t/**\n\t * Cleanup method to be called when service is destroyed\n\t */\n\tpublic destroy(): void {\n\t\t// Clear interval\n\t\tif (this.cleanupInterval) {\n\t\t\tclearInterval(this.cleanupInterval);\n\t\t\tthis.cleanupInterval = null;\n\t\t}\n\n\t\t// Close BroadcastChannel\n\t\tif (this.broadcastChannel) {\n\t\t\tthis.broadcastChannel.close();\n\t\t\tthis.broadcastChannel = null;\n\t\t}\n\n\t\t// Unregister tab\n\t\tthis.unregisterActiveTab();\n\n\t\t// Clear caches\n\t\tthis.cache.clear();\n\t\tthis.cacheTimeout.clear();\n\t}\n\n\t/**\n\t * Angular lifecycle hook - called when service is destroyed\n\t */\n\tngOnDestroy(): void {\n\t\tthis.destroy();\n\t}\n}\n","import { Injectable } from '@angular/core';\nimport * as cn from '../../lang/cn.json';\nimport * as de from '../../lang/de.json';\nimport * as en from '../../lang/en.json';\nimport * as es from '../../lang/es.json';\nimport * as fr from '../../lang/fr.json';\nimport * as hi from '../../lang/hi.json';\nimport * as it from '../../lang/it.json';\nimport * as ja from '../../lang/ja.json';\nimport * as nl from '../../lang/nl.json';\nimport * as pt from '../../lang/pt.json';\nimport { StorageService } from '../storage/storage.service';\nimport { AdditionalTranslationsType, AvailableLangs, LangOption } from '../../models/lang.model';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\n/**\n * Service responsible for managing translations for the application.\n * This service provides methods to add additional translations and to translate keys into the currently selected language.\n *\n * The pipe {@link TranslatePipe} is used to translate keys in the templates.\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class TranslateService {\n\t// Maps language codes to their respective translations\n\tprivate translationsByLanguage: Record<AvailableLangs, any> = { en, es, de, fr, cn, hi, it, ja, nl, pt };\n\n\t// Stores additional translations provided by the application\n\tprivate additionalTranslations: Record<AvailableLangs, any> | {} = {};\n\n\t// List of available language options with their display names and language codes\n\tprivate languageOptions: LangOption[] = [\n\t\t{ name: 'English', lang: 'en' },\n\t\t{ name: 'Español', lang: 'es' },\n\t\t{ name: 'Deutsch', lang: 'de' },\n\t\t{ name: 'Français', lang: 'fr' },\n\t\t{ name: '中国', lang: 'cn' },\n\t\t{ name: 'हिन्दी', lang: 'hi' },\n\t\t{ name: 'Italiano', lang: 'it' },\n\t\t{ name: '日本語', lang: 'ja' },\n\t\t{ name: 'Dutch', lang: 'nl' },\n\t\t{ name: 'Português', lang: 'pt' }\n\t];\n\n\t// The currently active translations for the selected language\n\tprivate activeTranslations: any;\n\n\t// The currently selected language option\n\tprivate selectedLanguageOption: LangOption;\n\n\t// BehaviorSubject to manage the currently selected language option\n\tprivate _selectedLanguageSubject: BehaviorSubject<LangOption> = new BehaviorSubject<LangOption>({ name: 'English', lang: 'en' });\n\n\t// Observable that emits changes to the selected language option\n\tselectedLanguageOption$: Observable<LangOption>;\n\n\tconstructor(private storageService: StorageService) {\n\t\tthis.selectedLanguageOption$ = this._selectedLanguageSubject.asObservable();\n\t\tthis.refreshSelectedLanguage();\n\t}\n\n\t/**\n\t * Adds multiple translations to the additional translations storage.\n\t * @param translations - A record where each key is a language code and the value is an object of translations for that language.\n\t */\n\taddTranslations(translations: Partial<AdditionalTranslationsType>): void {\n\t\tthis.additionalTranslations = translations;\n\t}\n\n\t/**\n\t * Sets the current language based on the provided language code.\n\t * Updates the selected language and emits the change.\n\t * @param lang - The language code to set.\n\t *\n\t * @internal\n\t */\n\tasync setCurrentLanguage(lang: AvailableLangs): Promise<void> {\n\t\t// Find the language option that matches the provided language code\n\t\tconst selectedLanguageOption = this.languageOptions.find((option) => option.lang === lang);\n\n\t\tif (selectedLanguageOption) {\n\t\t\t// Fetch the language data and update the current language\n\t\t\tthis.activeTranslations = await this.fetchLanguageData(lang);\n\t\t\tthis.selectedLanguageOption = selectedLanguageOption;\n\t\t\tthis._selectedLanguageSubject.next(this.selectedLanguageOption);\n\t\t\t// Notify subscribers of the language change\n\t\t\tthis._selectedLanguageSubject.next(this.selectedLanguageOption);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the available language options.\n\t * @param options - The new language options to set.\n\t *\n\t * @internal\n\t */\n\tupdateLanguageOptions(options?: LangOption[]): void {\n\t\tif (options && options.length > 0) {\n\t\t\tthis.languageOptions = options;\n\t\t\tthis.refreshSelectedLanguage();\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the currently selected language option.\n\t * @returns The currently selected language option.\n\t *\n\t * @internal\n\t */\n\tgetSelectedLanguage(): LangOption {\n\t\treturn this.selectedLanguageOption;\n\t}\n\n\t/**\n\t * Retrieves the list of all available language options.\n\t * @returns An array of available language options.\n\t */\n\tgetAvailableLanguages(): LangOption[] {\n\t\treturn this.languageOptions;\n\t}\n\n\t/**\n\t * Translates a given key into the current language.\n\t *\n\t * This method first attempts to find the translation in the official translations.\n\t * If the translation is not found, it then looks for the translation in the additional translations registered by the app.\n\t *\n\t * @param key - The key to be translated.\n\t * @returns The translated string if found, otherwise an empty string.\n\t */\n\ttranslate(key: string): string {\n\t\t// Attempt to find the translation in the official translations\n\t\tlet translation = this.findTranslation(this.activeTranslations, key);\n\n\t\tif (!translation) {\n\t\t\t// If not found, look for the translation in the additional translations\n\t\t\tconst additionalLangTranslations = this.additionalTranslations[this.selectedLanguageOption.lang];\n\t\t\ttranslation = this.findTranslation(additionalLangTranslations, key);\n\t\t}\n\n\t\treturn translation || '';\n\t}\n\n\t/**\n\t * Finds and returns a translation string from a nested translations source object based on a dot-separated key.\n\t *\n\t * @param translationsSource - The source object containing nested translation strings.\n\t * @param key - A dot-separated string representing the path to the desired translation.\n\t * @returns The translation string if found, otherwise `undefined`.\n\t */\n\tprivate findTranslation(translationsSource: any, key: string): string | undefined {\n\t\tlet translation = translationsSource;\n\n\t\t// Traverse the object tree based on the key structure\n\t\tkey.split('.').forEach((nestedKey) => {\n\t\t\ttry {\n\n\t\t\t\ttranslation = translation[nestedKey];\n\t\t\t} catch (error) {\n\t\t\t}\n\t\t});\n\n\t\treturn translation;\n\t}\n\n\t/**\n\t * Updates the currently selected language based on the stored language setting.\n\t */\n\tprivate async refreshSelectedLanguage() {\n\t\tconst storedLang = this.storageService.getLang();\n\t\tconst matchingOption = this.languageOptions.find((option) => option.lang === storedLang);\n\n\t\tif (storedLang && matchingOption) {\n\t\t\tthis.selectedLanguageOption = matchingOption;\n\t\t} else {\n\t\t\t// Default to the first language option if no language is found in storage\n\t\t\tthis.selectedLanguageOption = this.languageOptions[0];\n\t\t}\n\t\tthis.activeTranslations = await this.fetchLanguageData(this.selectedLanguageOption.lang);\n\t\tthis._selectedLanguageSubject.next(this.selectedLanguageOption);\n\t}\n\n\t/**\n\t * Fetches the language data from the source based on the provided language code.\n\t * @param lang - The language code to fetch data for.\n\t * @returns The language data associated with the provided language code.\n\t */\n\tprivate async fetchLanguageData(lang: AvailableLangs): Promise<any> {\n\t\tif (!(lang in this.translationsByLanguage)) {\n\t\t\t// Language not found in default languages options\n\t\t\t// Try to find it in the assets/lang directory\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(`assets/lang/${lang}.json`);\n\t\t\t\treturn await response.json();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Not found ${lang}.json in assets/lang`, error);\n\t\t\t\treturn {};\n\t\t\t}\n\t\t} else {\n\t\t\treturn this.translationsByLanguage[lang];\n\t\t}\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { TranslateService } from '../services/translate/translate.service';\n\n/**\n * @internal\n */\n@Pipe({\n    name: 'translate', pure: false,\n    standalone: false\n})\nexport class TranslatePipe implements PipeTransform {\n\tconstructor(private translateService: TranslateService) {}\n\n\ttransform(str: string): string {\n\t\tconst translation = this.translateService.translate(str);\n\t\tif (translation?.includes('OpenVidu PRO')) {\n\t\t\treturn translation.replace(\n\t\t\t\t'OpenVidu PRO',\n\t\t\t\t'<a href=\"https://openvidu.io/pricing/#openvidu-pro\" target=\"_blank\">OpenVidu PRO</a>'\n\t\t\t);\n\t\t}\n\t\treturn translation;\n\t}\n}\n","import { Component } from '@angular/core';\nimport { MatDialogRef } from '@angular/material/dialog';\n\n/**\n * @internal\n */\n@Component({\n    selector: 'app-delete-dialog',\n    template: `\n\t\t<div mat-dialog-content>{{ 'PANEL.RECORDING.DELETE_QUESTION' | translate }}</div>\n\t\t<div mat-dialog-actions>\n\t\t\t<button mat-button [disableRipple]=\"true\" (click)=\"close()\">{{ 'PANEL.RECORDING.CANCEL' | translate }}</button>\n\t\t\t<button [disableRipple]=\"true\" mat-button cdkFocusInitial (click)=\"close(true)\" id=\"delete-recording-confirm-btn\">\n\t\t\t\t{{ 'PANEL.RECORDING.DELETE' | translate }}\n\t\t\t</button>\n\t\t</div>\n\t`,\n    styles: [\n        `\n\t\t\t::ng-deep .mat-mdc-dialog-content {\n\t\t\t\tcolor: var(--ov-text-surface-color) !important;\n\t\t\t}\n\t\t\t::ng-deep .mat-mdc-dialog-surface {\n\t\t\t\tbackground-color: var(--ov-surface-color);\n\t\t\t\tborder-radius: var(--ov-surface-radius);\n\t\t\t}\n\t\t\t#delete-recording-confirm-btn {\n\t\t\t\tbackground-color: var(--ov-error-color) !important;\n\t\t\t\tcolor: var(--ov-primary-action-color);\n\t\t\t}\n\t\t\t.mat-mdc-button,\n\t\t\t.mat-mdc-button:not(:disabled),\n\t\t\t::ng-deep .mat-mdc-button .mat-mdc-button-persistent-ripple::before {\n\t\t\t\tcolor: var(--ov-text-primary-color) !important;\n\t\t\t\tbackground-color: var(--ov-primary-action-color) !important;\n\t\t\t\tborder-radius: var(--ov-surface-radius);\n\t\t\t}\n\t\t`\n    ],\n    standalone: false\n})\nexport class DeleteDialogComponent {\n\tconstructor(public dialogRef: MatDialogRef<DeleteDialogComponent>) {}\n\n\tclose(succsess = false) {\n\t\tthis.dialogRef.close(succsess);\n\t}\n}\n","import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { DialogData } from '../../models/dialog.model';\n\n/**\n * @internal\n */\n\n@Component({\n    selector: 'ov-dialog-template',\n    template: `\n\t\t<h1 mat-dialog-title>{{ data.title }}</h1>\n\t\t<div mat-dialog-content id=\"openvidu-dialog\">{{ data.description }}</div>\n\t\t<div mat-dialog-actions *ngIf=\"data.showActionButtons\">\n\t\t\t<button mat-button [disableRipple]=\"true\" (click)=\"close()\">{{ 'PANEL.CLOSE' | translate }}</button>\n\t\t</div>\n\t`,\n    styles: [\n        `\n\t\t\t::ng-deep .mat-mdc-dialog-content {\n\t\t\t\tcolor: var(--ov-text-surface-color) !important;\n\t\t\t}\n\n\t\t\t::ng-deep .mat-mdc-dialog-surface {\n\t\t\t\tbackground-color: var(--ov-surface-color);\n\t\t\t\tborder-radius: var(--ov-surface-radius);\n\t\t\t}\n\t\t\t.mat-mdc-button,\n\t\t\t.mat-mdc-button:not(:disabled),\n\t\t\t::ng-deep .mat-mdc-button .mat-mdc-button-persistent-ripple::before {\n\t\t\t\tcolor: var(--ov-text-primary-color);\n\t\t\t\tbackground-color: var(--ov-primary-action-color) !important;\n\t\t\t\tborder-radius: var(--ov-surface-radius);\n\t\t\t}\n\t\t`\n    ],\n    standalone: false\n})\nexport class DialogTemplateComponent {\n\tconstructor(\n\t\tpublic dialogRef: MatDialogRef<DialogTemplateComponent>,\n\t\t@Inject(MAT_DIALOG_DATA) public data: DialogData\n\t) {}\n\n\tclose() {\n\t\tthis.dialogRef.close();\n\t}\n}\n","import { Component, ElementRef, Inject, ViewChild } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { RecordingDialogData } from '../../models/dialog.model';\n\n/**\n * @internal\n */\n@Component({\n    selector: 'app-recording-dialog',\n    template: `\n\t\t<div mat-dialog-content>\n\t\t\t<video #videoElement controls autoplay [src]=\"src\" (error)=\"handleError()\"></video>\n\t\t</div>\n\t\t<div mat-dialog-actions *ngIf=\"data.showActionButtons\" align=\"end\">\n\t\t\t<button mat-button [disableRipple]=\"true\" (click)=\"close()\">{{ 'PANEL.CLOSE' | translate }}</button>\n\t\t</div>\n\t`,\n    styles: [\n        `\n\t\t\t::ng-deep .mat-mdc-dialog-content {\n\t\t\t\tcolor: var(--ov-text-surface-color) !important;\n\t\t\t}\n\n\t\t\t::ng-deep .mat-mdc-dialog-surface {\n\t\t\t\tbackground-color: var(--ov-surface-color);\n\t\t\t\tborder-radius: var(--ov-surface-radius);\n\t\t\t}\n\t\t\tvideo {\n\t\t\t\tmax-height: 64vh;\n\t\t\t\tmax-width: 100%;\n\t\t\t}\n\n\t\t\t.mat-mdc-button,\n\t\t\t.mat-mdc-button:not(:disabled),\n\t\t\t::ng-deep .mat-mdc-button .mat-mdc-button-persistent-ripple::before {\n\t\t\t\tcolor: var(--ov-text-primary-color);\n\t\t\t\tbackground-color: var(--ov-primary-action-color) !important;\n\t\t\t\tborder-radius: var(--ov-surface-radius);\n\t\t\t}\n\t\t`\n    ],\n    standalone: false\n})\nexport class RecordingDialogComponent {\n\t@ViewChild('videoElement', { static: true }) videoElement: ElementRef<HTMLVideoElement>;\n\n\tsrc: string;\n\n\tconstructor(\n\t\tpublic dialogRef: MatDialogRef<RecordingDialogComponent>,\n\t\t@Inject(MAT_DIALOG_DATA) public data: RecordingDialogData\n\t) {\n\t\tthis.src = data.src;\n\t}\n\tclose() {\n\t\tthis.dialogRef.close({ manageError: false, error: null });\n\t}\n\n\thandleError() {\n\t\tconst videoElement = this.videoElement.nativeElement;\n\t\tthis.dialogRef.close({ manageError: true, error: videoElement.error });\n\t}\n}\n","import { Injectable } from '@angular/core';\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Subscription } from 'rxjs';\nimport { DeleteDialogComponent } from '../../components/dialogs/delete-recording.component';\nimport { DialogTemplateComponent } from '../../components/dialogs/dialog.component';\nimport { ProFeatureDialogTemplateComponent } from '../../components/dialogs/pro-feature-dialog.component';\nimport { RecordingDialogComponent } from '../../components/dialogs/recording-dialog.component';\nimport { INotificationOptions } from '../../models/notification-options.model';\nimport { TranslateService } from '../translate/translate.service';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class ActionService {\n\tprivate dialogRef:\n\t\t| MatDialogRef<DialogTemplateComponent | RecordingDialogComponent | DeleteDialogComponent | ProFeatureDialogTemplateComponent>\n\t\t| undefined;\n\tprivate connectionDialogRef: MatDialogRef<DialogTemplateComponent> | undefined;\n\tprivate isConnectionDialogOpen = false;\n\n\tconstructor(\n\t\tprivate snackBar: MatSnackBar,\n\t\tpublic dialog: MatDialog,\n\t\tprivate translateService: TranslateService\n\t) {}\n\n\tlaunchNotification(options: INotificationOptions, callback?: () => void): void {\n\t\tif (!options.config) {\n\t\t\toptions.config = {\n\t\t\t\tduration: 3000,\n\t\t\t\tverticalPosition: 'top',\n\t\t\t\thorizontalPosition: 'end',\n\t\t\t\tpanelClass: 'snackbarNotification'\n\t\t\t};\n\t\t}\n\n\t\tconst notification = this.snackBar.open(options.message, options.buttonActionText, options.config);\n\t\tif (callback) {\n\t\t\t// subscribe and complete immediately after calling callback\n\t\t\tconst sub = notification.onAction().subscribe(() => {\n\t\t\t\tsub.unsubscribe();\n\t\t\t\tcallback();\n\t\t\t});\n\t\t}\n\t}\n\n\topenDialog(titleMessage: string, descriptionMessage: string, allowClose = true) {\n\t\tthis.closeDialog();\n\t\tconst config: MatDialogConfig = {\n\t\t\tminWidth: '250px',\n\t\t\tdata: { title: titleMessage, description: descriptionMessage, showActionButtons: allowClose },\n\t\t\tdisableClose: !allowClose\n\t\t};\n\t\tthis.dialogRef = this.dialog.open(DialogTemplateComponent, config);\n\t\tthis.dialogRef.afterClosed().subscribe(() => (this.dialogRef = undefined));\n\t}\n\n\topenConnectionDialog(titleMessage: string, descriptionMessage: string, allowClose = false) {\n\t\tif (this.isConnectionDialogOpen) return;\n\t\tconst config: MatDialogConfig = {\n\t\t\tminWidth: '250px',\n\t\t\tdata: { title: titleMessage, description: descriptionMessage, showActionButtons: allowClose },\n\t\t\tdisableClose: !allowClose\n\t\t};\n\n\t\tthis.connectionDialogRef = this.dialog.open(DialogTemplateComponent, config);\n\t\tthis.isConnectionDialogOpen = true;\n\t\tthis.connectionDialogRef.afterClosed().subscribe(() => {\n\t\t\tthis.isConnectionDialogOpen = false;\n\t\t\tthis.connectionDialogRef = undefined;\n\t\t});\n\t}\n\n\topenDeleteRecordingDialog(successCallback: () => void) {\n\t\tthis.closeDialog();\n\t\tthis.dialogRef = this.dialog.open(DeleteDialogComponent);\n\t\tthis.dialogRef.afterClosed().subscribe((result) => {\n\t\t\tif (result) {\n\t\t\t\tsuccessCallback();\n\t\t\t}\n\t\t\tthis.dialogRef = undefined;\n\t\t});\n\t}\n\n\topenRecordingPlayerDialog(src: string, allowClose = true) {\n\t\tthis.closeDialog();\n\t\tconst config: MatDialogConfig = {\n\t\t\tminWidth: '250px',\n\t\t\tdata: { src, showActionButtons: allowClose },\n\t\t\tdisableClose: !allowClose\n\t\t};\n\t\tthis.dialogRef = this.dialog.open(RecordingDialogComponent, config);\n\t\tthis.dialogRef.afterClosed().subscribe((data: { manageError: boolean; error: MediaError | null }) => {\n\t\t\tif (data && data.manageError) {\n\t\t\t\tthis.handleRecordingPlayerError(data.error);\n\t\t\t}\n\t\t\tthis.dialogRef = undefined;\n\t\t});\n\t}\n\n\tcloseDialog() {\n\t\tif (this.dialogRef) {\n\t\t\tthis.dialogRef.close();\n\t\t\tthis.dialogRef = undefined;\n\t\t}\n\t}\n\n\tcloseConnectionDialog() {\n\t\tif (this.connectionDialogRef) {\n\t\t\tthis.connectionDialogRef.close();\n\t\t\tthis.isConnectionDialogOpen = false;\n\t\t\tthis.connectionDialogRef = undefined;\n\t\t}\n\t}\n\n\tprivate handleRecordingPlayerError(error: MediaError | null) {\n\t\tlet message = 'ERRORS.MEDIA_ERR_GENERIC';\n\t\tif (error) {\n\t\t\tswitch (error.code) {\n\t\t\t\tcase error.MEDIA_ERR_NETWORK:\n\t\t\t\t\tmessage = 'ERRORS.MEDIA_ERR_NETWORK';\n\t\t\t\t\tbreak;\n\t\t\t\tcase error.MEDIA_ERR_DECODE:\n\t\t\t\t\tmessage = 'ERRORS.MEDIA_ERR_DECODE';\n\t\t\t\t\tbreak;\n\t\t\t\tcase error.MEDIA_ERR_SRC_NOT_SUPPORTED:\n\t\t\t\t\tmessage = 'ERRORS.MEDIA_ERR_SRC_NOT_SUPPORTED';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst title = this.translateService.translate('ERRORS.LOAD_RECORDING_TITLE');\n\t\tmessage = this.translateService.translate(message);\n\t\tthis.openDialog(title, message, true);\n\t}\n}\n","/**\n * Enum representing the position of additional buttons in a toolbar.\n */\nexport enum ToolbarAdditionalButtonsPosition {\n\tBEFORE_MENU = 'beforeMenu',\n\tAFTER_MENU = 'afterMenu'\n}","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, shareReplay, map } from 'rxjs/operators';\nimport { RecordingInfo } from '../../models/recording.model';\nimport { ToolbarAdditionalButtonsPosition } from '../../models/toolbar.model';\nimport { ParticipantModel } from '../../models/participant.model';\n\n/**\n * Configuration item for the service\n */\ninterface ConfigItem<T> {\n\tsubject: BehaviorSubject<T>;\n\tobservable$: Observable<T>;\n}\n\n/**\n * Recording activity controls configuration\n */\ninterface RecordingControls {\n\tplay: boolean;\n\tdownload: boolean;\n\tdelete: boolean;\n\texternalView: boolean;\n}\n\n/**\n * Toolbar configuration grouped by domain\n */\ninterface ToolbarConfig {\n\tcamera: boolean;\n\tmicrophone: boolean;\n\tscreenshare: boolean;\n\tfullscreen: boolean;\n\tcaptions: boolean;\n\tsettings: boolean;\n\tleave: boolean;\n\tparticipantsPanel: boolean;\n\tchatPanel: boolean;\n\tactivitiesPanel: boolean;\n\tdisplayRoomName: boolean;\n\troomName: string;\n\tdisplayLogo: boolean;\n\tbackgroundEffects: boolean;\n\trecording: boolean;\n\tviewRecordings: boolean;\n\tbroadcasting: boolean;\n\tbrandingLogo: string;\n\tadditionalButtonsPosition: ToolbarAdditionalButtonsPosition;\n}\n\n/**\n * Stream/Video configuration\n */\ninterface StreamConfig {\n\tvideoEnabled: boolean;\n\taudioEnabled: boolean;\n\tdisplayParticipantName: boolean;\n\tdisplayAudioDetection: boolean;\n\tvideoControls: boolean;\n\tparticipantItemMuteButton: boolean;\n}\n\n/**\n * Recording activity configuration\n */\ninterface RecordingActivityConfig {\n\tenabled: boolean;\n\treadOnly: boolean;\n\tshowControls: RecordingControls;\n\tstartStopButton: boolean;\n\tviewRecordingsButton: boolean;\n\tshowRecordingsList: boolean;\n}\n\n/**\n * Admin dashboard configuration\n */\ninterface AdminConfig {\n\trecordingsList: RecordingInfo[];\n\tloginError: any;\n\tloginTitle: string;\n\tdashboardTitle: string;\n}\n\n/**\n * General application configuration\n */\ninterface GeneralConfig {\n\ttoken: string;\n\tlivekitUrl: string;\n\ttokenError: any;\n\tminimal: boolean;\n\tparticipantName: string;\n\tprejoin: boolean;\n\tprejoinDisplayParticipantName: boolean;\n\tshowDisconnectionDialog: boolean;\n\tshowThemeSelector: boolean;\n\trecordingStreamBaseUrl: string;\n\te2eeKey?: string;\n}\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class OpenViduComponentsConfigService {\n\t/**\n\t * Helper method to create a configuration item with BehaviorSubject and Observable\n\t */\n\tprivate createConfigItem<T>(initialValue: T): ConfigItem<T> {\n\t\tconst subject = new BehaviorSubject<T>(initialValue);\n\t\tconst observable$ = subject.asObservable().pipe(distinctUntilChanged(), shareReplay(1));\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Helper method for array configurations with optimized comparison\n\t */\n\tprivate createArrayConfigItem<T>(initialValue: T[]): ConfigItem<T[]> {\n\t\tconst subject = new BehaviorSubject<T[]>(initialValue);\n\t\tconst observable$ = subject.asObservable().pipe(\n\t\t\tdistinctUntilChanged((prev, curr) => {\n\t\t\t\tif (prev.length !== curr.length) return false;\n\t\t\t\treturn prev.every((item, index) => this.deepEqual(item, curr[index]));\n\t\t\t}),\n\t\t\tshareReplay(1)\n\t\t);\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Helper method for RecordingControls with specific comparison\n\t */\n\tprivate createRecordingControlsConfigItem(initialValue: RecordingControls): ConfigItem<RecordingControls> {\n\t\tconst subject = new BehaviorSubject<RecordingControls>(initialValue);\n\t\tconst observable$ = subject.asObservable().pipe(\n\t\t\tdistinctUntilChanged(\n\t\t\t\t(prev, curr) =>\n\t\t\t\t\tprev.play === curr.play &&\n\t\t\t\t\tprev.download === curr.download &&\n\t\t\t\t\tprev.delete === curr.delete &&\n\t\t\t\t\tprev.externalView === curr.externalView\n\t\t\t),\n\t\t\tshareReplay(1)\n\t\t);\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Helper method for ToolbarConfig with specific comparison\n\t */\n\tprivate createToolbarConfigItem(initialValue: ToolbarConfig): ConfigItem<ToolbarConfig> {\n\t\tconst subject = new BehaviorSubject<ToolbarConfig>(initialValue);\n\t\tconst observable$ = subject.asObservable().pipe(\n\t\t\tdistinctUntilChanged((prev, curr) => this.compareToolbarConfig(prev, curr)),\n\t\t\tshareReplay(1)\n\t\t);\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Helper method for StreamConfig with specific comparison\n\t */\n\tprivate createStreamConfigItem(initialValue: StreamConfig): ConfigItem<StreamConfig> {\n\t\tconst subject = new BehaviorSubject<StreamConfig>(initialValue);\n\t\tconst observable$ = subject.asObservable().pipe(\n\t\t\tdistinctUntilChanged((prev, curr) => this.compareStreamConfig(prev, curr)),\n\t\t\tshareReplay(1)\n\t\t);\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Helper method for RecordingActivityConfig with specific comparison\n\t */\n\tprivate createRecordingActivityConfigItem(initialValue: RecordingActivityConfig): ConfigItem<RecordingActivityConfig> {\n\t\tconst subject = new BehaviorSubject<RecordingActivityConfig>(initialValue);\n\t\tconst observable$ = subject.asObservable().pipe(\n\t\t\tdistinctUntilChanged((prev, curr) => this.compareRecordingActivityConfig(prev, curr)),\n\t\t\tshareReplay(1)\n\t\t);\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Helper method for AdminConfig with specific comparison\n\t */\n\tprivate createAdminConfigItem(initialValue: AdminConfig): ConfigItem<AdminConfig> {\n\t\tconst subject = new BehaviorSubject<AdminConfig>(initialValue);\n\t\tconst observable$ = subject.asObservable().pipe(\n\t\t\tdistinctUntilChanged((prev, curr) => this.compareAdminConfig(prev, curr)),\n\t\t\tshareReplay(1)\n\t\t);\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Helper method for GeneralConfig with specific comparison\n\t */\n\tprivate createGeneralConfigItem(initialValue: GeneralConfig): ConfigItem<GeneralConfig> {\n\t\tconst subject = new BehaviorSubject<GeneralConfig>(initialValue);\n\t\tconst observable$ = subject.asObservable();\n\t\treturn { subject, observable$ };\n\t}\n\n\t/**\n\t * Optimized deep equality check\n\t */\n\tprivate deepEqual(a: any, b: any): boolean {\n\t\tif (a === b) return true;\n\t\tif (a == null || b == null) return a === b;\n\t\tif (typeof a !== typeof b) return false;\n\t\tif (typeof a !== 'object') return a === b;\n\n\t\tconst keysA = Object.keys(a);\n\t\tconst keysB = Object.keys(b);\n\t\tif (keysA.length !== keysB.length) return false;\n\n\t\treturn keysA.every((key) => this.deepEqual(a[key], b[key]));\n\t}\n\n\t/**\n\t * Compare ToolbarConfig efficiently\n\t */\n\tprivate compareToolbarConfig(prev: ToolbarConfig, curr: ToolbarConfig): boolean {\n\t\treturn (\n\t\t\tprev.camera === curr.camera &&\n\t\t\tprev.microphone === curr.microphone &&\n\t\t\tprev.screenshare === curr.screenshare &&\n\t\t\tprev.fullscreen === curr.fullscreen &&\n\t\t\tprev.captions === curr.captions &&\n\t\t\tprev.settings === curr.settings &&\n\t\t\tprev.leave === curr.leave &&\n\t\t\tprev.participantsPanel === curr.participantsPanel &&\n\t\t\tprev.chatPanel === curr.chatPanel &&\n\t\t\tprev.activitiesPanel === curr.activitiesPanel &&\n\t\t\tprev.displayRoomName === curr.displayRoomName &&\n\t\t\tprev.roomName === curr.roomName &&\n\t\t\tprev.displayLogo === curr.displayLogo &&\n\t\t\tprev.backgroundEffects === curr.backgroundEffects &&\n\t\t\tprev.recording === curr.recording &&\n\t\t\tprev.viewRecordings === curr.viewRecordings &&\n\t\t\tprev.broadcasting === curr.broadcasting &&\n\t\t\tprev.brandingLogo === curr.brandingLogo &&\n\t\t\tprev.additionalButtonsPosition === curr.additionalButtonsPosition\n\t\t);\n\t}\n\n\t/**\n\t * Compare StreamConfig efficiently\n\t */\n\tprivate compareStreamConfig(prev: StreamConfig, curr: StreamConfig): boolean {\n\t\treturn (\n\t\t\tprev.videoEnabled === curr.videoEnabled &&\n\t\t\tprev.audioEnabled === curr.audioEnabled &&\n\t\t\tprev.displayParticipantName === curr.displayParticipantName &&\n\t\t\tprev.displayAudioDetection === curr.displayAudioDetection &&\n\t\t\tprev.videoControls === curr.videoControls &&\n\t\t\tprev.participantItemMuteButton === curr.participantItemMuteButton\n\t\t);\n\t}\n\n\t/**\n\t * Compare RecordingActivityConfig efficiently\n\t */\n\tprivate compareRecordingActivityConfig(prev: RecordingActivityConfig, curr: RecordingActivityConfig): boolean {\n\t\treturn (\n\t\t\tprev.enabled === curr.enabled &&\n\t\t\tprev.readOnly === curr.readOnly &&\n\t\t\tprev.startStopButton === curr.startStopButton &&\n\t\t\tprev.viewRecordingsButton === curr.viewRecordingsButton &&\n\t\t\tprev.showRecordingsList === curr.showRecordingsList &&\n\t\t\tprev.showControls.play === curr.showControls.play &&\n\t\t\tprev.showControls.download === curr.showControls.download &&\n\t\t\tprev.showControls.delete === curr.showControls.delete &&\n\t\t\tprev.showControls.externalView === curr.showControls.externalView\n\t\t);\n\t}\n\n\t/**\n\t * Compare AdminConfig efficiently\n\t */\n\tprivate compareAdminConfig(prev: AdminConfig, curr: AdminConfig): boolean {\n\t\treturn (\n\t\t\tprev.loginError === curr.loginError &&\n\t\t\tprev.loginTitle === curr.loginTitle &&\n\t\t\tprev.dashboardTitle === curr.dashboardTitle &&\n\t\t\tprev.recordingsList.length === curr.recordingsList.length &&\n\t\t\tprev.recordingsList.every((item, index) => this.deepEqual(item, curr.recordingsList[index]))\n\t\t);\n\t}\n\n\t// Grouped configuration items by domain\n\tprivate generalConfig = this.createGeneralConfigItem({\n\t\ttoken: '',\n\t\tlivekitUrl: '',\n\t\ttokenError: null,\n\t\tminimal: false,\n\t\tparticipantName: '',\n\t\tprejoin: true,\n\t\tprejoinDisplayParticipantName: true,\n\t\tshowDisconnectionDialog: true,\n\t\tshowThemeSelector: false,\n\t\trecordingStreamBaseUrl: 'call/api/recordings',\n\t\te2eeKey: undefined\n\t});\n\n\tprivate toolbarConfig = this.createToolbarConfigItem({\n\t\tcamera: true,\n\t\tmicrophone: true,\n\t\tscreenshare: true,\n\t\tfullscreen: true,\n\t\tcaptions: true,\n\t\tsettings: true,\n\t\tleave: true,\n\t\tparticipantsPanel: true,\n\t\tchatPanel: true,\n\t\tactivitiesPanel: true,\n\t\tdisplayRoomName: true,\n\t\troomName: '',\n\t\tdisplayLogo: true,\n\t\tbackgroundEffects: true,\n\t\trecording: true,\n\t\tviewRecordings: false,\n\t\tbroadcasting: true,\n\t\tbrandingLogo: '',\n\t\tadditionalButtonsPosition: ToolbarAdditionalButtonsPosition.AFTER_MENU\n\t});\n\n\tprivate streamConfig = this.createStreamConfigItem({\n\t\tvideoEnabled: true,\n\t\taudioEnabled: true,\n\t\tdisplayParticipantName: true,\n\t\tdisplayAudioDetection: true,\n\t\tvideoControls: true,\n\t\tparticipantItemMuteButton: true\n\t});\n\n\tprivate recordingActivityConfig = this.createRecordingActivityConfigItem({\n\t\tenabled: true,\n\t\treadOnly: false,\n\t\tshowControls: {\n\t\t\tplay: true,\n\t\t\tdownload: true,\n\t\t\tdelete: true,\n\t\t\texternalView: false\n\t\t},\n\t\tstartStopButton: true,\n\t\tviewRecordingsButton: false,\n\t\tshowRecordingsList: true\n\t});\n\n\tprivate adminConfig = this.createAdminConfigItem({\n\t\trecordingsList: [],\n\t\tloginError: null,\n\t\tloginTitle: '',\n\t\tdashboardTitle: ''\n\t});\n\n\t// Individual configs that don't fit into groups\n\tprivate broadcastingActivityConfig = this.createConfigItem(true);\n\tprivate layoutRemoteParticipantsConfig = this.createConfigItem<ParticipantModel[] | undefined>(undefined);\n\n\t// General observables\n\ttoken$: Observable<string> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.token),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\tlivekitUrl$: Observable<string> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.livekitUrl),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\ttokenError$: Observable<any> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.tokenError),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\tminimal$: Observable<boolean> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.minimal),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\tparticipantName$: Observable<string> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.participantName),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\tprejoin$: Observable<boolean> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.prejoin),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\tprejoinDisplayParticipantName$: Observable<boolean> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.prejoinDisplayParticipantName),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\tshowDisconnectionDialog$: Observable<boolean> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.showDisconnectionDialog),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\n\tshowThemeSelector$: Observable<boolean> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.showThemeSelector),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\trecordingStreamBaseUrl$: Observable<string> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.recordingStreamBaseUrl),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\te2eeKey$: Observable<string | undefined> = this.generalConfig.observable$.pipe(\n\t\tmap((config) => config.e2eeKey),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t);\n\n\t// Stream observables\n\tvideoEnabled$: Observable<boolean> = this.streamConfig.observable$.pipe(map((config) => config.videoEnabled));\n\taudioEnabled$: Observable<boolean> = this.streamConfig.observable$.pipe(map((config) => config.audioEnabled));\n\tdisplayParticipantName$: Observable<boolean> = this.streamConfig.observable$.pipe(map((config) => config.displayParticipantName));\n\tdisplayAudioDetection$: Observable<boolean> = this.streamConfig.observable$.pipe(map((config) => config.displayAudioDetection));\n\tstreamVideoControls$: Observable<boolean> = this.streamConfig.observable$.pipe(map((config) => config.videoControls));\n\tparticipantItemMuteButton$: Observable<boolean> = this.streamConfig.observable$.pipe(map((config) => config.participantItemMuteButton));\n\n\t// Toolbar observables\n\tcameraButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.camera));\n\tmicrophoneButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.microphone));\n\tscreenshareButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.screenshare));\n\tfullscreenButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.fullscreen));\n\tcaptionsButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.captions));\n\ttoolbarSettingsButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.settings));\n\tleaveButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.leave));\n\tparticipantsPanelButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.participantsPanel));\n\tchatPanelButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.chatPanel));\n\tactivitiesPanelButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.activitiesPanel));\n\tdisplayRoomName$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.displayRoomName));\n\troomName$: Observable<string> = this.toolbarConfig.observable$.pipe(map((config) => config.roomName));\n\tbrandingLogo$: Observable<string> = this.toolbarConfig.observable$.pipe(map((config) => config.brandingLogo));\n\tdisplayLogo$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.displayLogo));\n\ttoolbarAdditionalButtonsPosition$: Observable<ToolbarAdditionalButtonsPosition> = this.toolbarConfig.observable$.pipe(\n\t\tmap((config) => config.additionalButtonsPosition)\n\t);\n\tbackgroundEffectsButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.backgroundEffects));\n\trecordingButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.recording));\n\ttoolbarViewRecordingsButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.viewRecordings));\n\tbroadcastingButton$: Observable<boolean> = this.toolbarConfig.observable$.pipe(map((config) => config.broadcasting));\n\n\t// Recording activity observables\n\trecordingActivity$: Observable<boolean> = this.recordingActivityConfig.observable$.pipe(map((config) => config.enabled));\n\trecordingActivityReadOnly$: Observable<boolean> = this.recordingActivityConfig.observable$.pipe(map((config) => config.readOnly));\n\trecordingActivityShowControls$: Observable<RecordingControls> = this.recordingActivityConfig.observable$.pipe(\n\t\tmap((config) => config.showControls)\n\t);\n\trecordingActivityStartStopRecordingButton$: Observable<boolean> = this.recordingActivityConfig.observable$.pipe(\n\t\tmap((config) => config.startStopButton)\n\t);\n\trecordingActivityViewRecordingsButton$: Observable<boolean> = this.recordingActivityConfig.observable$.pipe(\n\t\tmap((config) => config.viewRecordingsButton)\n\t);\n\trecordingActivityShowRecordingsList$: Observable<boolean> = this.recordingActivityConfig.observable$.pipe(\n\t\tmap((config) => config.showRecordingsList)\n\t);\n\n\t// Admin observables\n\tadminRecordingsList$: Observable<RecordingInfo[]> = this.adminConfig.observable$.pipe(map((config) => config.recordingsList));\n\tadminLoginError$: Observable<any> = this.adminConfig.observable$.pipe(map((config) => config.loginError));\n\tadminLoginTitle$: Observable<string> = this.adminConfig.observable$.pipe(map((config) => config.loginTitle));\n\tadminDashboardTitle$: Observable<string> = this.adminConfig.observable$.pipe(map((config) => config.dashboardTitle));\n\n\t// Individual observables that don't fit into groups\n\tbroadcastingActivity$: Observable<boolean> = this.broadcastingActivityConfig.observable$;\n\tlayoutRemoteParticipants$: Observable<ParticipantModel[] | undefined> = this.layoutRemoteParticipantsConfig.observable$;\n\n\tconstructor() {\n\t\t// Constructor no longer needed - all observables are initialized directly\n\t}\n\n\t// ============================================\n\t// BATCH UPDATE METHODS\n\t// ============================================\n\n\t/**\n\t * Update multiple general configuration properties at once\n\t */\n\tupdateGeneralConfig(partialConfig: Partial<GeneralConfig>): void {\n\t\tconst current = this.generalConfig.subject.getValue();\n\t\tthis.generalConfig.subject.next({ ...current, ...partialConfig });\n\t}\n\n\t/**\n\t * Update multiple toolbar configuration properties at once\n\t */\n\tupdateToolbarConfig(partialConfig: Partial<ToolbarConfig>): void {\n\t\tconst current = this.toolbarConfig.subject.getValue();\n\t\tthis.toolbarConfig.subject.next({ ...current, ...partialConfig });\n\t}\n\n\t/**\n\t * Update multiple stream configuration properties at once\n\t */\n\tupdateStreamConfig(partialConfig: Partial<StreamConfig>): void {\n\t\tconst current = this.streamConfig.subject.getValue();\n\t\tthis.streamConfig.subject.next({ ...current, ...partialConfig });\n\t}\n\n\t/**\n\t * Update multiple recording activity configuration properties at once\n\t */\n\tupdateRecordingActivityConfig(partialConfig: Partial<RecordingActivityConfig>): void {\n\t\tconst current = this.recordingActivityConfig.subject.getValue();\n\t\tthis.recordingActivityConfig.subject.next({ ...current, ...partialConfig });\n\t}\n\n\t/**\n\t * Update multiple admin configuration properties at once\n\t */\n\tupdateAdminConfig(partialConfig: Partial<AdminConfig>): void {\n\t\tconst current = this.adminConfig.subject.getValue();\n\t\tthis.adminConfig.subject.next({ ...current, ...partialConfig });\n\t}\n\n\t/**\n\t * Update recording controls specifically with batch support\n\t */\n\tupdateRecordingControls(partialControls: Partial<RecordingControls>): void {\n\t\tconst current = this.recordingActivityConfig.subject.getValue();\n\t\tconst updatedControls = { ...current.showControls, ...partialControls };\n\t\tthis.updateRecordingActivityConfig({ showControls: updatedControls });\n\t}\n\n\t// ============================================\n\t// DIRECT ACCESS METHODS (for internal use)\n\t// ============================================\n\n\t/**\n\t * @internal\n\t * Get current participant name directly\n\t */\n\tgetCurrentParticipantName(): string {\n\t\treturn this.generalConfig.subject.getValue().participantName;\n\t}\n\n\t// ============================================\n\t// INDIVIDUAL GETTER/SETTER METHODS\n\t// ============================================\n\n\t// General configuration methods\n\n\tgetLivekitUrl(): string {\n\t\treturn this.generalConfig.subject.getValue().livekitUrl;\n\t}\n\n\tshowPrejoin(): boolean {\n\t\treturn this.generalConfig.subject.getValue().prejoin;\n\t}\n\n\tgetShowDisconnectionDialog(): boolean {\n\t\treturn this.generalConfig.subject.getValue().showDisconnectionDialog;\n\t}\n\n\tgetRecordingStreamBaseUrl(): string {\n\t\tlet baseUrl = this.generalConfig.subject.getValue().recordingStreamBaseUrl;\n\t\t// Add trailing slash if not present\n\t\tbaseUrl += baseUrl.endsWith('/') ? '' : '/';\n\t\treturn baseUrl;\n\t}\n\n\tgetE2EEKey(): string | undefined {\n\t\treturn this.generalConfig.subject.getValue().e2eeKey;\n\t}\n\n\t// Stream configuration methods\n\n\tisVideoEnabled(): boolean {\n\t\treturn this.streamConfig.subject.getValue().videoEnabled;\n\t}\n\n\tisAudioEnabled(): boolean {\n\t\treturn this.streamConfig.subject.getValue().audioEnabled;\n\t}\n\n\t// Toolbar configuration methods\n\n\tgetRoomName(): string {\n\t\treturn this.toolbarConfig.subject.getValue().roomName;\n\t}\n\n\tsetBroadcastingButton(broadcastingButton: boolean) {\n\t\tthis.updateToolbarConfig({ broadcasting: broadcastingButton });\n\t}\n\n\tshowBackgroundEffectsButton(): boolean {\n\t\treturn this.toolbarConfig.subject.getValue().backgroundEffects;\n\t}\n\n\t// Activity methods (these remain individual as they don't fit cleanly into toolbar config)\n\n\tsetBroadcastingActivity(broadcastingActivity: boolean) {\n\t\tthis.broadcastingActivityConfig.subject.next(broadcastingActivity);\n\t}\n\n\t// Internals\n\tsetLayoutRemoteParticipants(participants: ParticipantModel[] | undefined) {\n\t\tthis.layoutRemoteParticipantsConfig.subject.next(participants);\n\t}\n\n\t// Recording Activity Configuration methods\n\n\tshowRecordingActivityRecordingsList(): boolean {\n\t\treturn this.recordingActivityConfig.subject.getValue().showRecordingsList;\n\t}\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { RecordingInfo, RecordingStatus, RecordingStatusInfo } from '../../models/recording.model';\nimport { ActionService } from '../action/action.service';\nimport { LoggerService } from '../logger/logger.service';\nimport { ILogger } from '../../models/logger.model';\nimport { OpenViduComponentsConfigService } from '../config/directive-config.service';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class RecordingService {\n\t/**\n\t * Recording status Observable which pushes the recording state in every update.\n\t */\n\trecordingStatusObs: Observable<RecordingStatusInfo>;\n\tprivate recordingTimeInterval: NodeJS.Timeout;\n\tprivate recordingStartTimestamp: number | null = null;\n\n\tprivate recordingStatus = <BehaviorSubject<RecordingStatusInfo>>new BehaviorSubject({\n\t\tstatus: RecordingStatus.STOPPED,\n\t\trecordingList: [] as RecordingInfo[],\n\t\tstartedAt: new Date(0, 0, 0, 0, 0, 0)\n\t});\n\tprivate log: ILogger;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate actionService: ActionService,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate loggerService: LoggerService\n\t) {\n\t\tthis.log = this.loggerService.get('RecordingService');\n\t\tthis.recordingStatusObs = this.recordingStatus.asObservable();\n\t}\n\n\t/**\n\t * Initializes the recording status with the given parameters and the timer to calculate the elapsed time.\n\t * @internal\n\t */\n\tsetRecordingStarted(recordingInfo?: RecordingInfo, startTimestamp?: number) {\n\t\t// Determine the actual start timestamp of the recording\n\t\t// Priority: startTimestamp parameter > recordingInfo.startedAt > current time\n\t\tthis.recordingStartTimestamp = startTimestamp || recordingInfo?.startedAt || Date.now();\n\n\t\tconst { recordingList } = this.recordingStatus.getValue();\n\t\tlet updatedRecordingList = [...recordingList];\n\n\t\tif (recordingInfo) {\n\t\t\tconst existingIndex = updatedRecordingList.findIndex((recording) => recording.id === recordingInfo.id);\n\t\t\tif (existingIndex !== -1) {\n\t\t\t\t// Replace existing recording info\n\t\t\t\tupdatedRecordingList[existingIndex] = recordingInfo;\n\t\t\t} else {\n\t\t\t\t// Add new recording info\n\t\t\t\tupdatedRecordingList = [recordingInfo, ...updatedRecordingList];\n\t\t\t}\n\t\t}\n\n\t\t// Calculate the elapsed time based on the actual start timestamp\n\t\tconst recordingElapsedTime = new Date(0, 0, 0, 0, 0, 0);\n\t\tif (this.recordingStartTimestamp) {\n\t\t\tconst elapsedSeconds = Math.floor((Date.now() - this.recordingStartTimestamp) / 1000);\n\t\t\trecordingElapsedTime.setSeconds(Math.max(0, elapsedSeconds)); // Ensure non-negative\n\t\t}\n\n\t\tthis.updateStatus({\n\t\t\tstatus: RecordingStatus.STARTED,\n\t\t\trecordingList: updatedRecordingList,\n\t\t\tstartedAt: recordingElapsedTime\n\t\t});\n\n\t\t// Start the timer after updating the initial state\n\t\tthis.startRecordingTimer();\n\t}\n\n\t/**\n\t * Stops the recording timer and updates the recording status to **stopped**.\n\t * @internal\n\t */\n\tsetRecordingStopped(recordingInfo?: RecordingInfo) {\n\t\tthis.stopRecordingTimer();\n\t\tconst { recordingList } = this.recordingStatus.getValue();\n\t\tlet updatedRecordingList = [...recordingList];\n\n\t\t// Update the recording list with the new recording info\n\t\tif (recordingInfo) {\n\t\t\tconst existingIndex = updatedRecordingList.findIndex((recording) => recording.id === recordingInfo.id);\n\t\t\tif (existingIndex !== -1) {\n\t\t\t\tupdatedRecordingList[existingIndex] = recordingInfo;\n\t\t\t} else {\n\t\t\t\tupdatedRecordingList = [recordingInfo, ...updatedRecordingList];\n\t\t\t}\n\t\t}\n\n\t\tthis.updateStatus({\n\t\t\tstatus: RecordingStatus.STOPPED,\n\t\t\trecordingList: updatedRecordingList,\n\t\t\tstartedAt: new Date(0, 0, 0, 0, 0, 0)\n\t\t});\n\n\t\tthis.recordingStartTimestamp = null;\n\t}\n\n\t/**\n\t * Set the {@link RecordingStatus} to **starting**.\n\t * The `started` stastus will be updated automatically when the recording is actually started.\n\t */\n\tsetRecordingStarting() {\n\t\tconst { recordingList, startedAt } = this.recordingStatus.getValue();\n\t\tthis.updateStatus({\n\t\t\tstatus: RecordingStatus.STARTING,\n\t\t\trecordingList,\n\t\t\tstartedAt\n\t\t});\n\t}\n\n\t/**\n\t * @internal\n\t * @param error\n\t */\n\tsetRecordingFailed(error: string) {\n\t\tthis.stopRecordingTimer();\n\t\tconst { startedAt, recordingList } = this.recordingStatus.getValue();\n\t\tconst statusInfo: RecordingStatusInfo = {\n\t\t\tstatus: RecordingStatus.FAILED,\n\t\t\trecordingList,\n\t\t\tstartedAt,\n\t\t\terror\n\t\t};\n\t\tthis.updateStatus(statusInfo);\n\t}\n\n\t/**\n\t * Set the {@link RecordingStatus} to **stopping**.\n\t * The `stopped` stastus will be updated automatically when the recording is actually stopped.\n\t */\n\tsetRecordingStopping() {\n\t\tconst { startedAt, recordingList } = this.recordingStatus.getValue();\n\n\t\tthis.updateStatus({\n\t\t\tstatus: RecordingStatus.STOPPING,\n\t\t\trecordingList,\n\t\t\tstartedAt\n\t\t});\n\t}\n\n\t/**\n\t * @internal\n\t * Play the recording blob received as parameter. This parameter must be obtained from backend using the OpenVidu REST API\n\t */\n\tplayRecording(recording: RecordingInfo) {\n\t\t// Only COMPOSED recording is supported. The extension will allways be 'mp4'.\n\t\tthis.log.d('Playing recording', recording);\n\t\tconst queryParamForAvoidCache = `?t=${new Date().getTime()}`;\n\t\tconst baseUrl = this.libService.getRecordingStreamBaseUrl();\n\t\tlet streamRecordingUrl = '';\n\t\tif (baseUrl === 'call/api/recordings/') {\n\t\t\t// Keep the compatibility with the old version\n\t\t\tstreamRecordingUrl = `${baseUrl}${recording.id}/stream${queryParamForAvoidCache}`;\n\t\t} else {\n\t\t\tstreamRecordingUrl = `${baseUrl}${recording.id}/media${queryParamForAvoidCache}`;\n\t\t}\n\t\tthis.actionService.openRecordingPlayerDialog(streamRecordingUrl);\n\t}\n\n\t/**\n\t * @internal\n\t * Download the the recording file received .\n\t * @param recording\n\t */\n\tdownloadRecording(recording: RecordingInfo) {\n\t\t// Only COMPOSED recording is supported. The extension will allways be 'mp4'.\n\t\tconst queryParamForAvoidCache = `?t=${new Date().getTime()}`;\n\t\tconst link = document.createElement('a');\n\t\tconst baseUrl = this.libService.getRecordingStreamBaseUrl();\n\t\tif (baseUrl === 'call/api/recordings/') {\n\t\t\t// Keep the compatibility with the old version\n\t\t\tlink.href = `${baseUrl}${recording.id}/stream${queryParamForAvoidCache}`;\n\t\t} else {\n\t\t\tlink.href = `${baseUrl}${recording.id}/media${queryParamForAvoidCache}`;\n\t\t}\n\t\tlink.download = recording.filename || 'openvidu-recording.mp4';\n\t\tlink.dispatchEvent(\n\t\t\tnew MouseEvent('click', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tview: window\n\t\t\t})\n\t\t);\n\t\t// For Firefox it is necessary to delay revoking the ObjectURL\n\t\tsetTimeout(() => link.remove(), 100);\n\t}\n\n\t/**\n\t * Deletes a recording from the recording list.\n\t *\n\t * @param recording - The recording to be deleted.\n\t * @internal\n\t */\n\tdeleteRecording(recording: RecordingInfo) {\n\t\tconst { recordingList, status, startedAt } = this.recordingStatus.getValue();\n\t\tconst updatedList = recordingList.filter((item) => item.id !== recording.id);\n\n\t\tif (updatedList.length !== recordingList.length) {\n\t\t\tthis.updateStatus({\n\t\t\t\tstatus,\n\t\t\t\trecordingList: updatedList,\n\t\t\t\tstartedAt\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t *\n\t * @param recordings\n\t * @internal\n\t */\n\tsetRecordingList(recordings: RecordingInfo[]) {\n\t\tconst { status, startedAt, error } = this.recordingStatus.getValue();\n\t\tthis.updateStatus({\n\t\t\tstatus,\n\t\t\trecordingList: recordings,\n\t\t\tstartedAt,\n\t\t\terror\n\t\t});\n\t}\n\n\t/**\n\t * Updates the recording status.\n\t * @param status {@link RecordingStatus}\n\t */\n\tprivate updateStatus(statusInfo: RecordingStatusInfo) {\n\t\tconst { status, recordingList, error, startedAt } = statusInfo;\n\t\tthis.recordingStatus.next({\n\t\t\tstatus,\n\t\t\trecordingList,\n\t\t\tstartedAt,\n\t\t\terror\n\t\t});\n\t}\n\n\tprivate startRecordingTimer() {\n\t\t// Don't override the timestamp if it's already set correctly\n\t\tif (this.recordingStartTimestamp === null) {\n\t\t\tthis.recordingStartTimestamp = Date.now();\n\t\t}\n\n\t\tif (this.recordingTimeInterval) {\n\t\t\tclearInterval(this.recordingTimeInterval);\n\t\t}\n\n\t\tthis.recordingTimeInterval = setInterval(() => {\n\t\t\tif (!this.recordingStartTimestamp) return;\n\n\t\t\t// Calculate elapsed time based on the actual recording start timestamp\n\t\t\tconst elapsedSeconds = Math.floor((Date.now() - this.recordingStartTimestamp) / 1000);\n\t\t\tconst startedAt = new Date(0, 0, 0, 0, 0, 0);\n\t\t\tstartedAt.setSeconds(Math.max(0, elapsedSeconds)); // Ensure non-negative\n\n\t\t\tconst { recordingList, status } = this.recordingStatus.getValue();\n\t\t\tthis.updateStatus({\n\t\t\t\tstatus,\n\t\t\t\trecordingList,\n\t\t\t\tstartedAt\n\t\t\t});\n\t\t}, 1000);\n\t}\n\n\tprivate stopRecordingTimer() {\n\t\tif (this.recordingTimeInterval) {\n\t\t\tclearInterval(this.recordingTimeInterval);\n\t\t}\n\t\tconst { recordingList, status, error } = this.recordingStatus.getValue();\n\t\tconst statusInfo: RecordingStatusInfo = {\n\t\t\tstatus,\n\t\t\trecordingList,\n\t\t\tstartedAt: new Date(0, 0, 0, 0, 0, 0), // Reset elapsed time when stopped\n\t\t\terror\n\t\t};\n\t\tthis.updateStatus(statusInfo);\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * @internal\n */\n@Pipe({\n\tname: 'duration',\n\tstandalone: false\n})\nexport class DurationFromSecondsPipe implements PipeTransform {\n\ttransform(durationInSeconds: number): string {\n\t\tif (durationInSeconds < 60) {\n\t\t\treturn `${Math.floor(durationInSeconds)}s`;\n\t\t} else if (durationInSeconds < 3600) {\n\t\t\tconst minutes = Math.floor(durationInSeconds / 60);\n\t\t\tconst seconds = Math.floor(durationInSeconds % 60);\n\t\t\treturn `${minutes}m ${seconds}s`;\n\t\t} else {\n\t\t\tconst hours = Math.floor(durationInSeconds / 3600);\n\t\t\tconst minutes = Math.floor((durationInSeconds - hours * 3600) / 60);\n\t\t\treturn `${hours}h ${minutes}m`;\n\t\t}\n\t}\n}\n\n/**\n * @internal\n */\n@Pipe({\n\tname: 'searchByStringProperty',\n\tstandalone: false\n})\nexport class SearchByStringPropertyPipe implements PipeTransform {\n\ttransform(items: any[], props: { properties: string[]; filter: string }): any {\n\t\tif (!items || !props || props.properties.length === 0 || !props.filter) {\n\t\t\treturn items;\n\t\t}\n\t\treturn items.filter((item) => {\n\t\t\treturn props.properties.some((prop) => {\n\t\t\t\tconst multipleProps = prop.split('.');\n\t\t\t\tlet recursiveProp = item;\n\t\t\t\ttry {\n\t\t\t\t\tmultipleProps.forEach((p) => {\n\t\t\t\t\t\trecursiveProp = recursiveProp[p];\n\t\t\t\t\t\tif (recursiveProp === null || recursiveProp === undefined) {\n\t\t\t\t\t\t\tthrow new Error('Property not found');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn recursiveProp.indexOf(props.filter) !== -1;\n\t\t\t});\n\t\t});\n\t}\n}\n\n/**\n * @internal\n */\n@Pipe({\n\tname: 'thumbnailUrl',\n\tstandalone: false\n})\nexport class ThumbnailFromUrlPipe implements PipeTransform {\n\ttransform(url: string): string {\n\t\tconst lastPart = url.split('/').pop();\n\t\tconst isMp4 = url.includes('.mp4');\n\n\t\tif (!lastPart || !isMp4) return url;\n\n\t\treturn `recordings/${lastPart.split('.')[0]}/${lastPart.replace('mp4', 'jpg')}`;\n\t}\n}\n","import { Component, OnInit, Output, EventEmitter, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { RecordingDeleteRequestedEvent, RecordingInfo, RecordingStatus } from '../../models/recording.model';\nimport { ActionService } from '../../services/action/action.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { RecordingService } from '../../services/recording/recording.service';\n\n@Component({\n\tselector: 'ov-admin-dashboard',\n\ttemplateUrl: './admin-dashboard.component.html',\n\tstyleUrls: ['./admin-dashboard.component.scss'],\n\tstandalone: false\n})\nexport class AdminDashboardComponent implements OnInit, OnDestroy {\n\t/**\n\t * Provides event notifications that fire when delete recording button has been clicked.\n\t * The recording should be deleted using the REST API.\n\t * @param recordingId\n\t */\n\t@Output() onRecordingDeleteRequested: EventEmitter<RecordingDeleteRequestedEvent> = new EventEmitter<RecordingDeleteRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when refresh recordings button has been clicked.\n\t * The recordings should be updated using the REST API.\n\t */\n\t@Output() onRefreshRecordingsRequested: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when load more button has been clicked.\n\t * The recordings should be updated using the REST API with the continuation token.\n\t */\n\t@Output() onLoadMoreRecordingsRequested: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when logout button has been clicked.\n\t */\n\t@Output() onLogoutRequested: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * @internal\n\t */\n\ttitle = '';\n\n\t/**\n\t * @internal\n\t */\n\trecordings: RecordingInfo[] = [];\n\t/**\n\t * @internal\n\t */\n\tsortDescendent = true;\n\t/**\n\t * @internal\n\t */\n\tsortByLegend = 'Sort by';\n\t/**\n\t * @internal\n\t */\n\tsearchValue = '';\n\t/**\n\t * @internal\n\t */\n\trecordingStatusEnum = RecordingStatus;\n\tprivate recordingsSub: Subscription;\n\tprivate titleSub: Subscription;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate actionService: ActionService,\n\t\tprivate recordingService: RecordingService,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @internal\n\t */\n\tngOnInit(): void {\n\t\tthis.subscribeToAdminDirectives();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngOnDestroy() {\n\t\tif (this.recordingsSub) this.recordingsSub.unsubscribe();\n\t\tif (this.titleSub) this.titleSub.unsubscribe();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tlogout() {\n\t\tthis.onLogoutRequested.emit();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\trefreshRecordings() {\n\t\tthis.recordings = [];\n\t\tthis.onRefreshRecordingsRequested.emit();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsortRecordingsByDateStart() {\n\t\tthis.recordings.sort((a, b) => {\n\t\t\tif (!a.startedAt || !b.startedAt) return 0;\n\t\t\tif (a.startedAt > b.startedAt) {\n\t\t\t\treturn this.sortDescendent ? -1 : 1;\n\t\t\t} else if (a.startedAt < b.startedAt) {\n\t\t\t\treturn this.sortDescendent ? 1 : -1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t\tthis.sortByLegend = 'Start Date';\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsortRecordingsByDateEnd() {\n\t\tthis.recordings.sort((a, b) => {\n\t\t\tif (!a.endedAt || !b.endedAt) return 0;\n\t\t\tif (a.endedAt > b.endedAt) {\n\t\t\t\treturn this.sortDescendent ? -1 : 1;\n\t\t\t} else if (a.endedAt < b.endedAt) {\n\t\t\t\treturn this.sortDescendent ? 1 : -1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t\tthis.sortByLegend = 'End Date';\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsortRecordingsByDuration() {\n\t\tthis.recordings.sort((a, b) => {\n\t\t\tif (!a.duration || !b.duration) return 0;\n\t\t\tif (a.duration > b.duration) {\n\t\t\t\treturn this.sortDescendent ? -1 : 1;\n\t\t\t} else if (a.duration < b.duration) {\n\t\t\t\treturn this.sortDescendent ? 1 : -1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t\tthis.sortByLegend = 'Duration';\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsortRecordingsBySize() {\n\t\tthis.recordings.sort((a, b) => {\n\t\t\tif (!a.size || !b.size) return 0;\n\t\t\tif (a.size > b.size) {\n\t\t\t\treturn this.sortDescendent ? -1 : 1;\n\t\t\t} else if (a.size < b.size) {\n\t\t\t\treturn this.sortDescendent ? 1 : -1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t\tthis.sortByLegend = 'Size';\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tloadMore(event: any) {\n\t\tif (event) {\n\t\t\tthis.onLoadMoreRecordingsRequested.emit();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tdeleteRecording(recording: RecordingInfo) {\n\t\tconst succsessCallback = async () => {\n\t\t\tif (!recording.id) {\n\t\t\t\tthrow new Error('Error deleting recording. Recording id is undefined');\n\t\t\t}\n\t\t\tconst payload: RecordingDeleteRequestedEvent = {\n\t\t\t\troomName: recording.roomName,\n\t\t\t\trecordingId: recording.id\n\t\t\t};\n\t\t\tthis.onRecordingDeleteRequested.emit(payload);\n\t\t\t//mark the recording as deleted\n\t\t\trecording.markedForDeletion = true;\n\t\t};\n\n\t\tthis.actionService.openDeleteRecordingDialog(succsessCallback);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tdownload(recording: RecordingInfo) {\n\t\tthis.recordingService.downloadRecording(recording);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tasync play(recording: RecordingInfo) {\n\t\tthis.recordingService.playRecording(recording);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\ttrackByRecordingId(index: number, recording: any): any {\n\t\treturn recording.id;\n\t}\n\n\tprivate filterDeletedRecordings(recordings: RecordingInfo[]) {\n\t\tthis.recordings = this.recordings.filter(\n\t\t  (recording) => !recording.markedForDeletion && recordings.some((r) => r.id === recording.id)\n\t\t);\n\t  }\n\n\t  private mergeRecordings(recordings: RecordingInfo[]) {\n\t\tconst recordingMap = new Map(this.recordings.map((recording) => [recording.id, recording]));\n\t\trecordings.forEach((recording) => recordingMap.set(recording.id, recording));\n\t\tthis.recordings = Array.from(recordingMap.values());\n\t  }\n\n\tprivate sortRecordings() {\n\t\tswitch (this.sortByLegend) {\n\t\t\tcase 'End Date':\n\t\t\t\tthis.sortRecordingsByDateEnd();\n\t\t\t\tbreak;\n\t\t\tcase 'Start Date':\n\t\t\t\tthis.sortRecordingsByDateStart();\n\t\t\t\tbreak;\n\t\t\tcase 'Duration':\n\t\t\t\tthis.sortRecordingsByDuration();\n\t\t\t\tbreak;\n\t\t\tcase 'Size':\n\t\t\t\tthis.sortRecordingsBySize();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.sortRecordingsByDateEnd();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate subscribeToAdminDirectives() {\n\t\tthis.recordingsSub = this.libService.adminRecordingsList$.subscribe((recordings: RecordingInfo[]) => {\n\n\t\t\t// Remove the recordings that are marked for deletion\n\t\t\tthis.filterDeletedRecordings(recordings);\n\n\t\t\t// Merge the new recordings and avoid duplicates\n\t\t\tthis.mergeRecordings(recordings);\n\n\t\t\tthis.sortRecordings();\n\t\t});\n\n\t\tthis.titleSub = this.libService.adminDashboardTitle$.subscribe((value) => {\n\t\t\tthis.title = value;\n\t\t});\n\t}\n}\n","<div class=\"dashboard-container\">\n\t<mat-toolbar class=\"header\">\n\t\t<span>{{ title || ('ADMIN.DASHBOARD_TITLE' | translate) }}</span>\n\t\t<span class=\"toolbar-spacer\"></span>\n\n\t\t<button class=\"logout-btn\" mat-icon-button aria-label=\"Refresh\" (click)=\"logout()\">\n\t\t\t<mat-icon>logout</mat-icon>\n\t\t</button>\n\t</mat-toolbar>\n\n\t<div class=\"dashboard-body\">\n\t\t<mat-toolbar id=\"toolbar-search\">\n\t\t\t<div class=\"search-bar\">\n\t\t\t\t<textarea\n\t\t\t\t\tid=\"search-input\"\n\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\trows=\"4\"\n\t\t\t\t\tplaceholder=\"{{ 'ADMIN.RECORDINGS.SEARCH' | translate }}\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t[(ngModel)]=\"searchValue\"\n\t\t\t\t></textarea>\n\t\t\t\t<button *ngIf=\"searchValue\" class=\"searchbar-btn\" mat-icon-button aria-label=\"Clear\" (click)=\"searchValue = ''\">\n\t\t\t\t\t<mat-icon>close</mat-icon>\n\t\t\t\t</button>\n\t\t\t\t<button *ngIf=\"!searchValue\" class=\"searchbar-btn\" mat-icon-button aria-label=\"Search\">\n\t\t\t\t\t<mat-icon>search</mat-icon>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<button id=\"sort-menu-btn\" color=\"primary\" mat-flat-button [matMenuTriggerFor]=\"sortMenu\">\n\t\t\t\t{{ sortByLegend }}\n\t\t\t\t<mat-icon>arrow_drop_down</mat-icon>\n\t\t\t</button>\n\n\t\t\t<mat-menu #sortMenu=\"matMenu\">\n\t\t\t\t<button mat-menu-item class=\"order-select-btn\" (click)=\"sortRecordingsByDateStart()\">\n\t\t\t\t\t{{ 'ADMIN.RECORDINGS.DATE_START' | translate }}\n\t\t\t\t</button>\n\t\t\t\t<button mat-menu-item class=\"order-select-btn\" (click)=\"sortRecordingsByDateEnd()\">\n\t\t\t\t\t{{ 'ADMIN.RECORDINGS.DATE_END' | translate }}\n\t\t\t\t</button>\n\t\t\t\t<button mat-menu-item class=\"order-select-btn\" (click)=\"sortRecordingsByDuration()\">\n\t\t\t\t\t{{ 'ADMIN.RECORDINGS.DURATION' | translate }}\n\t\t\t\t</button>\n\t\t\t\t<button mat-menu-item class=\"order-select-btn\" (click)=\"sortRecordingsBySize()\">\n\t\t\t\t\t{{ 'ADMIN.RECORDINGS.SIZE' | translate }}\n\t\t\t\t</button>\n\t\t\t</mat-menu>\n\n\t\t\t<span class=\"toolbar-spacer\"></span>\n\n\t\t\t<button mat-icon-button aria-label=\"Refresh\" (click)=\"refreshRecordings()\">\n\t\t\t\t<mat-icon>refresh</mat-icon>\n\t\t\t</button>\n\t\t</mat-toolbar>\n\n\t\t<div class=\"recordings-container\">\n\t\t\t<div *ngIf=\"!recordings || recordings.length === 0\" class=\"no-recordings-warn\">\n\t\t\t\t<span>{{ 'ADMIN.RECORDINGS.EMPTY' | translate }}</span>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\t*ngFor=\"\n\t\t\t\t\tlet recording of recordings\n\t\t\t\t\t\t| searchByStringProperty: { properties: ['roomName', 'filename', 'outputMode'], filter: searchValue };\n\t\t\t\t\ttrackBy: trackByRecordingId\n\t\t\t\t\"\n\t\t\t\tclass=\"recording-card\"\n\t\t\t>\n\t\t\t\t<mat-card appearance=\"outlined\" class=\"card\">\n\t\t\t\t\t<mat-card-content>\n\t\t\t\t\t\t<div class=\"video-div-container\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc=\"data:image/png;base64,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VMq6zTgPA0qcHCgylbJuMx8DoNAPReYuObcZI1Wg2CdF5k4Zt5kXAVDg8Zs0ADuKzIjazGwAFPiuyHQk1zaz9jIAbjtUZDqVZ5txHgYU2VRkOpZlm/kZALd8VWS6kGObmTZSBW47U2S6lF2bmQ+Am+YUmRFqzByN9e1DANzwdEqR6VpmbaYZADfsKTK9yKvNPAuAdkuKzMj13WZmAqDN8o4ik4E+28xkALR5rcjkYX7FeRgwOKeKTCYu2ozzMGBQdhWZbPTRZsYDoMW3HorMcdAiizaz1giAa/uKTFZ6bjMTAXBtIXXnwbtgqB7OjvViPQCubKeubG4EhUbeZprOw4Brv1IXDg6Xg2KjbzOLAfDPuSKTpR7azFYAXDqZUmQy9aQ51p2VALi0ochkq7F1ZKQKv9m7Y5UGgigMo1cEKxFkxYhRWMyCmkKwsBCVrQSjnWJlY2NhF3yMFD6zrpWgyW5SzSznPMQUHzP/sJp7RSZhZWE8DFjF8ZEik7Sl2kwRAD9OFZnELdVmqgBoTBSZ5C3RZoYB0DhTZDLQuc28BcC3l9Ydmakik4Dd85P1LraNhwGNO0UmEx3bzF4ARDwrMtno1GbqAIiYKDL56NJmBgEQMV2b61ORSU6HNlMGQLzOLTLjIEHDgUeqQLur/2fDnh4VmUS1tZnbAJgzLfOhyCSsLIyHAW2uL9yRyc7CNjMKgIg7RSY/Ve0nVaDFzKulDJWFZUhgsfGlOzIZGg4c7sBC77P9tcbDzXGQjaqWZYAWh6fjjasgL+WW1V+AHvrbZgZ2IQGyV9VuQgL0ULnltw6AHvrVZuqdAKAfqvPt9UZxEAD0x87BaLRpVQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgC/24EAAAAAAAMj/tRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYU9OBAAAAAAAPJ/bQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWEPDgQAAAAAgPxfG0FVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdiDAwEAAAAAIP/XRlBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFfbgQAAAAAAAyP+1EVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhT04EAAAAAAA8n9tBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYQ8OBAAAAACA/F8bQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVNgpGwSgYBaNgFDAAAL2hiP3OAIFCAAAAAElFTkSuQmCC\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div class=\"video-btns\">\n\t\t\t\t\t\t\t\t<button *ngIf=\"recording.status === recordingStatusEnum.READY\" mat-icon-button (click)=\"play(recording)\">\n\t\t\t\t\t\t\t\t\t<mat-icon id=\"play\" aria-label=\"Play\" title=\"{{ 'PANEL.RECORDING.PLAY' | translate }}\"\n\t\t\t\t\t\t\t\t\t\t>play_arrow</mat-icon\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t(click)=\"download(recording)\"\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\t(recording.location && recording.status === recordingStatusEnum.READY) ||\n\t\t\t\t\t\t\t\t\t\trecording.status === recordingStatusEnum.FAILED\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\taria-label=\"Download\"\n\t\t\t\t\t\t\t\t\ttitle=\"{{ 'PANEL.RECORDING.DOWNLOAD' | translate }}\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon id=\"download\">download</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\tclass=\"delete-recording-btn\"\n\t\t\t\t\t\t\t\t\t(click)=\"deleteRecording(recording)\"\n\t\t\t\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\t\t\t\trecording.status === recordingStatusEnum.READY || recording.status === recordingStatusEnum.FAILED\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<mat-icon id=\"delete\" aria-label=\"Delete\" title=\"{{ 'PANEL.RECORDING.DELETE' | translate }}\"\n\t\t\t\t\t\t\t\t\t\t>delete</mat-icon\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"video-info-container\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.NAME' | translate }}</span\n\t\t\t\t\t\t\t\t\t><span class=\"video-card-value\">{{ recording.filename }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.ROOM' | translate }}</span\n\t\t\t\t\t\t\t\t\t><span class=\"video-card-value\">{{ recording.roomName }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.OUTPUT' | translate }}</span\n\t\t\t\t\t\t\t\t\t><span class=\"video-card-value\">{{ recording.outputMode }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.DATE_START' | translate }}</span\n\t\t\t\t\t\t\t\t\t><span class=\"video-card-value\">{{ recording.startedAt | date: 'M/d/yy, H:mm:ss' }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.DATE_END' | translate }}</span\n\t\t\t\t\t\t\t\t\t><span class=\"video-card-value\">{{ recording.endedAt | date: 'M/d/yy, H:mm:ss' }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.DURATION' | translate }}</span\n\t\t\t\t\t\t\t\t\t><span class=\"video-card-value\">{{ recording.duration | duration }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.SIZE' | translate }}</span\n\t\t\t\t\t\t\t\t\t><span class=\"video-card-value\">{{ recording.size / 1024 / 1024 | number: '1.1-2' }} MB</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"video-div-tag\" style=\"margin-top: 11px\">\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-tag\">{{ 'ADMIN.RECORDINGS.STATUS' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span class=\"video-card-value status-value\" [ngClass]=\"recording.status\">{{ recording.status }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</mat-card-content>\n\t\t\t\t</mat-card>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"load-more-container\">\n\t\t\t<button mat-fab extended class=\"load-more-btn\" (click)=\"loadMore($event)\">\n\t\t\t\t<mat-icon>keyboard_double_arrow_down</mat-icon>\n\t\t\t\t{{ 'ADMIN.LOAD_MORE' | translate }}\n\t\t\t</button>\n\t\t</div>\n\t</div>\n\n\t<mat-toolbar class=\"footer\" id=\"footer\" role=\"heading\">\n\t\t<span>{{ 'ADMIN.POWERED_BY' | translate }}</span>\n\t\t<a href=\"https://openvidu.io/\">OpenVidu</a>\n\t</mat-toolbar>\n</div>\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { Validators, FormGroup, FormBuilder } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { ActionService } from '../../services/action/action.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\n\n@Component({\n\tselector: 'ov-admin-login',\n\ttemplateUrl: './admin-login.component.html',\n\tstyleUrls: ['./admin-login.component.scss'],\n\tstandalone: false\n})\nexport class AdminLoginComponent implements OnInit {\n\t/**\n\t * Provides event notifications that fire when login button has been clicked.\n\t * The event will contain the credentials value.\n\t * @returns {EventEmitter<{ username: string; password: string }>}\n\t */\n\t@Output() onLoginRequested: EventEmitter<{ username: string; password: string }> = new EventEmitter<{\n\t\tusername: string;\n\t\tpassword: string;\n\t}>();\n\n\t/**\n\t * @internal\n\t */\n\ttitle: string;\n\n\t/**\n\t * @internal\n\t */\n\tloading = false;\n\n\t/**\n\t * @internal\n\t */\n\tshowSpinner = false;\n\n\t/**\n\t * @internal\n\t */\n\tloginForm: FormGroup;\n\n\tprivate errorSub: Subscription;\n\tprivate titleSub: Subscription;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate actionService: ActionService,\n\t\tprivate fb: FormBuilder\n\t) {\n\t\tthis.loginForm = this.fb.group({\n\t\t\tusername: ['', [Validators.required, Validators.minLength(4)]],\n\t\t\tpassword: ['', [Validators.required, Validators.minLength(4)]]\n\t\t});\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngOnInit() {\n\t\tthis.subscribeToAdminLoginDirectives();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngOnDestroy() {\n\t\tthis.showSpinner = false;\n\t\tif (this.errorSub) this.errorSub.unsubscribe();\n\t\tif (this.titleSub) this.titleSub.unsubscribe();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tlogin() {\n\t\tif (this.loginForm.invalid) return;\n\t\tthis.showSpinner = true;\n\t\tthis.onLoginRequested.emit(this.loginForm.value);\n\t}\n\n\tprivate subscribeToAdminLoginDirectives() {\n\t\tthis.errorSub = this.libService.adminLoginError$.subscribe((value) => {\n\t\t\tconst errorExists = !!value;\n\t\t\tif (errorExists) {\n\t\t\t\tthis.showSpinner = false;\n\t\t\t\tthis.actionService.openDialog(value.error, value.message, true);\n\t\t\t}\n\t\t});\n\n\t\tthis.titleSub = this.libService.adminLoginTitle$.subscribe((value) => {\n\t\t\tthis.title = value;\n\t\t});\n\t}\n}\n","<mat-toolbar class=\"header\"> {{ title || ('ADMIN.DASHBOARD_TITLE' | translate) }} </mat-toolbar>\n\n<div class=\"center-container\">\n\t<div *ngIf=\"loading\" class=\"outer\">\n\t\t<div class=\"middle\">\n\t\t\t<div class=\"inner\">\n\t\t\t\t<mat-spinner [diameter]=\"50\"></mat-spinner>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<mat-card *ngIf=\"!loading\" class=\"card-container\" appearance=\"outlined\">\n\t\t<mat-card-content>\n\t\t\t<form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\">\n\t\t\t\t<mat-form-field appearance=\"outline\" class=\"form-field\">\n\t\t\t\t\t<mat-label>{{ 'ADMIN.USERNAME' | translate }}</mat-label>\n\t\t\t\t\t<input matInput formControlName=\"username\" type=\"text\" name=\"username\" />\n\t\t\t\t\t<mat-error *ngIf=\"loginForm.get('username')?.hasError('required')\">\n\t\t\t\t\t\t{{ 'ADMIN.USERNAME_REQUIRED' | translate }}\n\t\t\t\t\t</mat-error>\n\t\t\t\t</mat-form-field>\n\t\t\t\t<mat-form-field appearance=\"outline\" class=\"form-field\">\n\t\t\t\t\t<mat-label>{{ 'ADMIN.PASSWORD' | translate }}</mat-label>\n\t\t\t\t\t<input matInput formControlName=\"password\" type=\"password\" name=\"password\" autocomplete=\"current-password\" />\n\t\t\t\t\t<mat-error *ngIf=\"loginForm.get('password')?.hasError('required')\">\n\t\t\t\t\t\t{{ 'ADMIN.PASSWORD_REQUIRED' | translate }}\n\t\t\t\t\t</mat-error>\n\t\t\t\t</mat-form-field>\n\t\t\t\t<div class=\"col-12 d-flex text-center\">\n\t\t\t\t\t<button mat-flat-button disableRipple class=\"form-btn\" type=\"submit\">\n\t\t\t\t\t\t{{ 'ADMIN.LOGIN' | translate }}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</mat-card-content>\n\t</mat-card>\n</div>\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { Component } from '@angular/core';\n\n/**\n * Component to display a landscape orientation warning on mobile devices.\n * @internal\n */\n@Component({\n\tselector: 'ov-landscape-warning',\n\ttemplateUrl: './landscape-warning.component.html',\n\tstyleUrl: './landscape-warning.component.scss',\n\tstandalone: false,\n\tanimations: [\n\t\ttrigger('inOutAnimation', [\n\t\t\ttransition(':enter', [style({ opacity: 0 }), animate('200ms', style({ opacity: 1 }))]),\n\t\t\ttransition(':leave', [animate('200ms', style({ opacity: 0 }))])\n\t\t])\n\t]\n})\nexport class LandscapeWarningComponent {}\n","<!-- Landscape orientation warning for mobile devices -->\n<div id=\"landscape-warning\" [@inOutAnimation]>\n\t<div class=\"warning-message\">\n\t\t<mat-icon class=\"warning-icon\">screen_rotation</mat-icon>\n\t\t<span>{{ 'ROOM.LANDSCAPE_WARNING' | translate }}</span>\n\t</div>\n</div>\n","/**\n * The ***ovPreJoin** directive empowers you to substitute the default pre-join component template with a custom one.\n * This directive allows you to create a completely custom pre-join experience while maintaining the core functionality.\n *\n * In the example below, we demonstrate how to replace the pre-join template with a custom one that includes\n * device selection and a custom join button.\n *\n * <!--ovPreJoin-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n * import { FormsModule } from '@angular/forms';\n *\n * import {\n * \tDeviceService,\n * \tParticipantService,\n * \tOpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t\t(onReadyToJoin)=\"onReadyToJoin()\"\n * \t\t>\n * \t\t\t<!-- Custom Pre-Join Component -->\n * \t\t\t<div *ovPreJoin class=\"custom-prejoin\">\n * \t\t\t\t<h2>Join Meeting</h2>\n * \t\t\t\t<div class=\"prejoin-form\">\n * \t\t\t\t\t<input\n * \t\t\t\t\t\ttype=\"text\"\n * \t\t\t\t\t\tplaceholder=\"Enter your name\"\n * \t\t\t\t\t\t[(ngModel)]=\"participantName\"\n * \t\t\t\t\t\tclass=\"name-input\"\n * \t\t\t\t\t/>\n * \t\t\t\t\t<button\n * \t\t\t\t\t\t(click)=\"joinMeeting()\"\n * \t\t\t\t\t\t[disabled]=\"!participantName\"\n * \t\t\t\t\t\tclass=\"join-button\"\n * \t\t\t\t\t>\n * \t\t\t\t\t\tJoin Meeting\n * \t\t\t\t\t</button>\n * \t\t\t\t</div>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\t.custom-prejoin {\n * \t\t\tdisplay: flex;\n * \t\t\tflex-direction: column;\n * \t\t\talign-items: center;\n * \t\t\tjustify-content: center;\n * \t\t\theight: 100vh;\n * \t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n * \t\t\tcolor: white;\n * \t\t}\n * \t\t.prejoin-form {\n * \t\t\tdisplay: flex;\n * \t\t\tflex-direction: column;\n * \t\t\tgap: 20px;\n * \t\t\talign-items: center;\n * \t\t}\n * \t\t.name-input {\n * \t\t\tpadding: 12px;\n * \t\t\tborder: none;\n * \t\t\tborder-radius: 8px;\n * \t\t\tfont-size: 16px;\n * \t\t\tmin-width: 250px;\n * \t\t}\n * \t\t.join-button {\n * \t\t\tpadding: 12px 24px;\n * \t\t\tbackground: #4CAF50;\n * \t\t\tcolor: white;\n * \t\t\tborder: none;\n * \t\t\tborder-radius: 8px;\n * \t\t\tfont-size: 16px;\n * \t\t\tcursor: pointer;\n * \t\t\ttransition: background 0.3s;\n * \t\t}\n * \t\t.join-button:hover:not(:disabled) {\n * \t\t\tbackground: #45a049;\n * \t\t}\n * \t\t.join-button:disabled {\n * \t\t\tbackground: #cccccc;\n * \t\t\tcursor: not-allowed;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule, FormsModule],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'custom-prejoin';\n * \ttoken!: string;\n * \tparticipantName: string = '';\n *\n * \tconstructor(\n * \t\tprivate httpClient: HttpClient,\n * \t\tprivate deviceService: DeviceService,\n * \t\tprivate participantService: ParticipantService\n * \t) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Function called when ready to join\n * \tonReadyToJoin() {\n * \t\tconsole.log('Ready to join the meeting');\n * \t}\n *\n * \t// Function to join the meeting\n * \tasync joinMeeting() {\n * \t\tif (this.participantName.trim()) {\n * \t\t\t// Request token with the participant name\n * \t\t\tawait this.onTokenRequested(this.participantName);\n * \t\t}\n * \t}\n *\n * \t// Function to get a token from the server\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovPreJoin-end-tutorial-->\n *\n * @internal\n */\n\nimport { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\n\n@Directive({\n\tselector: '[ovPreJoin]',\n\tstandalone: false\n})\nexport class PreJoinDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovParticipantPanelAfterLocalParticipant** directive allows you to inject custom HTML or Angular templates\n * immediately after the local participant item in the participant panel.\n * This enables you to extend the participant panel with additional controls, information, or UI elements.\n *\n * Usage example:\n * ```html\n * <ov-participant-panel>\n *   <ng-container *ovParticipantPanelAfterLocalParticipant>\n *     <div class=\"custom-content\">\n *       <!-- Your custom HTML here -->\n *       <span>Custom content after local participant</span>\n *     </div>\n *   </ng-container>\n * </ov-participant-panel>\n * ```\n */\n@Directive({\n\tselector: '[ovParticipantPanelAfterLocalParticipant]',\n\tstandalone: false\n})\nexport class ParticipantPanelAfterLocalParticipantDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovLeaveButton** directive allows you to inject a custom leave button template. You can use the toolbarLeaveButton = false for\n * replacing the default leave button with your custom one.\n *\n * Usage example:\n * ```html\n * <ov-videoconference [toolbarLeaveButton]=\"false\">\n *   <ng-container *ovLeaveButton>\n *     <button class=\"my-leave-button\" (click)=\"customLeave()\">\n *       Leave meeting\n *     </button>\n *   </ng-container>\n * </ov-videoconference>\n * ```\n */\n@Directive({\n\tselector: '[ovToolbarLeaveButton]',\n\tstandalone: false\n})\nexport class LeaveButtonDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovLayoutAdditionalElements** directive allows you to inject custom HTML or Angular templates\n * as additional layout elements within the videoconference UI.\n * This enables you to extend the layout with extra controls, banners, or any custom UI.\n *\n * You can specify a slot to control where the element is positioned:\n * - 'top': Position at the top of the layout (after local participant, before remote participants)\n * - 'bottom': Position at the bottom of the layout (after all participants)\n * - 'default' or no slot: Position after local participant (default behavior)\n *\n * Usage examples:\n * ```html\n * <ov-videoconference>\n *   <!-- Default position (after local participant) -->\n *   <ng-container *ovLayoutAdditionalElements>\n *     <div class=\"my-banner\">Banner</div>\n *   </ng-container>\n *\n *   <!-- Top position -->\n *   <ng-container *ovLayoutAdditionalElements=\"'top'\">\n *     <div class=\"top-bar\">Top Bar</div>\n *   </ng-container>\n *\n *   <!-- Bottom position -->\n *   <ng-container *ovLayoutAdditionalElements=\"'bottom'\">\n *     <div class=\"bottom-info\">Footer Info</div>\n *   </ng-container>\n * </ov-videoconference>\n * ```\n */\n@Directive({\n\tselector: '[ovLayoutAdditionalElements]',\n\tstandalone: false\n})\nexport class LayoutAdditionalElementsDirective {\n\t/**\n\t * Slot position: 'top', 'bottom', or 'default'\n\t */\n\tslot: 'top' | 'bottom' | 'default' = 'default';\n\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\t@Input('ovLayoutAdditionalElements')\n\tset ovLayoutAdditionalElements(slot: 'top' | 'bottom' | 'default' | '') {\n\t\tif (slot === 'top' || slot === 'bottom' || slot === 'default') {\n\t\t\tthis.slot = slot;\n\t\t} else {\n\t\t\tthis.slot = 'default';\n\t\t}\n\t}\n}\n\n/**\n * The ***ovParticipantPanelParticipantBadge** directive allows you to inject custom badges or indicators\n * in the participant panel.\n * This enables you to add role indicators, status badges, or other visual elements.\n *\n * Usage example:\n * ```html\n * <ov-participants-panel>\n *   <div *ovParticipantPanelItem=\"let participant\">\n *     <ov-participant-panel-item [participant]=\"participant\">\n *       <!-- Custom badge for local participant only -->\n *       <ng-container *ovParticipantPanelParticipantBadge>\n *         <span class=\"moderator-badge\">\n *           <mat-icon>admin_panel_settings</mat-icon>\n *           Moderator\n *         </span>\n *       </ng-container>\n *     </ov-participant-panel-item>\n *   </div>\n * </ov-participants-panel>\n * ```\n */\n@Directive({\n\tselector: '[ovParticipantPanelParticipantBadge]',\n\tstandalone: false\n})\nexport class ParticipantPanelParticipantBadgeDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovSettingsPanelGeneralAdditionalElements** directive allows you to inject custom HTML or Angular templates\n * into the general section of the settings panel.\n * This enables you to add custom controls, information, or UI elements to extend the settings panel functionality.\n *\n * Usage example:\n * ```html\n * <ov-videoconference>\n *   <ng-container *ovSettingsPanelGeneralAdditionalElements>\n *     <div class=\"custom-settings-section\">\n *       <mat-list>\n *         <mat-list-item>\n *           <mat-icon matListItemIcon>tune</mat-icon>\n *           <div matListItemTitle>Custom Setting</div>\n *           <mat-slide-toggle matListItemMeta [(ngModel)]=\"customSetting\"></mat-slide-toggle>\n *         </mat-list-item>\n *       </mat-list>\n *     </div>\n *   </ng-container>\n * </ov-videoconference>\n * ```\n *\n * @internal\n */\n@Directive({\n\tselector: '[ovSettingsPanelGeneralAdditionalElements]',\n\tstandalone: false\n})\nexport class SettingsPanelGeneralAdditionalElementsDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovToolbarMoreOptionsAdditionalMenuItems** directive allows you to inject custom HTML or Angular templates\n * into the \"more options\" menu (three dots button) of the toolbar.\n * This enables you to add custom menu items to extend the toolbar functionality.\n *\n * Usage example:\n * ```html\n * <ov-videoconference>\n *   <ng-container *ovToolbarMoreOptionsAdditionalMenuItems>\n *     <button mat-menu-item (click)=\"onCustomAction()\">\n *       <mat-icon>star</mat-icon>\n *       <span>Custom Action</span>\n *     </button>\n *     <mat-divider></mat-divider>\n *     <button mat-menu-item (click)=\"onAnotherAction()\">\n *       <mat-icon>info</mat-icon>\n *       <span>Another Action</span>\n *     </button>\n *   </ng-container>\n * </ov-videoconference>\n * ```\n *\n * @internal\n */\n@Directive({\n\tselector: '[ovToolbarMoreOptionsAdditionalMenuItems]',\n\tstandalone: false\n})\nexport class ToolbarMoreOptionsAdditionalMenuItemsDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}","import { Directive, TemplateRef, ViewContainerRef } from '@angular/core';\n\n/**\n * The ***ovToolbar** directive allows to replace the default toolbar component with a custom one.\n *\n * In the example below we've replaced the default toolbar and added the **toggleAudio** and **toggleVideo** buttons.\n * Here we are using the {@link ParticipantService} for enabling/disabling the audio and video.\n *\n * <!--ovToolbar-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import {\n *   ParticipantService,\n *   OpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n *\n * @Component({\n *   selector: 'app-root',\n *   template: `\n *     <ov-videoconference\n *       [token]=\"token\"\n *       [livekitUrl]=\"LIVEKIT_URL\"\n *       (onTokenRequested)=\"onTokenRequested($event)\"\n *     >\n *       <div *ovToolbar style=\"text-align: center;\">\n *         <button (click)=\"toggleVideo()\">Toggle Video</button>\n *         <button (click)=\"toggleAudio()\">Toggle Audio</button>\n *       </div>\n *     </ov-videoconference>\n *   `,\n *   standalone: true,\n *   imports: [OpenViduComponentsModule],\n * })\n * export class AppComponent {\n *   // For local development, leave these variables empty\n *   // For production, configure them with correct URLs depending on your deployment\n *\n *   APPLICATION_SERVER_URL = '';\n *   LIVEKIT_URL = '';\n *   // The name of the room.\n *   roomName = 'custom-toolbar';\n *\n *   // The token used to connect to the videoconference.\n *   token!: string;\n *\n *   constructor(\n *     private httpClient: HttpClient,\n *     private participantService: ParticipantService\n *   ) {\n *     this.configureUrls();\n *   }\n *\n *   private configureUrls() {\n *     // If APPLICATION_SERVER_URL is not configured, use default value from local development\n *     if (!this.APPLICATION_SERVER_URL) {\n *       if (window.location.hostname === 'localhost') {\n *         this.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n *       } else {\n *         this.APPLICATION_SERVER_URL =\n *           'https://' + window.location.hostname + ':6443/';\n *       }\n *     }\n *\n *     // If LIVEKIT_URL is not configured, use default value from local development\n *     if (!this.LIVEKIT_URL) {\n *       if (window.location.hostname === 'localhost') {\n *         this.LIVEKIT_URL = 'ws://localhost:7880/';\n *       } else {\n *         this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n *       }\n *     }\n *   }\n *\n *   // Called when a token is requested for a participant.\n *   async onTokenRequested(participantName: string) {\n *     const { token } = await this.getToken(this.roomName, participantName);\n *     this.token = token;\n *   }\n *\n *   // Toggles the camera on and off.\n *   async toggleVideo() {\n *     const isCameraEnabled = this.participantService.isMyCameraEnabled();\n *     await this.participantService.setCameraEnabled(!isCameraEnabled);\n *   }\n *\n *   // Toggles the microphone on and off.\n *   async toggleAudio() {\n *     const isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n *     await this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n *   }\n *\n *   // Gets a token for a participant.\n *   getToken(roomName: string, participantName: string): Promise<any> {\n *     try {\n *       return lastValueFrom(\n *         this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n *           roomName,\n *           participantName,\n *         })\n *       );\n *     } catch (error: any) {\n *       if (error.status === 404) {\n *         throw {\n *           status: error.status,\n *           message: 'Cannot connect with backend. ' + error.url + ' not found',\n *         };\n *       }\n *       throw error;\n *     }\n *   }\n * }\n *\n * ```\n * <!--ovToolbar-end-tutorial-->\n *\n * You can run the associated tutorial [here](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-toolbar/).\n */\n@Directive({\n\tselector: '[ovToolbar]',\n\tstandalone: false\n})\nexport class ToolbarDirective {\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovToolbarAdditionalButtons** directive enables the addition of extra buttons to the central button group within the toolbar.\n *\n * In the following example, we've included the same buttons as those in the {@link ToolbarDirective}. Additionally, we utilize the {@link ParticipantService} to assess audio and video statuses.\n *\n * <!--ovToolbarAdditionalButtons-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import {\n * \tParticipantService,\n * \tOpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n * import { MatIcon } from '@angular/material/icon';\n * import { MatIconButton } from '@angular/material/button';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<div *ovToolbarAdditionalButtons style=\"text-align: center;\">\n * \t\t\t\t<button mat-icon-button (click)=\"toggleVideo()\">\n * \t\t\t\t\t<mat-icon>videocam</mat-icon>\n * \t\t\t\t</button>\n * \t\t\t\t<button mat-icon-button (click)=\"toggleAudio()\">\n * \t\t\t\t\t<mat-icon>mic</mat-icon>\n * \t\t\t\t</button>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: [],\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n *\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// The name of the room for the video conference.\n * \troomName = 'toolbar-additionalbtn';\n *\n * \t// The token used to authenticate the user in the video conference.\n * \ttoken!: string;\n *\n * \tconstructor(\n * \t\tprivate httpClient: HttpClient,\n * \t\tprivate participantService: ParticipantService\n * \t) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Called when the token is requested.\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Toggles the camera on/off.\n * \tasync toggleVideo() {\n * \t\tconst isCameraEnabled = this.participantService.isMyCameraEnabled();\n * \t\tawait this.participantService.setCameraEnabled(!isCameraEnabled);\n * \t}\n *\n * \t// Toggles the microphone on/off.\n * \tasync toggleAudio() {\n * \t\tconst isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n * \t\tawait this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n * \t}\n *\n * \t// Retrieves a token from the server to authenticate the user.\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage: 'Cannot connect with backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovToolbarAdditionalButtons-end-tutorial-->\n *\n * To follow a step-by-step tutorial on this feature, please visit [this link](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-toolbar-buttons/).\n */\n\n@Directive({\n\tselector: '[ovToolbarAdditionalButtons]',\n\tstandalone: false\n})\nexport class ToolbarAdditionalButtonsDirective {\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovToolbarAdditionalPanelButtons** directive allows to add additional **panel buttons** to the toolbar.\n * In the example below we've added a simple button without any functionality. To learn how to toggle the panel check the {@link AdditionalPanelsDirective}.\n *\n * <!--ovToolbarAdditionalPanelButtons-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import { OpenViduComponentsModule } from 'openvidu-components-angular';\n * import { MatIconButton } from '@angular/material/button';\n * import { MatIcon } from '@angular/material/icon';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t[toolbarDisplayRoomName]=\"false\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n * \t\t\t\t<button mat-icon-button (click)=\"onButtonClicked()\">\n * \t\t\t\t\t<mat-icon>star</mat-icon>\n * \t\t\t\t</button>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: [],\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n *\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Set the room name\n * \troomName = 'toolbar-additional-panel-btn';\n *\n * \t// Initialize the token variable\n * \ttoken!: string;\n *\n * \tconstructor(private httpClient: HttpClient) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Method to request a token for a participant\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Method to handle button click\n * \tonButtonClicked() {\n * \t\talert('button clicked');\n * \t}\n *\n * \t// Method to get a token from the backend\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage: 'Cannot connect with backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovToolbarAdditionalPanelButtons-end-tutorial-->\n *\n * You can run the associated tutorial [here](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-toolbar-panel-buttons/).\n */\n@Directive({\n\tselector: '[ovToolbarAdditionalPanelButtons]',\n\tstandalone: false\n})\nexport class ToolbarAdditionalPanelButtonsDirective {\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovPanel** directive empowers you to seamlessly replace default panels with custom ones.\n * It also provides the flexibility to insert elements tagged with the {@link ChatPanelDirective}, {@link ParticipantsPanelDirective}, and {@link AdditionalPanelsDirective}.\n *\n * In the example below, we showcase how to entirely replace the {@link PanelComponent} using the {@link ChatPanelDirective}.\n * Within it, you can tailor the appearance and behavior of the {@link ParticipantsPanelComponent} and {@link ChatPanelComponent} using their respective directives.\n *\n * <!--ovPanel-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import { OpenViduComponentsModule } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Custom Panels -->\n * \t\t\t<ov-panel *ovPanel>\n * \t\t\t\t<!-- Custom Chat Panel -->\n * \t\t\t\t<div *ovChatPanel id=\"my-chat-panel\">This is my custom chat panel</div>\n *\n * \t\t\t\t<!-- Custom Participants Panel -->\n * \t\t\t\t<div *ovParticipantsPanel id=\"my-participants-panel\">\n * \t\t\t\t\tThis is my custom participants panel\n * \t\t\t\t</div>\n *\n * \t\t\t\t<!-- Custom Activities Panel -->\n * \t\t\t\t<div *ovActivitiesPanel id=\"my-activities-panel\">\n * \t\t\t\t\tThis is my custom activities panel\n * \t\t\t\t</div>\n * \t\t\t</ov-panel>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\t#my-chat-panel,\n * \t\t#my-participants-panel,\n * \t\t#my-activities-panel {\n * \t\t\ttext-align: center;\n * \t\t\theight: calc(100% - 40px);\n * \t\t\tmargin: 20px;\n * \t\t}\n *\n * \t\t#my-chat-panel {\n * \t\t\tbackground: #c9ffb2;\n * \t\t}\n *\n * \t\t#my-participants-panel {\n * \t\t\tbackground: #ddf2ff;\n * \t\t}\n *\n * \t\t#my-activities-panel {\n * \t\t\tbackground: #ffddc9;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'custom-panels';\n * \ttoken!: string;\n *\n * \tconstructor(private httpClient: HttpClient) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Function to get a token from the server\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovPanel-end-tutorial-->\n *\n *\n * For a comprehensive tutorial on implementing custom panels, please refer to the associated guide [here](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-panels/).\n */\n@Directive({\n\tselector: '[ovPanel]',\n\tstandalone: false\n})\nexport class PanelDirective {\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n *\n * The ***ovAdditionalPanels** directive enables you to effortlessly integrate additional panels with the {@link PanelComponent}.\n *\n * In the example below, we showcase how to add a custom panel to the {@link PanelComponent} using the **ovAdditionalPanels** directive.\n *\n * <!--ovAdditionalPanels-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import {\n * \tPanelStatusInfo,\n * \tPanelService,\n * \tOpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n *\n * import { MatIcon } from '@angular/material/icon';\n * import { MatIconButton } from '@angular/material/button';\n *\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t[toolbarDisplayRoomName]=\"false\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Additional Toolbar Buttons -->\n * \t\t\t<div *ovToolbarAdditionalPanelButtons style=\"text-align: center;\">\n * \t\t\t\t<button mat-icon-button (click)=\"toggleMyPanel('my-panel1')\">\n * \t\t\t\t\t<mat-icon>360</mat-icon>\n * \t\t\t\t</button>\n * \t\t\t\t<button mat-icon-button (click)=\"toggleMyPanel('my-panel2')\">\n * \t\t\t\t\t<mat-icon>star</mat-icon>\n * \t\t\t\t</button>\n * \t\t\t</div>\n *\n * \t\t\t<!-- Additional Panels -->\n * \t\t\t<div *ovAdditionalPanels id=\"my-panels\">\n * \t\t\t\t@if (showExternalPanel) {\n * \t\t\t\t<div id=\"my-panel1\">\n * \t\t\t\t\t<h2>NEW PANEL 1</h2>\n * \t\t\t\t\t<p>This is my new additional panel</p>\n * \t\t\t\t</div>\n * \t\t\t\t} @if (showExternalPanel2) {\n * \t\t\t\t<div id=\"my-panel2\">\n * \t\t\t\t\t<h2>NEW PANEL 2</h2>\n * \t\t\t\t\t<p>This is another new panel</p>\n * \t\t\t\t</div>\n * \t\t\t\t}\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\t#my-panels {\n * \t\t\theight: 100%;\n * \t\t\toverflow: hidden;\n * \t\t}\n * \t\t#my-panel1,\n * \t\t#my-panel2 {\n * \t\t\ttext-align: center;\n * \t\t\theight: calc(100% - 40px);\n * \t\t\tmargin: 20px;\n * \t\t}\n * \t\t#my-panel1 {\n * \t\t\tbackground: #c9ffb2;\n * \t\t}\n * \t\t#my-panel2 {\n * \t\t\tbackground: #ddf2ff;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule, MatIconButton, MatIcon],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'additional-panels';\n * \ttoken!: string;\n *\n * \t// Flags to control the visibility of external panels\n * \tshowExternalPanel: boolean = false;\n * \tshowExternalPanel2: boolean = false;\n *\n * \tconstructor(\n * \t\tprivate httpClient: HttpClient,\n * \t\tprivate panelService: PanelService\n * \t) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tngOnInit() {\n * \t\tthis.subscribeToPanelToggling();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: any) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Subscribe to panel toggling events\n * \tsubscribeToPanelToggling() {\n * \t\tthis.panelService.panelStatusObs.subscribe((ev: PanelStatusInfo) => {\n * \t\t\tthis.showExternalPanel = ev.isOpened && ev.panelType === 'my-panel1';\n * \t\t\tthis.showExternalPanel2 = ev.isOpened && ev.panelType === 'my-panel2';\n * \t\t});\n * \t}\n *\n * \t// Toggle the visibility of external panels\n * \ttoggleMyPanel(type: string) {\n * \t\tthis.panelService.togglePanel(type);\n * \t}\n *\n * \t// Function to get a token from the server\n * \tasync getToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovAdditionalPanels-end-tutorial-->\n *\n * For detailed instructions, refer to the tutorial available [here](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-additional-panels/).\n */\n@Directive({\n\tselector: '[ovAdditionalPanels]',\n\tstandalone: false\n})\nexport class AdditionalPanelsDirective {\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovChatPanel** directive empowers you to effortlessly substitute the default chat panel template with a custom one.\n *\n * In the example below, we showcase how to replace the chat template with a custom one.\n *\n * <!--ovChatPanel-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import {\n * \tDataPacket_Kind,\n * \tDataPublishOptions,\n * \tDataTopic,\n * \tParticipantService,\n * \tRemoteParticipant,\n * \tRoom,\n * \tRoomEvent,\n * \tOpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t[toolbarDisplayRoomName]=\"false\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t\t(onRoomCreated)=\"onRoomCreated($event)\"\n * \t\t>\n * \t\t\t<!-- Chat Panel -->\n * \t\t\t<div *ovChatPanel id=\"my-panel\">\n * \t\t\t\t<h3>Chat</h3>\n * \t\t\t\t<div>\n * \t\t\t\t\t<ul>\n * \t\t\t\t\t\t@for (msg of messages; track msg) {\n * \t\t\t\t\t\t<li>{{ msg }}</li>\n * \t\t\t\t\t\t}\n * \t\t\t\t\t</ul>\n * \t\t\t\t</div>\n * \t\t\t\t<input value=\"Hello\" #input />\n * \t\t\t\t<button (click)=\"send(input.value)\">Send</button>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\t#my-panel {\n * \t\t\tbackground: #aafffc;\n * \t\t\theight: 100%;\n * \t\t\toverflow: hidden;\n * \t\t\ttext-align: center;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'chat-panel-directive-example';\n * \ttoken!: string;\n * \tmessages: string[] = [];\n *\n * \tconstructor(\n * \t\tprivate httpClient: HttpClient,\n * \t\tprivate participantService: ParticipantService\n * \t) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Event handler for room creation\n * \tonRoomCreated(room: Room) {\n * \t\troom.on(\n * \t\t\tRoomEvent.DataReceived,\n * \t\t\t(\n * \t\t\t\tpayload: Uint8Array,\n * \t\t\t\tparticipant?: RemoteParticipant,\n * \t\t\t\t_?: DataPacket_Kind,\n * \t\t\t\ttopic?: string\n * \t\t\t) => {\n * \t\t\t\tif (topic === DataTopic.CHAT) {\n * \t\t\t\t\tconst { message } = JSON.parse(new TextDecoder().decode(payload));\n * \t\t\t\t\tconst participantName = participant?.name || 'Unknown';\n * \t\t\t\t\tthis.messages.push(message);\n * \t\t\t\t\tconsole.log(`Message received from ${participantName}:`, message);\n * \t\t\t\t}\n * \t\t\t}\n * \t\t);\n * \t}\n *\n * \t// Function to send a chat message\n * \tasync send(message: string): Promise<void> {\n * \t\tconst strData = JSON.stringify({ message });\n * \t\tconst data: Uint8Array = new TextEncoder().encode(strData);\n * \t\tconst options: DataPublishOptions = { topic: DataTopic.CHAT };\n * \t\tawait this.participantService.publishData(data, options);\n * \t\tthis.messages.push(message);\n * \t}\n *\n * \t// Function to get a token from the server\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovChatPanel-end-tutorial-->\n *\n *\n * For a step-by-step tutorial on how to replace the chat template with just a few lines of code,\n * check out our comprehensive guide: [Customizing the Chat Panel](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-chat-panel/).\n */\n@Directive({\n\tselector: '[ovChatPanel]',\n\tstandalone: false\n})\nexport class ChatPanelDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * backgroundEffectsPanel does not provide any customization for now\n * @internal\n */\n@Directive({\n\tselector: '[ovBackgroundEffectsPanel]',\n\tstandalone: false\n})\nexport class BackgroundEffectsPanelDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovActivitiesPanel** directive empowers you to effortlessly substitute the default activities panel template with a custom one.\n *\n * In the example below, we showcase how to replace the activities template with a custom one.\n *\n * <!--ovActivitiesPanel-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n * import { OpenViduComponentsModule } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Custom activities panel -->\n * \t\t\t<div *ovActivitiesPanel id=\"my-panel\">\n * \t\t\t\t<h3>ACTIVITIES</h3>\n * \t\t\t\t<div>CUSTOM ACTIVITIES</div>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\t#my-panel {\n * \t\t\tbackground: #aafffc;\n * \t\t\theight: 100%;\n * \t\t\toverflow: hidden;\n * \t\t\ttext-align: center;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n * \troomName = 'custom-activities-panel';\n * \ttoken!: string;\n *\n * \tconstructor(private httpClient: HttpClient) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tconfigureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage: 'Cannot connect with backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovActivitiesPanel-end-tutorial-->\n *\n * For a step-by-step tutorial on how to replace the activities template with just a few lines of code,\n * check out our comprehensive guide: [Customizing the Activities Panel](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-activities-panel/).\n */\n@Directive({\n\tselector: '[ovActivitiesPanel]',\n\tstandalone: false\n})\nexport class ActivitiesPanelDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovParticipantsPanel** directive empowers you to substitute the default participants panel template with a customized one.\n * In the following example, we demonstrate how to replace the participants template with just a few lines of code.\n *\n * <!--ovParticipantsPanel-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component, OnDestroy, OnInit } from '@angular/core';\n * import { lastValueFrom, Subscription } from 'rxjs';\n *\n * import {\n * \tParticipantModel,\n * \tParticipantService,\n * \tOpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Custom Participants Panel -->\n * \t\t\t<div *ovParticipantsPanel id=\"my-panel\">\n * \t\t\t\t<ul id=\"local\">\n * \t\t\t\t\t<li>{{ localParticipant.name }}</li>\n * \t\t\t\t</ul>\n * \t\t\t\t<ul id=\"remote\">\n * \t\t\t\t\t@for (p of remoteParticipants; track p) {\n * \t\t\t\t\t<li>{{ p.name }}</li>\n * \t\t\t\t\t}\n * \t\t\t\t</ul>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\t#my-panel {\n * \t\t\tbackground: #faff7f;\n * \t\t\theight: 100%;\n * \t\t\toverflow: hidden;\n * \t\t}\n * \t\t#my-panel > #local {\n * \t\t\tbackground: #a184ff;\n * \t\t}\n * \t\t#my-panel > #remote {\n * \t\t\tbackground: #7fb8ff;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule],\n * })\n * export class AppComponent implements OnInit, OnDestroy {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'custom-participants-panel';\n * \ttoken!: string;\n *\n * \t// Participant-related properties\n * \tlocalParticipant!: ParticipantModel;\n * \tremoteParticipants!: ParticipantModel[];\n * \tlocalParticipantSubs!: Subscription;\n * \tremoteParticipantsSubs!: Subscription;\n *\n * \tconstructor(\n * \t\tprivate httpClient: HttpClient,\n * \t\tprivate participantService: ParticipantService\n * \t) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Subscribes to updates for local and remote participants.\n * \tngOnInit() {\n * \t\tthis.subscribeToParticipants();\n * \t}\n *\n * \t// Unsubscribes from updates for local and remote participants to prevent memory leaks.\n * \tngOnDestroy() {\n * \t\tthis.localParticipantSubs.unsubscribe();\n * \t\tthis.remoteParticipantsSubs.unsubscribe();\n * \t}\n *\n * \t// Function called when a participant requests a token to join the room.\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Subscribes to updates for local and remote participants.\n * \tsubscribeToParticipants() {\n * \t\tthis.localParticipantSubs =\n * \t\t\tthis.participantService.localParticipant$.subscribe((p) => {\n * \t\t\t\tif (p) this.localParticipant = p;\n * \t\t\t});\n *\n * \t\tthis.remoteParticipantsSubs =\n * \t\t\tthis.participantService.remoteParticipants$.subscribe(\n * \t\t\t\t(participants) => {\n * \t\t\t\t\tthis.remoteParticipants = participants;\n * \t\t\t\t}\n * \t\t\t);\n * \t}\n *\n * \t// Sends a request to the server to obtain a token for a participant.\n * \tasync getToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovParticipantsPanel-end-tutorial-->\n *\n * For a comprehensive tutorial on customizing the participants panel, please visit [this link](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-participants-panel/).\n */\n\n@Directive({\n\tselector: '[ovParticipantsPanel]',\n\tstandalone: false\n})\nexport class ParticipantsPanelDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovParticipantPanelItem** directive allows you to customize the default participant panel item template within the {@link ParticipantsPanelComponent}.\n *\n * With the **ovParticipantPanelItem** directive, you can access the participant object from its context using the `let` keyword and referencing the `participant`\n * variable as follows: `*ovParticipantPanelItem=\"let participant\"`. This allows you to access the {@link ParticipantModel} object.\n *\n * In the example below, we demonstrate how to replace the participant panel item template with just a few lines of code.\n *\n * <!--ovParticipantPanelItem-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import { MatIcon } from '@angular/material/icon';\n * import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';\n * import { MatIconButton } from '@angular/material/button';\n * import { OpenViduComponentsModule } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Participant Panel Items -->\n * \t\t\t<div *ovParticipantPanelItem=\"let participant\" style=\"display: flex\">\n * \t\t\t\t<p>{{ participant.name }}</p>\n *\n * \t\t\t\t<!-- More Options Menu -->\n * \t\t\t\t<button mat-icon-button [matMenuTriggerFor]=\"menu\">\n * \t\t\t\t\t<mat-icon>more_vert</mat-icon>\n * \t\t\t\t</button>\n *\n * \t\t\t\t<!-- Menu Content -->\n * \t\t\t\t<mat-menu #menu=\"matMenu\">\n * \t\t\t\t\t<button mat-menu-item>Button 1</button>\n * \t\t\t\t\t<button mat-menu-item>Button 2</button>\n * \t\t\t\t</mat-menu>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: [],\n * \tstandalone: true,\n * \timports: [\n * \t\tOpenViduComponentsModule,\n * \t\tMatIconButton,\n * \t\tMatMenuTrigger,\n * \t\tMatIcon,\n * \t\tMatMenu,\n * \t\tMatMenuItem,\n * \t],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'participant-panel-item';\n * \ttoken!: string;\n *\n * \tconstructor(private httpClient: HttpClient) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Function to get a token from the server\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovParticipantPanelItem-end-tutorial-->\n *\n * For a detailed tutorial on customizing participant panel items, please visit [this link](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-participant-panel-item/).\n */\n\n@Directive({\n\tselector: '[ovParticipantPanelItem]',\n\tstandalone: false\n})\nexport class ParticipantPanelItemDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovParticipantPanelItemElements** directive allows you to incorporate additional elements into the {@link ParticipantPanelItemComponent}.\n * In the example below, we demonstrate how to add a simple button for disconnecting from the session.\n *\n * With the ***ovParticipantPanelItemElements** directive, you can access the participant object within its context using the `let` keyword and referencing the `participant` variable as follows: `*ovParticipantPanelItem=\"let participant\"`.\n * This enables you to access the {@link ParticipantModel} object and activate the button exclusively for the local participant.\n *\n *\n * <!--ovParticipantPanelItemElements-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import {\n * \tOpenViduService,\n * \tOpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t@if (connected) {\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t[toolbarDisplayRoomName]=\"false\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Participant Panel Item Elements -->\n * \t\t\t<div *ovParticipantPanelItemElements=\"let participant\">\n * \t\t\t\t<!-- Leave Button for Local Participant -->\n * \t\t\t\t@if (participant.isLocal) {\n * \t\t\t\t<button (click)=\"leaveSession()\">Leave</button>\n * \t\t\t\t}\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t\t}\n *\n * \t\t<!-- Session Disconnected Message -->\n * \t\t@if (!connected) {\n * \t\t<div style=\"text-align: center;\">Session disconnected</div>\n * \t\t}\n * \t`,\n * \tstyles: [],\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'participant-panel-item-elements';\n * \ttoken!: string;\n *\n * \t// Flag to indicate session connection status\n * \tconnected = true;\n *\n * \tconstructor(\n * \t\tprivate httpClient: HttpClient,\n * \t\tprivate openviduService: OpenViduService\n * \t) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Function to leave the session\n * \tasync leaveSession() {\n * \t\tawait this.openviduService.disconnectRoom();\n * \t\tthis.connected = false;\n * \t}\n *\n * \t// Function to get a token from the server\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovParticipantPanelItemElements-end-tutorial-->\n *\n * For a comprehensive tutorial on adding elements to participant panel items, please visit [this link](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-participant-panel-item-element/).\n */\n\n@Directive({\n\tselector: '[ovParticipantPanelItemElements]',\n\tstandalone: false\n})\nexport class ParticipantPanelItemElementsDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic viewContainer: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovLayout** directive empowers you to replace the default room layout with a customized one.\n *\n * To ensure that the default {@link StreamComponent} functions correctly with participant tracks, you can access all local tracks using the [tracks](../classes/ParticipantModel.html#tracks) accessor.\n * Extracting streams from remote participants can be more complex, but openvidu-angular simplifies the process with the {@link RemoteParticipantTracksPipe}, which facilitates the extraction of each participant's stream.\n *\n * In the example below, take note of the HTML template's structure. The `*ngFor` statements employ the `| tracks` pipe to handle tracks effectively.\n *\n * <!--ovLayout-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component, OnDestroy, OnInit } from '@angular/core';\n * import { lastValueFrom, Subscription } from 'rxjs';\n * import {\n * \tParticipantModel,\n * \tParticipantService,\n * \tOpenViduComponentsModule,\n * } from 'openvidu-components-angular';\n * import { NgClass } from '@angular/common';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Custom Layout for Video Streams -->\n * \t\t\t<div *ovLayout>\n * \t\t\t\t<div class=\"container\">\n * \t\t\t\t\t<!-- Local Participant's Tracks -->\n * \t\t\t\t\t@for (track of localParticipant.tracks; track track) {\n * \t\t\t\t\t<div\n * \t\t\t\t\t\tclass=\"item\"\n * \t\t\t\t\t\t[ngClass]=\"{\n * \t\t\t\t\t\t\thidden:\n * \t\t\t\t\t\t\t\ttrack.isAudioTrack && !track.participant.onlyHasAudioTracks\n * \t\t\t\t\t\t}\"\n * \t\t\t\t\t>\n * \t\t\t\t\t\t<ov-stream [track]=\"track\"></ov-stream>\n * \t\t\t\t\t</div>\n * \t\t\t\t\t}\n *\n * \t\t\t\t\t<!-- Remote Participants' Tracks -->\n * \t\t\t\t\t@for (track of remoteParticipants | tracks; track track) {\n * \t\t\t\t\t<div\n * \t\t\t\t\t\tclass=\"item\"\n * \t\t\t\t\t\t[ngClass]=\"{\n * \t\t\t\t\t\t\thidden:\n * \t\t\t\t\t\t\t\ttrack.isAudioTrack && !track.participant.onlyHasAudioTracks\n * \t\t\t\t\t\t}\"\n * \t\t\t\t\t>\n * \t\t\t\t\t\t<ov-stream [track]=\"track\"></ov-stream>\n * \t\t\t\t\t</div>\n * \t\t\t\t\t}\n * \t\t\t\t</div>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\t.container {\n * \t\t\tdisplay: flex;\n * \t\t\tflex-wrap: wrap;\n * \t\t\tjustify-content: space-between;\n * \t\t}\n * \t\t.item {\n * \t\t\tflex: 0 50%;\n * \t\t\theight: 250px;\n * \t\t\tmargin-bottom: 2%;\n * \t\t}\n * \t\t.hidden {\n * \t\t\tdisplay: none;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule, NgClass],\n * })\n * export class AppComponent implements OnInit, OnDestroy {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'custom-layout';\n * \ttoken!: string;\n *\n * \t// Participant-related properties\n * \tlocalParticipant!: ParticipantModel;\n * \tremoteParticipants!: ParticipantModel[];\n * \tlocalParticipantSubs!: Subscription;\n * \tremoteParticipantsSubs!: Subscription;\n *\n * \tconstructor(\n * \t\tprivate httpClient: HttpClient,\n * \t\tprivate participantService: ParticipantService\n * \t) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \tngOnInit() {\n * \t\t// Subscribe to participants' updates\n * \t\tthis.subscribeToParticipants();\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \tngOnDestroy() {\n * \t\t// Unsubscribe from participant updates to prevent memory leaks\n * \t\tthis.localParticipantSubs.unsubscribe();\n * \t\tthis.remoteParticipantsSubs.unsubscribe();\n * \t}\n *\n * \t// Subscribe to updates for local and remote participants\n * \tsubscribeToParticipants() {\n * \t\tthis.localParticipantSubs =\n * \t\t\tthis.participantService.localParticipant$.subscribe((p) => {\n * \t\t\t\tif (p) this.localParticipant = p;\n * \t\t\t});\n *\n * \t\tthis.remoteParticipantsSubs =\n * \t\t\tthis.participantService.remoteParticipants$.subscribe(\n * \t\t\t\t(participants) => {\n * \t\t\t\t\tthis.remoteParticipants = participants;\n * \t\t\t\t}\n * \t\t\t);\n * \t}\n *\n * \t// Function to get a token from the server\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovLayout-end-tutorial-->\n *\n *\n * For a comprehensive guide on implementing custom layouts, please refer to the associated tutorial [here](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-layout/).\n */\n@Directive({\n\tselector: '[ovLayout]',\n\tstandalone: false\n})\nexport class LayoutDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}\n\n/**\n * The ***ovStream** directive empowers you to substitute the default {@link StreamComponent} template with a custom one.\n * In the example below, we demonstrate how to customize the position and styles of a participant's nickname by replacing the default stream component.\n *\n * With the **ovStream** directive, you can access the track object within its context using the `let` keyword and referencing the `track` variable as follows: `*ovStream=\"let track\"`. This allows you to access the {@link ParticipantModel} object using `track.participant`.\n *\n * In the example provided below, we illustrate how to achieve this customization with just a few lines of code.\n *\n * <!--ovStream-start-tutorial-->\n * ```typescript\n * import { HttpClient } from '@angular/common/http';\n * import { Component } from '@angular/core';\n * import { lastValueFrom } from 'rxjs';\n *\n * import {\n * \tOpenViduComponentsModule,\n * \tApiDirectiveModule,\n * \tOpenViduComponentsDirectiveModule,\n * } from 'openvidu-components-angular';\n *\n * @Component({\n * \tselector: 'app-root',\n * \ttemplate: `\n * \t\t<!-- OpenVidu Video Conference Component -->\n * \t\t<ov-videoconference\n * \t\t\t[token]=\"token\"\n * \t\t\t[livekitUrl]=\"LIVEKIT_URL\"\n * \t\t\t(onTokenRequested)=\"onTokenRequested($event)\"\n * \t\t>\n * \t\t\t<!-- Display Video Streams -->\n * \t\t\t<div *ovStream=\"let track\">\n * \t\t\t\t<!-- Video Stream Component -->\n * \t\t\t\t<ov-stream [track]=\"track\" [displayParticipantName]=\"false\"></ov-stream>\n *\n * \t\t\t\t<!-- Display Participant's Name -->\n * \t\t\t\t<p>{{ track.participant.name }}</p>\n * \t\t\t</div>\n * \t\t</ov-videoconference>\n * \t`,\n * \tstyles: `\n * \t\tp {\n * \t\t\tposition: absolute;\n * \t\t\tbottom: 0;\n * \t\t\tborder: 2px solid;\n * \t\t\tbackground: #000000;\n * \t\t}\n * \t`,\n * \tstandalone: true,\n * \timports: [OpenViduComponentsModule],\n * })\n * export class AppComponent {\n * \t// For local development, leave these variables empty\n * \t// For production, configure them with correct URLs depending on your deployment\n * \tAPPLICATION_SERVER_URL = '';\n * \tLIVEKIT_URL = '';\n *\n * \t// Define the name of the room and initialize the token variable\n * \troomName = 'custom-stream';\n * \ttoken!: string;\n *\n * \tconstructor(private httpClient: HttpClient) {\n * \t\tthis.configureUrls();\n * \t}\n *\n * \tprivate configureUrls() {\n * \t\t// If APPLICATION_SERVER_URL is not configured, use default value from local development\n * \t\tif (!this.APPLICATION_SERVER_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.APPLICATION_SERVER_URL = 'http://localhost:6080/';\n * \t\t\t} else {\n * \t\t\t\tthis.APPLICATION_SERVER_URL =\n * \t\t\t\t\t'https://' + window.location.hostname + ':6443/';\n * \t\t\t}\n * \t\t}\n *\n * \t\t// If LIVEKIT_URL is not configured, use default value from local development\n * \t\tif (!this.LIVEKIT_URL) {\n * \t\t\tif (window.location.hostname === 'localhost') {\n * \t\t\t\tthis.LIVEKIT_URL = 'ws://localhost:7880/';\n * \t\t\t} else {\n * \t\t\t\tthis.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';\n * \t\t\t}\n * \t\t}\n * \t}\n *\n * \t// Function to request a token when a participant joins the room\n * \tasync onTokenRequested(participantName: string) {\n * \t\tconst { token } = await this.getToken(this.roomName, participantName);\n * \t\tthis.token = token;\n * \t}\n *\n * \t// Function to get a token from the server\n * \tgetToken(roomName: string, participantName: string): Promise<any> {\n * \t\ttry {\n * \t\t\t// Send a POST request to the server to obtain a token\n * \t\t\treturn lastValueFrom(\n * \t\t\t\tthis.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {\n * \t\t\t\t\troomName,\n * \t\t\t\t\tparticipantName,\n * \t\t\t\t})\n * \t\t\t);\n * \t\t} catch (error: any) {\n * \t\t\t// Handle errors, e.g., if the server is not reachable\n * \t\t\tif (error.status === 404) {\n * \t\t\t\tthrow {\n * \t\t\t\t\tstatus: error.status,\n * \t\t\t\t\tmessage:\n * \t\t\t\t\t\t'Cannot connect with the backend. ' + error.url + ' not found',\n * \t\t\t\t};\n * \t\t\t}\n * \t\t\tthrow error;\n * \t\t}\n * \t}\n * }\n *\n * ```\n * <!--ovStream-end-tutorial-->\n *\n * For a detailed tutorial on customizing the stream component, please visit [this link](https://openvidu.io/latest/docs/tutorials/angular-components/openvidu-custom-stream/).\n */\n\n@Directive({\n\tselector: '[ovStream]',\n\tstandalone: false\n})\nexport class StreamDirective {\n\tconstructor(\n\t\tpublic template: TemplateRef<any>,\n\t\tpublic container: ViewContainerRef\n\t) {}\n}\n\n","/**\n * @internal\n */\nexport enum LayoutClass {\n\tROOT_ELEMENT = 'OV_root',\n\tBIG_ELEMENT = 'OV_big',\n\tSMALL_ELEMENT = 'OV_small',\n\tTOP_BAR_ELEMENT = 'OV_top-bar',\n\tIGNORED_ELEMENT = 'OV_ignored',\n\tMINIMIZED_ELEMENT = 'OV_minimized',\n\tSIDENAV_CONTAINER = 'sidenav-container',\n\tNO_SIZE_ELEMENT = 'no-size',\n\tCLASS_NAME = 'layout'\n}\n\n/**\n * @internal\n */\nexport enum SidenavMode {\n\tOVER = 'over',\n\tSIDE = 'side'\n}\n\n/**\n * @internal\n */\nexport enum LayoutAlignment {\n\tSTART = 'start',\n\tCENTER = 'center',\n\tEND = 'end'\n}\n\n/**\n * Layout position options for big elements\n */\nexport type BigFirstOption = boolean | 'column' | 'row';\n\n/**\n * Element dimensions interface\n */\nexport interface ElementDimensions {\n\theight: number;\n\twidth: number;\n\tbig?: boolean;\n\tsmall?: boolean;\n\ttopBar?: boolean;\n}\n\n/**\n * Layout area definition\n */\nexport interface LayoutArea {\n\ttop: number;\n\tleft: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Layout box positioning\n */\nexport interface LayoutBox extends LayoutArea {}\n\n/**\n * Row structure for layout calculations\n */\nexport interface LayoutRow {\n\tratios: number[];\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Best dimensions calculation result\n */\nexport interface BestDimensions {\n\tmaxArea: number;\n\ttargetCols: number;\n\ttargetRows: number;\n\ttargetHeight: number;\n\ttargetWidth: number;\n\tratio: number;\n}\n\n/**\n * Extended layout options with container dimensions\n */\nexport interface ExtendedLayoutOptions extends OpenViduLayoutOptions {\n\tcontainerWidth: number;\n\tcontainerHeight: number;\n}\n\n/**\n * Layout calculation result containing positioned boxes and allocated areas\n */\nexport interface LayoutCalculationResult {\n\tboxes: LayoutBox[];\n\tareas: LayoutAreas;\n}\n\n/**\n * Layout areas for different element categories\n */\nexport interface LayoutAreas {\n\tbig: LayoutArea | null;\n\tnormal: LayoutArea | null;\n\tsmall: LayoutArea | null;\n\ttopBar: LayoutArea | null;\n}\n\n/**\n * Categorized elements by type\n * @internal\n */\nexport interface CategorizedElements {\n\tbig: ElementDimensions[];\n\tnormal: ElementDimensions[];\n\tsmall: ElementDimensions[];\n\ttopBar: ElementDimensions[];\n\tbigIndices: number[];\n\tnormalIndices: number[];\n\tsmallIndices: number[];\n\ttopBarIndices: number[];\n}\n\n/**\n * Layout configuration constants\n */\nexport const LAYOUT_CONSTANTS = {\n\tDEFAULT_VIDEO_WIDTH: 640,\n\tDEFAULT_VIDEO_HEIGHT: 480,\n\tDEFAULT_MAX_RATIO: 3 / 2,\n\tDEFAULT_MIN_RATIO: 9 / 16,\n\tDEFAULT_BIG_PERCENTAGE: 0.8,\n\tUPDATE_TIMEOUT: 50,\n\tANIMATION_DURATION: '0.1s',\n\tANIMATION_EASING: 'linear'\n} as const;\n\n/**\n * @internal\n */\nexport interface OpenViduLayoutOptions {\n\t/** The narrowest ratio that will be used (2x3 by default) */\n\tmaxRatio: number;\n\t/** The widest ratio that will be used (16x9 by default) */\n\tminRatio: number;\n\t/** If true, aspect ratio is maintained and minRatio/maxRatio are ignored */\n\tfixedRatio: boolean;\n\t/** Whether to animate transitions */\n\tanimate: boolean;\n\t/** Class for elements that should be sized bigger */\n\tbigClass: string;\n\t/** Class for elements that should be sized smaller */\n\tsmallClass: string;\n\t/** Class for elements that should be ignored */\n\tignoredClass: string;\n\t/** Maximum percentage of space big elements should take up */\n\tbigPercentage: number;\n\t/** Minimum percentage for big space to scale down whitespace */\n\tminBigPercentage: number;\n\t/** Fixed ratio for big elements */\n\tbigFixedRatio: boolean;\n\t/** Narrowest ratio for big elements */\n\tbigMaxRatio: number;\n\t/** Widest ratio for big elements */\n\tbigMinRatio: number;\n\t/** Position preference for big elements */\n\tbigFirst: BigFirstOption;\n\t/** Alignment for all elements */\n\talignItems: LayoutAlignment;\n\t/** Alignment for big elements */\n\tbigAlignItems: LayoutAlignment;\n\t/** Alignment for small elements */\n\tsmallAlignItems: LayoutAlignment;\n\t/** Maximum width of elements */\n\tmaxWidth: number;\n\t/** Maximum height of elements */\n\tmaxHeight: number;\n\t/** Maximum width for small elements */\n\tsmallMaxWidth: number;\n\t/** Maximum height for small elements */\n\tsmallMaxHeight: number;\n\t/** Maximum width for big elements */\n\tbigMaxWidth: number;\n\t/** Maximum height for big elements */\n\tbigMaxHeight: number;\n\t/** Scale up elements in last row if fewer elements */\n\tscaleLastRow: boolean;\n\t/** Scale up big elements in last row */\n\tbigScaleLastRow: boolean;\n}\n","import { BestDimensions } from './layout-types.model';\n\n/**\n * Manages caching of dimension calculations for layout optimization.\n * Uses memoization to avoid recalculating the same layout dimensions.\n * \n * @internal\n */\nexport class LayoutDimensionsCache {\n\tprivate cache = new Map<string, BestDimensions>();\n\n\t/**\n\t * Retrieves cached dimension calculation if available\n\t * @param key Cache key generated from calculation parameters\n\t * @returns Cached dimensions or undefined if not found\n\t */\n\tget(key: string): BestDimensions | undefined {\n\t\treturn this.cache.get(key);\n\t}\n\n\t/**\n\t * Stores dimension calculation result in cache\n\t * @param key Cache key generated from calculation parameters\n\t * @param value Calculated best dimensions\n\t */\n\tset(key: string, value: BestDimensions): void {\n\t\tthis.cache.set(key, value);\n\t}\n\n\t/**\n\t * Clears all cached dimensions to free memory\n\t */\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Gets the current cache size\n\t * @returns Number of cached entries\n\t */\n\tsize(): number {\n\t\treturn this.cache.size;\n\t}\n\n\t/**\n\t * Checks if a key exists in the cache\n\t * @param key Cache key to check\n\t * @returns True if key exists\n\t */\n\thas(key: string): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\t/**\n\t * Generates a cache key from calculation parameters\n\t * @param minRatio Minimum aspect ratio\n\t * @param maxRatio Maximum aspect ratio\n\t * @param width Container width\n\t * @param height Container height\n\t * @param count Number of elements\n\t * @param maxWidth Maximum element width\n\t * @param maxHeight Maximum element height\n\t * @returns Cache key string\n\t */\n\tstatic generateKey(\n\t\tminRatio: number,\n\t\tmaxRatio: number,\n\t\twidth: number,\n\t\theight: number,\n\t\tcount: number,\n\t\tmaxWidth: number,\n\t\tmaxHeight: number\n\t): string {\n\t\treturn `${minRatio}_${maxRatio}_${width}_${height}_${count}_${maxWidth}_${maxHeight}`;\n\t}\n}\n","import { LayoutDimensionsCache } from './layout-dimensions-cache.model';\nimport {\n\tBestDimensions,\n\tCategorizedElements,\n\tElementDimensions,\n\tExtendedLayoutOptions,\n\tLAYOUT_CONSTANTS,\n\tLayoutAlignment,\n\tLayoutBox,\n\tLayoutCalculationResult,\n\tLayoutRow\n} from './layout-types.model';\n\n/**\n * Pure calculation logic for layout positioning.\n * Contains all mathematical algorithms for element positioning without DOM manipulation.\n *\n * @internal\n */\nexport class LayoutCalculator {\n\tconstructor(private dimensionsCache: LayoutDimensionsCache) {}\n\n\t/**\n\t * Calculate complete layout including boxes and areas\n\t * @param opts Extended layout options with container dimensions\n\t * @param elements Array of element dimensions\n\t * @returns Layout calculation result with boxes and areas\n\t */\n\tcalculateLayout(opts: ExtendedLayoutOptions, elements: ElementDimensions[]): LayoutCalculationResult {\n\t\tconst {\n\t\t\tmaxRatio = LAYOUT_CONSTANTS.DEFAULT_MAX_RATIO,\n\t\t\tminRatio = LAYOUT_CONSTANTS.DEFAULT_MIN_RATIO,\n\t\t\tfixedRatio = false,\n\t\t\tbigPercentage = LAYOUT_CONSTANTS.DEFAULT_BIG_PERCENTAGE,\n\t\t\tminBigPercentage = 0,\n\t\t\tbigFixedRatio = false,\n\t\t\tbigMaxRatio = LAYOUT_CONSTANTS.DEFAULT_MAX_RATIO,\n\t\t\tbigMinRatio = LAYOUT_CONSTANTS.DEFAULT_MIN_RATIO,\n\t\t\tbigFirst = true,\n\t\t\tcontainerWidth = LAYOUT_CONSTANTS.DEFAULT_VIDEO_WIDTH,\n\t\t\tcontainerHeight = LAYOUT_CONSTANTS.DEFAULT_VIDEO_HEIGHT,\n\t\t\talignItems = LayoutAlignment.CENTER,\n\t\t\tbigAlignItems = LayoutAlignment.CENTER,\n\t\t\tsmallAlignItems = LayoutAlignment.CENTER,\n\t\t\tmaxWidth = Infinity,\n\t\t\tmaxHeight = Infinity,\n\t\t\tsmallMaxWidth = Infinity,\n\t\t\tsmallMaxHeight = Infinity,\n\t\t\tbigMaxWidth = Infinity,\n\t\t\tbigMaxHeight = Infinity,\n\t\t\tscaleLastRow = true,\n\t\t\tbigScaleLastRow = true\n\t\t} = opts;\n\n\t\tconst availableRatio = containerHeight / containerWidth;\n\t\tlet offsetLeft = 0;\n\t\tlet offsetTop = 0;\n\t\tlet bigOffsetTop = 0;\n\t\tlet bigOffsetLeft = 0;\n\n\t\t// Categorize elements\n\t\tconst categorized = this.categorizeElements(elements);\n\t\tconst { bigOnes, normalOnes, smallOnes, topBarOnes } = categorized;\n\n\t\tlet bigBoxes: LayoutBox[] = [];\n\t\tlet smallBoxes: LayoutBox[] = [];\n\t\tlet topBarBoxes: LayoutBox[] = [];\n\t\tlet normalBoxes: LayoutBox[] = [];\n\t\tlet areas: LayoutCalculationResult['areas'] = { big: null, normal: null, small: null, topBar: null };\n\n\t\t// Handle different layout scenarios based on element types\n\t\tif (bigOnes.length > 0 && (normalOnes.length > 0 || smallOnes.length > 0 || topBarOnes.length > 0)) {\n\t\t\t// Scenario: Big elements with normal/small/topbar elements\n\t\t\tlet bigWidth;\n\t\t\tlet bigHeight;\n\t\t\tlet showBigFirst = bigFirst;\n\n\t\t\tif (availableRatio > this.getVideoRatio(bigOnes[0])) {\n\t\t\t\t// We are tall, going to take up the whole width and arrange small guys at the bottom\n\t\t\t\tbigWidth = containerWidth;\n\t\t\t\tbigHeight = Math.floor(containerHeight * bigPercentage);\n\n\t\t\t\tif (minBigPercentage > 0) {\n\t\t\t\t\t// Find the best size for the big area\n\t\t\t\t\tlet bigDimensions;\n\t\t\t\t\tif (!bigFixedRatio) {\n\t\t\t\t\t\tbigDimensions = this.getBestDimensions(\n\t\t\t\t\t\t\tbigMinRatio,\n\t\t\t\t\t\t\tbigMaxRatio,\n\t\t\t\t\t\t\tbigWidth,\n\t\t\t\t\t\t\tbigHeight,\n\t\t\t\t\t\t\tbigOnes.length,\n\t\t\t\t\t\t\tbigMaxWidth,\n\t\t\t\t\t\t\tbigMaxHeight\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Use the ratio of the first video element we find to approximate\n\t\t\t\t\t\tconst ratio = bigOnes[0].height / bigOnes[0].width;\n\t\t\t\t\t\tbigDimensions = this.getBestDimensions(ratio, ratio, bigWidth, bigHeight, bigOnes.length, bigMaxWidth, bigMaxHeight);\n\t\t\t\t\t}\n\n\t\t\t\t\tbigHeight = Math.max(\n\t\t\t\t\t\tcontainerHeight * minBigPercentage,\n\t\t\t\t\t\tMath.min(bigHeight, bigDimensions.targetHeight * bigDimensions.targetRows)\n\t\t\t\t\t);\n\n\t\t\t\t\t// Don't awkwardly scale the small area bigger than we need to and end up with floating videos in the middle\n\t\t\t\t\tconst smallDimensions = this.getBestDimensions(\n\t\t\t\t\t\tminRatio,\n\t\t\t\t\t\tmaxRatio,\n\t\t\t\t\t\tcontainerWidth,\n\t\t\t\t\t\tcontainerHeight - bigHeight,\n\t\t\t\t\t\tnormalOnes.length + smallOnes.length + topBarOnes.length,\n\t\t\t\t\t\tsmallMaxWidth,\n\t\t\t\t\t\tsmallMaxHeight\n\t\t\t\t\t);\n\t\t\t\t\tbigHeight = Math.max(bigHeight, containerHeight - smallDimensions.targetRows * smallDimensions.targetHeight);\n\t\t\t\t}\n\n\t\t\t\toffsetTop = bigHeight;\n\t\t\t\tbigOffsetTop = containerHeight - offsetTop;\n\n\t\t\t\tif (bigFirst === 'column') {\n\t\t\t\t\tshowBigFirst = false;\n\t\t\t\t} else if (bigFirst === 'row') {\n\t\t\t\t\tshowBigFirst = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We are wide, going to take up the whole height and arrange the small guys on the right\n\t\t\t\tbigHeight = containerHeight;\n\t\t\t\tbigWidth = Math.floor(containerWidth * bigPercentage);\n\n\t\t\t\tif (minBigPercentage > 0) {\n\t\t\t\t\t// Find the best size for the big area\n\t\t\t\t\tlet bigDimensions;\n\t\t\t\t\tif (!bigFixedRatio) {\n\t\t\t\t\t\tbigDimensions = this.getBestDimensions(\n\t\t\t\t\t\t\tbigMinRatio,\n\t\t\t\t\t\t\tbigMaxRatio,\n\t\t\t\t\t\t\tbigWidth,\n\t\t\t\t\t\t\tbigHeight,\n\t\t\t\t\t\t\tbigOnes.length,\n\t\t\t\t\t\t\tbigMaxWidth,\n\t\t\t\t\t\t\tbigMaxHeight\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Use the ratio of the first video element we find to approximate\n\t\t\t\t\t\tconst ratio = bigOnes[0].height / bigOnes[0].width;\n\t\t\t\t\t\tbigDimensions = this.getBestDimensions(ratio, ratio, bigWidth, bigHeight, bigOnes.length, bigMaxWidth, bigMaxHeight);\n\t\t\t\t\t}\n\n\t\t\t\t\tbigWidth = Math.max(\n\t\t\t\t\t\tcontainerWidth * minBigPercentage,\n\t\t\t\t\t\tMath.min(bigWidth, bigDimensions.targetWidth * bigDimensions.targetCols)\n\t\t\t\t\t);\n\n\t\t\t\t\t// Don't awkwardly scale the small area bigger than we need to and end up with floating videos in the middle\n\t\t\t\t\tconst smallDimensions = this.getBestDimensions(\n\t\t\t\t\t\tminRatio,\n\t\t\t\t\t\tmaxRatio,\n\t\t\t\t\t\tcontainerWidth - bigWidth,\n\t\t\t\t\t\tcontainerHeight,\n\t\t\t\t\t\tnormalOnes.length + smallOnes.length + topBarOnes.length,\n\t\t\t\t\t\tsmallMaxWidth,\n\t\t\t\t\t\tsmallMaxHeight\n\t\t\t\t\t);\n\t\t\t\t\tbigWidth = Math.max(bigWidth, containerWidth - smallDimensions.targetCols * smallDimensions.targetWidth);\n\t\t\t\t}\n\n\t\t\t\toffsetLeft = bigWidth;\n\t\t\t\tbigOffsetLeft = containerWidth - offsetLeft;\n\n\t\t\t\tif (bigFirst === 'column') {\n\t\t\t\t\tshowBigFirst = true;\n\t\t\t\t} else if (bigFirst === 'row') {\n\t\t\t\t\tshowBigFirst = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (showBigFirst) {\n\t\t\t\tareas.big = { top: 0, left: 0, width: bigWidth, height: bigHeight };\n\t\t\t\tareas.normal = { top: offsetTop, left: offsetLeft, width: containerWidth - offsetLeft, height: containerHeight - offsetTop };\n\t\t\t} else {\n\t\t\t\tareas.big = { left: bigOffsetLeft, top: bigOffsetTop, width: bigWidth, height: bigHeight };\n\t\t\t\tareas.normal = { top: 0, left: 0, width: containerWidth - offsetLeft, height: containerHeight - offsetTop };\n\t\t\t}\n\t\t} else if (bigOnes.length > 0 && normalOnes.length === 0 && smallOnes.length === 0 && topBarOnes.length === 0) {\n\t\t\t// We only have bigOnes just center it\n\t\t\tareas.big = { top: 0, left: 0, width: containerWidth, height: containerHeight };\n\t\t} else if (normalOnes.length > 0 || smallOnes.length > 0 || topBarOnes.length > 0) {\n\t\t\t// Only normal, small, and/or topbar elements\n\t\t\tareas.normal = { top: offsetTop, left: offsetLeft, width: containerWidth - offsetLeft, height: containerHeight - offsetTop };\n\t\t}\n\n\t\t// Calculate boxes for each area\n\t\tif (areas.big) {\n\t\t\tbigBoxes = this.calculateBoxesForArea(\n\t\t\t\t{\n\t\t\t\t\tcontainerWidth: areas.big.width,\n\t\t\t\t\tcontainerHeight: areas.big.height,\n\t\t\t\t\toffsetLeft: areas.big.left,\n\t\t\t\t\toffsetTop: areas.big.top,\n\t\t\t\t\tfixedRatio: bigFixedRatio,\n\t\t\t\t\tminRatio: bigMinRatio,\n\t\t\t\t\tmaxRatio: bigMaxRatio,\n\t\t\t\t\talignItems: bigAlignItems,\n\t\t\t\t\tmaxWidth: bigMaxWidth,\n\t\t\t\t\tmaxHeight: bigMaxHeight,\n\t\t\t\t\tscaleLastRow: bigScaleLastRow\n\t\t\t\t},\n\t\t\t\tbigOnes\n\t\t\t);\n\t\t}\n\n\t\tif (areas.normal) {\n\t\t\tlet currentTop = areas.normal.top;\n\t\t\tlet remainingHeight = areas.normal.height;\n\n\t\t\t// 1. Position TopBar Elements at the very top (header style: full width, 50px height)\n\t\t\tif (topBarOnes.length > 0) {\n\t\t\t\tconst topBarHeight = 50;\n\t\t\t\tconst topBarWidth = Math.floor(containerWidth / topBarOnes.length);\n\n\t\t\t\ttopBarBoxes = topBarOnes.map((element, idx) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tleft: areas.normal!.left + idx * topBarWidth,\n\t\t\t\t\t\ttop: currentTop,\n\t\t\t\t\t\twidth: topBarWidth,\n\t\t\t\t\t\theight: topBarHeight\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tcurrentTop += topBarHeight;\n\t\t\t\tremainingHeight -= topBarHeight;\n\t\t\t}\n\n\t\t\t// 2. Position Small Elements (reduced format)\n\t\t\tif (smallOnes.length > 0) {\n\t\t\t\tconst maxSmallWidthAvailable = smallMaxWidth;\n\t\t\t\tconst maxSmallHeightAvailable = smallMaxHeight;\n\n\t\t\t\tconst tentativeCols = maxSmallWidthAvailable === Infinity\n\t\t\t\t\t? smallOnes.length\n\t\t\t\t\t: Math.max(1, Math.floor(containerWidth / maxSmallWidthAvailable));\n\t\t\t\tconst displayCols = Math.max(1, Math.min(smallOnes.length, tentativeCols));\n\n\t\t\t\tconst computedWidth = maxSmallWidthAvailable === Infinity\n\t\t\t\t\t? Math.floor(containerWidth / displayCols)\n\t\t\t\t\t: maxSmallWidthAvailable;\n\t\t\t\tconst computedHeight = maxSmallHeightAvailable === Infinity ? computedWidth : maxSmallHeightAvailable;\n\n\t\t\t\tconst rowWidth = displayCols * computedWidth;\n\t\t\t\tconst rowOffset = Math.floor(Math.max(0, containerWidth - rowWidth) / 2);\n\n\t\t\t\tsmallBoxes = smallOnes.map((element, idx) => {\n\t\t\t\t\tconst col = idx % displayCols;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tleft: areas.normal!.left + col * computedWidth + rowOffset,\n\t\t\t\t\t\ttop: currentTop,\n\t\t\t\t\t\twidth: computedWidth,\n\t\t\t\t\t\theight: computedHeight\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tcurrentTop += computedHeight;\n\t\t\t\tremainingHeight -= computedHeight;\n\t\t\t}\n\n\t\t\t// 3. Position Normal Elements in remaining space\n\t\t\tif (normalOnes.length > 0) {\n\t\t\t\tnormalBoxes = this.calculateBoxesForArea(\n\t\t\t\t\t{\n\t\t\t\t\t\tcontainerWidth: areas.normal.width,\n\t\t\t\t\t\tcontainerHeight: Math.max(0, remainingHeight),\n\t\t\t\t\t\toffsetLeft: areas.normal.left,\n\t\t\t\t\t\toffsetTop: currentTop,\n\t\t\t\t\t\tfixedRatio,\n\t\t\t\t\t\tminRatio,\n\t\t\t\t\t\tmaxRatio,\n\t\t\t\t\t\talignItems: areas.big ? smallAlignItems : alignItems,\n\t\t\t\t\t\tmaxWidth: areas.big ? maxWidth : maxWidth,\n\t\t\t\t\t\tmaxHeight: areas.big ? maxHeight : maxHeight,\n\t\t\t\t\t\tscaleLastRow\n\t\t\t\t\t},\n\t\t\t\t\tnormalOnes\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Rebuild the array in the right order based on element types\n\t\tconst boxes = this.reconstructBoxesInOrder(\n\t\t\telements,\n\t\t\tcategorized,\n\t\t\tbigBoxes,\n\t\t\tnormalBoxes,\n\t\t\tsmallBoxes,\n\t\t\ttopBarBoxes\n\t\t);\n\n\t\treturn { boxes, areas };\n\t}\n\n\t/**\n\t * Calculate best dimensions for a set of elements\n\t * @param minRatio Minimum aspect ratio\n\t * @param maxRatio Maximum aspect ratio\n\t * @param width Available width\n\t * @param height Available height\n\t * @param count Number of elements\n\t * @param maxWidth Maximum element width\n\t * @param maxHeight Maximum element height\n\t * @returns Best dimensions calculation result\n\t */\n\tgetBestDimensions(\n\t\tminRatio: number,\n\t\tmaxRatio: number,\n\t\twidth: number,\n\t\theight: number,\n\t\tcount: number,\n\t\tmaxWidth: number,\n\t\tmaxHeight: number\n\t): BestDimensions {\n\t\t// Cache key for memoization\n\t\tconst cacheKey = LayoutDimensionsCache.generateKey(minRatio, maxRatio, width, height, count, maxWidth, maxHeight);\n\t\tconst cached = this.dimensionsCache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tlet maxArea: number | undefined;\n\t\tlet targetCols = 1;\n\t\tlet targetRows = 1;\n\t\tlet targetHeight = 0;\n\t\tlet targetWidth = 0;\n\n\t\t// Iterate through every possible combination of rows and columns\n\t\t// and see which one has the least amount of whitespace\n\t\tfor (let i = 1; i <= count; i++) {\n\t\t\tconst cols = i;\n\t\t\tconst rows = Math.ceil(count / cols);\n\n\t\t\t// Try taking up the whole height and width\n\t\t\tlet tHeight = Math.floor(height / rows);\n\t\t\tlet tWidth = Math.floor(width / cols);\n\n\t\t\tlet tRatio = tHeight / tWidth;\n\t\t\tif (tRatio > maxRatio) {\n\t\t\t\t// We went over decrease the height\n\t\t\t\ttRatio = maxRatio;\n\t\t\t\ttHeight = tWidth * tRatio;\n\t\t\t} else if (tRatio < minRatio) {\n\t\t\t\t// We went under decrease the width\n\t\t\t\ttRatio = minRatio;\n\t\t\t\ttWidth = tHeight / tRatio;\n\t\t\t}\n\n\t\t\ttWidth = Math.min(maxWidth, tWidth);\n\t\t\ttHeight = Math.min(maxHeight, tHeight);\n\n\t\t\tconst area = tWidth * tHeight * count;\n\n\t\t\t// If this width and height takes up the most space then we're going with that\n\t\t\tif (maxArea === undefined || area >= maxArea) {\n\t\t\t\tif (!(area === maxArea && count % (cols * rows) > count % (targetRows * targetCols))) {\n\t\t\t\t\t// Favour even numbers of participants in each row, eg. 2 on each row\n\t\t\t\t\t// instead of 3 in one row and then 1 on the next\n\t\t\t\t\tmaxArea = area;\n\t\t\t\t\ttargetHeight = tHeight;\n\t\t\t\t\ttargetWidth = tWidth;\n\t\t\t\t\ttargetCols = cols;\n\t\t\t\t\ttargetRows = rows;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst result: BestDimensions = {\n\t\t\tmaxArea: maxArea || 0,\n\t\t\ttargetCols: targetCols,\n\t\t\ttargetRows: targetRows,\n\t\t\ttargetHeight: targetHeight,\n\t\t\ttargetWidth: targetWidth,\n\t\t\tratio: targetHeight / targetWidth || 0\n\t\t};\n\n\t\t// Cache the result for future use\n\t\tthis.dimensionsCache.set(cacheKey, result);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Calculate boxes for a specific area\n\t * @param opts Area-specific layout options\n\t * @param elements Elements to position in this area\n\t * @returns Array of layout boxes\n\t */\n\tprivate calculateBoxesForArea(\n\t\topts: Partial<ExtendedLayoutOptions & { offsetLeft: number; offsetTop: number }>,\n\t\telements: ElementDimensions[]\n\t): LayoutBox[] {\n\t\tconst {\n\t\t\tmaxRatio = LAYOUT_CONSTANTS.DEFAULT_MAX_RATIO,\n\t\t\tminRatio = LAYOUT_CONSTANTS.DEFAULT_MIN_RATIO,\n\t\t\tfixedRatio = false,\n\t\t\tcontainerWidth = LAYOUT_CONSTANTS.DEFAULT_VIDEO_WIDTH,\n\t\t\tcontainerHeight = LAYOUT_CONSTANTS.DEFAULT_VIDEO_HEIGHT,\n\t\t\toffsetLeft = 0,\n\t\t\toffsetTop = 0,\n\t\t\talignItems = LayoutAlignment.CENTER,\n\t\t\tmaxWidth = Infinity,\n\t\t\tmaxHeight = Infinity,\n\t\t\tscaleLastRow = true\n\t\t} = opts;\n\n\t\tconst ratios = elements.map((element) => element.height / element.width);\n\t\tconst count = ratios.length;\n\n\t\tlet dimensions;\n\n\t\tif (!fixedRatio) {\n\t\t\tdimensions = this.getBestDimensions(minRatio, maxRatio, containerWidth, containerHeight, count, maxWidth, maxHeight);\n\t\t} else {\n\t\t\t// Use the ratio of the first video element we find to approximate\n\t\t\tconst ratio = ratios.length > 0 ? ratios[0] : LAYOUT_CONSTANTS.DEFAULT_MIN_RATIO;\n\t\t\tdimensions = this.getBestDimensions(ratio, ratio, containerWidth, containerHeight, count, maxWidth, maxHeight);\n\t\t}\n\n\t\t// Loop through each stream in the container and place it inside\n\t\tlet x = 0;\n\t\tlet y = 0;\n\t\tconst rows: LayoutRow[] = [];\n\t\tlet row: LayoutRow | undefined;\n\t\tconst boxes: LayoutBox[] = [];\n\n\t\t// Iterate through the children and create an array with a new item for each row\n\t\t// and calculate the width of each row so that we know if we go over the size and need to adjust\n\t\tfor (let i = 0; i < ratios.length; i++) {\n\t\t\tif (i % dimensions.targetCols === 0) {\n\t\t\t\t// This is a new row\n\t\t\t\trow = { ratios: [], width: 0, height: 0 };\n\t\t\t\trows.push(row);\n\t\t\t}\n\t\t\tconst ratio = ratios[i];\n\t\t\tif (row) {\n\t\t\t\trow.ratios.push(ratio);\n\t\t\t\tlet targetWidth = dimensions.targetWidth;\n\t\t\t\tconst targetHeight = dimensions.targetHeight;\n\t\t\t\t// If we're using a fixedRatio then we need to set the correct ratio for this element\n\t\t\t\tif (fixedRatio) {\n\t\t\t\t\ttargetWidth = targetHeight / ratio;\n\t\t\t\t}\n\t\t\t\trow.width += targetWidth;\n\t\t\t\trow.height = targetHeight;\n\t\t\t}\n\t\t}\n\n\t\t// Calculate total row height adjusting if we go too wide\n\t\tlet totalRowHeight = 0;\n\t\tlet remainingShortRows = 0;\n\t\tfor (let i = 0; i < rows.length; i++) {\n\t\t\trow = rows[i];\n\t\t\tif (row.width > containerWidth) {\n\t\t\t\t// Went over on the width, need to adjust the height proportionally\n\t\t\t\trow.height = Math.floor(row.height * (containerWidth / row.width));\n\t\t\t\trow.width = containerWidth;\n\t\t\t} else if (row.width < containerWidth && row.height < maxHeight) {\n\t\t\t\tremainingShortRows += 1;\n\t\t\t}\n\t\t\ttotalRowHeight += row.height;\n\t\t}\n\n\t\tif (scaleLastRow && totalRowHeight < containerHeight && remainingShortRows > 0) {\n\t\t\t// We can grow some of the rows, we're not taking up the whole height\n\t\t\tlet remainingHeightDiff = containerHeight - totalRowHeight;\n\t\t\ttotalRowHeight = 0;\n\t\t\tfor (let i = 0; i < rows.length; i++) {\n\t\t\t\trow = rows[i];\n\t\t\t\tif (row.width < containerWidth) {\n\t\t\t\t\t// Evenly distribute the extra height between the short rows\n\t\t\t\t\tlet extraHeight = remainingHeightDiff / remainingShortRows;\n\t\t\t\t\tif (extraHeight / row.height > (containerWidth - row.width) / row.width) {\n\t\t\t\t\t\t// We can't go that big or we'll go too wide\n\t\t\t\t\t\textraHeight = Math.floor(((containerWidth - row.width) / row.width) * row.height);\n\t\t\t\t\t}\n\t\t\t\t\trow.width += Math.floor((extraHeight / row.height) * row.width);\n\t\t\t\t\trow.height += extraHeight;\n\t\t\t\t\tremainingHeightDiff -= extraHeight;\n\t\t\t\t\tremainingShortRows -= 1;\n\t\t\t\t}\n\t\t\t\ttotalRowHeight += row.height;\n\t\t\t}\n\t\t}\n\n\t\t// vertical centering\n\t\tswitch (alignItems) {\n\t\t\tcase LayoutAlignment.START:\n\t\t\t\ty = 0;\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.END:\n\t\t\t\ty = containerHeight - totalRowHeight;\n\t\t\t\tbreak;\n\t\t\tcase LayoutAlignment.CENTER:\n\t\t\tdefault:\n\t\t\t\ty = (containerHeight - totalRowHeight) / 2;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Iterate through each row and place each child\n\t\tfor (let i = 0; i < rows.length; i++) {\n\t\t\trow = rows[i];\n\t\t\tlet rowMarginLeft;\n\t\t\tswitch (alignItems) {\n\t\t\t\tcase LayoutAlignment.START:\n\t\t\t\t\trowMarginLeft = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.END:\n\t\t\t\t\trowMarginLeft = containerWidth - row.width;\n\t\t\t\t\tbreak;\n\t\t\t\tcase LayoutAlignment.CENTER:\n\t\t\t\tdefault:\n\t\t\t\t\trowMarginLeft = (containerWidth - row.width) / 2;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx = rowMarginLeft;\n\t\t\tlet targetHeight = row.height;\n\t\t\tfor (let j = 0; j < row.ratios.length; j++) {\n\t\t\t\tconst ratio = row.ratios[j];\n\n\t\t\t\tlet targetWidth = dimensions.targetWidth;\n\t\t\t\ttargetHeight = row.height;\n\t\t\t\t// If we're using a fixedRatio then we need to set the correct ratio for this element\n\t\t\t\tif (fixedRatio) {\n\t\t\t\t\ttargetWidth = Math.floor(targetHeight / ratio);\n\t\t\t\t} else if (targetHeight / targetWidth !== dimensions.targetHeight / dimensions.targetWidth) {\n\t\t\t\t\t// We grew this row, we need to adjust the width to account for the increase in height\n\t\t\t\t\ttargetWidth = Math.floor((dimensions.targetWidth / dimensions.targetHeight) * targetHeight);\n\t\t\t\t}\n\n\t\t\t\tboxes.push({\n\t\t\t\t\tleft: x + offsetLeft,\n\t\t\t\t\ttop: y + offsetTop,\n\t\t\t\t\twidth: targetWidth,\n\t\t\t\t\theight: targetHeight\n\t\t\t\t});\n\t\t\t\tx += targetWidth;\n\t\t\t}\n\t\t\ty += targetHeight;\n\t\t}\n\t\treturn boxes;\n\t}\n\n\t/**\n\t * Categorize elements into big, normal, small, and topBar\n\t * @param elements Elements to categorize\n\t * @returns Categorized elements with their indices\n\t */\n\tprivate categorizeElements(elements: ElementDimensions[]): CategorizedElements & {\n\t\tbigOnes: ElementDimensions[];\n\t\tnormalOnes: ElementDimensions[];\n\t\tsmallOnes: ElementDimensions[];\n\t\ttopBarOnes: ElementDimensions[];\n\t} {\n\t\tconst bigIndices: number[] = [];\n\t\tconst smallIndices: number[] = [];\n\t\tconst topBarIndices: number[] = [];\n\t\tconst normalIndices: number[] = [];\n\n\t\tconst bigOnes = elements.filter((element, idx) => {\n\t\t\tif (element.big) {\n\t\t\t\tbigIndices.push(idx);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tconst topBarOnes = elements.filter((element, idx) => {\n\t\t\tif (!element.big && element.topBar) {\n\t\t\t\ttopBarIndices.push(idx);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tconst smallOnes = elements.filter((element, idx) => {\n\t\t\tif (!element.big && !element.topBar && element.small) {\n\t\t\t\tsmallIndices.push(idx);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tconst normalOnes = elements.filter((element, idx) => {\n\t\t\tif (!element.big && !element.topBar && !element.small) {\n\t\t\t\tnormalIndices.push(idx);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\treturn {\n\t\t\tbig: bigOnes,\n\t\t\tnormal: normalOnes,\n\t\t\tsmall: smallOnes,\n\t\t\ttopBar: topBarOnes,\n\t\t\tbigOnes,\n\t\t\tnormalOnes,\n\t\t\tsmallOnes,\n\t\t\ttopBarOnes,\n\t\t\tbigIndices,\n\t\t\tnormalIndices,\n\t\t\tsmallIndices,\n\t\t\ttopBarIndices\n\t\t};\n\t}\n\n\t/**\n\t * Reconstruct boxes in original element order\n\t * @param elements Original elements\n\t * @param categorized Categorized elements\n\t * @param bigBoxes Boxes for big elements\n\t * @param normalBoxes Boxes for normal elements\n\t * @param smallBoxes Boxes for small elements\n\t * @param topBarBoxes Boxes for topBar elements\n\t * @returns Boxes in original order\n\t */\n\tprivate reconstructBoxesInOrder(\n\t\telements: ElementDimensions[],\n\t\tcategorized: CategorizedElements,\n\t\tbigBoxes: LayoutBox[],\n\t\tnormalBoxes: LayoutBox[],\n\t\tsmallBoxes: LayoutBox[],\n\t\ttopBarBoxes: LayoutBox[]\n\t): LayoutBox[] {\n\t\tconst boxes: LayoutBox[] = [];\n\t\tlet bigBoxesIdx = 0;\n\t\tlet normalBoxesIdx = 0;\n\t\tlet smallBoxesIdx = 0;\n\t\tlet topBarBoxesIdx = 0;\n\n\t\telements.forEach((element, idx) => {\n\t\t\tif (categorized.bigIndices.indexOf(idx) > -1) {\n\t\t\t\tboxes[idx] = bigBoxes[bigBoxesIdx];\n\t\t\t\tbigBoxesIdx += 1;\n\t\t\t} else if (categorized.topBarIndices.indexOf(idx) > -1) {\n\t\t\t\tboxes[idx] = topBarBoxes[topBarBoxesIdx];\n\t\t\t\ttopBarBoxesIdx += 1;\n\t\t\t} else if (categorized.smallIndices.indexOf(idx) > -1) {\n\t\t\t\tboxes[idx] = smallBoxes[smallBoxesIdx];\n\t\t\t\tsmallBoxesIdx += 1;\n\t\t\t} else {\n\t\t\t\tboxes[idx] = normalBoxes[normalBoxesIdx];\n\t\t\t\tnormalBoxesIdx += 1;\n\t\t\t}\n\t\t});\n\n\t\treturn boxes;\n\t}\n\n\t/**\n\t * Get video aspect ratio\n\t * @param element Element dimensions\n\t * @returns Aspect ratio (height/width)\n\t */\n\tprivate getVideoRatio(element: ElementDimensions): number {\n\t\treturn element.height / element.width;\n\t}\n}\n","import { LAYOUT_CONSTANTS, LayoutBox } from './layout-types.model';\n\n/**\n * Position information for DOM element\n */\ninterface ElementPosition {\n\tleft: string;\n\ttop: string;\n\twidth: string;\n\theight: string;\n\t[key: string]: string; // Allow index signature for dynamic access\n}\n\n/**\n * Handles DOM manipulation and rendering for layout elements.\n * Manages positioning, animations, and visual updates without calculation logic.\n *\n * @internal\n */\nexport class LayoutRenderer {\n\n\t/**\n\t * Render layout boxes to DOM elements\n\t * @param container Parent container element\n\t * @param boxes Calculated layout boxes\n\t * @param elements DOM elements to position\n\t * @param animate Whether to animate transitions\n\t */\n\trenderLayout(container: HTMLElement, boxes: LayoutBox[], elements: HTMLElement[], animate: boolean): void {\n\t\tboxes.forEach((box, idx) => {\n\t\t\tconst elem = elements[idx];\n\t\t\tif (!elem) return;\n\n\t\t\t// Set position:absolute for proper layout positioning\n\t\t\tthis.getCssProperty(elem, 'position', 'absolute');\n\n\t\t\tconst actualDimensions = this.calculateActualDimensions(elem, box);\n\t\t\tthis.positionElement(elem, box.left, box.top, actualDimensions.width, actualDimensions.height, animate);\n\t\t});\n\t}\n\n\t/**\n\t * Calculate actual element dimensions accounting for margins, padding, and borders\n\t * @param elem DOM element\n\t * @param box Layout box dimensions\n\t * @returns Actual width and height\n\t */\n\tprivate calculateActualDimensions(elem: HTMLElement, box: LayoutBox): { width: number; height: number } {\n\t\tconst actualWidth =\n\t\t\tbox.width -\n\t\t\tthis.getCSSNumber(elem, 'margin-left') -\n\t\t\tthis.getCSSNumber(elem, 'margin-right') -\n\t\t\t(this.getCssProperty(elem, 'box-sizing') !== 'border-box'\n\t\t\t\t? this.getCSSNumber(elem, 'padding-left') +\n\t\t\t\t  this.getCSSNumber(elem, 'padding-right') +\n\t\t\t\t  this.getCSSNumber(elem, 'border-left') +\n\t\t\t\t  this.getCSSNumber(elem, 'border-right')\n\t\t\t\t: 0);\n\n\t\tconst actualHeight =\n\t\t\tbox.height -\n\t\t\tthis.getCSSNumber(elem, 'margin-top') -\n\t\t\tthis.getCSSNumber(elem, 'margin-bottom') -\n\t\t\t(this.getCssProperty(elem, 'box-sizing') !== 'border-box'\n\t\t\t\t? this.getCSSNumber(elem, 'padding-top') +\n\t\t\t\t  this.getCSSNumber(elem, 'padding-bottom') +\n\t\t\t\t  this.getCSSNumber(elem, 'border-top') +\n\t\t\t\t  this.getCSSNumber(elem, 'border-bottom')\n\t\t\t\t: 0);\n\n\t\treturn { width: actualWidth, height: actualHeight };\n\t}\n\n\t/**\n\t * Position element at specified coordinates with optional animation\n\t * @param elem Video or HTML element to position\n\t * @param x Left position\n\t * @param y Top position\n\t * @param width Element width\n\t * @param height Element height\n\t * @param animate Whether to animate the transition\n\t */\n\tprivate positionElement(\n\t\telem: HTMLVideoElement | HTMLElement,\n\t\tx: number,\n\t\ty: number,\n\t\twidth: number,\n\t\theight: number,\n\t\tanimate: boolean\n\t): void {\n\t\tconst targetPosition: ElementPosition = {\n\t\t\tleft: `${x}px`,\n\t\t\ttop: `${y}px`,\n\t\t\twidth: `${width}px`,\n\t\t\theight: `${height}px`\n\t\t};\n\n\t\tthis.fixAspectRatio(elem, width);\n\n\t\tif (animate) {\n\t\t\tsetTimeout(() => {\n\t\t\t\t// Animation added in CSS transition: all .1s linear;\n\t\t\t\tthis.animateElement(elem, targetPosition);\n\t\t\t\tthis.fixAspectRatio(elem, width);\n\t\t\t}, 10);\n\t\t} else {\n\t\t\tthis.setElementPosition(elem, targetPosition);\n\t\t\tif (!elem.classList.contains('layout')) {\n\t\t\t\telem.classList.add('layout');\n\t\t\t}\n\t\t}\n\n\t\tthis.fixAspectRatio(elem, width);\n\t}\n\n\t/**\n\t * Set element position without animation\n\t * @param elem Element to position\n\t * @param targetPosition Target position object\n\t */\n\tprivate setElementPosition(elem: HTMLVideoElement | HTMLElement, targetPosition: ElementPosition): void {\n\t\tObject.keys(targetPosition).forEach((key) => {\n\t\t\t(elem.style as any)[key] = targetPosition[key];\n\t\t});\n\t}\n\n\t/**\n\t * Animate element to target position\n\t * @param elem Element to animate\n\t * @param targetPosition Target position object\n\t */\n\tprivate animateElement(elem: HTMLVideoElement | HTMLElement, targetPosition: ElementPosition): void {\n\t\telem.style.transition = `all ${LAYOUT_CONSTANTS.ANIMATION_DURATION} ${LAYOUT_CONSTANTS.ANIMATION_EASING}`;\n\t\tthis.setElementPosition(elem, targetPosition);\n\t}\n\n\t/**\n\t * Fix aspect ratio for video elements\n\t * @param elem Element to fix\n\t * @param width Target width\n\t */\n\tprivate fixAspectRatio(elem: HTMLVideoElement | HTMLElement, width: number): void {\n\t\tconst sub = elem.querySelector('.OV_root') as HTMLVideoElement;\n\t\tif (sub) {\n\t\t\t// If this is the parent of a subscriber or publisher, then we need\n\t\t\t// to force the mutation observer on the publisher or subscriber to\n\t\t\t// trigger to get it to fix its layout\n\t\t\tconst oldWidth = sub.style.width;\n\t\t\tsub.style.width = `${width}px`;\n\t\t\tsub.style.width = oldWidth || '';\n\t\t}\n\t}\n\n\t/**\n\t * Get CSS property value or set it\n\t * @param el Element to query/modify\n\t * @param propertyName Property name or object of properties\n\t * @param value Optional value to set\n\t * @returns Property value if getting, void if setting\n\t */\n\tprivate getCssProperty(\n\t\tel: HTMLVideoElement | HTMLElement,\n\t\tpropertyName: any,\n\t\tvalue?: string\n\t): void | string {\n\t\tif (value !== undefined) {\n\t\t\t// Set one CSS property\n\t\t\tel.style[propertyName] = value;\n\t\t} else if (typeof propertyName === 'object') {\n\t\t\t// Set several CSS properties at once\n\t\t\tObject.keys(propertyName).forEach((key) => {\n\t\t\t\tthis.getCssProperty(el, key, propertyName[key]);\n\t\t\t});\n\t\t} else {\n\t\t\t// Get the CSS property\n\t\t\tconst computedStyle = window.getComputedStyle(el);\n\t\t\tlet currentValue = computedStyle.getPropertyValue(propertyName);\n\n\t\t\tif (currentValue === '') {\n\t\t\t\tcurrentValue = el.style[propertyName];\n\t\t\t}\n\t\t\treturn currentValue;\n\t\t}\n\t}\n\n\t/**\n\t * Get CSS property as number\n\t * @param elem Element to query\n\t * @param prop Property name\n\t * @returns Numeric value or 0 if not found\n\t */\n\tprivate getCSSNumber(elem: HTMLElement, prop: string): number {\n\t\tconst cssStr = this.getCssProperty(elem, prop);\n\t\treturn cssStr ? parseInt(cssStr, 10) : 0;\n\t}\n}\n","// Re-export all public types and constants for backward compatibility\nexport {\n\tBestDimensions,\n\tBigFirstOption,\n\tElementDimensions,\n\tExtendedLayoutOptions,\n\tLAYOUT_CONSTANTS,\n\tLayoutAlignment,\n\tLayoutArea,\n\tLayoutBox,\n\tLayoutClass,\n\tLayoutRow,\n\tOpenViduLayoutOptions,\n\tSidenavMode\n} from './layout-types.model';\n\nimport { LayoutCalculator } from './layout-calculator.model';\nimport { LayoutDimensionsCache } from './layout-dimensions-cache.model';\nimport { LayoutRenderer } from './layout-renderer.model';\nimport { ElementDimensions, ExtendedLayoutOptions, LAYOUT_CONSTANTS, LayoutClass, OpenViduLayoutOptions } from './layout-types.model';\n\n/**\n * OpenViduLayout orchestrates layout calculation and rendering.\n * Maintains backward compatibility with existing API while delegating to specialized classes.\n *\n * @internal\n */\nexport class OpenViduLayout {\n\tprivate layoutContainer!: HTMLElement;\n\tprivate opts!: OpenViduLayoutOptions;\n\n\t// Specialized components\n\tprivate dimensionsCache: LayoutDimensionsCache;\n\tprivate calculator: LayoutCalculator;\n\tprivate renderer: LayoutRenderer;\n\n\tconstructor() {\n\t\tthis.dimensionsCache = new LayoutDimensionsCache();\n\t\tthis.calculator = new LayoutCalculator(this.dimensionsCache);\n\t\tthis.renderer = new LayoutRenderer();\n\t}\n\n\t/**\n\t * Update the layout container\n\t * module export layout\n\t */\n\tupdateLayout(container: HTMLElement, opts: OpenViduLayoutOptions) {\n\t\tsetTimeout(() => {\n\t\t\tthis.layoutContainer = container;\n\t\t\tthis.opts = opts;\n\n\t\t\tif (this.getCssProperty(this.layoutContainer, 'display') === 'none') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet id = this.layoutContainer.id;\n\t\t\tif (!id) {\n\t\t\t\tid = 'OV_' + this.cheapUUID();\n\t\t\t\tthis.layoutContainer.id = id;\n\t\t\t}\n\n\t\t\tconst extendedOpts: ExtendedLayoutOptions = {\n\t\t\t\t...opts,\n\t\t\t\tcontainerHeight:\n\t\t\t\t\tthis.getHeight(this.layoutContainer) -\n\t\t\t\t\tthis.getCSSNumber(this.layoutContainer, 'border-top') -\n\t\t\t\t\tthis.getCSSNumber(this.layoutContainer, 'border-bottom'),\n\t\t\t\tcontainerWidth:\n\t\t\t\t\tthis.getWidth(this.layoutContainer) -\n\t\t\t\t\tthis.getCSSNumber(this.layoutContainer, 'border-left') -\n\t\t\t\t\tthis.getCSSNumber(this.layoutContainer, 'border-right')\n\t\t\t};\n\n\t\t\tconst selector = `#${id}>*:not(.${LayoutClass.IGNORED_ELEMENT}):not(.${LayoutClass.MINIMIZED_ELEMENT})`;\n\t\t\tconst children = Array.prototype.filter.call(this.layoutContainer.querySelectorAll(selector), () => this.filterDisplayNone);\n\n\t\t\tconst elements = children.map((element: HTMLElement) => {\n\t\t\t\tconst res = this.getChildDims(element);\n\t\t\t\tres.big = element.classList.contains(this.opts.bigClass);\n\t\t\t\tres.small = element.classList.contains(LayoutClass.SMALL_ELEMENT);\n\t\t\t\tres.topBar = element.classList.contains(LayoutClass.TOP_BAR_ELEMENT);\n\t\t\t\treturn res;\n\t\t\t});\n\n\t\t\t// Delegate calculation to LayoutCalculator\n\t\t\tconst layout = this.calculator.calculateLayout(extendedOpts, elements);\n\n\t\t\t// Delegate rendering to LayoutRenderer\n\t\t\tthis.renderer.renderLayout(this.layoutContainer, layout.boxes, children, this.opts.animate);\n\t\t}, LAYOUT_CONSTANTS.UPDATE_TIMEOUT);\n\t}\n\n\t/**\n\t * Initialize the layout inside of the container with the options required\n\t * @param container\n\t * @param opts\n\t */\n\tinitLayoutContainer(container: HTMLElement, opts: OpenViduLayoutOptions) {\n\t\tthis.opts = opts;\n\t\tthis.layoutContainer = container;\n\t\tthis.updateLayout(container, opts);\n\t}\n\n\tgetLayoutContainer(): HTMLElement {\n\t\treturn this.layoutContainer;\n\t}\n\n\t/**\n\t * Clear dimensions cache to free memory\n\t */\n\tclearCache(): void {\n\t\tthis.dimensionsCache.clear();\n\t}\n\n\t// ============================================================================\n\t// PRIVATE UTILITY METHODS (DOM Helpers)\n\t// ============================================================================\n\n\tprivate getCssProperty(el: HTMLVideoElement | HTMLElement, propertyName: any, value?: string): void | string {\n\t\tif (value !== undefined) {\n\t\t\t// Set one CSS property\n\t\t\tel.style[propertyName] = value;\n\t\t} else if (typeof propertyName === 'object') {\n\t\t\t// Set several CSS properties at once\n\t\t\tObject.keys(propertyName).forEach((key) => {\n\t\t\t\tthis.getCssProperty(el, key, propertyName[key]);\n\t\t\t});\n\t\t} else {\n\t\t\t// Get the CSS property\n\t\t\tconst computedStyle = window.getComputedStyle(el);\n\t\t\tlet currentValue = computedStyle.getPropertyValue(propertyName);\n\n\t\t\tif (currentValue === '') {\n\t\t\t\tcurrentValue = el.style[propertyName];\n\t\t\t}\n\t\t\treturn currentValue;\n\t\t}\n\t}\n\n\tprivate height(el: HTMLElement) {\n\t\tconst { offsetHeight } = el;\n\n\t\tif (offsetHeight > 0) {\n\t\t\treturn `${offsetHeight}px`;\n\t\t}\n\t\treturn this.getCssProperty(el, 'height');\n\t}\n\n\tprivate width(el: HTMLElement) {\n\t\tconst { offsetWidth } = el;\n\n\t\tif (offsetWidth > 0) {\n\t\t\treturn `${offsetWidth}px`;\n\t\t}\n\t\treturn this.getCssProperty(el, 'width');\n\t}\n\n\t/**\n\t * @hidden\n\t */\n\tprivate getChildDims(child: HTMLVideoElement | HTMLElement): ElementDimensions {\n\t\tif (child instanceof HTMLVideoElement) {\n\t\t\tif (child.videoHeight && child.videoWidth) {\n\t\t\t\treturn {\n\t\t\t\t\theight: child.videoHeight,\n\t\t\t\t\twidth: child.videoWidth\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (child instanceof HTMLElement) {\n\t\t\tconst video = child.querySelector('video');\n\t\t\tif (video instanceof HTMLVideoElement && video.videoHeight && video.videoWidth) {\n\t\t\t\treturn {\n\t\t\t\t\theight: video.videoHeight,\n\t\t\t\t\twidth: video.videoWidth\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\theight: LAYOUT_CONSTANTS.DEFAULT_VIDEO_HEIGHT,\n\t\t\twidth: LAYOUT_CONSTANTS.DEFAULT_VIDEO_WIDTH\n\t\t};\n\t}\n\n\t/**\n\t * @hidden\n\t */\n\tprivate getCSSNumber(elem: HTMLElement, prop: string): number {\n\t\tconst cssStr = this.getCssProperty(elem, prop);\n\t\treturn cssStr ? parseInt(cssStr, 10) : 0;\n\t}\n\n\t/**\n\t * @hidden\n\t */\n\t// Really cheap UUID function\n\tprivate cheapUUID(): string {\n\t\treturn Math.floor(Math.random() * 100000000).toString();\n\t}\n\n\t/**\n\t * @hidden\n\t */\n\tprivate getHeight(elem: HTMLElement): number {\n\t\tconst heightStr = this.height(elem);\n\t\treturn heightStr ? parseInt(heightStr, 10) : 0;\n\t}\n\n\t/**\n\t * @hidden\n\t */\n\tprivate getWidth(elem: HTMLElement): number {\n\t\tconst widthStr = this.width(elem);\n\t\treturn widthStr ? parseInt(widthStr, 10) : 0;\n\t}\n\n\t/**\n\t * @hidden\n\t */\n\tprivate filterDisplayNone(element: HTMLElement) {\n\t\treturn this.getCssProperty(element, 'display') !== 'none';\n\t}\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Service to detect platform, device type, and browser features.\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class PlatformService {\n\tprivate readonly userAgent: string = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n\tconstructor() {}\n\n\t// ===== Device Type =====\n\n\t/**\n\t * Returns true if the device is mobile (iOS or Android)\n\t */\n\tisMobile(): boolean {\n\t\treturn this.isAndroid() || this.isIos();\n\t}\n\n\t/**\n\t * Returns true if the device is physically a mobile device (iPhone, Android phone)\n\t * This method is orientation-independent and hardware-based\n\t */\n\tisPhysicalMobile(): boolean {\n\t\treturn this.isIPhone() || this.isAndroidPhone();\n\t}\n\n\t/**\n\t * Returns true if the device is physically a tablet (iPad, Android tablet)\n\t */\n\tisPhysicalTablet(): boolean {\n\t\treturn this.isIPad() || this.isAndroidTablet();\n\t}\n\n\t/**\n\t * Detect Android phone specifically (not tablet)\n\t */\n\tisAndroidPhone(): boolean {\n\t\treturn /\\b(\\w*Android\\w*)\\b/.test(this.userAgent) && /\\b(\\w*Mobile\\w*)\\b/.test(this.userAgent);\n\t}\n\n\t/**\n\t * Detect Android tablet specifically\n\t */\n\tisAndroidTablet(): boolean {\n\t\treturn /\\b(\\w*Android\\w*)\\b/.test(this.userAgent) && !/\\b(\\w*Mobile\\w*)\\b/.test(this.userAgent);\n\t}\n\n\t/**\n\t * Detect Android Mobile (legacy method for compatibility)\n\t */\n\tisAndroid(): boolean {\n\t\treturn this.isAndroidPhone() || this.isAndroidTablet();\n\t}\n\n\t/**\n\t * Detect iPhone specifically\n\t */\n\tisIPhone(): boolean {\n\t\treturn /\\biPhone\\b/.test(this.userAgent) && /\\bMobile\\b/.test(this.userAgent);\n\t}\n\n\t/**\n\t * Detect iPad specifically\n\t */\n\tisIPad(): boolean {\n\t\treturn /\\bMacintosh\\b/.test(this.userAgent) && 'ontouchend' in document;\n\t}\n\n\t/**\n\t * Detect iOS device (iPhone or iPad)\n\t */\n\tisIos(): boolean {\n\t\treturn this.isIPhone() || this.isIPad();\n\t}\n\n\t/**\n\t * Detect if the device supports touch interactions\n\t */\n\tisTouchDevice(): boolean {\n\t\treturn 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\t}\n\n\t/**\n\t * Get the maximum screen dimension (useful for detecting device capabilities)\n\t */\n\tgetMaxScreenDimension(): number {\n\t\tif (typeof screen === 'undefined') return 1024;\n\t\treturn Math.max(screen.width, screen.height);\n\t}\n\n\t/**\n\t * Get the minimum screen dimension\n\t */\n\tgetMinScreenDimension(): number {\n\t\tif (typeof screen === 'undefined') return 768;\n\t\treturn Math.min(screen.width, screen.height);\n\t}\n\n\t/**\n\t * Enhanced mobile detection that considers physical device characteristics\n\t * This is orientation-independent and more reliable for landscape warnings\n\t */\n\tisPhysicalMobileDevice(): boolean {\n\t\t// First check: User agent based detection (most reliable)\n\t\tif (this.isPhysicalMobile()) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Second check: Screen dimensions for edge cases\n\t\t// Most mobile devices have a max dimension <= 950px even in landscape\n\t\tconst maxDimension = this.getMaxScreenDimension();\n\t\tconst minDimension = this.getMinScreenDimension();\n\n\t\t// If touch device with small screen dimensions, likely mobile\n\t\tif (this.isTouchDevice() && maxDimension <= 950 && minDimension <= 500) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t// ===== Browser Detection =====\n\n\tisFirefox(): boolean {\n\t\treturn /Firefox[\\/\\s](\\d+\\.\\d+)/.test(this.userAgent);\n\t}\n\n\tisSafariIos(): boolean {\n\t\treturn this.isIos() && this.isIOSWithSafari(this.userAgent);\n\t}\n\n\tprivate isIOSWithSafari(userAgent: string): boolean {\n\t\treturn /\\bSafari\\b/.test(userAgent) && !/\\bCriOS\\b/.test(userAgent) && !/\\bFxiOS\\b/.test(userAgent);\n\t}\n}\n","import { Injectable, signal, computed, OnDestroy } from '@angular/core';\nimport { fromEvent, Subject, debounceTime, distinctUntilChanged } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { PlatformService } from '../platform/platform.service';\nimport { DeviceOrientation, ViewportInfo, ViewportSize } from '../../models/viewport.model';\n\n/**\n * Service for responsive viewport detection and device type identification.\n * Provides reactive signals and utilities for building responsive interfaces.\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class ViewportService implements OnDestroy {\n\t// Design system breakpoints\n\tprivate readonly BREAKPOINTS = {\n\t\tmobile: 480,\n\t\ttablet: 768,\n\t\tdesktop: 1024,\n\t\twide: 1200\n\t} as const;\n\n\t// Reactive signals\n\tprivate readonly _width = signal(this.getCurrentWidth());\n\tprivate readonly _height = signal(this.getCurrentHeight());\n\n\t// Cleanup subject\n\tprivate readonly destroy$ = new Subject<void>();\n\n\tconstructor(protected platform: PlatformService) {\n\t\tthis.initializeResizeListener();\n\t}\n\n\t// ==== PUBLIC REACTIVE SIGNALS ====\n\n\t/**\n\t * Current viewport width\n\t */\n\treadonly width = this._width.asReadonly();\n\n\t/**\n\t * Current viewport height\n\t */\n\treadonly height = this._height.asReadonly();\n\n\t/**\n\t * Whether device supports touch interactions\n\t */\n\treadonly isTouchDevice = computed(() => this.platform.isTouchDevice());\n\n\t/**\n\t * Whether device is physically a mobile device (orientation-independent)\n\t * This uses hardware detection, not just screen size\n\t */\n\treadonly isPhysicalMobile = computed(() => this.platform.isPhysicalMobileDevice());\n\n\t/**\n\t * Whether device is physically a tablet (orientation-independent)\n\t */\n\treadonly isPhysicalTablet = computed(() => this.platform.isPhysicalTablet());\n\n\t/**\n\t * Current viewport size category\n\t */\n\treadonly viewportSize = computed<ViewportSize>(() => {\n\t\tconst width = this._width();\n\t\tif (width >= this.BREAKPOINTS.wide) return 'wide';\n\t\tif (width >= this.BREAKPOINTS.desktop) return 'desktop';\n\t\tif (width >= this.BREAKPOINTS.tablet) return 'tablet';\n\t\treturn 'mobile';\n\t});\n\n\t/**\n\t * Device orientation (computed)\n\t */\n\treadonly orientation = computed<DeviceOrientation>(() => {\n\t\treturn this._width() > this._height() ? 'landscape' : 'portrait';\n\t});\n\n\t/**\n\t * Whether current viewport is mobile size (legacy method)\n\t * For landscape warnings, use isPhysicalMobile instead\n\t */\n\treadonly isMobile = computed(() => this.viewportSize() === 'mobile' && this.platform.isTouchDevice());\n\n\t/**\n\t * Whether current viewport is tablet size\n\t */\n\treadonly isTablet = computed(() => this.viewportSize() === 'tablet' && this.platform.isTouchDevice());\n\n\t/**\n\t * Whether device should show mobile landscape warning\n\t * This is orientation-independent and hardware-based detection\n\t */\n\treadonly shouldShowLandscapeWarning = computed(() =>\n\t\tthis.isPhysicalMobile() && this.orientation() === 'landscape'\n\t);\n\n\t/**\n\t * Whether current viewport is desktop size\n\t */\n\treadonly isDesktop = computed(() => this.viewportSize() === 'desktop');\n\n\t/**\n\t * Whether current viewport is wide desktop size\n\t */\n\treadonly isWide = computed(() => this.viewportSize() === 'wide');\n\n\t/**\n\t * Whether current viewport is mobile or smaller\n\t */\n\treadonly isMobileView = computed(() => this._width() < this.BREAKPOINTS.tablet);\n\n\t/**\n\t * Whether current viewport is tablet or smaller\n\t */\n\treadonly isTabletDown = computed(() => this._width() < this.BREAKPOINTS.desktop);\n\n\t/**\n\t * Whether current viewport is tablet or larger\n\t */\n\treadonly isTabletUp = computed(() => this._width() >= this.BREAKPOINTS.tablet);\n\n\t/**\n\t * Whether current viewport is desktop or larger\n\t */\n\treadonly isDesktopUp = computed(() => this._width() >= this.BREAKPOINTS.desktop);\n\n\t/**\n\t * Complete viewport information\n\t */\n\treadonly viewportInfo = computed<ViewportInfo>(() => ({\n\t\twidth: this._width(),\n\t\theight: this._height(),\n\t\tsize: this.viewportSize(),\n\t\torientation: this.orientation(),\n\t\tisMobile: this.isMobile(),\n\t\tisTablet: this.isTablet(),\n\t\tisDesktop: this.isDesktop(),\n\t\tisWide: this.isWide(),\n\t\tisTouchDevice: this.isTouchDevice(),\n\t\tisPhysicalMobile: this.isPhysicalMobile(),\n\t\tisPhysicalTablet: this.isPhysicalTablet(),\n\t\tshouldShowLandscapeWarning: this.shouldShowLandscapeWarning()\n\t}));\n\n\t// ==== PUBLIC UTILITY METHODS ====\n\n\t/**\n\t * Check if viewport matches specific size\n\t */\n\tmatchesSize(size: ViewportSize): boolean {\n\t\treturn this.viewportSize() === size;\n\t}\n\n\t/**\n\t * Check if viewport is smaller than specified size\n\t */\n\tisSmallerThan(size: ViewportSize): boolean {\n\t\tconst currentWidth = this._width();\n\t\treturn currentWidth < this.BREAKPOINTS[size];\n\t}\n\n\t/**\n\t * Check if viewport is larger than specified size\n\t */\n\tisLargerThan(size: ViewportSize): boolean {\n\t\tconst currentWidth = this._width();\n\t\treturn currentWidth >= this.BREAKPOINTS[size];\n\t}\n\n\t/**\n\t * Get responsive grid columns based on viewport and content count\n\t */\n\tgetGridColumns(itemCount = 0): string {\n\t\tif (this.isMobileView()) {\n\t\t\treturn 'single-column';\n\t\t}\n\t\tif (this.isTablet()) {\n\t\t\treturn itemCount > 6 ? 'two-columns' : 'single-column';\n\t\t}\n\t\treturn itemCount > 10 ? 'three-columns' : 'two-columns';\n\t}\n\n\t/**\n\t * Get appropriate icon size for current viewport\n\t */\n\tgetIconSize(): 'small' | 'medium' | 'large' {\n\t\tif (this.isMobileView()) return 'medium';\n\t\tif (this.isTablet()) return 'small';\n\t\treturn 'small';\n\t}\n\n\t/**\n\t * Get appropriate spacing size for current viewport\n\t */\n\tgetSpacing(): 'compact' | 'comfortable' | 'spacious' {\n\t\tif (this.isMobileView()) return 'compact';\n\t\tif (this.isTablet()) return 'comfortable';\n\t\treturn 'spacious';\n\t}\n\n\t/**\n\t * Check if device is in landscape mode (mobile context)\n\t */\n\tisLandscape(): boolean {\n\t\treturn this.orientation() === 'landscape';\n\t}\n\n\t/**\n\t * Check if device is in portrait mode\n\t */\n\tisPortrait(): boolean {\n\t\treturn this.orientation() === 'portrait';\n\t}\n\n\t/**\n\t * Get breakpoint value for specified size\n\t */\n\tgetBreakpoint(size: keyof typeof this.BREAKPOINTS): number {\n\t\treturn this.BREAKPOINTS[size];\n\t}\n\n\t// ==== PRIVATE METHODS ====\n\n\tprivate getCurrentWidth(): number {\n\t\treturn typeof window !== 'undefined' ? window.innerWidth : 1024;\n\t}\n\n\tprivate getCurrentHeight(): number {\n\t\treturn typeof window !== 'undefined' ? window.innerHeight : 768;\n\t}\n\n\tprivate detectTouchDevice(): boolean {\n\t\tif (typeof window === 'undefined') return false;\n\t\treturn 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\t}\n\n\tprivate initializeResizeListener(): void {\n\t\tif (typeof window === 'undefined') return;\n\n\t\tfromEvent(window, 'resize')\n\t\t\t.pipe(\n\t\t\t\tdebounceTime(150), // Debounce for performance\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttakeUntil(this.destroy$)\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis._width.set(this.getCurrentWidth());\n\t\t\t\tthis._height.set(this.getCurrentHeight());\n\t\t\t});\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n}\n","import { Injectable, effect } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { LayoutAlignment, LayoutClass, OpenViduLayout, OpenViduLayoutOptions } from '../../models/layout/layout.model';\nimport { ILogger } from '../../models/logger.model';\nimport { LoggerService } from '../logger/logger.service';\nimport { ViewportService } from '../viewport/viewport.service';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class LayoutService {\n\tlayoutContainer: HTMLElement | undefined = undefined;\n\tlayoutWidthObs: Observable<number>;\n\tcaptionsTogglingObs: Observable<boolean>;\n\tprotected layoutWidth: BehaviorSubject<number> = new BehaviorSubject(0);\n\tprotected openviduLayout: OpenViduLayout | undefined;\n\tprotected openviduLayoutOptions!: OpenViduLayoutOptions;\n\tprotected captionsToggling: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\tprotected log: ILogger;\n\n\tconstructor(\n\t\tprotected loggerSrv: LoggerService,\n\t\tprotected viewportSrv: ViewportService\n\t) {\n\t\tthis.layoutWidthObs = this.layoutWidth.asObservable();\n\t\tthis.captionsTogglingObs = this.captionsToggling.asObservable();\n\t\tthis.log = this.loggerSrv.get('LayoutService');\n\t\tthis.openviduLayoutOptions = this.getOptions();\n\t\tthis.setupViewportListener();\n\t}\n\n\tinitialize(container: HTMLElement) {\n\t\tthis.layoutContainer = container;\n\t\tthis.openviduLayout = new OpenViduLayout();\n\t\tthis.openviduLayoutOptions = this.getOptions();\n\t\tif (this.layoutContainer) {\n\t\t\tthis.openviduLayout.initLayoutContainer(this.layoutContainer, this.openviduLayoutOptions);\n\t\t}\n\t\tthis.sendLayoutWidthEvent();\n\t}\n\n\ttoggleCaptions() {\n\t\tthis.captionsToggling.next(!this.captionsToggling.getValue());\n\t}\n\n\tupdate(timeout: number | undefined = undefined) {\n\t\tconst updateAux = () => {\n\t\t\tif (this.openviduLayout && this.layoutContainer) {\n\t\t\t\tthis.openviduLayoutOptions = this.getOptions();\n\t\t\t\tthis.openviduLayout.updateLayout(this.layoutContainer, this.openviduLayoutOptions);\n\t\t\t\tthis.sendLayoutWidthEvent();\n\t\t\t}\n\t\t};\n\t\tif (typeof timeout === 'number' && timeout >= 0) {\n\t\t\tsetTimeout(() => updateAux(), timeout);\n\t\t} else {\n\t\t\tupdateAux();\n\t\t}\n\t}\n\n\tupdateResponsive() {\n\t\tthis.updateLayoutOptions();\n\t}\n\n\tgetLayout() {\n\t\treturn this.openviduLayout;\n\t}\n\n\tclear() {\n\t\tthis.openviduLayout = undefined;\n\t}\n\n\t/**\n\t * Get layout options adjusted to the current viewport\n\t * @returns Layout options adjusted to the current viewport\n\t */\n\tprotected getOptions(): OpenViduLayoutOptions {\n\t\tconst ratios = this.getResponsiveRatios();\n\t\tconst percentages = this.getResponsivePercentages();\n\n\t\treturn {\n\t\t\tmaxRatio: ratios.maxRatio,\n\t\t\tminRatio: ratios.minRatio,\n\t\t\tfixedRatio: false,\n\t\t\tbigClass: LayoutClass.BIG_ELEMENT,\n\t\t\tsmallClass: LayoutClass.SMALL_ELEMENT,\n\t\t\tignoredClass: LayoutClass.IGNORED_ELEMENT,\n\t\t\tbigPercentage: percentages.bigPercentage,\n\t\t\tminBigPercentage: percentages.minBigPercentage,\n\t\t\tbigFixedRatio: false,\n\t\t\tbigMaxRatio: ratios.bigMaxRatio,\n\t\t\tbigMinRatio: ratios.bigMinRatio,\n\t\t\tbigFirst: true,\n\t\t\tanimate: true,\n\t\t\talignItems: LayoutAlignment.CENTER,\n\t\t\tbigAlignItems: LayoutAlignment.CENTER,\n\t\t\tsmallAlignItems: LayoutAlignment.CENTER,\n\t\t\tmaxWidth: Infinity,\n\t\t\tmaxHeight: Infinity,\n\t\t\tsmallMaxWidth: Infinity,\n\t\t\tsmallMaxHeight: 80,\n\t\t\tbigMaxWidth: Infinity,\n\t\t\tbigMaxHeight: Infinity,\n\t\t\tscaleLastRow: true,\n\t\t\tbigScaleLastRow: true\n\t\t};\n\t}\n\n\tprotected getResponsiveRatios() {\n\t\tconst isMobile = this.viewportSrv.isMobile();\n\t\tconst isTablet = this.viewportSrv.isTablet();\n\t\tconst isPortrait = this.viewportSrv.isPortrait();\n\n\t\tif (isMobile && isPortrait) {\n\t\t\treturn {\n\t\t\t\tmaxRatio: 5 / 4,\n\t\t\t\tminRatio: 4 / 5,\n\t\t\t\tbigMaxRatio: 5 / 4,\n\t\t\t\tbigMinRatio: 3 / 4\n\t\t\t};\n\t\t}\n\n\t\tif (isMobile) {\n\t\t\treturn {\n\t\t\t\tmaxRatio: 16 / 9,\n\t\t\t\tminRatio: 3 / 4,\n\t\t\t\tbigMaxRatio: 16 / 9,\n\t\t\t\tbigMinRatio: 4 / 3\n\t\t\t};\n\t\t}\n\n\t\tif (isTablet && isPortrait) {\n\t\t\treturn {\n\t\t\t\tmaxRatio: 4 / 3,\n\t\t\t\tminRatio: 3 / 5,\n\t\t\t\tbigMaxRatio: 4 / 3,\n\t\t\t\tbigMinRatio: 9 / 16\n\t\t\t};\n\t\t}\n\n\t\tif (isTablet) {\n\t\t\treturn {\n\t\t\t\tmaxRatio: 16 / 9,\n\t\t\t\tminRatio: 2 / 3,\n\t\t\t\tbigMaxRatio: 16 / 9,\n\t\t\t\tbigMinRatio: 9 / 16\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmaxRatio: 16 / 9,\n\t\t\tminRatio: 9 / 16,\n\t\t\tbigMaxRatio: 16 / 9,\n\t\t\tbigMinRatio: 9 / 16\n\t\t};\n\t}\n\n\tprotected getResponsivePercentages() {\n\t\tconst isMobile = this.viewportSrv.isMobile();\n\t\tconst isTablet = this.viewportSrv.isTablet();\n\t\tconst isPortrait = this.viewportSrv.isPortrait();\n\n\t\tif (isMobile && isPortrait) {\n\t\t\treturn {\n\t\t\t\tbigPercentage: 0.85,\n\t\t\t\tminBigPercentage: 0.7\n\t\t\t};\n\t\t}\n\n\t\tif (isMobile) {\n\t\t\treturn {\n\t\t\t\tbigPercentage: 0.82,\n\t\t\t\tminBigPercentage: 0.65\n\t\t\t};\n\t\t}\n\n\t\tif (isTablet && isPortrait) {\n\t\t\treturn {\n\t\t\t\tbigPercentage: 0.83,\n\t\t\t\tminBigPercentage: 0.6\n\t\t\t};\n\t\t}\n\n\t\tif (isTablet) {\n\t\t\treturn {\n\t\t\t\tbigPercentage: 0.81,\n\t\t\t\tminBigPercentage: 0.55\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tbigPercentage: 0.8,\n\t\t\tminBigPercentage: 0.5\n\t\t};\n\t}\n\n\tprotected setupViewportListener(): void {\n\t\teffect(() => {\n\t\t\tconst viewportInfo = this.viewportSrv.viewportInfo();\n\t\t\tconst isMobile = this.viewportSrv.isMobile();\n\t\t\tconst orientation = this.viewportSrv.orientation();\n\t\t\tthis.updateLayoutOptions();\n\t\t});\n\t}\n\n\tprotected updateLayoutOptions(): void {\n\t\tconst newOptions = this.getOptions();\n\n\t\tif (this.hasSignificantChanges(this.openviduLayoutOptions, newOptions)) {\n\t\t\tthis.openviduLayoutOptions = newOptions;\n\n\t\t\tif (this.openviduLayout && this.layoutContainer) {\n\t\t\t\tthis.openviduLayout.updateLayout(this.layoutContainer, this.openviduLayoutOptions);\n\t\t\t\tthis.sendLayoutWidthEvent();\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected hasSignificantChanges(oldOptions: OpenViduLayoutOptions, newOptions: OpenViduLayoutOptions): boolean {\n\t\tif (!oldOptions) return true;\n\n\t\tconst significantProps: (keyof OpenViduLayoutOptions)[] = [\n\t\t\t'maxRatio',\n\t\t\t'minRatio',\n\t\t\t'bigMaxRatio',\n\t\t\t'bigMinRatio',\n\t\t\t'bigPercentage',\n\t\t\t'alignItems',\n\t\t\t'bigAlignItems'\n\t\t];\n\n\t\treturn significantProps.some(\n\t\t\t(prop) => Math.abs((oldOptions[prop] as number) - (newOptions[prop] as number)) > 0.01 || oldOptions[prop] !== newOptions[prop]\n\t\t);\n\t}\n\n\tprotected sendLayoutWidthEvent() {\n\t\tconst layoutContainer = this.openviduLayout?.getLayoutContainer();\n\t\tif (!layoutContainer) {\n\t\t\tthis.log.e('Layout container not found. Cannot send layout width event');\n\t\t\treturn;\n\t\t}\n\t\tconst sidenavLayoutElement = this.getHTMLElementByClassName(layoutContainer, LayoutClass.SIDENAV_CONTAINER);\n\t\tif (sidenavLayoutElement && sidenavLayoutElement.clientWidth) {\n\t\t\tthis.layoutWidth.next(sidenavLayoutElement.clientWidth);\n\t\t}\n\t}\n\n\tprotected getHTMLElementByClassName(element: HTMLElement | null, className: string): HTMLElement | null {\n\t\twhile (!!element && element !== document.body) {\n\t\t\tif (element.className.includes(className)) {\n\t\t\t\treturn element;\n\t\t\t}\n\t\t\telement = element.parentElement;\n\t\t}\n\t\treturn null;\n\t}\n}\n","/**\n * Interface representing the different types of panels\n */\nexport enum PanelType {\n\tCHAT = 'chat',\n\tPARTICIPANTS = 'participants',\n\tBACKGROUND_EFFECTS = 'background-effects',\n\tACTIVITIES = 'activities',\n\tSETTINGS = 'settings'\n}\n\n/**\n * Interface representing a panel event\n */\n\nexport interface PanelStatusInfo {\n\t/**\n\t * Indicates whether the panel is currently opened.\n\t */\n\tisOpened: boolean;\n\n\t/**\n\t * The type of the panel. For example: 'chat', 'participants', 'settings', 'activities', etc.\n\t */\n\tpanelType?: PanelType | string;\n\n\t/**\n\t * Additional information for the 'activities' and 'settings' panel, specifying the sub-option to be displayed.\n\t */\n\tsubOptionType?: string;\n\n\t/**\n\t * The previous type of the panel before any changes.\n\t */\n\tpreviousPanelType?: PanelType | string;\n}\n\n/**\n * @internal\n */\nexport enum PanelSettingsOptions {\n\tGENERAL = 'general',\n\tAUDIO = 'audio',\n\tVIDEO = 'video',\n\tCAPTIONS = 'captions'\n}\n\n/**\n * Interface representing a panel status event emmited by the library to the final app\n */\ninterface PanelStatusEvent {\n\tisOpened: boolean;\n}\n\nexport interface ChatPanelStatusEvent extends PanelStatusEvent {}\nexport interface ParticipantsPanelStatusEvent extends PanelStatusEvent {}\nexport interface ActivitiesPanelStatusEvent extends PanelStatusEvent {}\nexport interface SettingsPanelStatusEvent extends PanelStatusEvent {}\n// export interface BackgroundEffectsPanelStatusEvent extends PanelStatusEvent { }\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { ILogger } from '../../models/logger.model';\nimport { PanelStatusInfo, PanelSettingsOptions, PanelType } from '../../models/panel.model';\nimport { LoggerService } from '../logger/logger.service';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class PanelService {\n\t/**\n\t * Panel Observable which pushes the panel status in every update.\n\t */\n\tpanelStatusObs: Observable<PanelStatusInfo>;\n\tprivate log: ILogger;\n\tprivate isExternalOpened: boolean = false;\n\tprivate externalType: string = '';\n\tprivate _panelOpened = <BehaviorSubject<PanelStatusInfo>>new BehaviorSubject({ isOpened: false });\n\tprivate panelTypes: string[] = Object.values(PanelType);\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(private loggerSrv: LoggerService) {\n\t\tthis.log = this.loggerSrv.get('PanelService');\n\t\tthis.panelStatusObs = this._panelOpened.asObservable();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tclear() {\n\t\tthis._panelOpened.next({ isOpened: false });\n\t}\n\n\t/**\n\t * Open or close the panel type received. Calling this method with the panel opened and the same type panel, will close the panel.\n\t * If the type is differente, it will switch to the properly panel.\n\t */\n\ttogglePanel(panelType: PanelType | string, subOptionType?: PanelSettingsOptions | string) {\n\t\tconst previousState = this._panelOpened.getValue();\n\t\tconst isDefaultPanel = this.panelTypes.includes(panelType);\n\n\t\tthis.log.d(`Toggling ${isDefaultPanel ? panelType : 'external'} menu`);\n\n\t\t// Set the next panel state\n\t\tlet nextOpenedValue: boolean;\n\n\t\tif (panelType === previousState.panelType) {\n\t\t\t// Same panel clicked, toggle it\n\t\t\tnextOpenedValue = !previousState.isOpened;\n\t\t} else {\n\t\t\t// Different panel clicked, always open it\n\t\t\tnextOpenedValue = true;\n\t\t}\n\n\t\t// Update external panel tracking\n\t\tif (isDefaultPanel) {\n\t\t\tthis.isExternalOpened = false;\n\t\t\tthis.externalType = '';\n\t\t} else {\n\t\t\tthis.isExternalOpened = nextOpenedValue;\n\t\t\tthis.externalType = nextOpenedValue ? panelType : '';\n\t\t}\n\n\t\t// Update the panel state\n\t\tthis._panelOpened.next({\n\t\t\tisOpened: nextOpenedValue,\n\t\t\tpanelType,\n\t\t\tsubOptionType,\n\t\t\tpreviousPanelType: previousState.panelType\n\t\t});\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tisPanelOpened(): boolean {\n\t\treturn this._panelOpened.getValue().isOpened;\n\t}\n\n\t/**\n\t * Closes the panel if it is opened.\n\t */\n\tclosePanel(): void {\n\t\tthis._panelOpened.next({ isOpened: false, panelType: undefined, subOptionType: undefined, previousPanelType: undefined });\n\t}\n\n\t/**\n\t * Whether the chat panel is opened or not.\n\t */\n\tisChatPanelOpened(): boolean {\n\t\tconst panelState = this._panelOpened.getValue();\n\t\treturn panelState.isOpened && panelState.panelType === PanelType.CHAT;\n\t}\n\n\t/**\n\t * Whether the participants panel is opened or not.\n\t */\n\tisParticipantsPanelOpened(): boolean {\n\t\tconst panelState = this._panelOpened.getValue();\n\t\treturn panelState.isOpened && panelState.panelType === PanelType.PARTICIPANTS;\n\t}\n\n\t/**\n\t * Whether the activities panel is opened or not.\n\t */\n\tisActivitiesPanelOpened(): boolean {\n\t\tconst panelState = this._panelOpened.getValue();\n\t\treturn panelState.isOpened && panelState.panelType === PanelType.ACTIVITIES;\n\t}\n\n\t/**\n\t * Whether the settings panel is opened or not.\n\t */\n\tisSettingsPanelOpened(): boolean {\n\t\tconst panelState = this._panelOpened.getValue();\n\t\treturn panelState.isOpened && panelState.panelType === PanelType.SETTINGS;\n\t}\n\n\t/**\n\t * Whether the background effects panel is opened or not.\n\t */\n\tisBackgroundEffectsPanelOpened(): boolean {\n\t\tconst panelState = this._panelOpened.getValue();\n\t\treturn panelState.isOpened && panelState.panelType === PanelType.BACKGROUND_EFFECTS;\n\t}\n\n\t/**\n\t * Returns whether the external panel (a panel adding by the final user) is opened or not.\n\t */\n\tisExternalPanelOpened(): boolean {\n\t\treturn this.isExternalOpened;\n\t}\n}\n","/**\n * @internal\n */\nexport interface CustomDevice {\n\tlabel: string;\n\tdevice: string;\n\ttype?: CameraType;\n}\n\n/**\n * @internal\n */\nexport enum CameraType {\n\tFRONT = 'FRONT',\n\tBACK = 'BACK'\n}\n\n/**\n * @internal\n */\nexport enum DeviceType {\n\tAUDIO_INPUT = 'audioinput',\n\tVIDEO_INPUT = 'videoinput'\n}\n","import {\n\tAudioCaptureOptions,\n\tDataPublishOptions,\n\tLocalParticipant,\n\tLocalTrack,\n\tLocalTrackPublication,\n\tRemoteParticipant,\n\tRoom,\n\tScreenShareCaptureOptions,\n\tTrack,\n\tTrackPublication,\n\tTrackPublishOptions,\n\tVideoCaptureOptions\n} from 'livekit-client';\nimport { DeviceType } from './device.model';\n\nexport interface ParticipantLeftEvent {\n\troomName: string;\n\tparticipantName: string;\n\tidentity: string;\n\treason: ParticipantLeftReason;\n}\n\nexport enum ParticipantLeftReason {\n\t// User-initiated disconnections\n\tLEAVE = 'LEAVE', // The participant left the room voluntarily\n\tBROWSER_UNLOAD = 'browser_unload', // The participant was disconnected due to a browser unload event\n\n\t// Network-related disconnections\n\tNETWORK_DISCONNECT = 'network_disconnect', // The participant was disconnected due to a network error\n\tSIGNAL_CLOSE = 'websocket_closed', // The participant was disconnected due to a websocket error\n\n\t// Server-initiated disconnections\n\tSERVER_SHUTDOWN = 'server_shutdown', // The server was shut down\n\tPARTICIPANT_REMOVED = 'participant_removed', // The participant was removed from the room\n\tROOM_DELETED = 'room_deleted', // The room was deleted\n\n\t// Permission/policy-based disconnections\n\tDUPLICATE_IDENTITY = 'duplicate_identity', // The participant was disconnected due to a duplicate identity\n\n\tOTHER = 'other' // The participant was disconnected for an unknown reason\n}\n/**\n * Interface that defines the properties of the participant track publication.\n */\nexport interface ParticipantTrackPublication extends TrackPublication {\n\t/**\n\t * The participant who published the track.\n\t */\n\tparticipant: ParticipantModel;\n\n\t/**\n\t * Indicates whether the HTML element associated with the track is pinned (fixed in place) or not.\n\t */\n\tisPinned: boolean;\n\n\t/**\n\t * Indicates whether the HTML element associated with the track is minimized (made smaller) or not.\n\t */\n\tisMinimized: boolean;\n\n\t/**\n\t * Indicates whether the track is from a camera source or not.\n\t */\n\tisCameraTrack: boolean;\n\n\t/**\n\t * Indicates whether the track is from a screen sharing source or not.\n\t */\n\tisScreenTrack: boolean;\n\n\t/**\n\t * Indicates whether the track is from an audio sharing source or not.\n\t */\n\tisAudioTrack: boolean;\n\n\t/**\n\t * Indicates whether the participant's audio is forcibly muted or not.\n\t */\n\tisMutedForcibly?: boolean;\n}\n\n/**\n * Interface defining properties of a participant.\n */\nexport interface ParticipantProperties {\n\t/**\n\t * The participant instance, which can be either a local participant or a remote participant.\n\t */\n\tparticipant: LocalParticipant | RemoteParticipant;\n\n\t/**\n\t * The room in which the participant is located, applicable only for local participants.\n\t */\n\troom?: Room;\n\n\t/**\n\t * The color profile associated with the participant.\n\t * It specifies the visual representation of the participant in the user interface.\n\t */\n\tcolorProfile?: string;\n\n\t/**\n\t * This property allows to know what screen track is the last one published for enlarging it\n\t * Map <trackSid, publicationDate>\n\t * @internal\n\t **/\n\tscreenTrackPublicationDate?: Map<string, number>;\n}\n\n/**\n * Class that represents a participant in the room.\n */\nexport class ParticipantModel {\n\t/**\n\t * This property allows to know what screen track is the last one published for enlarging it\n\t * Map <trackSid, publicationDate>\n\t * @internal\n\t **/\n\tscreenTrackPublicationDate: Map<string, number>;\n\t/**\n\t * The color profile associated with the participant.\n\t * It specifies the visual representation of the participant in the user interface.\n\t */\n\tcolorProfile: string;\n\tprivate participant: LocalParticipant | RemoteParticipant;\n\tprivate room: Room | undefined;\n\tprivate speaking: boolean = false;\n\tprivate customVideoTrack: Partial<ParticipantTrackPublication>;\n\tprivate _hasEncryptionError: boolean = false;\n\tprivate _decryptedName: string | undefined;\n\n\tconstructor(props: ParticipantProperties) {\n\t\tthis.participant = props.participant;\n\t\tthis.colorProfile = props.colorProfile ?? `hsl(${Math.random() * 360}, 100%, 80%)`;\n\t\tthis.room = props.room;\n\t\tthis.screenTrackPublicationDate = props.screenTrackPublicationDate ?? new Map<string, number>();\n\n\t\tthis.customVideoTrack = {\n\t\t\tparticipant: this,\n\t\t\tkind: Track.Kind.Video,\n\t\t\ttrackName: 'customVideoTrack',\n\t\t\ttrackSid: 'customVideoTrack',\n\t\t\tsource: Track.Source.Camera,\n\t\t\tisPinned: false,\n\t\t\tisMinimized: false,\n\t\t\tisMutedForcibly: false,\n\t\t\tisCameraTrack: true,\n\t\t\tisScreenTrack: false,\n\t\t\tisAudioTrack: false\n\t\t};\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget identity() {\n\t\treturn this.participant.identity;\n\t}\n\n\t/**\n\t * Returns the server assigned unique identifier for the participant.\n\t * @returns string\n\t */\n\tget sid(): string {\n\t\treturn this.participant.sid;\n\t}\n\n\t/**\n\t * Returns the participant name.\n\t * @returns string\n\t */\n\tget name(): string | undefined {\n\t\treturn this._decryptedName ?? this.participant.name;\n\t}\n\n\t/**\n\t * Returns the room name where the participant is.\n\t * @return string | undefined\n\t * @internal\n\t */\n\tget roomName(): string | undefined {\n\t\treturn this.room?.name;\n\t}\n\n\t/**\n\t * Returns if the participant has enabled its camera.\n\t */\n\tget isCameraEnabled(): boolean {\n\t\treturn this.participant.isCameraEnabled;\n\t}\n\n\t/**\n\t * Returns if the participant has enabled its microphone.\n\t */\n\tget isMicrophoneEnabled(): boolean {\n\t\treturn this.participant.isMicrophoneEnabled;\n\t}\n\n\t/**\n\t * Returns if the participant has enabled its screen share.\n\t */\n\tget isScreenShareEnabled(): boolean {\n\t\treturn this.participant.isScreenShareEnabled;\n\t}\n\n\t/**\n\t * Returns if the participant is speaking.\n\t */\n\tget isSpeaking(): boolean {\n\t\t// There is a bug when a participant mutes its microphone, it is still considered as speaking\n\t\t// that's why we need to check if the microphone is enabled\n\t\treturn this.speaking && this.isMicrophoneEnabled;\n\t}\n\n\t/**\n\t * Returns all the participant tracks.\n\t * @return ParticipantTrackPublication[]\n\t */\n\tget tracks(): ParticipantTrackPublication[] {\n\t\tconst defaultTracks = this.participant.getTrackPublications().map((track: TrackPublication) => {\n\t\t\ttrack['participant'] = this;\n\t\t\ttrack['isPinned'] = track['isPinned'];\n\t\t\ttrack['isMinimized'] = track['isMinimized'];\n\t\t\ttrack['isMutedForcibly'] = track['isMutedForcibly'] || false;\n\t\t\ttrack['isCameraTrack'] = track.source === Track.Source.Camera;\n\t\t\ttrack['isScreenTrack'] = track.source === Track.Source.ScreenShare;\n\t\t\ttrack['isAudioTrack'] = track.kind === Track.Kind.Audio;\n\t\t\treturn track as ParticipantTrackPublication;\n\t\t});\n\n\t\tconst hasCameraTrack = defaultTracks.some((track) => track.source === Track.Source.Camera);\n\t\t// const hasOnlyAudioTrack = defaultTracks.every((track) => track.kind === Track.Kind.Audio);\n\t\t// const hasOnlyScreenTrack = defaultTracks.every((track) => track.source === Track.Source.ScreenShare);\n\t\tif (!hasCameraTrack) {\n\t\t\t/**\n\t\t\t * If default tracks does not contain camera track, we add a custom video track with the aim of showing the\n\t\t\t * participant's name and avatar. If we don't add this track, the participant's\n\t\t\t * name and avatar will not be shown in the video grid and the participant would be a\n\t\t\t * ghost in the room.\n\t\t\t **/\n\t\t\tdefaultTracks.push(this.customVideoTrack as ParticipantTrackPublication);\n\t\t}\n\t\treturn defaultTracks;\n\t}\n\n\t/**\n\t * Returns all the participant video tracks.\n\t * @return ParticipantTrackPublication[]\n\t */\n\tget videoTracks(): ParticipantTrackPublication[] {\n\t\treturn this.tracks.filter((track: TrackPublication) => track.kind === Track.Kind.Video);\n\t}\n\n\t/**\n\t * Returns all the participant audio tracks.\n\t * @return ParticipantTrackPublication[]\n\t */\n\tget audioTracks(): ParticipantTrackPublication[] {\n\t\treturn this.tracks.filter((track: TrackPublication) => track.kind === Track.Kind.Audio);\n\t}\n\n\t/**\n\t * Returns all the participant camera tracks.\n\t * @return ParticipantTrackPublication[]\n\t */\n\tget cameraTracks(): ParticipantTrackPublication[] {\n\t\treturn this.tracks.filter((track: TrackPublication) => track.source === Track.Source.Camera && track.kind === Track.Kind.Video);\n\t}\n\n\t/**\n\t * Returns if the participant is local.\n\t */\n\tget isLocal(): boolean {\n\t\treturn this.participant.isLocal;\n\t}\n\n\t/**\n\t * Returns if the participant has only audio tracks.\n\t */\n\tget onlyHasAudioTracks(): boolean {\n\t\treturn this.tracks.every((track) => track.kind === Track.Kind.Audio);\n\t}\n\n\t/**\n\t * Returns if the participant has only screen tracks.\n\t */\n\tget onlyHasScreenTracks(): boolean {\n\t\treturn this.tracks.every((track) => track.source === Track.Source.ScreenShare);\n\t}\n\n\t/**\n\t * Returns if the participant has any track forcibly muted.\n\t * @internal\n\t */\n\tget isMutedForcibly() {\n\t\treturn this.tracks.some((track) => track.isMutedForcibly);\n\t}\n\n\t/**\n\t * Returns if the participant has any track minimized\n\t * @internal\n\t */\n\tget isMinimized(): boolean {\n\t\treturn this.tracks.some((track) => track.isMinimized);\n\t}\n\n\t/**\n\t * @returns ParticipantProperties\n\t * @internal\n\t */\n\tgetProperties(): ParticipantProperties {\n\t\treturn {\n\t\t\tparticipant: this.participant,\n\t\t\troom: this.room,\n\t\t\tcolorProfile: this.colorProfile,\n\t\t\tscreenTrackPublicationDate: this.screenTrackPublicationDate\n\t\t};\n\t}\n\n\t/**\n\t *\n\t * Creates a screen capture tracks with getDisplayMedia(). A LocalVideoTrack is always created and returned.\n\t * @param options\n\t * @returns Promise<LocalTrack[]>\n\t * @internal\n\t */\n\tcreateScreenTracks(options: ScreenShareCaptureOptions): Promise<LocalTrack[]> {\n\t\tif (this.participant instanceof LocalParticipant) {\n\t\t\treturn this.participant.createScreenTracks(options);\n\t\t}\n\t\treturn Promise.reject(\"Remote participant can't create screen tracks\");\n\t}\n\n\t/**\n\t *\n\t * Publishes a track to the room\n\t * @param track\n\t * @returns\n\t */\n\tpublishTrack(track: LocalTrack, options?: TrackPublishOptions): Promise<LocalTrackPublication> {\n\t\tif (this.participant instanceof LocalParticipant) {\n\t\t\treturn this.participant.publishTrack(track, options);\n\t\t}\n\t\treturn Promise.reject(\"Remote participant can't publish tracks\");\n\t}\n\n\t/**\n\t * Enable or disable a participant's camera track.\n\t * @param enabled\n\t * @returns Promise<LocalTrackPublication | undefined>\n\t * @internal\n\t */\n\tsetCameraEnabled(\n\t\tenabled: boolean,\n\t\toptions?: VideoCaptureOptions,\n\t\tpublishOptions?: TrackPublishOptions\n\t): Promise<LocalTrackPublication | undefined> {\n\t\tif (this.participant instanceof LocalParticipant) {\n\t\t\treturn this.participant.setCameraEnabled(enabled, options, publishOptions);\n\t\t}\n\t\treturn Promise.reject(\"Remote participant can't enable camera\");\n\t}\n\n\t/**\n\t * Enable or disable a participant's microphone track.\n\t * @param enabled\n\t * @returns Promise<LocalTrackPublication | undefined>\n\t * @internal\n\t */\n\tsetMicrophoneEnabled(\n\t\tenabled: boolean,\n\t\toptions?: AudioCaptureOptions,\n\t\tpublishOptions?: TrackPublishOptions\n\t): Promise<LocalTrackPublication | undefined> {\n\t\tif (this.participant instanceof LocalParticipant) {\n\t\t\treturn this.participant.setMicrophoneEnabled(enabled, options, publishOptions);\n\t\t}\n\t\treturn Promise.reject(\"Remote participant can't enable microphone\");\n\t}\n\n\t/**\n\t * Start or stop sharing a participant's screen\n\t * @param enabled\n\t * @returns Promise<LocalTrackPublication | undefined>\n\t * @internal\n\t */\n\tsetScreenShareEnabled(\n\t\tenabled: boolean,\n\t\toptions: ScreenShareCaptureOptions,\n\t\tpublishOptions?: TrackPublishOptions\n\t): Promise<LocalTrackPublication | undefined> {\n\t\tif (this.participant instanceof LocalParticipant) {\n\t\t\treturn this.participant.setScreenShareEnabled(enabled, options, publishOptions);\n\t\t}\n\t\treturn Promise.reject(\"Remote participant can't enable screen share\");\n\t}\n\n\t/**\n\t * Sets the participant's speaking status.\n\t * @param speaking\n\t * @internal\n\t */\n\tsetSpeaking(speaking: boolean) {\n\t\tthis.speaking = speaking;\n\t}\n\n\t/**\n\t * Switches the active camera track used in this room to the given device id.\n\t * @param deviceId\n\t * @returns Promise<void>\n\t * @internal\n\t */\n\tasync switchCamera(deviceId: string): Promise<void> {\n\t\tif (this.room) {\n\t\t\tawait this.room.switchActiveDevice(DeviceType.VIDEO_INPUT, deviceId);\n\t\t}\n\t}\n\n\t/**\n\t * Switches the active microphone track used in this room to the given device id.\n\t * @param deviceId\n\t * @returns Promise<void>\n\t * @internal\n\t */\n\tasync switchMicrophone(deviceId: string): Promise<void> {\n\t\tif (this.room) {\n\t\t\tawait this.room.switchActiveDevice(DeviceType.AUDIO_INPUT, deviceId);\n\t\t}\n\t}\n\n\t/**\n\t * Switches the active screen share track showing a native browser dialog to select a screen or window.\n\t * @param newTrack [LocalTrack](https://docs.livekit.io/client-sdk-js/classes/LocalTrack.html)\n\t * @returns Promise<void>\n\t * @internal\n\t */\n\tasync switchScreenshare(newTrack: LocalTrack): Promise<void> {\n\t\tif (!(this.participant instanceof LocalParticipant)) {\n\t\t\treturn Promise.reject(\"Remote participant can't switch screen share\");\n\t\t}\n\n\t\tconst screenTrack = this.tracks.find((track) => track.source === Track.Source.ScreenShare);\n\t\tif (!screenTrack || !screenTrack.videoTrack) {\n\t\t\treturn Promise.reject('No active screen share track to switch');\n\t\t}\n\n\t\tconst currentTrack = screenTrack.videoTrack as LocalTrack;\n\n\t\tawait currentTrack.replaceTrack(newTrack.mediaStreamTrack);\n\t\treturn Promise.resolve();\n\t}\n\n\t/**\n\t * Publish a new data payload to the room. Data will be forwarded to each participant in the room if the destination field in publishOptions is empty.\n\t * @param data\n\t * @param {DataPublishOptions} publishOptions [DataPublishOptions](https://docs.livekit.io/client-sdk-js/types/DataPublishOptions.html)\n\t * @returns Promise that is resolved if the data was successfully sent, or rejected with an Error object if not.\n\t * @internal\n\t */\n\tasync publishData(data: Uint8Array, publishOptions: DataPublishOptions): Promise<void> {\n\t\tif (this.participant instanceof LocalParticipant) {\n\t\t\treturn this.participant.publishData(data, publishOptions);\n\t\t}\n\t\treturn Promise.reject(\"Remote participant can't publish data\");\n\t}\n\n\t/**\n\t * @returns The participant active connection types\n\t * @internal\n\t */\n\tgetTracksPublishedTypes(): Track.Source[] {\n\t\tconst tracksPublishedTypes: Track.Source[] = [];\n\t\tif (this.isCameraEnabled) tracksPublishedTypes.push(Track.Source.Camera);\n\t\tif (this.isScreenShareEnabled) tracksPublishedTypes.push(Track.Source.ScreenShare);\n\t\tif (this.isMicrophoneEnabled) tracksPublishedTypes.push(Track.Source.Microphone);\n\n\t\treturn tracksPublishedTypes;\n\t}\n\n\t/**\n\t * Sets the participant's name.\n\t * @param name\n\t * @internal\n\t * As updating name requires that the participant has the `canUpdateOwnMetadata` to true in server side, which is a little bit insecure,\n\t * we decided to not allow this feature for now.\n\t */\n\t// setName(name: string) {\n\t// \tif (this.participant instanceof LocalParticipant) {\n\t// \t\tthis.participant.setName(name);\n\t// \t}\n\t// }\n\n\t/**\n\t * Sets all video track elements to pinned or unpinned given a boolean value\n\t * @param pinned\n\t * @internal\n\t */\n\tsetAllVideoPinned(pinned: boolean) {\n\t\tthis.tracks.forEach((track) => (track.isPinned = pinned));\n\t}\n\n\t/**\n\t * Toggle the pinned status of a video track element\n\t * @param trackSid\n\t * @internal\n\t */\n\ttoggleVideoPinned(trackSid: string): void {\n\t\tconst track = this.tracks.find((track) => track.trackSid === trackSid);\n\t\tif (track) {\n\t\t\ttrack.isPinned = !track.isPinned;\n\t\t}\n\t}\n\n\t/**\n\t * Gets whether this participant is pinned.\n\t * This indicates that the participant's video is fixed in place in the UI.\n\t * @returns boolean\n\t */\n\tget isPinned(): boolean {\n\t\treturn this.tracks.some((track) => track.isPinned);\n\t}\n\n\t/**\n\t * Sets all video track elements from a specific source to pinned or unpinned given a boolean value\n\t * @param source The source of the track to be pinned or unpinned (e.g., 'camera', 'screenShare').\n\t * @param pinned\n\t * @internal\n\t */\n\tsetVideoPinnedBySource(source: Track.Source, pinned: boolean) {\n\t\tthis.tracks\n\t\t\t.filter((track) => track.source === source && track.kind === Track.Kind.Video)\n\t\t\t.forEach((track) => (track.isPinned = pinned));\n\t}\n\n\t/**\n\t * Toggle the minimized status of a video track element\n\t * @param trackSid\n\t * @returns\n\t * @internal\n\t */\n\ttoggleVideoMinimized(trackSid: string): void {\n\t\tconst track = this.tracks.find((track) => track.trackSid === trackSid);\n\t\tif (track) {\n\t\t\ttrack.isMinimized = !track.isMinimized;\n\t\t}\n\t}\n\n\t/**\n\t * Sets the publication date of a screen track\n\t * @param trackSid\n\t * @param publicationDate\n\t * @internal\n\t */\n\tsetScreenTrackPublicationDate(trackSid: string, publicationDate: number) {\n\t\tif (publicationDate === -1) {\n\t\t\tthis.screenTrackPublicationDate.delete(trackSid);\n\t\t} else {\n\t\t\tthis.screenTrackPublicationDate.set(trackSid, publicationDate);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\t// someHasVideoPinned(): boolean {\n\t// \treturn Array.from(this.streams.values()).some((conn) => conn.videoPinned);\n\t// }\n\n\t/**\n\t * @internal\n\t */\n\tsetMutedForcibly(muted: boolean) {\n\t\tthis.tracks.forEach((track) => (track.isMutedForcibly = muted));\n\t}\n\n\t/**\n\t * Gets whether this participant has an encryption error.\n\t * This indicates that the participant cannot decrypt the video stream due to an incorrect encryption key.\n\t * @returns boolean\n\t */\n\tget hasEncryptionError(): boolean {\n\t\treturn this._hasEncryptionError;\n\t}\n\n\t/**\n\t * Sets the encryption error state for this participant.\n\t * @param hasError - Whether the participant has an encryption error\n\t * @internal\n\t */\n\tsetEncryptionError(hasError: boolean) {\n\t\tthis._hasEncryptionError = hasError;\n\t}\n\n\t/**\n\t * Sets the decrypted name for this participant.\n\t * @param decryptedName - The decrypted participant name\n\t * @internal\n\t */\n\tsetDecryptedName(decryptedName: string | undefined) {\n\t\tthis._decryptedName = decryptedName;\n\t}\n}\n","import { Injectable } from '@angular/core';\nimport { createKeyMaterialFromString, deriveKeys } from 'livekit-client';\nimport { Subject, takeUntil } from 'rxjs';\nimport { OpenViduComponentsConfigService } from '../config/directive-config.service';\n\n/**\n * Independent E2EE Service for encrypting and decrypting text-based content\n * (chat messages, participant names, metadata, etc.)\n *\n * This service uses LiveKit's key derivation utilities combined with Web Crypto API:\n * - Uses createKeyMaterialFromString from livekit-client for key material generation (PBKDF2)\n * - Uses deriveKeys from livekit-client for key derivation (HKDF)\n * - Uses Web Crypto API (AES-GCM) for actual encryption/decryption\n * - Generates random IV for each encryption operation\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root',\n})\nexport class E2eeService {\n\tprivate static readonly ENCRYPTION_ALGORITHM = 'AES-GCM';\n\tprivate static readonly IV_LENGTH = 12;\n\tprivate static readonly SALT = 'livekit-e2ee-data'; // Salt for HKDF key derivation\n\n\tprivate decryptionCache = new Map<string, string>();\n\tprivate destroy$ = new Subject<void>();\n\tprivate isE2EEEnabled = false;\n\n\tprivate encryptionKey: CryptoKey | undefined;\n\n\tconstructor(protected configService: OpenViduComponentsConfigService) {\n\t\t// Monitor E2EE key changes\n\t\tthis.configService.e2eeKey$.pipe(takeUntil(this.destroy$)).subscribe(async (key: any) => {\n\t\t\tawait this.setE2EEKey(key);\n\t\t});\n\t}\n\n\tasync setE2EEKey(key: string | null): Promise<void> {\n\t\tif (key) {\n\t\t\tthis.isE2EEEnabled = true;\n\t\t\tthis.decryptionCache.clear();\n\n\t\t\tawait this.deriveEncryptionKey(key);\n\t\t} else {\n\t\t\tthis.isE2EEEnabled = false;\n\t\t\tthis.encryptionKey = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Derives encryption key from passphrase using LiveKit's key derivation utilities\n\t * @param passphrase The E2EE passphrase\n\t * @private\n\t */\n\tprivate async deriveEncryptionKey(passphrase: string): Promise<void> {\n\t\ttry {\n\t\t\t// Use LiveKit's createKeyMaterialFromString (PBKDF2)\n\t\t\tconst keyMaterial = await createKeyMaterialFromString(passphrase);\n\n\t\t\t// Use LiveKit's deriveKeys to get encryption key (HKDF)\n\t\t\tconst derivedKeys = await deriveKeys(keyMaterial, E2eeService.SALT);\n\n\t\t\t// Store the encryption key for use in encrypt/decrypt operations\n\t\t\tthis.encryptionKey = derivedKeys.encryptionKey;\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to derive encryption key:', error);\n\t\t\tthis.encryptionKey = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Checks if E2EE is currently enabled and encryption key is ready\n\t */\n\tget isEnabled(): boolean {\n\t\treturn this.isE2EEEnabled && !!this.encryptionKey;\n\t}\n\n\t/**\n\t * Generates a random initialization vector for encryption\n\t * @private\n\t */\n\tprivate static generateIV(): Uint8Array {\n\t\treturn crypto.getRandomValues(new Uint8Array(E2eeService.IV_LENGTH));\n\t}\n\n\t/**\n\t * Encrypts text content using Web Crypto API with LiveKit-derived keys.\n\t * Returns base64-encoded string suitable for metadata/names.\n\t *\n\t * @param text Plain text to encrypt\n\t * @returns Encrypted text in base64 format, or original text if E2EE is disabled\n\t */\n\tasync encrypt(text: string): Promise<string>;\n\n\t/**\n\t * Encrypts binary data using Web Crypto API with LiveKit-derived keys.\n\t * Returns Uint8Array suitable for data channels.\n\t *\n\t * @param data Plain data to encrypt\n\t * @returns Encrypted data as Uint8Array, or original data if E2EE is disabled\n\t */\n\tasync encrypt(data: Uint8Array): Promise<Uint8Array>;\n\n\t/**\n\t * Implementation of encrypt overloads\n\t */\n\tasync encrypt(input: string | Uint8Array): Promise<string | Uint8Array> {\n\t\tif (!this.isEnabled) {\n\t\t\treturn input;\n\t\t}\n\n\t\tconst isString = typeof input === 'string';\n\t\tif (isString && !input) {\n\t\t\treturn input;\n\t\t}\n\n\t\tif (!this.encryptionKey) {\n\t\t\tconsole.warn('E2EE encryption not available: CryptoKey not initialized. Returning unencrypted data.');\n\t\t\treturn input;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert string to Uint8Array if needed\n\t\t\tconst data = isString ? new TextEncoder().encode(input as string) : (input as Uint8Array);\n\n\t\t\t// Generate a random IV for this encryption\n\t\t\tconst iv = E2eeService.generateIV();\n\n\t\t\t// Encrypt the data using Web Crypto API with AES-GCM\n\t\t\tconst encryptedBuffer = await crypto.subtle.encrypt(\n\t\t\t\t{\n\t\t\t\t\tname: E2eeService.ENCRYPTION_ALGORITHM,\n\t\t\t\t\tiv: iv as BufferSource\n\t\t\t\t},\n\t\t\t\tthis.encryptionKey,\n\t\t\t\tdata as BufferSource\n\t\t\t);\n\n\t\t\tconst encryptedData = new Uint8Array(encryptedBuffer);\n\n\t\t\t// Combine IV + encrypted payload for transport\n\t\t\t// Format: [iv(12 bytes)][payload(variable)]\n\t\t\tconst combined = new Uint8Array(iv.length + encryptedData.length);\n\t\t\tcombined.set(iv, 0);\n\t\t\tcombined.set(encryptedData, iv.length);\n\n\t\t\t// Return as base64 for strings, Uint8Array for binary data\n\t\t\treturn isString ? btoa(String.fromCharCode(...combined)) : combined;\n\t\t} catch (error) {\n\t\t\tconsole.error('E2EE encryption failed:', error);\n\t\t\t// Return original input if encryption fails\n\t\t\treturn input;\n\t\t}\n\t}\n\n\t/**\n\t * Decrypts text content from base64 format using Web Crypto API.\n\t * Suitable for decrypting participant names, metadata, etc.\n\t *\n\t * @param encryptedText Encrypted text in base64 format\n\t * @param participantIdentity Identity of the participant who encrypted the content (optional, used for caching)\n\t * @returns Decrypted plain text, or throws error if decryption fails\n\t */\n\tasync decrypt(encryptedText: string, participantIdentity?: string): Promise<string>;\n\n\t/**\n\t * Decrypts binary data from Uint8Array using Web Crypto API.\n\t * Suitable for decrypting data channel messages.\n\t *\n\t * If E2EE is not enabled, returns the original encryptedData.\n\t *\n\t * @param encryptedData Encrypted data as Uint8Array (format: [iv][payload])\n\t * @param participantIdentity Identity of the participant who encrypted the content (optional)\n\t * @returns Decrypted data as Uint8Array\n\t */\n\tasync decrypt(encryptedData: Uint8Array, participantIdentity?: string): Promise<Uint8Array>;\n\n\t/**\n\t * Implementation of decrypt overloads\n\t */\n\tasync decrypt(input: string | Uint8Array, participantIdentity?: string): Promise<string | Uint8Array> {\n\t\tif (!this.isEnabled) {\n\t\t\treturn input;\n\t\t}\n\n\t\tconst isString = typeof input === 'string';\n\t\tif (isString && !input) {\n\t\t\treturn input;\n\t\t}\n\n\t\t// Check cache for strings (caching binary data would be too memory intensive)\n\t\tif (isString) {\n\t\t\tconst cacheKey = `${participantIdentity || 'unknown'}:${input}`;\n\t\t\tif (this.decryptionCache.has(cacheKey)) {\n\t\t\t\treturn this.decryptionCache.get(cacheKey)!;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.encryptionKey) {\n\t\t\tthrow new Error('E2EE decryption not available: CryptoKey not initialized');\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert to Uint8Array if string (base64)\n\t\t\tconst combined = isString ? Uint8Array.from(atob(input as string), (c) => c.charCodeAt(0)) : (input as Uint8Array);\n\n\t\t\t// Extract components: iv(12) + payload(variable)\n\t\t\tconst iv = combined.slice(0, E2eeService.IV_LENGTH);\n\t\t\tconst payload = combined.slice(E2eeService.IV_LENGTH);\n\n\t\t\t// Decrypt the data using Web Crypto API with AES-GCM\n\t\t\tconst decryptedBuffer = await crypto.subtle.decrypt(\n\t\t\t\t{\n\t\t\t\t\tname: E2eeService.ENCRYPTION_ALGORITHM,\n\t\t\t\t\tiv: iv as BufferSource\n\t\t\t\t},\n\t\t\t\tthis.encryptionKey,\n\t\t\t\tpayload as BufferSource\n\t\t\t);\n\n\t\t\tconst decryptedData = new Uint8Array(decryptedBuffer);\n\n\t\t\t// Return as string or Uint8Array depending on input type\n\t\t\tif (isString) {\n\t\t\t\tconst decoder = new TextDecoder();\n\t\t\t\tconst result = decoder.decode(decryptedData);\n\n\t\t\t\t// Cache successful string decryption\n\t\t\t\tconst cacheKey = `${participantIdentity || 'unknown'}:${input}`;\n\t\t\t\tthis.decryptionCache.set(cacheKey, result);\n\n\t\t\t\t// Limit cache size to prevent memory issues\n\t\t\t\tif (this.decryptionCache.size > 1000) {\n\t\t\t\t\tconst firstKey = this.decryptionCache.keys().next().value;\n\t\t\t\t\tif (firstKey) {\n\t\t\t\t\t\tthis.decryptionCache.delete(firstKey);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn decryptedData;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('E2EE decryption failed (wrong key or corrupted data):', error);\n\t\t\tthrow new Error(`Decryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n\t\t}\n\t}\n\n\t/**\n\t * Attempts to decrypt text content. If decryption fails or E2EE is not enabled,\n\t * returns a masked string to indicate unavailable content.\n\t *\n\t * @param encryptedText Encrypted text in base64 format\n\t * @param participantIdentity Identity of the participant (optional, used for caching)\n\t * @param maskText Custom mask text to show on failure (default: '******')\n\t * @returns Decrypted text or masked value if decryption fails\n\t */\n\tasync decryptOrMask(encryptedText: string, participantIdentity?: string, maskText?: string): Promise<string>;\n\n\t/**\n\t * Attempts to decrypt binary data. If decryption fails or E2EE is not enabled,\n\t * returns the maskText encoded as Uint8Array to indicate unavailable content.\n\t *\n\t * @param encryptedData Encrypted data as Uint8Array\n\t * @param participantIdentity Identity of the participant (optional)\n\t * @param maskText Custom mask text to show on failure (default: '******')\n\t * @returns Decrypted data or encoded maskText as Uint8Array if decryption fails\n\t */\n\tasync decryptOrMask(encryptedData: Uint8Array, participantIdentity?: string, maskText?: string): Promise<Uint8Array>;\n\n\t/**\n\t * Implementation of decryptOrMask overloads\n\t */\n\tasync decryptOrMask(\n\t\tinput: string | Uint8Array,\n\t\tparticipantIdentity?: string,\n\t\tmaskText: string = '******'\n\t): Promise<string | Uint8Array> {\n\t\tconst isString = typeof input === 'string';\n\n\t\t// If E2EE is not enabled, return original input\n\t\tif (!this.isEnabled) {\n\t\t\treturn input;\n\t\t}\n\n\t\t// If encryption key is not available, return masked value\n\t\tif (!this.encryptionKey) {\n\t\t\treturn isString ? maskText : new TextEncoder().encode(maskText);\n\t\t}\n\n\t\t// If input is empty, return as-is\n\t\tif ((isString && !input) || (!isString && input.length === 0)) {\n\t\t\treturn input;\n\t\t}\n\n\t\ttry {\n\t\t\t// For strings, check if it's valid base64 before attempting decryption\n\t\t\tif (isString) {\n\t\t\t\ttry {\n\t\t\t\t\tatob(input as string);\n\t\t\t\t} catch {\n\t\t\t\t\t// Not base64, likely not encrypted - return original\n\t\t\t\t\treturn input;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Attempt decryption\n\t\t\treturn await this.decrypt(input as any, participantIdentity);\n\t\t} catch (error) {\n\t\t\t// Decryption failed - return masked value\n\t\t\tif (isString) {\n\t\t\t\tconsole.warn('E2EE: Failed to decrypt content, returning masked value:', error);\n\t\t\t\treturn maskText;\n\t\t\t} else {\n\t\t\t\tconsole.warn('E2EE: Failed to decrypt binary data, returning encoded mask text:', error);\n\t\t\t\treturn new TextEncoder().encode(maskText);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clears the decryption cache.\n\t * Should be called when E2EE key changes or when leaving a room.\n\t */\n\tclearCache(): void {\n\t\tthis.decryptionCache.clear();\n\t}\n\n\t/**\n\t * Cleanup on service destroy\n\t */\n\tngOnDestroy(): void {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.clearCache();\n\t}\n}\n","import { computed, Injectable, OnDestroy, signal } from '@angular/core';\nimport { createLocalTracks, LocalTrack, Room, Track } from 'livekit-client';\nimport { CameraType, CustomDevice, DeviceType } from '../../models/device.model';\nimport { ILogger } from '../../models/logger.model';\nimport { LoggerService } from '../logger/logger.service';\nimport { PlatformService } from '../platform/platform.service';\nimport { StorageService } from '../storage/storage.service';\n\n/**\n * Device availability state for each media type\n */\ninterface DeviceAvailabilityState {\n\thasDevices: boolean;\n\tisEnabled: boolean;\n\tpermissionGranted: boolean;\n\terror?: string;\n}\n\n/**\n * Device service with improved performance and independent audio/video handling.\n *\n * Key improvements:\n * - Smart permission requests (single prompt when possible, fallback to separate)\n * - Angular Signals for reactive state management (cameras, microphones as signals)\n * - Live device detection - automatically updates when devices are connected/disconnected\n * - Better error handling with specific error types per device\n * - Performance optimizations with caching\n * - LiveKit client integration for modern track management\n *\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class DeviceService implements OnDestroy {\n\t// Reactive device lists with Signals\n\treadonly cameras = signal<CustomDevice[]>([]);\n\treadonly microphones = signal<CustomDevice[]>([]);\n\treadonly cameraSelected = signal<CustomDevice | undefined>(undefined);\n\treadonly microphoneSelected = signal<CustomDevice | undefined>(undefined);\n\n\t// Reactive state management with Signals\n\tprivate readonly videoState = signal<DeviceAvailabilityState>({\n\t\thasDevices: false,\n\t\tisEnabled: true,\n\t\tpermissionGranted: false\n\t});\n\n\tprivate readonly audioState = signal<DeviceAvailabilityState>({\n\t\thasDevices: false,\n\t\tisEnabled: true,\n\t\tpermissionGranted: false\n\t});\n\n\t// Computed signals for common checks\n\treadonly hasVideoDevices = computed(() =>\n\t\tthis.videoState().hasDevices && this.cameras().length > 0\n\t);\n\n\treadonly hasAudioDevices = computed(() =>\n\t\tthis.audioState().hasDevices && this.microphones().length > 0\n\t);\n\n\treadonly hasVideoPermission = computed(() =>\n\t\tthis.videoState().permissionGranted\n\t);\n\n\treadonly hasAudioPermission = computed(() =>\n\t\tthis.audioState().permissionGranted\n\t);\n\n\treadonly allPermissionsGranted = computed(() =>\n\t\tthis.videoState().permissionGranted && this.audioState().permissionGranted\n\t);\n\n\t// Constants\n\tprivate readonly CACHE_DURATION = 5000; // 5 seconds\n\n\t// Internal state\n\tprivate devicesCache: {\n\t\ttimestamp: number;\n\t\tdevices: MediaDeviceInfo[];\n\t} | null = null;\n\tprivate log: ILogger;\n\tprivate initializationPromise: Promise<void> | null = null;\n\tprivate deviceChangeHandler: (() => void) | null = null;\n\n\tconstructor(\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate platformSrv: PlatformService,\n\t\tprivate storageSrv: StorageService\n\t) {\n\t\tthis.log = this.loggerSrv.get('DeviceService');\n\t}\n\n\t/**\n\t * Cleanup when service is destroyed\n\t */\n\tngOnDestroy(): void {\n\t\t// Remove device change listener\n\t\tif (this.deviceChangeHandler && navigator.mediaDevices?.removeEventListener) {\n\t\t\tnavigator.mediaDevices.removeEventListener('devicechange', this.deviceChangeHandler);\n\t\t\tthis.deviceChangeHandler = null;\n\t\t\tthis.log.d('Device change detection disabled');\n\t\t}\n\t}\n\n\t/**\n\t * Initialize media devices with parallel audio/video handling\n\t * Returns a promise that resolves when initialization is complete\n\t */\n\tasync initializeDevices(): Promise<void> {\n\t\t// Prevent multiple simultaneous initializations\n\t\tif (this.initializationPromise) {\n\t\t\treturn this.initializationPromise;\n\t\t}\n\n\t\tthis.initializationPromise = this.performInitialization();\n\n\t\ttry {\n\t\t\tawait this.initializationPromise;\n\t\t} finally {\n\t\t\tthis.initializationPromise = null;\n\t\t}\n\t}\n\n\tprivate async performInitialization(): Promise<void> {\n\t\tthis.clear();\n\n\t\ttry {\n\t\t\t// Try to get devices with parallel audio/video permission requests\n\t\t\tconst devices = await this.getLocalDevicesOptimized();\n\n\t\t\tif (devices.length === 0) {\n\t\t\t\tthis.log.w('No media devices found or permissions denied');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.processDevices(devices);\n\t\t\tthis.updateSelectedDevices();\n\n\t\t\t// Setup live device detection\n\t\t\tthis.setupDeviceChangeDetection();\n\n\t\t\tthis.log.d('Media devices initialized', {\n\t\t\t\tcameras: this.cameras().length,\n\t\t\t\tmicrophones: this.microphones().length\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error initializing devices', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Optimized device retrieval with independent audio/video handling\n\t * This solves the critical bug where audio device failure affects video device detection\n\t */\n\tprivate async getLocalDevicesOptimized(): Promise<MediaDeviceInfo[]> {\n\t\t// Check cache first\n\t\tif (this.devicesCache && Date.now() - this.devicesCache.timestamp < this.CACHE_DURATION) {\n\t\t\tthis.log.d('Using cached devices');\n\t\t\treturn this.devicesCache.devices;\n\t\t}\n\n\t\ttry {\n\t\t\t// Try parallel permission requests for better performance\n\t\t\tconst results = await this.requestPermissionsParallel();\n\n\t\t\t// Get devices after permissions are granted\n\t\t\tconst devices = await this.enumerateDevices();\n\n\t\t\t// Update cache\n\t\t\tthis.devicesCache = {\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdevices\n\t\t\t};\n\n\t\t\t// Update state based on results\n\t\t\tthis.updateDeviceStates(results);\n\n\t\t\treturn devices;\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error getting devices', error);\n\n\t\t\t// Fallback: try to enumerate devices without permissions\n\t\t\treturn await this.fallbackDeviceEnumeration();\n\t\t}\n\t}\n\n\t/**\n\t * Smart permission request strategy:\n\t * 1. Try both together (single prompt - better UX)\n\t * 2. If fails, try individually (fallback for granular permissions)\n\t *\n\t * This minimizes user friction while maintaining independence\n\t */\n\tprivate async requestPermissionsParallel(): Promise<{\n\t\tvideo: { success: boolean; error?: any };\n\t\taudio: { success: boolean; error?: any };\n\t}> {\n\t\tconst results = {\n\t\t\tvideo: { success: false, error: undefined as any },\n\t\t\taudio: { success: false, error: undefined as any }\n\t\t};\n\n\t\t// Strategy 1: Try requesting both together (single prompt)\n\t\ttry {\n\t\t\tthis.log.d('Requesting both audio and video permissions together');\n\t\t\tconst tracks = await createLocalTracks({ audio: true, video: true });\n\n\t\t\t// Check which tracks we got\n\t\t\tconst videoTrack = tracks.find(t => t.kind === Track.Kind.Video);\n\t\t\tconst audioTrack = tracks.find(t => t.kind === Track.Kind.Audio);\n\n\t\t\tif (videoTrack) {\n\t\t\t\tresults.video.success = true;\n\t\t\t\tthis.log.d('Video permission granted');\n\t\t\t}\n\n\t\t\tif (audioTrack) {\n\t\t\t\tresults.audio.success = true;\n\t\t\t\tthis.log.d('Audio permission granted');\n\t\t\t}\n\n\t\t\t// Stop tracks immediately after getting permission\n\t\t\ttracks.forEach(t => t.stop());\n\n\t\t\t// If both succeeded, return early (best case - single prompt!)\n\t\t\tif (results.video.success && results.audio.success) {\n\t\t\t\tthis.log.d('Both permissions granted with single prompt');\n\t\t\t\treturn results;\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tthis.log.w('Combined permission request failed, trying individually', error);\n\t\t\t// Continue to fallback strategy\n\t\t}\n\n\t\t// Strategy 2: Fallback - request individually if combined request failed\n\t\t// This handles cases where user denied one but might allow the other\n\t\tconst promises: Promise<void>[] = [];\n\n\t\t// Try video if not already granted\n\t\tif (!results.video.success) {\n\t\t\tpromises.push(\n\t\t\t\tthis.requestVideoPermission().then(\n\t\t\t\t\t(tracks) => {\n\t\t\t\t\t\tresults.video.success = true;\n\t\t\t\t\t\ttracks.forEach(t => t.stop());\n\t\t\t\t\t\tthis.log.d('Video permission granted individually');\n\t\t\t\t\t},\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\tresults.video.error = error;\n\t\t\t\t\t\tthis.log.w('Video permission denied', error);\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t// Try audio if not already granted\n\t\tif (!results.audio.success) {\n\t\t\tpromises.push(\n\t\t\t\tthis.requestAudioPermission().then(\n\t\t\t\t\t(tracks) => {\n\t\t\t\t\t\tresults.audio.success = true;\n\t\t\t\t\t\ttracks.forEach(t => t.stop());\n\t\t\t\t\t\tthis.log.d('Audio permission granted individually');\n\t\t\t\t\t},\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\tresults.audio.error = error;\n\t\t\t\t\t\tthis.log.w('Audio permission denied', error);\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t// Wait for fallback requests to complete\n\t\tif (promises.length > 0) {\n\t\t\tawait Promise.allSettled(promises);\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * Request video permission independently\n\t */\n\tprivate async requestVideoPermission(): Promise<LocalTrack[]> {\n\t\ttry {\n\t\t\treturn await createLocalTracks({ audio: false, video: true });\n\t\t} catch (error: any) {\n\t\t\tthis.videoState.update(state => ({\n\t\t\t\t...state,\n\t\t\t\tpermissionGranted: false,\n\t\t\t\terror: error.name || 'Unknown error'\n\t\t\t}));\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Request audio permission independently\n\t */\n\tprivate async requestAudioPermission(): Promise<LocalTrack[]> {\n\t\ttry {\n\t\t\treturn await createLocalTracks({ audio: true, video: false });\n\t\t} catch (error: any) {\n\t\t\tthis.audioState.update(state => ({\n\t\t\t\t...state,\n\t\t\t\tpermissionGranted: false,\n\t\t\t\terror: error.name || 'Unknown error'\n\t\t\t}));\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Enumerate devices using LiveKit's Room API or browser API\n\t */\n\tprivate async enumerateDevices(): Promise<MediaDeviceInfo[]> {\n\t\ttry {\n\t\t\t// Use LiveKit's Room.getLocalDevices if available, otherwise fallback to browser API\n\t\t\tconst devices = await Room.getLocalDevices();\n\t\t\treturn this.filterValidDevices(devices);\n\t\t} catch (error) {\n\t\t\tthis.log.w('LiveKit device enumeration failed, using browser API', error);\n\n\t\t\t// Firefox compatibility\n\t\t\tif (this.platformSrv.isFirefox()) {\n\t\t\t\treturn await this.getDevicesFirefox();\n\t\t\t}\n\n\t\t\tconst devices = await navigator.mediaDevices.enumerateDevices();\n\t\t\treturn this.filterValidDevices(devices);\n\t\t}\n\t}\n\n\t/**\n\t * Firefox-specific device enumeration\n\t */\n\tprivate async getDevicesFirefox(): Promise<MediaDeviceInfo[]> {\n\t\ttry {\n\t\t\t// Firefox may need explicit getUserMedia call\n\t\t\tconst stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });\n\t\t\tstream.getTracks().forEach(track => track.stop());\n\n\t\t\tconst devices = await navigator.mediaDevices.enumerateDevices();\n\t\t\treturn this.filterValidDevices(devices);\n\t\t} catch (error) {\n\t\t\tthis.log.w('Firefox getUserMedia failed, trying enumerate directly', error);\n\t\t\tconst devices = await navigator.mediaDevices.enumerateDevices();\n\t\t\treturn this.filterValidDevices(devices);\n\t\t}\n\t}\n\n\t/**\n\t * Filter out invalid or default devices\n\t */\n\tprivate filterValidDevices(devices: MediaDeviceInfo[]): MediaDeviceInfo[] {\n\t\treturn devices.filter(\n\t\t\t(d) => d.label && d.deviceId && d.deviceId !== 'default'\n\t\t);\n\t}\n\n\t/**\n\t * Fallback device enumeration without permissions\n\t */\n\tprivate async fallbackDeviceEnumeration(): Promise<MediaDeviceInfo[]> {\n\t\ttry {\n\t\t\tthis.log.d('Attempting device enumeration without permissions');\n\t\t\tconst devices = await navigator.mediaDevices.enumerateDevices();\n\n\t\t\t// Filter devices that have IDs but may not have labels\n\t\t\treturn devices.filter(d => d.deviceId && d.deviceId !== 'default');\n\t\t} catch (error) {\n\t\t\tthis.log.e('Fallback device enumeration failed', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Update device states based on permission results\n\t */\n\tprivate updateDeviceStates(results: {\n\t\tvideo: { success: boolean; error?: any };\n\t\taudio: { success: boolean; error?: any };\n\t}): void {\n\t\t// Update video state\n\t\tthis.videoState.update(state => ({\n\t\t\t...state,\n\t\t\tpermissionGranted: results.video.success,\n\t\t\terror: results.video.error?.name\n\t\t}));\n\n\t\t// Update audio state\n\t\tthis.audioState.update(state => ({\n\t\t\t...state,\n\t\t\tpermissionGranted: results.audio.success,\n\t\t\terror: results.audio.error?.name\n\t\t}));\n\t}\n\n\t/**\n\t * Process raw devices into typed camera and microphone lists\n\t */\n\tprivate processDevices(devices: MediaDeviceInfo[]): void {\n\t\t// Process video devices\n\t\tconst camerasArray = devices\n\t\t\t.filter((d) => d.kind === DeviceType.VIDEO_INPUT)\n\t\t\t.map((d) => this.createCustomDevice(d, CameraType.BACK));\n\n\t\t// Process audio devices\n\t\tconst microphonesArray = devices\n\t\t\t.filter((d) => d.kind === DeviceType.AUDIO_INPUT)\n\t\t\t.map((d) => ({ label: d.label, device: d.deviceId }));\n\n\t\t// Detect camera types (front/back)\n\t\tthis.detectCameraTypes(camerasArray);\n\n\t\t// Update signals\n\t\tthis.cameras.set(camerasArray);\n\t\tthis.microphones.set(microphonesArray);\n\n\t\t// Update availability states\n\t\tthis.updateDeviceAvailability(camerasArray.length, microphonesArray.length);\n\t}\n\n\t/**\n\t * Detect camera types (front/back) based on platform and labels\n\t */\n\tprivate detectCameraTypes(cameras: CustomDevice[]): void {\n\t\tif (cameras.length === 0) return;\n\n\t\tif (this.platformSrv.isMobile()) {\n\t\t\t// On mobile, detect by label\n\t\t\tcameras.forEach((camera) => {\n\t\t\t\tif (camera.label.toLowerCase().includes(CameraType.FRONT.toLowerCase())) {\n\t\t\t\t\tcamera.type = CameraType.FRONT;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// On desktop, first camera is typically front-facing\n\t\t\tcameras[0].type = CameraType.FRONT;\n\t\t}\n\t}\n\n\t/**\n\t * Update device availability states\n\t */\n\tprivate updateDeviceAvailability(cameraCount: number, microphoneCount: number): void {\n\t\tthis.videoState.update(state => ({\n\t\t\t...state,\n\t\t\thasDevices: cameraCount > 0\n\t\t}));\n\n\t\tthis.audioState.update(state => ({\n\t\t\t...state,\n\t\t\thasDevices: microphoneCount > 0\n\t\t}));\n\t}\n\n\t/**\n\t * Create custom device object\n\t */\n\tprivate createCustomDevice(device: MediaDeviceInfo, defaultType: CameraType): CustomDevice {\n\t\treturn {\n\t\t\tlabel: device.label,\n\t\t\tdevice: device.deviceId,\n\t\t\ttype: defaultType\n\t\t};\n\t}\n\n\t/**\n\t * Update selected devices from storage or use defaults\n\t */\n\tprivate updateSelectedDevices(): void {\n\t\tconst storedCamera = this.storageSrv.getVideoDevice();\n\t\tconst selectedCam = this.findDeviceOrDefault(\n\t\t\tthis.cameras(),\n\t\t\tstoredCamera?.device\n\t\t);\n\t\tif (selectedCam) {\n\t\t\tthis.cameraSelected.set(selectedCam);\n\t\t}\n\n\t\tconst storedMic = this.storageSrv.getAudioDevice();\n\t\tconst selectedMic = this.findDeviceOrDefault(\n\t\t\tthis.microphones(),\n\t\t\tstoredMic?.device\n\t\t);\n\t\tif (selectedMic) {\n\t\t\tthis.microphoneSelected.set(selectedMic);\n\t\t}\n\t}\n\n\t/**\n\t * Find device by ID or return first available\n\t */\n\tprivate findDeviceOrDefault(devices: CustomDevice[], deviceId?: string): CustomDevice | undefined {\n\t\tif (devices.length === 0) return undefined;\n\t\treturn deviceId\n\t\t\t? devices.find((d) => d.device === deviceId) || devices[0]\n\t\t\t: devices[0];\n\t}\n\n\t/**\n\t * Refresh devices (e.g., when a device is plugged/unplugged)\n\t */\n\tasync refreshDevices(): Promise<void> {\n\t\t// Invalidate cache\n\t\tthis.devicesCache = null;\n\n\t\tconst devices = await this.getLocalDevicesOptimized();\n\t\tthis.processDevices(devices);\n\t\tthis.updateSelectedDevices();\n\n\t\tthis.log.d('Devices refreshed', {\n\t\t\tcameras: this.cameras().length,\n\t\t\tmicrophones: this.microphones().length\n\t\t});\n\t}\n\n\t/**\n\t * Setup live device change detection\n\t * Automatically refreshes device list when devices are connected/disconnected\n\t */\n\tprivate setupDeviceChangeDetection(): void {\n\t\tif (!navigator.mediaDevices?.addEventListener) {\n\t\t\tthis.log.w('Device change detection not supported');\n\t\t\treturn;\n\t\t}\n\n\t\t// Remove existing listener if any\n\t\tif (this.deviceChangeHandler) {\n\t\t\tnavigator.mediaDevices.removeEventListener('devicechange', this.deviceChangeHandler);\n\t\t}\n\n\t\t// Create new handler\n\t\tthis.deviceChangeHandler = async () => {\n\t\t\tthis.log.d('Device change detected, refreshing device list');\n\t\t\tawait this.refreshDevices();\n\t\t};\n\n\t\t// Register listener\n\t\tnavigator.mediaDevices.addEventListener('devicechange', this.deviceChangeHandler);\n\t\tthis.log.d('Device change detection enabled');\n\t}\n\n\t// Public API methods (compatible with original DeviceService)\n\n\t/**\n\t * Check if camera is enabled based on storage and device availability\n\t */\n\tisCameraEnabled(): boolean {\n\t\treturn this.hasVideoDeviceAvailable() && this.storageSrv.isCameraEnabled();\n\t}\n\n\t/**\n\t * Check if microphone is enabled based on storage and device availability\n\t */\n\tisMicrophoneEnabled(): boolean {\n\t\treturn this.hasAudioDeviceAvailable() && this.storageSrv.isMicrophoneEnabled();\n\t}\n\n\t/**\n\t * Get currently selected camera\n\t */\n\tgetCameraSelected(): CustomDevice | undefined {\n\t\treturn this.cameraSelected();\n\t}\n\n\t/**\n\t * Get currently selected microphone\n\t */\n\tgetMicrophoneSelected(): CustomDevice | undefined {\n\t\treturn this.microphoneSelected();\n\t}\n\n\t/**\n\t * Set selected camera and persist to storage\n\t */\n\tsetCameraSelected(deviceId: string): void {\n\t\tconst device = this.cameras().find((c) => c.device === deviceId);\n\t\tif (!device) {\n\t\t\tthis.log.w('Camera not found:', deviceId);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.cameraSelected.set(device);\n\t\tthis.storageSrv.setVideoDevice(device);\n\t\tthis.log.d('Camera selected:', device.label);\n\t}\n\n\t/**\n\t * Set selected microphone and persist to storage\n\t */\n\tsetMicSelected(deviceId: string): void {\n\t\tconst device = this.microphones().find((m) => m.device === deviceId);\n\t\tif (!device) {\n\t\t\tthis.log.w('Microphone not found:', deviceId);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.microphoneSelected.set(device);\n\t\tthis.storageSrv.setAudioDevice(device);\n\t\tthis.log.d('Microphone selected:', device.label);\n\t}\n\n\t/**\n\t * Check if video track needs to be updated\n\t */\n\tneedUpdateVideoTrack(newDevice: CustomDevice): boolean {\n\t\tconst current = this.cameraSelected();\n\t\treturn (\n\t\t\tcurrent?.device !== newDevice.device ||\n\t\t\tcurrent?.label !== newDevice.label\n\t\t);\n\t}\n\n\t/**\n\t * Check if audio track needs to be updated\n\t */\n\tneedUpdateAudioTrack(newDevice: CustomDevice): boolean {\n\t\tconst current = this.microphoneSelected();\n\t\treturn (\n\t\t\tcurrent?.device !== newDevice.device ||\n\t\t\tcurrent?.label !== newDevice.label\n\t\t);\n\t}\n\n\t// ==========================================\n\t// Public API - Device Access\n\t// ==========================================\n\n\t/**\n\t * Get list of available cameras\n\t */\n\tgetCameras(): CustomDevice[] {\n\t\treturn this.cameras();\n\t}\n\n\t/**\n\t * Get list of available microphones\n\t */\n\tgetMicrophones(): CustomDevice[] {\n\t\treturn this.microphones();\n\t}\n\n\t// ==========================================\n\t// Public API - Device State\n\t// ==========================================\n\n\t/**\n\t * Check if video devices are available\n\t */\n\thasVideoDeviceAvailable(): boolean {\n\t\treturn this.hasVideoDevices();\n\t}\n\n\t/**\n\t * Check if audio devices are available\n\t */\n\thasAudioDeviceAvailable(): boolean {\n\t\treturn this.hasAudioDevices();\n\t}\n\n\t// ==========================================\n\t// Public API - Permission State\n\t// ==========================================\n\n\t/**\n\t * Check if video permission was granted\n\t */\n\thasVideoPermissionGranted(): boolean {\n\t\treturn this.hasVideoPermission();\n\t}\n\n\t/**\n\t * Check if audio permission was granted\n\t */\n\thasAudioPermissionGranted(): boolean {\n\t\treturn this.hasAudioPermission();\n\t}\n\n\t// ==========================================\n\t// Public API - Reactive State Access\n\t// For components that need direct signal access, use:\n\t// - this.cameras, this.microphones (device lists)\n\t// - this.cameraSelected, this.microphoneSelected (selections)\n\t// - this.hasVideoDevices, this.hasAudioDevices (availability)\n\t// - this.hasVideoPermission, this.hasAudioPermission (permissions)\n\t// - this.allPermissionsGranted (combined permissions)\n\t// ==========================================\n\n\t/**\n\t * Clear all device data\n\t */\n\tclear(): void {\n\t\tthis.cameras.set([]);\n\t\tthis.microphones.set([]);\n\t\tthis.cameraSelected.set(undefined);\n\t\tthis.microphoneSelected.set(undefined);\n\t\tthis.devicesCache = null;\n\n\t\tthis.videoState.set({\n\t\t\thasDevices: false,\n\t\t\tisEnabled: true,\n\t\t\tpermissionGranted: false\n\t\t});\n\n\t\tthis.audioState.set({\n\t\t\thasDevices: false,\n\t\t\tisEnabled: true,\n\t\t\tpermissionGranted: false\n\t\t});\n\t}\n}\n","import { Injectable, signal, Signal } from '@angular/core';\nimport {\n\tBackgroundProcessor,\n\tBackgroundProcessorWrapper,\n\tsupportsBackgroundProcessors,\n\tsupportsModernBackgroundProcessors,\n\tSwitchBackgroundProcessorOptions\n} from '@livekit/track-processors';\nimport {\n\tAudioCaptureOptions,\n\tConnectionState,\n\tcreateLocalTracks,\n\tCreateLocalTracksOptions,\n\tE2EEOptions,\n\tExternalE2EEKeyProvider,\n\tLocalAudioTrack,\n\tLocalTrack,\n\tLocalVideoTrack,\n\tRoom,\n\tRoomOptions,\n\tTrack,\n\tVideoCaptureOptions,\n\tVideoPresets\n} from 'livekit-client';\nimport { ILogger } from '../../models/logger.model';\nimport { OpenViduComponentsConfigService } from '../config/directive-config.service';\nimport { DeviceService } from '../device/device.service';\nimport { LoggerService } from '../logger/logger.service';\nimport { StorageService } from '../storage/storage.service';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class OpenViduService {\n\t/*\n\t * @internal\n\t */\n\t// isSttReadyObs: Observable<boolean>;\n\t// private STT_TIMEOUT_MS = 2 * 1000;\n\t// private sttReconnectionTimeout: NodeJS.Timeout;\n\t// private _isSttReady: BehaviorSubject<boolean> = new BehaviorSubject(true);\n\n\tprivate room: Room;\n\tprivate keyProvider: ExternalE2EEKeyProvider | undefined;\n\n\t/**\n\t * @internal\n\t * Indicates whether the client initiated disconnect event should be handled.\n\t * This is used to determine if the disconnect event should be emitted when the 'Disconnect' event is triggered\n\t */\n\tshouldHandleClientInitiatedDisconnectEvent = true;\n\n\t/*\n\t * Tracks used in the prejoin component. They are created when the room is not yet created.\n\t */\n\tprivate localTracks: LocalTrack[] = [];\n\tprivate livekitToken = '';\n\tprivate livekitUrl = '';\n\tprivate log: ILogger;\n\n\t/**\n\t * Background processor for video tracks. Initialized in disabled mode.\n\t * This processor is shared between prejoin and in-room states.\n\t * Only initialized if browser supports background processing (GPU available).\n\t */\n\tprivate backgroundProcessor?: BackgroundProcessorWrapper;\n\n\t/**\n\t * Signal to track if background processor is supported (requires GPU).\n\t * Set to false if browser doesn't support it or processor initialization fails.\n\t */\n\tprivate _isBackgroundProcessorSupported = signal(false);\n\n\t/**\n\t * Public readonly signal for background processor support status.\n\t */\n\treadonly isBackgroundProcessorSupported: Signal<boolean> = this._isBackgroundProcessorSupported.asReadonly();\n\n\t/**\n\t * Stores the last applied background options so they can be re-applied after a camera switch.\n\t */\n\tprivate currentBackgroundOptions: SwitchBackgroundProcessorOptions | null = null;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate deviceService: DeviceService,\n\t\tprivate storageService: StorageService,\n\t\tprivate configService: OpenViduComponentsConfigService\n\t) {\n\t\tthis.log = this.loggerSrv.get('OpenViduService');\n\t\t// this.isSttReadyObs = this._isSttReady.asObservable();\n\n\t\t// Check if browser supports background processors\n\t\tif (!supportsBackgroundProcessors()) {\n\t\t\tthis.log.w('Background processors not supported in this browser (GPU may be disabled)');\n\t\t\tthis._isBackgroundProcessorSupported.set(false);\n\t\t\treturn;\n\t\t}\n\n\t\t// Only initialize processor immediately for browsers supporting modern processors\n\t\t// Browsers without modern support (e.g., Firefox) will initialize on-demand\n\t\tif (supportsModernBackgroundProcessors()) {\n\t\t\ttry {\n\t\t\t\tthis.backgroundProcessor = BackgroundProcessor({ mode: 'disabled' });\n\t\t\t\tthis._isBackgroundProcessorSupported.set(true);\n\t\t\t\tthis.log.d('Background processor initialized at startup (modern processors supported)');\n\t\t\t} catch (error: any) {\n\t\t\t\tthis.log.w('Failed to initialize background processor:', error?.message || error);\n\t\t\t\tthis._isBackgroundProcessorSupported.set(false);\n\t\t\t}\n\t\t} else {\n\t\t\t// Mark as supported but don't initialize yet - will be created on-demand\n\t\t\tthis._isBackgroundProcessorSupported.set(true);\n\t\t\tthis.log.d('Background processors supported but not modern - will initialize on-demand');\n\t\t}\n\t}\n\n\t/**\n\t * Creates a new Room with audio and video devices selected or default ones.\n\t * @internal\n\t */\n\tinitRoom(): void {\n\t\t// Check if E2EE configuration needs to be applied\n\t\tconst e2eeKey = this.configService.getE2EEKey();\n\t\tconst needsE2EEConfig = e2eeKey && e2eeKey.trim() !== '' && !this.keyProvider;\n\n\t\t// If room already exists and doesn't need E2EE reconfiguration, don't recreate it\n\t\tif (this.room && !needsE2EEConfig) {\n\t\t\tthis.log.d('Room already initialized, skipping re-initialization');\n\t\t\treturn;\n\t\t}\n\n\t\t// If room exists but needs E2EE configuration, we need to recreate it\n\t\tif (this.room && needsE2EEConfig) {\n\t\t\tthis.log.d('Room needs E2EE configuration, recreating room');\n\t\t\tthis.room = null as any;\n\t\t}\n\n\t\tconst videoDeviceId = this.deviceService.getCameraSelected()?.device ?? undefined;\n\t\tconst audioDeviceId = this.deviceService.getMicrophoneSelected()?.device ?? undefined;\n\n\t\tconst roomOptions: RoomOptions = {\n\t\t\tadaptiveStream: true,\n\t\t\tdynacast: true,\n\t\t\taudioCaptureDefaults: {\n\t\t\t\tdeviceId: audioDeviceId,\n\t\t\t\techoCancellation: true,\n\t\t\t\tnoiseSuppression: true,\n\t\t\t\tautoGainControl: true\n\t\t\t},\n\t\t\tvideoCaptureDefaults: {\n\t\t\t\tdeviceId: videoDeviceId,\n\t\t\t\tresolution: VideoPresets.h720.resolution\n\t\t\t},\n\t\t\tpublishDefaults: {\n\t\t\t\tdtx: true,\n\t\t\t\tsimulcast: true,\n\t\t\t\tstopMicTrackOnMute: true\n\t\t\t},\n\t\t\tstopLocalTrackOnUnpublish: true,\n\t\t\tdisconnectOnPageLeave: true\n\t\t};\n\n\t\t// Configure E2EE if key is provided and keyProvider exists\n\t\tif (needsE2EEConfig) {\n\t\t\t// Create worker using the copied livekit-client e2ee worker from assets\n\t\t\troomOptions.encryption = this.buildE2EEOptions();\n\t\t}\n\n\t\tthis.room = new Room(roomOptions);\n\t\tthis.log.d('Room initialized successfully');\n\t}\n\n\tprivate buildE2EEOptions(): E2EEOptions {\n\t\tthis.log.d('Configuring E2EE with provided key');\n\t\tthis.keyProvider = new ExternalE2EEKeyProvider();\n\t\t// Create worker using the copied livekit-client e2ee worker from assets\n\t\treturn {\n\t\t\tkeyProvider: this.keyProvider,\n\t\t\tworker: new Worker('./assets/livekit/livekit-client.e2ee.worker.mjs', { type: 'module' })\n\t\t};\n\t}\n\n\t/**\n\t * Connects local participant to the room\n\t */\n\tasync connectRoom(): Promise<void> {\n\t\ttry {\n\t\t\t// Configure E2EE if key provider was initialized\n\t\t\tif (this.keyProvider) {\n\t\t\t\tconst e2eeKey = this.configService.getE2EEKey();\n\t\t\t\tif (e2eeKey) {\n\t\t\t\t\tthis.log.d('Setting E2EE key and enabling encryption');\n\t\t\t\t\tawait this.keyProvider.setKey(e2eeKey);\n\t\t\t\t\tawait this.room.setE2EEEnabled(true);\n\t\t\t\t\tthis.log.d('E2EE successfully enabled');\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.room.connect(this.livekitUrl, this.livekitToken);\n\t\t\tthis.log.d(`Successfully connected to room ${this.room.name}`);\n\n\t\t\tconst participantName = this.storageService.getParticipantName();\n\t\t\tif (participantName) {\n\t\t\t\tthis.room.localParticipant.setName(participantName);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error connecting to room:', error);\n\t\t\tthrow { code: 'CONNECTION_ERROR', message: `Error connecting to the server at the following URL: ${this.livekitUrl}` };\n\t\t}\n\t}\n\n\t/**\n\t * Disconnects from the current room.\n\t *\n\t * This method will check if there's an active connection to a room before attempting to disconnect.\n\t * If the room is connected, it will perform the disconnection and call the optional callback function.\n\t *\n\t * @param callback - Optional function to be executed after a successful disconnection\n\t * @returns A Promise that resolves once the disconnection is complete\n\t */\n\tasync disconnectRoom(callback?: () => void, shouldHandleClientInitiatedDisconnectEvent: boolean = true): Promise<void> {\n\t\tthis.shouldHandleClientInitiatedDisconnectEvent = shouldHandleClientInitiatedDisconnectEvent;\n\t\tif (this.isRoomConnected()) {\n\t\t\tthis.log.d('Disconnecting from room');\n\t\t\tawait this.room.disconnect();\n\t\t\tif (callback) callback();\n\t\t}\n\t}\n\n\t/**\n\t * @returns Room instance\n\t */\n\tgetRoom(): Room {\n\t\tif (!this.room) {\n\t\t\tthis.log.e('Room is not initialized. Make sure token is set before accessing the room.');\n\t\t\tthrow new Error('Room is not initialized. Make sure token is set before accessing the room.');\n\t\t}\n\t\treturn this.room;\n\t}\n\n\t/**\n\t * Checks if room is initialized without throwing an error\n\t * @returns true if room is initialized, false otherwise\n\t */\n\tisRoomInitialized(): boolean {\n\t\treturn !!this.room;\n\t}\n\n\t/**\n\t * Returns the room name\n\t */\n\tgetRoomName(): string {\n\t\treturn this.room?.name;\n\t}\n\n\t/**\n\t * Returns if local participant is connected to the room\n\t * @returns\n\t */\n\tisRoomConnected(): boolean {\n\t\treturn this.room?.state === ConnectionState.Connected;\n\t}\n\n\thasRoomTracksPublished(): boolean {\n\t\tconst { localParticipant, remoteParticipants } = this.getRoom();\n\t\tconst localTracks = localParticipant.getTrackPublications();\n\t\tconst remoteTracks = Array.from(remoteParticipants.values()).flatMap((p) => p.getTrackPublications());\n\n\t\treturn localTracks.length > 0 || remoteTracks.length > 0;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tinitializeAndSetToken(token: string, livekitUrl?: string): void {\n\t\tconst { livekitUrl: urlFromToken } = this.extractLivekitData(token);\n\n\t\tthis.livekitToken = token;\n\t\tconst url = livekitUrl || urlFromToken;\n\n\t\tif (!url) {\n\t\t\tthis.log.e('LiveKit URL is not defined. Please, check the livekitUrl parameter of the VideoConferenceComponent');\n\t\t\tthrow new Error('Livekit URL is not defined');\n\t\t}\n\n\t\tthis.livekitUrl = url;\n\t\t// this.livekitRoomAdmin = !!livekitRoomAdmin;\n\n\t\t// Initialize room if it doesn't exist yet\n\t\t// This ensures that getRoom() won't fail if token is set before onTokenRequested\n\t\tif (!this.room) {\n\t\t\tthis.log.d('Room not initialized yet, initializing room due to token assignment');\n\t\t\tthis.initRoom();\n\t\t}\n\t\t// return this.room.prepareConnection(this.livekitUrl, this.livekitToken);\n\t}\n\n\t/**\n\t * Sets the local tracks for the OpenVidu service.\n\t *\n\t * @param tracks - An array of LocalTrack objects representing the local tracks to be set.\n\t * @returns void\n\t * @internal\n\t */\n\tsetLocalTracks(tracks: LocalTrack[]): void {\n\t\tthis.localTracks = tracks.filter((track) => track !== undefined) as LocalTrack[];\n\t}\n\n\t/**\n\t * @internal\n\t * @returns\n\t */\n\tgetLocalTracks(): LocalTrack[] {\n\t\treturn this.localTracks;\n\t}\n\n\t/**\n\t * Switches the background mode on the local video track.\n\t * Works both in prejoin and in-room states.\n\t * For Firefox: applies processor when effect is activated to avoid performance issues\n\t * For other browsers: processor is pre-attached, so just switch mode\n\t * @param options - The switch options (mode, blurRadius, imagePath)\n\t * @returns Promise<void>\n\t * @internal\n\t */\n\tasync switchBackgroundMode(options: SwitchBackgroundProcessorOptions): Promise<void> {\n\t\tif (!this.isBackgroundProcessorSupported()) {\n\t\t\tthis.log.w('Background processor not supported (GPU disabled). Virtual background is disabled.');\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// For browsers without modern processor support: attach processor on-demand when effect is activated\n\t\t\tif (!supportsModernBackgroundProcessors()) {\n\t\t\t\tawait this.handleLazyProcessorAttachment(options.mode);\n\t\t\t}\n\n\t\t\t// If processor exists, switch mode (either pre-initialized or just created on-demand)\n\t\t\tif (this.backgroundProcessor) {\n\t\t\t\tawait this.backgroundProcessor.switchTo(options);\n\t\t\t\tthis.currentBackgroundOptions = options;\n\t\t\t\tthis.log.d('Background mode switched:', options);\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tthis.log.e('Failed to switch background mode:', error?.message || error);\n\t\t\tthis._isBackgroundProcessorSupported.set(false);\n\t\t\t// Don't throw - gracefully disable virtual background instead of crashing\n\t\t}\n\t}\n\n\t/**\n\t * Handles lazy processor attachment for browsers without modern processor support.\n\t * Creates and attaches processor on-demand when effect is activated.\n\t * This is used for browsers like Firefox that don't support modern background processors.\n\t * @internal\n\t */\n\tprivate async handleLazyProcessorAttachment(mode: SwitchBackgroundProcessorOptions['mode']): Promise<void> {\n\t\tconst videoTrack = await this.getVideoTrack();\n\t\tif (!videoTrack) return;\n\n\t\tconst hasProcessor = Boolean(videoTrack.getProcessor());\n\t\tconst isDisabled = mode === 'disabled';\n\n\t\tif (!isDisabled && !hasProcessor) {\n\t\t\ttry {\n\t\t\t\t// Create processor on-demand if not already created\n\t\t\t\tif (!this.backgroundProcessor) {\n\t\t\t\t\tthis.log.d('Creating background processor on-demand');\n\t\t\t\t\tthis.backgroundProcessor = BackgroundProcessor({ mode: 'disabled' });\n\t\t\t\t}\n\n\t\t\t\tthis.log.d('Attaching processor on effect activation (lazy loading)');\n\t\t\t\tawait videoTrack.setProcessor(this.backgroundProcessor);\n\t\t\t} catch (error: any) {\n\t\t\t\tthis.log.w('Failed to attach background processor (GPU may be disabled):', error?.message || error);\n\t\t\t\tthis._isBackgroundProcessorSupported.set(false);\n\t\t\t\t// Continue without crashing - virtual background will be disabled\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (isDisabled && hasProcessor) {\n\t\t\tthis.log.d('Stopping processor on effect deactivation');\n\t\t\tawait videoTrack.stopProcessor();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t **/\n\tremoveLocalTracks(): void {\n\t\tthis.localTracks.forEach((track) => {\n\t\t\ttrack.stop();\n\t\t\ttrack.detach();\n\t\t});\n\t\tthis.localTracks = [];\n\t}\n\n\t/**\n\t * Creates local tracks for video and audio devices.\n\t *\n\t * @param videoDeviceId - The ID of the video device to use. If not provided, the default video device will be used.\n\t * @param audioDeviceId - The ID of the audio device to use. If not provided, the default audio device will be used.\n\t * @param allowPartialCreation - If true, allows creating tracks even if some devices fail\n\t * @returns A promise that resolves to an array of LocalTrack objects representing the created tracks.\n\t * @internal\n\t */\n\tasync createLocalTracks(\n\t\tvideoDeviceId: string | boolean | undefined = undefined,\n\t\taudioDeviceId: string | boolean | undefined = undefined,\n\t\tallowPartialCreation: boolean = true\n\t): Promise<LocalTrack[]> {\n\t\t// Default values: true if device is enabled, false otherwise\n\t\tvideoDeviceId ??= this.deviceService.isCameraEnabled();\n\t\taudioDeviceId ??= this.deviceService.isMicrophoneEnabled();\n\n\t\tconst options: CreateLocalTracksOptions = {\n\t\t\taudio: { echoCancellation: true, noiseSuppression: true },\n\t\t\tvideo: {}\n\t\t};\n\n\t\t// Video device\n\t\tif (videoDeviceId === true) {\n\t\t\tif (this.deviceService.hasVideoDeviceAvailable()) {\n\t\t\t\tconst selectedCamera = this.deviceService.getCameraSelected();\n\t\t\t\toptions.video = { deviceId: this.toDeviceConstraint(selectedCamera?.device) };\n\t\t\t} else {\n\t\t\t\toptions.video = false;\n\t\t\t}\n\t\t} else if (videoDeviceId === false) {\n\t\t\toptions.video = false;\n\t\t} else {\n\t\t\t(options.video as VideoCaptureOptions).deviceId = this.toDeviceConstraint(videoDeviceId);\n\t\t}\n\n\t\t// Audio device\n\t\tif (audioDeviceId === true) {\n\t\t\tif (this.deviceService.hasAudioDeviceAvailable()) {\n\t\t\t\tconst selectedMic = this.deviceService.getMicrophoneSelected();\n\t\t\t\t(options.audio as AudioCaptureOptions).deviceId = this.toDeviceConstraint(selectedMic?.device);\n\t\t\t} else {\n\t\t\t\toptions.audio = false;\n\t\t\t}\n\t\t} else if (audioDeviceId === false) {\n\t\t\toptions.audio = false;\n\t\t} else {\n\t\t\t(options.audio as AudioCaptureOptions).deviceId = this.toDeviceConstraint(audioDeviceId);\n\t\t}\n\n\t\tlet newLocalTracks: LocalTrack[] = [];\n\n\t\tif (options.audio || options.video) {\n\t\t\tthis.log.d('Creating local tracks with options', options);\n\n\t\t\tif (allowPartialCreation) {\n\t\t\t\t// Try to create tracks separately to handle device conflicts gracefully\n\t\t\t\tnewLocalTracks = await this.createTracksWithFallback(options);\n\t\t\t} else {\n\t\t\t\t// Original behavior - all or nothing\n\t\t\t\tnewLocalTracks = await createLocalTracks(options);\n\t\t\t}\n\n\t\t\t// Apply background processor to the new video track.\n\t\t\t// applyProcessorToVideoTrack handles both modern (pre-attach + auto-restore via\n\t\t\t// transformer.options) and Firefox/non-modern (lazy attach only when a VBG is active).\n\t\t\tconst videoTrack = newLocalTracks.find((t) => t.kind === Track.Kind.Video) as LocalVideoTrack | undefined;\n\t\t\tif (videoTrack) {\n\t\t\t\tawait this.applyProcessorToVideoTrack(videoTrack);\n\t\t\t}\n\n\t\t\t// Mute tracks if devices are disabled\n\t\t\tif (!this.deviceService.isCameraEnabled()) {\n\t\t\t\tnewLocalTracks.find((t) => t.kind === Track.Kind.Video)?.mute();\n\t\t\t}\n\t\t\tif (!this.deviceService.isMicrophoneEnabled()) {\n\t\t\t\tnewLocalTracks.find((t) => t.kind === Track.Kind.Audio)?.mute();\n\t\t\t}\n\t\t}\n\t\treturn newLocalTracks;\n\t}\n\n\t/**\n\t * Creates tracks with fallback strategy to handle device conflicts\n\t * @param options - The track creation options\n\t * @returns Array of successfully created tracks\n\t * @internal\n\t */\n\tprivate async createTracksWithFallback(options: CreateLocalTracksOptions): Promise<LocalTrack[]> {\n\t\tconst tracks: LocalTrack[] = [];\n\n\t\t// Try to create video track separately\n\t\tif (options.video) {\n\t\t\ttry {\n\t\t\t\tconst videoTracks = await createLocalTracks({ video: options.video });\n\t\t\t\ttracks.push(...videoTracks);\n\t\t\t\tthis.log.d('Video track created successfully');\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.w('Failed to create video track, device may be busy:', error);\n\t\t\t\t// Still continue to try audio track\n\t\t\t}\n\t\t}\n\n\t\t// Try to create audio track separately\n\t\tif (options.audio) {\n\t\t\ttry {\n\t\t\t\tconst audioTracks = await createLocalTracks({ audio: options.audio });\n\t\t\t\ttracks.push(...audioTracks);\n\t\t\t\tthis.log.d('Audio track created successfully');\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.w('Failed to create audio track, device may be busy:', error);\n\t\t\t}\n\t\t}\n\n\t\treturn tracks;\n\t}\n\n\tprivate toDeviceConstraint(deviceId?: string): ConstrainDOMString {\n\t\tif (!deviceId || deviceId === 'default') {\n\t\t\treturn { ideal: 'default' };\n\t\t}\n\t\treturn { exact: deviceId };\n\t}\n\n\t/**\n\t * @internal\n\t * As the Room is not created yet, we need to handle the media tracks with a temporary array of tracks.\n\t * This method must be only called from the prejoin component.\n\t **/\n\tasync setVideoTrackEnabled(enabled: boolean) {\n\t\tlet videoTrack = this.localTracks?.find((track) => track.kind === Track.Kind.Video);\n\t\t// Room is not connected, so we can't enable/disable the camera\n\t\tif (enabled) {\n\t\t\tawait videoTrack?.unmute();\n\t\t} else {\n\t\t\tawait videoTrack?.mute();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * As the Room is not created yet, we need to handle the media tracks with a temporary array of tracks.\n\t * This method must be only called from the prejoin component.\n\t **/\n\tasync setAudioTrackEnabled(enabled: boolean) {\n\t\tconst audioTrack = this.localTracks?.find((track) => track.kind === Track.Kind.Audio);\n\t\t// Session is not connected, so we can't enable/disable the camera\n\t\tif (enabled) {\n\t\t\tawait audioTrack?.unmute();\n\t\t} else {\n\t\t\tawait audioTrack?.mute();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * As the Room is not created yet, we need to handle the media tracks with a temporary array of tracks.\n\t * This method must be only called before connect to room.\n\t **/\n\tisVideoTrackEnabled(): boolean {\n\t\tif (this.localTracks.length === 0) {\n\t\t\treturn this.deviceService.isCameraEnabled();\n\t\t}\n\t\tconst videoTrack = this.localTracks.find((track) => track.kind === Track.Kind.Video);\n\t\treturn !!videoTrack && !videoTrack.isMuted && videoTrack?.mediaStreamTrack?.enabled;\n\t}\n\n\t/**\n\t * @internal\n\t * As the Room is not created yet, we need to handle the media tracks with a temporary array of tracks.\n\t * This method must be only called before connect to room.\n\t **/\n\tisAudioTrackEnabled(): boolean {\n\t\tif (this.localTracks.length === 0) {\n\t\t\treturn this.deviceService.isMicrophoneEnabled();\n\t\t}\n\t\tconst audioTrack = this.localTracks.find((track) => track.kind === Track.Kind.Audio);\n\t\treturn !!audioTrack && !audioTrack.isMuted && audioTrack?.mediaStreamTrack?.enabled;\n\t}\n\n\t/**\n\t * Switches the camera device in prejoin (room not yet connected).\n\t *\n\t * Uses `LocalVideoTrack.restartTrack({ deviceId })` on the existing track when available.\n\t * This is the correct LiveKit pattern: `restartTrack` internally calls `setMediaStreamTrack`,\n\t * which automatically calls `processor.restart(newTrack)` if a background processor is\n\t * attached — preserving any active virtual-background effect without extra work.\n\t *\n\t * Falls back to creating a new track (with processor reattachment) when no track exists.\n\t * @param deviceId - The new video device ID\n\t * @internal\n\t */\n\tasync switchCamera(deviceId: string): Promise<void> {\n\t\tconst existingTrack = this.localTracks.find((t) => t.kind === Track.Kind.Video) as LocalVideoTrack | undefined;\n\t\tconst options: VideoCaptureOptions = { deviceId: this.toDeviceConstraint(deviceId) };\n\t\tif (existingTrack) {\n\t\t\ttry {\n\t\t\t\t// restartTrack replaces the underlying MediaStreamTrack in-place.\n\t\t\t\t// LiveKit's setMediaStreamTrack will call processor.restart(newTrack) automatically\n\t\t\t\t// if a background processor is attached, preserving the active effect.\n\t\t\t\tawait existingTrack.restartTrack(options);\n\t\t\t\tif (!this.deviceService.isCameraEnabled()) {\n\t\t\t\t\tawait existingTrack.mute();\n\t\t\t\t}\n\t\t\t\tthis.log.d('Camera switched via restartTrack:', deviceId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.e('Failed to switch camera via restartTrack:', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// No existing track (edge case: camera was unavailable/unpublished) → create a fresh one\n\t\ttry {\n\t\t\tconst newVideoTracks = await createLocalTracks({ video: options });\n\t\t\tconst videoTrack = newVideoTracks.find((t) => t.kind === Track.Kind.Video) as LocalVideoTrack | undefined;\n\t\t\tif (videoTrack) {\n\t\t\t\tif (!this.deviceService.isCameraEnabled()) {\n\t\t\t\t\tawait videoTrack.mute();\n\t\t\t\t}\n\t\t\t\t// Attach processor (and restore active background if any) to the fresh track\n\t\t\t\tawait this.applyProcessorToVideoTrack(videoTrack);\n\t\t\t\tthis.localTracks.push(videoTrack);\n\t\t\t\tthis.log.d('New camera track created and added:', deviceId);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.e('Failed to create new video track:', error);\n\t\t\tconst message = error instanceof Error ? error.message : 'Unknown error';\n\t\t\tthrow new Error(`Failed to switch camera: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Attaches the background processor to a freshly-created video track.\n\t * Called only for brand-new track objects (createLocalTracks or the no-existing-track fallback).\n\t *\n\t * - Modern browsers: pre-attaches the shared processor object; `processor.init()` uses the\n\t *   transformer's stored options so any previously active mode is automatically restored.\n\t * - Firefox (non-modern / stream fallback): lazily attaches the processor only when a\n\t *   background effect was already active, then re-applies the stored options.\n\t * @internal\n\t */\n\tprivate async applyProcessorToVideoTrack(videoTrack: LocalVideoTrack): Promise<void> {\n\t\tif (!this.isBackgroundProcessorSupported()) return;\n\n\t\tif (supportsModernBackgroundProcessors()) {\n\t\t\tif (!this.backgroundProcessor) return;\n\t\t\ttry {\n\t\t\t\t// setProcessor calls processor.init() which re-initialises the pipeline using\n\t\t\t\t// transformer.options (updated by every switchTo call), so the active background\n\t\t\t\t// effect is restored without an explicit switchTo here.\n\t\t\t\tawait videoTrack.setProcessor(this.backgroundProcessor);\n\t\t\t\tthis.log.d('Background processor applied to video track');\n\t\t\t} catch (error: any) {\n\t\t\t\tthis.log.w('Failed to apply background processor to video track:', error?.message || error);\n\t\t\t\tthis._isBackgroundProcessorSupported.set(false);\n\t\t\t}\n\t\t} else if (this.currentBackgroundOptions && this.currentBackgroundOptions.mode !== 'disabled') {\n\t\t\t// Firefox / non-modern: processor is not pre-allocated; create on first use\n\t\t\ttry {\n\t\t\t\tif (!this.backgroundProcessor) {\n\t\t\t\t\tthis.backgroundProcessor = BackgroundProcessor({ mode: 'disabled' });\n\t\t\t\t}\n\t\t\t\tawait videoTrack.setProcessor(this.backgroundProcessor);\n\t\t\t\t// For the non-modern path the processor's transformer options are reset on init;\n\t\t\t\t// we must explicitly re-apply the active effect.\n\t\t\t\tawait this.backgroundProcessor.switchTo(this.currentBackgroundOptions);\n\t\t\t\tthis.log.d('Background effect restored on new track (non-modern):', this.currentBackgroundOptions);\n\t\t\t} catch (error: any) {\n\t\t\t\tthis.log.w('Failed to restore background processor (non-modern):', error?.message || error);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Switches the microphone device in prejoin (room not yet connected).\n\t *\n\t * Uses `LocalAudioTrack.restartTrack({ deviceId })` on the existing track when available,\n\t * preserving echo-cancellation, noise-suppression and auto-gain-control constraints.\n\t * Falls back to creating a new audio track when none exists.\n\t * @param deviceId - The new audio device ID\n\t * @internal\n\t */\n\tasync switchMicrophone(deviceId: string): Promise<void> {\n\t\tconst existingTrack = this.localTracks.find((t) => t.kind === Track.Kind.Audio) as LocalAudioTrack | undefined;\n\t\tconst options: AudioCaptureOptions = {\n\t\t\tdeviceId: this.toDeviceConstraint(deviceId),\n\t\t\techoCancellation: true,\n\t\t\tnoiseSuppression: true,\n\t\t\tautoGainControl: true\n\t\t};\n\n\t\tif (existingTrack) {\n\t\t\ttry {\n\t\t\t\tawait existingTrack.restartTrack(options);\n\t\t\t\tif (!this.deviceService.isMicrophoneEnabled()) {\n\t\t\t\t\tawait existingTrack.mute();\n\t\t\t\t}\n\t\t\t\tthis.log.d('Microphone switched via restartTrack:', deviceId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.e('Failed to switch microphone via restartTrack:', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// No existing track (edge case) → create a fresh one\n\t\ttry {\n\t\t\tconst newAudioTracks = await createLocalTracks(options as CreateLocalTracksOptions);\n\t\t\tconst audioTrack = newAudioTracks.find((t) => t.kind === Track.Kind.Audio);\n\t\t\tif (audioTrack) {\n\t\t\t\tif (!this.deviceService.isMicrophoneEnabled()) {\n\t\t\t\t\tawait audioTrack.mute();\n\t\t\t\t}\n\t\t\t\tthis.localTracks.push(audioTrack);\n\t\t\t\tthis.log.d('New microphone track created and added:', deviceId);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.e('Failed to create new audio track:', error);\n\t\t\tconst message = error instanceof Error ? error.message : 'Unknown error';\n\t\t\tthrow new Error(`Failed to switch microphone: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the current video track from local tracks or room\n\t * @returns LocalVideoTrack or undefined\n\t * @internal\n\t */\n\tprivate async getVideoTrack(): Promise<LocalVideoTrack | undefined> {\n\t\t// First try to get from local tracks (prejoin state)\n\t\tlet videoTrack = this.localTracks.find((t) => t.kind === Track.Kind.Video) as LocalVideoTrack | undefined;\n\n\t\t// If not found and room is connected, get from published tracks\n\t\tif (!videoTrack && this.isRoomConnected()) {\n\t\t\tconst localParticipant = this.room.localParticipant;\n\t\t\tconst videoPublication = localParticipant.getTrackPublications().find((pub) => pub.kind === Track.Kind.Video);\n\t\t\tvideoTrack = videoPublication?.track as LocalVideoTrack | undefined;\n\t\t}\n\n\t\treturn videoTrack;\n\t}\n\n\t/**\n\t * Extracts Livekit data from the provided token and returns an object containing the Livekit URL and room admin status.\n\t * @param token - The token to extract Livekit data from.\n\t * @param livekitUrl - The default Livekit URL to use if no Livekit URL is found in the token metadata.\n\t * @returns An object containing the Livekit URL and room admin status.\n\t * @throws Error if there is an error decoding and parsing the token.\n\t * @internal\n\t */\n\tprivate extractLivekitData(token: string): { livekitUrl?: string; livekitRoomAdmin: boolean } {\n\t\ttry {\n\t\t\tconst base64Url = token.split('.')[1];\n\t\t\tconst base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n\t\t\tconst jsonPayload = decodeURIComponent(\n\t\t\t\twindow\n\t\t\t\t\t.atob(base64)\n\t\t\t\t\t.split('')\n\t\t\t\t\t.map((c) => {\n\t\t\t\t\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t\t\t\t\t})\n\t\t\t\t\t.join('')\n\t\t\t);\n\n\t\t\tconst payload = JSON.parse(jsonPayload);\n\t\t\tif (payload?.metadata) {\n\t\t\t\tconst tokenMetadata = JSON.parse(payload.metadata);\n\t\t\t\treturn {\n\t\t\t\t\tlivekitUrl: tokenMetadata.livekitUrl,\n\t\t\t\t\tlivekitRoomAdmin: !!tokenMetadata.roomAdmin\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { livekitRoomAdmin: false };\n\t\t} catch (error) {\n\t\t\tthrow new Error('Error decoding and parsing token: ' + error);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Whether the STT service is ready or not\n\t * This will be `false` when the app receives a SPEECH_TO_TEXT_DISCONNECTED exception\n\t * and it cannot subscribe to STT\n\t */\n\t// isSttReady(): boolean {\n\t// \treturn this._isSttReady.getValue();\n\t// }\n\n\t/**\n\t * @internal\n\t */\n\t// setSTTReady(value: boolean): void {\n\t// \tif (this._isSttReady.getValue() !== value) {\n\t// \t\tthis._isSttReady.next(value);\n\t// \t}\n\t// }\n\n\t/**\n\t * @internal\n\t * Subscribe all `CAMERA` stream types to speech-to-text\n\t * It will retry the subscription each `STT_TIMEOUT_MS`\n\t *\n\t * @param lang The language of the Stream's audio track.\n\t */\n\t// async subscribeRemotesToSTT(lang: string): Promise<void> {\n\t// \tconst participantService = this.injector.get(ParticipantService);\n\t// \tconst remoteParticipants = participantService.getRemoteParticipants();\n\t// \tlet successNumber = 0;\n\t// \tfor (const p of remoteParticipants) {\n\t// \t\tconst stream = p.getCameraConnection()?.streamManager?.stream;\n\t// \t\tif (stream) {\n\t// \t\t\ttry {\n\t// \t\t\t\tawait this.subscribeStreamToStt(stream, lang);\n\t// \t\t\t\tsuccessNumber++;\n\t// \t\t\t} catch (error) {\n\t// \t\t\t\tthis.log.e(`Error subscribing ${stream.streamId} to STT:`, error);\n\t// \t\t\t\tbreak;\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// \tthis.setSTTReady(successNumber === remoteParticipants.length);\n\t// \tif (!this.isSttReady()) {\n\t// \t\tthis.log.w('STT is not ready. Retrying subscription...');\n\t// \t\tthis.sttReconnectionTimeout = setTimeout(this.subscribeRemotesToSTT.bind(this, lang), this.STT_TIMEOUT_MS);\n\t// \t}\n\t// }\n\n\t/**\n\t * @internal\n\t * Subscribe a stream to speech-to-text\n\t * @param stream\n\t * @param lang\n\t */\n\t// async subscribeStreamToStt(stream: Stream, lang: string): Promise<void> {\n\t// \tawait this.getWebcamSession().subscribeToSpeechToText(stream, lang);\n\t// \tthis.log.d(`Subscribed stream ${stream.streamId} to STT with ${lang} language.`);\n\t// }\n\n\t/**\n\t * @internal\n\t * Unsubscribe to all `CAMERA` stream types to speech-to-text if STT is up(ready)\n\t */\n\t// async unsubscribeRemotesFromSTT(): Promise<void> {\n\t// \tconst participantService = this.injector.get(ParticipantService);\n\t// \tclearTimeout(this.sttReconnectionTimeout);\n\t// \tif (this.isSttReady()) {\n\t// \t\tfor (const p of participantService.getRemoteParticipants()) {\n\t// \t\t\tconst stream = p.getCameraConnection().streamManager.stream;\n\t// \t\t\tif (stream) {\n\t// \t\t\t\ttry {\n\t// \t\t\t\t\tawait this.getWebcamSession().unsubscribeFromSpeechToText(stream);\n\t// \t\t\t\t} catch (error) {\n\t// \t\t\t\t\tthis.log.e(`Error unsubscribing ${stream.streamId} from STT:`, error);\n\t// \t\t\t\t}\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// }\n}\n","import { Injectable, Signal, WritableSignal, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport {\n\tAudioCaptureOptions,\n\tDataPublishOptions,\n\tLocalParticipant,\n\tLocalTrackPublication,\n\tParticipant,\n\tRemoteParticipant,\n\tScreenShareCaptureOptions,\n\tTrack,\n\tVideoCaptureOptions,\n\tVideoPresets\n} from 'livekit-client';\nimport { Observable } from 'rxjs';\nimport { ILogger } from '../../models/logger.model';\nimport { ParticipantModel, ParticipantProperties } from '../../models/participant.model';\nimport { OpenViduComponentsConfigService } from '../config/directive-config.service';\nimport { GlobalConfigService } from '../config/global-config.service';\nimport { E2eeService } from '../e2ee/e2ee.service';\nimport { LoggerService } from '../logger/logger.service';\nimport { OpenViduService } from '../openvidu/openvidu.service';\nimport { StorageService } from '../storage/storage.service';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class ParticipantService {\n\t/**\n\t * Local participant Observable which pushes the local participant object in every update.\n\t * @deprecated Please prefer `localParticipantSignal` for reactive updates and `localParticipant$` when using RxJS.\n\t */\n\tlocalParticipant$: Observable<ParticipantModel | undefined>;\n\n\t/**\n\t * Remote participants Observable which pushes the remote participants array in every update.\n\t * @deprecated Please prefer `remoteParticipantsSignal` for reactive updates and `remoteParticipants$` when using RxJS.\n\t */\n\tremoteParticipants$: Observable<ParticipantModel[]>;\n\n\t/**\n\t * Local participant Signal for reactive programming with Angular signals.\n\t * This is a modern alternative to localParticipant$ Observable.\n\t * @since Angular 16+\n\t */\n\tlocalParticipantSignal: Signal<ParticipantModel | undefined>;\n\tprivate localParticipantWritableSignal: WritableSignal<ParticipantModel | undefined> = signal<ParticipantModel | undefined>(undefined);\n\n\t/**\n\t * Remote participants Signal for reactive programming with Angular signals.\n\t * This is a modern alternative to remoteParticipants$ Observable.\n\t * @since Angular 16+\n\t */\n\tremoteParticipantsSignal: Signal<ParticipantModel[]>;\n\tprivate remoteParticipantsWritableSignal: WritableSignal<ParticipantModel[]> = signal<ParticipantModel[]>([]);\n\n\tprivate localParticipant: ParticipantModel | undefined;\n\tprivate lastLocalParticipantSnapshot: ParticipantModel | undefined;\n\tprivate remoteParticipants: ParticipantModel[] = [];\n\tprivate log: ILogger;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate globalService: GlobalConfigService,\n\t\tprivate directiveService: OpenViduComponentsConfigService,\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate storageSrv: StorageService,\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate e2eeService: E2eeService\n\t) {\n\t\tthis.log = this.loggerSrv.get('ParticipantService');\n\n\t\t// Expose readonly signals\n\t\tthis.localParticipantSignal = this.localParticipantWritableSignal.asReadonly();\n\t\tthis.remoteParticipantsSignal = this.remoteParticipantsWritableSignal.asReadonly();\n\n\t\t// Create Observables from signals for backward compatibility\n\t\tthis.localParticipant$ = toObservable(this.localParticipantWritableSignal);\n\t\tthis.remoteParticipants$ = toObservable(this.remoteParticipantsWritableSignal);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tclear(): void {\n\t\tthis.localParticipant = undefined;\n\t\tthis.lastLocalParticipantSnapshot = undefined;\n\t\tthis.remoteParticipants = [];\n\t\tthis.localParticipantWritableSignal.set(undefined);\n\t\tthis.remoteParticipantsWritableSignal.set([]);\n\t}\n\n\t/**\n\t * @internal\n\t * Setting up the local participant object.\n\t * @param participant\n\t */\n\tsetLocalParticipant(participant: LocalParticipant) {\n\t\tconst room = this.openviduService.getRoom();\n\t\tthis.localParticipant = this.newParticipant({ participant, room });\n\t}\n\n\t/**\n\t * Returns the local participant object.\n\t *\n\t * @deprecated Please prefer `localParticipantSignal()` for reactive updates and `localParticipant$` when using RxJS.\n\t */\n\tgetLocalParticipant(): ParticipantModel | undefined {\n\t\treturn this.localParticipant;\n\t}\n\n\t/**\n\t * Connects to the room and publishes the local tracks.\n\t * @internal\n\t */\n\tasync connect(): Promise<void> {\n\t\tlet isCameraEnabled: boolean = this.isMyCameraEnabled();\n\t\tlet isMicrophoneEnabled: boolean = this.isMyMicrophoneEnabled();\n\t\tlet prejoinTracks = this.openviduService.getLocalTracks();\n\n\t\tif (prejoinTracks.length === 0 && (isCameraEnabled || isMicrophoneEnabled)) {\n\t\t\tprejoinTracks = await this.openviduService.createLocalTracks(isCameraEnabled, isMicrophoneEnabled);\n\t\t}\n\n\t\tawait this.openviduService.connectRoom();\n\t\tthis.setLocalParticipant(this.openviduService.getRoom().localParticipant);\n\n\t\tconst videoTrack = prejoinTracks.find((track) => track.kind === Track.Kind.Video);\n\t\tconst audioTrack = prejoinTracks.find((track) => track.kind === Track.Kind.Audio);\n\n\t\tconst promises: Promise<LocalTrackPublication>[] = [];\n\t\tif (this.localParticipant && videoTrack) {\n\t\t\tpromises.push(this.localParticipant.publishTrack(videoTrack));\n\t\t}\n\t\tif (this.localParticipant && audioTrack) {\n\t\t\tpromises.push(this.localParticipant?.publishTrack(audioTrack));\n\t\t}\n\n\t\tawait Promise.all(promises);\n\t\tthis.updateLocalParticipant();\n\t\t// if(!isCameraEnabled) await this.setCameraEnabled(isCameraEnabled);\n\t\t// if(!isMicrophoneEnabled) await this.setMicrophoneEnabled(isMicrophoneEnabled);\n\t\t// Once the Room is created, the temporary tracks are not longer needed.\n\t\tthis.log.d('Connected to room', this.openviduService.getRoom());\n\t\tthis.openviduService.getRoom().remoteParticipants.forEach((p) => {\n\t\t\tthis.addRemoteParticipant(p);\n\t\t});\n\t}\n\n\t/**\n\t * Publishes a new data payload to the room. Data will be forwarded to each participant in the room if the destination field in publishOptions is empty.\n\t * @param data\n\t * @param {DataPublishOptions} publishOptions [DataPublishOptions](https://docs.livekit.io/client-sdk-js/types/DataPublishOptions.html)\n\t */\n\tpublishData(data: Uint8Array, publishOptions: DataPublishOptions): Promise<void> {\n\t\tif (this.localParticipant) {\n\t\t\treturn this.localParticipant.publishData(data, publishOptions);\n\t\t}\n\t\treturn Promise.reject('Local participant not found');\n\t}\n\n\t/**\n\t * Switches the active camera track used in this room to the given device id.\n\t * @param deviceId\n\t */\n\tasync switchCamera(deviceId: string): Promise<void> {\n\t\tif (this.openviduService.isRoomConnected()) {\n\t\t\tawait this.localParticipant?.switchCamera(deviceId);\n\t\t} else {\n\t\t\tawait this.openviduService.switchCamera(deviceId);\n\t\t}\n\t\t// this.updateLocalParticipant();\n\t}\n\n\t/**\n\t * Switches the active microphone track used in this room to the given device id.\n\t * @param deviceId\n\t */\n\tasync switchMicrophone(deviceId: string): Promise<void> {\n\t\tif (this.openviduService.isRoomConnected()) {\n\t\t\tawait this.localParticipant?.switchMicrophone(deviceId);\n\t\t} else {\n\t\t\tawait this.openviduService.switchMicrophone(deviceId);\n\t\t}\n\t\t// this.updateLocalParticipant();\n\t}\n\n\t/**\n\t * Switches the active screen share track showing a native browser dialog to select a screen or window.\n\t */\n\tasync switchScreenShare(): Promise<void> {\n\t\tif (!this.localParticipant) {\n\t\t\tthis.log.e('Local participant is undefined when switching screenshare');\n\t\t\treturn;\n\t\t}\n\n\t\t// Chrome / Safari: seamless replaceTrack keeps the same publication SID.\n\t\tconst options = this.getScreenCaptureOptions();\n\t\tconst [newTrack] = await this.localParticipant.createScreenTracks(options);\n\t\tif (newTrack) {\n\t\t\tnewTrack.addListener('ended', async () => {\n\t\t\t\tthis.log.d('Clicked native stop button. Stopping screen sharing');\n\t\t\t\tawait this.setScreenShareEnabled(false);\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tawait this.localParticipant.switchScreenshare(newTrack);\n\t\t\t} catch (error) {\n\t\t\t\tnewTrack.stop();\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\t// this.updateLocalParticipant();\n\t}\n\n\t/**\n\t * Sets the local participant camera enabled or disabled.\n\t * @param enabled\n\t */\n\tasync setCameraEnabled(enabled: boolean): Promise<void> {\n\t\tif (this.openviduService.isRoomConnected()) {\n\t\t\tconst storageDevice = this.storageSrv.getVideoDevice();\n\t\t\tlet options: VideoCaptureOptions | undefined;\n\t\t\tif (storageDevice) {\n\t\t\t\toptions = {\n\t\t\t\t\tdeviceId: storageDevice.device,\n\t\t\t\t\tfacingMode: 'user',\n\t\t\t\t\tresolution: VideoPresets.h720.resolution\n\t\t\t\t};\n\t\t\t}\n\t\t\tawait this.localParticipant?.setCameraEnabled(enabled, options);\n\t\t\tthis.updateLocalParticipant();\n\t\t} else {\n\t\t\tawait this.openviduService.setVideoTrackEnabled(enabled);\n\t\t}\n\t}\n\n\t/**\n\t * Sets the local participant microphone enabled or disabled.\n\t * @param enabled\n\t */\n\tasync setMicrophoneEnabled(enabled: boolean): Promise<void> {\n\t\tif (this.openviduService.isRoomConnected()) {\n\t\t\tconst storageDevice = this.storageSrv.getAudioDevice();\n\t\t\tlet options: AudioCaptureOptions | undefined;\n\t\t\tif (storageDevice) {\n\t\t\t\toptions = {\n\t\t\t\t\tdeviceId: storageDevice.device\n\t\t\t\t};\n\t\t\t}\n\t\t\tawait this.localParticipant?.setMicrophoneEnabled(enabled, options);\n\t\t\tthis.updateLocalParticipant();\n\t\t} else {\n\t\t\tthis.openviduService.setAudioTrackEnabled(enabled);\n\t\t}\n\t}\n\n\t/**\n\t * Share or unshare the local participant screen.\n\t * @param enabled: true to share the screen, false to unshare it\n\t *\n\t */\n\tasync setScreenShareEnabled(enabled: boolean): Promise<void> {\n\t\tconst options = this.getScreenCaptureOptions();\n\t\tconst track = await this.localParticipant?.setScreenShareEnabled(enabled, options);\n\t\tif (enabled && track) {\n\t\t\t// Set all videos to normal size when a local screen is shared\n\t\t\tthis.resetRemoteStreamsToNormalSize();\n\t\t\tthis.resetMyStreamsToNormalSize();\n\t\t\tthis.localParticipant?.toggleVideoPinned(track.trackSid);\n\t\t\tthis.localParticipant?.setScreenTrackPublicationDate(track.trackSid, new Date().getTime());\n\n\t\t\ttrack?.addListener('ended', async () => {\n\t\t\t\tthis.log.d('Clicked native stop button. Stopping screen sharing');\n\t\t\t\tawait this.setScreenShareEnabled(false);\n\t\t\t});\n\t\t} else if (!enabled && track) {\n\t\t\t// Enlarge the last screen shared when a local screen is stopped\n\t\t\tthis.localParticipant?.setScreenTrackPublicationDate(track.trackSid, -1);\n\t\t\tthis.resetRemoteStreamsToNormalSize();\n\t\t\tthis.resetMyStreamsToNormalSize();\n\t\t\tthis.setLastScreenPinned();\n\t\t}\n\t\tthis.updateLocalParticipant();\n\t}\n\n\t/**\n\t * @internal\n\t * As updating name requires that the participant has the `canUpdateOwnMetadata` to true in server side, which is a little bit insecure,\n\t * we decided to not allow this feature for now.\n\t */\n\t// setMyName(name: string) {\n\t// \tif (!this.localParticipant) return;\n\t// \tthis.localParticipant.setName(name);\n\t// \tthis.updateLocalParticipant();\n\t// }\n\n\t/**\n\t * Sets as speaking to all participants given in the array.\n\t * @param speakers\n\t * @internal\n\t */\n\tsetSpeaking(speakers: Participant[]) {\n\t\t// Set all participants' isSpeaking property to false\n\t\tthis.localParticipant?.setSpeaking(false);\n\t\tthis.remoteParticipants.forEach((participant) => participant.setSpeaking(false));\n\t\tspeakers.forEach((s) => {\n\t\t\tif (s.isLocal) {\n\t\t\t\tthis.localParticipant?.setSpeaking(true);\n\t\t\t} else {\n\t\t\t\tconst participant = this.remoteParticipants.find((p) => p.sid === s.sid);\n\t\t\t\tparticipant?.setSpeaking(true);\n\t\t\t\tthis.updateRemoteParticipants();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Sets the encryption error state for a participant.\n\t * This is called when a participant cannot decrypt video streams due to an incorrect encryption key.\n\t * @param participantSid - The SID of the participant with the encryption error\n\t * @param hasError - Whether the participant has an encryption error\n\t * @internal\n\t */\n\tsetEncryptionError(participantSid: string, hasError: boolean) {\n\t\tif (this.localParticipant?.sid === participantSid) {\n\t\t\tthis.localParticipant.setEncryptionError(hasError);\n\t\t\tthis.updateLocalParticipant();\n\t\t} else {\n\t\t\tconst participant = this.remoteParticipants.find((p) => p.sid === participantSid);\n\t\t\tif (participant) {\n\t\t\t\tparticipant.setEncryptionError(hasError);\n\t\t\t\tthis.updateRemoteParticipants();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns the local participant name.\n\t */\n\tgetMyName(): string | undefined {\n\t\treturn this.localParticipant?.name;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\ttoggleMyVideoPinned(sid: string | undefined) {\n\t\tif (sid && this.localParticipant) this.localParticipant.toggleVideoPinned(sid);\n\t\tthis.updateLocalParticipant();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\ttoggleMyVideoMinimized(sid: string | undefined) {\n\t\tif (sid && this.localParticipant) this.localParticipant.toggleVideoMinimized(sid);\n\t\tthis.updateLocalParticipant();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tresetMyStreamsToNormalSize() {\n\t\tthis.localParticipant?.setAllVideoPinned(false);\n\t\t// \tthis.updateLocalParticipant();\n\t}\n\n\t/**\n\t * Returns if the local participant camera is enabled.\n\t */\n\tisMyCameraEnabled(): boolean {\n\t\tif (this.openviduService.isRoomConnected() && this.localParticipant) {\n\t\t\treturn this.localParticipant.isCameraEnabled;\n\t\t} else {\n\t\t\tconst directiveCameraEnabled = this.directiveService.isVideoEnabled();\n\n\t\t\tif (!directiveCameraEnabled) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.openviduService.isVideoTrackEnabled() && this.storageSrv.isCameraEnabled();\n\t\t}\n\t}\n\n\t/**\n\t * Returns if the local participant microphone is enabled.\n\t */\n\tisMyMicrophoneEnabled(): boolean {\n\t\tif (this.openviduService.isRoomConnected() && this.localParticipant) {\n\t\t\treturn this.localParticipant.isMicrophoneEnabled;\n\t\t} else {\n\t\t\tconst directiveMicropgoneEnabled = this.directiveService.isAudioEnabled();\n\n\t\t\tif (!directiveMicropgoneEnabled) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.openviduService.isAudioTrackEnabled() && this.storageSrv.isMicrophoneEnabled();\n\t\t}\n\t}\n\n\t/**\n\t * Returns if the local participant screen is enabled.\n\t */\n\tisMyScreenShareEnabled(): boolean {\n\t\treturn this.localParticipant?.isScreenShareEnabled || false;\n\t}\n\n\t/**\n\t * Forces to update the local participant object and fire a new `localParticipant$` Observable event.\n\t */\n\tupdateLocalParticipant() {\n\t\tconst localParticipantFromSignal = this.localParticipantWritableSignal();\n\n\t\t// Backward compatibility: if the consumer mutated the last emitted snapshot and\n\t\t// then calls updateLocalParticipant(), keep the internal source of truth in sync.\n\t\t// Only sync when the emitted snapshot actually diverged after emission; otherwise,\n\t\t// a stale observable/signal snapshot would overwrite newer canonical state.\n\t\tif (\n\t\t\tthis.localParticipant &&\n\t\t\tlocalParticipantFromSignal &&\n\t\t\tthis.lastLocalParticipantSnapshot &&\n\t\t\tlocalParticipantFromSignal !== this.localParticipant &&\n\t\t\tlocalParticipantFromSignal.sid === this.localParticipant.sid &&\n\t\t\tthis.hasParticipantSnapshotMutations(localParticipantFromSignal, this.lastLocalParticipantSnapshot)\n\t\t) {\n\t\t\tObject.assign(this.localParticipant, localParticipantFromSignal);\n\t\t}\n\n\t\t// Update Signal - create new reference to trigger reactivity\n\t\t// The Observable will automatically emit via toObservable()\n\t\tif (this.localParticipant) {\n\t\t\tconst updatedParticipant = this.cloneParticipant(this.localParticipant);\n\t\t\tthis.localParticipantWritableSignal.set(updatedParticipant);\n\t\t\tthis.lastLocalParticipantSnapshot = this.cloneParticipant(updatedParticipant);\n\t\t} else {\n\t\t\tthis.localParticipantWritableSignal.set(undefined);\n\t\t\tthis.lastLocalParticipantSnapshot = undefined;\n\t\t}\n\t}\n\n\tprivate hasParticipantSnapshotMutations(current: ParticipantModel, previous: ParticipantModel): boolean {\n\t\tconst currentState = current as unknown as Record<string, unknown>;\n\t\tconst previousState = previous as unknown as Record<string, unknown>;\n\t\tconst keys = new Set([...Object.keys(currentState), ...Object.keys(previousState)]);\n\n\t\tfor (const key of keys) {\n\t\t\tif (!Object.is(currentState[key], previousState[key])) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate cloneParticipant<T extends ParticipantModel>(participant: T): T {\n\t\treturn Object.assign(Object.create(Object.getPrototypeOf(participant)), {\n\t\t\t...participant\n\t\t});\n\t}\n\n\t/**\n\t * Sets the last screen element as pinned\n\t * @internal\n\t */\n\tsetLastScreenPinned() {\n\t\tif (!this.localParticipant?.isScreenShareEnabled && !this.someRemoteIsSharingScreen()) {\n\t\t\treturn; // Exit early if neither local nor remote participants are sharing screen\n\t\t}\n\t\tlet localCreatedAt = -Infinity;\n\t\tlet localTrackSid = '';\n\t\tif (this.localParticipant?.isScreenShareEnabled) {\n\t\t\tlocalCreatedAt = Math.max(...this.localParticipant.screenTrackPublicationDate.values());\n\t\t\tthis.localParticipant.screenTrackPublicationDate.forEach((value, key) => {\n\t\t\t\tif (value === localCreatedAt) {\n\t\t\t\t\tlocalTrackSid = key;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tlet remoteCreatedAt = -Infinity;\n\t\tlet remoteTrackSid = '';\n\t\tif (this.someRemoteIsSharingScreen()) {\n\t\t\tconst lastRemoteParticipant = this.remoteParticipants.reduce((prev, current) => {\n\t\t\t\tconst prevMax = Math.max(...prev.screenTrackPublicationDate.values());\n\t\t\t\tconst currentMax = Math.max(...current.screenTrackPublicationDate.values());\n\t\t\t\treturn prevMax > currentMax ? prev : current;\n\t\t\t});\n\t\t\tremoteCreatedAt = Math.max(...lastRemoteParticipant.screenTrackPublicationDate.values());\n\t\t\tlastRemoteParticipant.screenTrackPublicationDate.forEach((value, key) => {\n\t\t\t\tif (value === remoteCreatedAt) {\n\t\t\t\t\tremoteTrackSid = key;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (remoteCreatedAt > localCreatedAt) {\n\t\t\tthis.toggleRemoteVideoPinned(remoteTrackSid);\n\t\t} else {\n\t\t\tthis.toggleMyVideoPinned(localTrackSid);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the participant with the given identity.\n\t * @param identity\n\t * @returns\n\t */\n\tgetParticipantByIdentity(identity: string): ParticipantModel | undefined {\n\t\tif (this.localParticipant?.identity === identity) {\n\t\t\treturn this.localParticipant;\n\t\t}\n\t\treturn this.remoteParticipants.find((p) => p.identity === identity);\n\t}\n\n\t/* ------------------------------ Remote Participants ------------------------------ */\n\n\t/**\n\t * Returns all remote participants in the room.\n\t *\n\t * @deprecated Please prefer `remoteParticipantsSignal()` for automatic reactive updates or `remoteParticipants$` when using Observables.\n\t */\n\tgetRemoteParticipants(): ParticipantModel[] {\n\t\treturn this.remoteParticipants;\n\t}\n\n\t/**\n\t * Returns the remote participant with the given sid.\n\t * @param sid\n\t */\n\tgetRemoteParticipantBySid(sid: string): ParticipantModel | undefined {\n\t\treturn this.remoteParticipants.find((p) => p.sid === sid);\n\t}\n\n\t/**\n\t * Force to update the remote participants object and fire a new `remoteParticipants$` Observable event.\n\t */\n\tupdateRemoteParticipants() {\n\t\t// Update Signal - create new array reference to trigger reactivity\n\t\t// The Observable will automatically emit via toObservable()\n\t\tthis.remoteParticipantsWritableSignal.set([...this.remoteParticipants]);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\taddRemoteParticipant(participant: RemoteParticipant) {\n\t\tconst index = this.remoteParticipants.findIndex((p) => p.sid === participant.sid);\n\t\tif (index >= 0) {\n\t\t\tconst remoteParticipant = this.remoteParticipants[index];\n\t\t\tconst pp: ParticipantProperties = remoteParticipant.getProperties();\n\t\t\tpp.participant = participant;\n\t\t\tthis.remoteParticipants[index] = this.newParticipant(pp);\n\t\t} else {\n\t\t\tthis.remoteParticipants.push(this.newParticipant({ participant }));\n\t\t}\n\t\tthis.updateRemoteParticipants();\n\t}\n\n\t/**\n\t * Removes participant track from the remote participant object.\n\t * @param participant\n\t * @param trackSid\n\t * @internal\n\t */\n\tremoveRemoteParticipantTrack(participant: RemoteParticipant, trackSid: string) {\n\t\tconst index = this.remoteParticipants.findIndex((p) => p.sid === participant.sid);\n\t\tif (index >= 0) {\n\t\t\tconst track = this.remoteParticipants[index].tracks.find((t) => t.trackSid === trackSid);\n\t\t\ttrack?.track?.stop();\n\t\t\ttrack?.track?.detach();\n\t\t\tconst pp: ParticipantProperties = this.remoteParticipants[index].getProperties();\n\t\t\tpp.participant = participant;\n\t\t\tthis.remoteParticipants[index] = this.newParticipant(pp);\n\t\t\tthis.updateRemoteParticipants();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tremoveRemoteParticipant(sid: string) {\n\t\tconst index = this.remoteParticipants.findIndex((p) => p.sid === sid);\n\t\tif (index !== -1) {\n\t\t\tthis.remoteParticipants.splice(index, 1);\n\t\t\tthis.updateRemoteParticipants();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tresetRemoteStreamsToNormalSize() {\n\t\tthis.remoteParticipants.forEach((participant) => participant.setAllVideoPinned(false));\n\t\t// this.updateRemoteParticipants();\n\t}\n\n\t/**\n\t * Set the screen track publication date of a remote participant with the aim of taking control of the last screen published\n\t * @param participantSid\n\t * @param trackSid\n\t * @param createdAt\n\t * @internal\n\t */\n\tsetScreenTrackPublicationDate(participantSid: string, trackSid: string, createdAt: number) {\n\t\tconst participant = this.remoteParticipants.find((p) => p.sid === participantSid);\n\t\tif (participant) {\n\t\t\tparticipant.setScreenTrackPublicationDate(trackSid, createdAt);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsomeRemoteIsSharingScreen(): boolean {\n\t\treturn this.remoteParticipants.some((p) => p.isScreenShareEnabled);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\ttoggleRemoteVideoPinned(sid: string | undefined) {\n\t\tif (sid) {\n\t\t\tconst participant = this.remoteParticipants.find((p) => p.tracks.some((track) => track.trackSid === sid));\n\t\t\tif (participant) {\n\t\t\t\tparticipant.toggleVideoPinned(sid);\n\t\t\t}\n\t\t\tthis.updateRemoteParticipants();\n\t\t}\n\t}\n\n\t/**\n\t * Sets the remote participant video track element muted or unmuted .\n\t * @internal\n\t */\n\tsetRemoteMutedForcibly(sid: string, value: boolean) {\n\t\tconst p = this.getRemoteParticipantBySid(sid);\n\t\tif (p) {\n\t\t\tp.setMutedForcibly(value);\n\t\t\tthis.updateRemoteParticipants();\n\t\t}\n\t}\n\n\tprivate newParticipant(props: ParticipantProperties): ParticipantModel {\n\t\tlet participant: ParticipantModel;\n\t\tif (this.globalService.hasParticipantFactory()) {\n\t\t\tparticipant = this.globalService.getParticipantFactory().apply(this, [props]);\n\t\t} else {\n\t\t\tparticipant = new ParticipantModel(props);\n\t\t}\n\n\t\t// Decrypt participant name asynchronously if E2EE is enabled\n\t\tthis.decryptParticipantName(participant);\n\n\t\treturn participant;\n\t}\n\n\t/**\n\t * Decrypts the participant name if E2EE is enabled.\n\t * Updates the participant model asynchronously.\n\t * @param participant - The participant model to decrypt the name for\n\t * @private\n\t */\n\tprivate async decryptParticipantName(participant: ParticipantModel): Promise<void> {\n\t\tconst originalName = participant.name;\n\t\tif (!originalName) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst decryptedName = await this.e2eeService.decryptOrMask(originalName, participant.identity);\n\t\t\tparticipant.setDecryptedName(decryptedName);\n\n\t\t\t// Update observables to reflect the decrypted name\n\t\t\tif (participant.isLocal) {\n\t\t\t\tthis.updateLocalParticipant();\n\t\t\t} else {\n\t\t\t\tthis.updateRemoteParticipants();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.w('Failed to decrypt participant name:', error);\n\t\t}\n\t}\n\n\tprivate getScreenCaptureOptions(): ScreenShareCaptureOptions {\n\t\treturn {\n\t\t\taudio: true,\n\t\t\tvideo: {\n\t\t\t\tdisplaySurface: 'browser' // Set browser tab as default options\n\t\t\t},\n\t\t\tsystemAudio: 'include', // Include system audio as an option\n\t\t\tresolution: VideoPresets.h1080.resolution,\n\t\t\tcontentHint: 'text', // Optimized for detailed content, adjust based on use case\n\t\t\tsuppressLocalAudioPlayback: true, // Prevent echo by not playing local audio\n\t\t\tselfBrowserSurface: 'exclude', // Avoid self capture to prevent mirror effect\n\t\t\tsurfaceSwitching: 'include', // Allow users to switch shared tab dynamically\n\t\t\tpreferCurrentTab: false // Do not force current tab to be selected\n\t\t};\n\t}\n}\n","import { Injectable, TemplateRef } from '@angular/core';\nimport {\n\tLayoutAdditionalElementsDirective,\n\tLeaveButtonDirective,\n\tParticipantPanelAfterLocalParticipantDirective,\n\tPreJoinDirective,\n\tSettingsPanelGeneralAdditionalElementsDirective,\n\tToolbarMoreOptionsAdditionalMenuItemsDirective\n} from '../../directives/template/internals.directive';\nimport {\n\tActivitiesPanelDirective,\n\tAdditionalPanelsDirective,\n\tChatPanelDirective,\n\tLayoutDirective,\n\tPanelDirective,\n\tParticipantPanelItemDirective,\n\tParticipantPanelItemElementsDirective,\n\tParticipantsPanelDirective,\n\tStreamDirective,\n\tToolbarAdditionalButtonsDirective,\n\tToolbarAdditionalPanelButtonsDirective,\n\tToolbarDirective\n} from '../../directives/template/openvidu-components-angular.directive';\nimport { ILogger } from '../../models/logger.model';\nimport { LoggerService } from '../logger/logger.service';\n\n/**\n * Configuration object for all templates in the videoconference component\n */\nexport interface TemplateConfiguration {\n\t// Toolbar templates\n\ttoolbarTemplate: TemplateRef<any>;\n\ttoolbarAdditionalButtonsTemplate?: TemplateRef<any>;\n\ttoolbarAdditionalPanelButtonsTemplate?: TemplateRef<any>;\n\ttoolbarLeaveButtonTemplate?: TemplateRef<any>;\n\n\t// Panel templates\n\tpanelTemplate: TemplateRef<any>;\n\tchatPanelTemplate: TemplateRef<any>;\n\tparticipantsPanelTemplate: TemplateRef<any>;\n\tactivitiesPanelTemplate: TemplateRef<any>;\n\tadditionalPanelsTemplate?: TemplateRef<any>;\n\n\t// Participant templates\n\tparticipantPanelAfterLocalParticipantTemplate?: TemplateRef<any>;\n\tparticipantPanelItemTemplate: TemplateRef<any>;\n\tparticipantPanelItemElementsTemplate?: TemplateRef<any>;\n\n\t// Layout templates\n\tlayoutTemplate: TemplateRef<any>;\n\tstreamTemplate: TemplateRef<any>;\n\tlayoutAdditionalElementsTemplate?: TemplateRef<any>;\n\n\t// Settings panel templates\n\tsettingsPanelGeneralAdditionalElementsTemplate?: TemplateRef<any>;\n\n\t// Toolbar templates\n\ttoolbarMoreOptionsAdditionalMenuItemsTemplate?: TemplateRef<any>;\n\n\t// PreJoin template\n\tpreJoinTemplate?: TemplateRef<any>;\n}\n\n/**\n * Configuration object for panel component templates\n */\nexport interface PanelTemplateConfiguration {\n\tparticipantsPanelTemplate?: TemplateRef<any>;\n\tchatPanelTemplate?: TemplateRef<any>;\n\tactivitiesPanelTemplate?: TemplateRef<any>;\n\tadditionalPanelsTemplate?: TemplateRef<any>;\n\tbackgroundEffectsPanelTemplate?: TemplateRef<any>;\n\tsettingsPanelTemplate?: TemplateRef<any>;\n}\n\n/**\n * Configuration object for toolbar component templates\n */\nexport interface ToolbarTemplateConfiguration {\n\ttoolbarAdditionalButtonsTemplate?: TemplateRef<any>;\n\ttoolbarAdditionalPanelButtonsTemplate?: TemplateRef<any>;\n\ttoolbarLeaveButtonTemplate?: TemplateRef<any>;\n\ttoolbarMoreOptionsAdditionalMenuItemsTemplate?: TemplateRef<any>;\n}\n\n/**\n * Configuration object for layout component templates\n */\nexport interface LayoutTemplateConfiguration {\n\tlayoutStreamTemplate?: TemplateRef<any>;\n\tlayoutAdditionalElementsTemplate?: TemplateRef<any>;\n\tlayoutAdditionalElementsSlot?: 'top' | 'bottom' | 'default';\n}\n\n/**\n * Configuration object for participants panel component templates\n */\nexport interface ParticipantsPanelTemplateConfiguration {\n\tparticipantPanelItemTemplate?: TemplateRef<any>;\n\tparticipantPanelAfterLocalParticipantTemplate?: TemplateRef<any>;\n}\n\n/**\n * Configuration object for participant panel item component templates\n */\nexport interface ParticipantPanelItemTemplateConfiguration {\n\tparticipantPanelItemElementsTemplate?: TemplateRef<any>;\n}\n\n/**\n * Configuration object for session component templates\n */\nexport interface SessionTemplateConfiguration {\n\ttoolbarTemplate?: TemplateRef<any>;\n\tpanelTemplate?: TemplateRef<any>;\n\tlayoutTemplate?: TemplateRef<any>;\n}\n\n/**\n * External directives provided by the consumer\n */\nexport interface ExternalDirectives {\n\ttoolbar?: ToolbarDirective;\n\ttoolbarAdditionalButtons?: ToolbarAdditionalButtonsDirective;\n\ttoolbarAdditionalPanelButtons?: ToolbarAdditionalPanelButtonsDirective;\n\ttoolbarLeaveButton?: LeaveButtonDirective;\n\tadditionalPanels?: AdditionalPanelsDirective;\n\tpanel?: PanelDirective;\n\tchatPanel?: ChatPanelDirective;\n\tactivitiesPanel?: ActivitiesPanelDirective;\n\tparticipantsPanel?: ParticipantsPanelDirective;\n\tparticipantPanelAfterLocalParticipant?: ParticipantPanelAfterLocalParticipantDirective;\n\tparticipantPanelItem?: ParticipantPanelItemDirective;\n\tparticipantPanelItemElements?: ParticipantPanelItemElementsDirective;\n\tlayout?: LayoutDirective;\n\tstream?: StreamDirective;\n\tpreJoin?: PreJoinDirective;\n\tlayoutAdditionalElements?: LayoutAdditionalElementsDirective;\n\tsettingsPanelGeneralAdditionalElements?: SettingsPanelGeneralAdditionalElementsDirective;\n\ttoolbarMoreOptionsAdditionalMenuItems?: ToolbarMoreOptionsAdditionalMenuItemsDirective;\n}\n\n/**\n * Default templates provided by the component\n */\nexport interface DefaultTemplates {\n\ttoolbar: TemplateRef<any>;\n\tpanel: TemplateRef<any>;\n\tchatPanel: TemplateRef<any>;\n\tparticipantsPanel: TemplateRef<any>;\n\tactivitiesPanel: TemplateRef<any>;\n\tparticipantPanelItem: TemplateRef<any>;\n\tlayout: TemplateRef<any>;\n\tstream: TemplateRef<any>;\n}\n\n/**\n * Service responsible for managing and configuring templates for the videoconference component.\n * This service centralizes all template setup logic, making the main component cleaner and more maintainable.\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class TemplateManagerService {\n\tprivate log: ILogger;\n\n\tconstructor(private loggerSrv: LoggerService) {\n\t\tthis.log = this.loggerSrv.get('TemplateManagerService');\n\t}\n\n\t/**\n\t * Sets up all templates based on external directives and default templates\n\t */\n\tsetupTemplates(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateConfiguration {\n\t\tthis.log.v('Setting up templates...');\n\n\t\tconst config: TemplateConfiguration = {\n\t\t\ttoolbarTemplate: this.setupToolbarTemplate(externalDirectives, defaultTemplates),\n\t\t\tpanelTemplate: this.setupPanelTemplate(externalDirectives, defaultTemplates),\n\t\t\tlayoutTemplate: this.setupLayoutTemplate(externalDirectives, defaultTemplates),\n\t\t\tpreJoinTemplate: this.setupPreJoinTemplate(externalDirectives),\n\n\t\t\t// Individual templates\n\t\t\tchatPanelTemplate: this.setupChatPanelTemplate(externalDirectives, defaultTemplates),\n\t\t\tparticipantsPanelTemplate: this.setupParticipantsPanelTemplate(externalDirectives, defaultTemplates),\n\t\t\tactivitiesPanelTemplate: this.setupActivitiesPanelTemplate(externalDirectives, defaultTemplates),\n\t\t\tparticipantPanelItemTemplate: this.setupParticipantPanelItemTemplate(externalDirectives, defaultTemplates),\n\t\t\tstreamTemplate: this.setupStreamTemplate(externalDirectives, defaultTemplates),\n\t\t\tparticipantPanelAfterLocalParticipantTemplate: this.setupParticipantPanelAfterLocalParticipantTemplate(externalDirectives)\n\t\t};\n\n\t\t// Optional templates\n\t\tif (externalDirectives.toolbarAdditionalButtons) {\n\t\t\tconfig.toolbarAdditionalButtonsTemplate = externalDirectives.toolbarAdditionalButtons.template;\n\t\t\tthis.log.v('Setting EXTERNAL TOOLBAR ADDITIONAL BUTTONS');\n\t\t}\n\n\t\tif (externalDirectives.toolbarLeaveButton) {\n\t\t\tconfig.toolbarLeaveButtonTemplate = externalDirectives.toolbarLeaveButton.template;\n\t\t\tthis.log.v('Setting EXTERNAL TOOLBAR LEAVE BUTTON');\n\t\t}\n\n\t\tif (externalDirectives.toolbarAdditionalPanelButtons) {\n\t\t\tconfig.toolbarAdditionalPanelButtonsTemplate = externalDirectives.toolbarAdditionalPanelButtons.template;\n\t\t\tthis.log.v('Setting EXTERNAL TOOLBAR ADDITIONAL PANEL BUTTONS');\n\t\t}\n\n\t\tif (externalDirectives.additionalPanels) {\n\t\t\tconfig.additionalPanelsTemplate = externalDirectives.additionalPanels.template;\n\t\t\tthis.log.v('Setting EXTERNAL ADDITIONAL PANELS');\n\t\t}\n\n\t\tif (externalDirectives.participantPanelItemElements) {\n\t\t\tconfig.participantPanelItemElementsTemplate = externalDirectives.participantPanelItemElements.template;\n\t\t\tthis.log.v('Setting EXTERNAL PARTICIPANT PANEL ITEM ELEMENTS');\n\t\t}\n\n\t\tif (externalDirectives.layoutAdditionalElements) {\n\t\t\tthis.log.v('Setting EXTERNAL ADDITIONAL LAYOUT ELEMENTS');\n\t\t\tconfig.layoutAdditionalElementsTemplate = externalDirectives.layoutAdditionalElements.template;\n\t\t}\n\n\t\tif (externalDirectives.settingsPanelGeneralAdditionalElements) {\n\t\t\tthis.log.v('Setting EXTERNAL SETTINGS PANEL GENERAL ADDITIONAL ELEMENTS');\n\t\t\tconfig.settingsPanelGeneralAdditionalElementsTemplate = externalDirectives.settingsPanelGeneralAdditionalElements.template;\n\t\t}\n\n\t\tif (externalDirectives.toolbarMoreOptionsAdditionalMenuItems) {\n\t\t\tthis.log.v('Setting EXTERNAL TOOLBAR MORE OPTIONS ADDITIONAL MENU ITEMS');\n\t\t\tconfig.toolbarMoreOptionsAdditionalMenuItemsTemplate = externalDirectives.toolbarMoreOptionsAdditionalMenuItems.template;\n\t\t}\n\n\t\tthis.log.v('Template setup completed', config);\n\t\treturn config;\n\t}\n\n\t/**\n\t * Sets up the participantPanelAfterLocalParticipant template\n\t */\n\tprivate setupParticipantPanelAfterLocalParticipantTemplate(externalDirectives: ExternalDirectives): TemplateRef<any> | undefined {\n\t\tif (externalDirectives.participantPanelAfterLocalParticipant) {\n\t\t\tthis.log.v('Setting EXTERNAL PARTICIPANT PANEL AFTER LOCAL PARTICIPANT');\n\t\t\treturn (externalDirectives.participantPanelAfterLocalParticipant as any).template;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Sets up the toolbar template\n\t */\n\tprivate setupToolbarTemplate(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateRef<any> {\n\t\tif (externalDirectives.toolbar) {\n\t\t\tthis.log.v('Setting EXTERNAL TOOLBAR');\n\t\t\treturn externalDirectives.toolbar.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT TOOLBAR');\n\t\t\treturn defaultTemplates.toolbar;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the panel template\n\t */\n\tprivate setupPanelTemplate(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateRef<any> {\n\t\tif (externalDirectives.panel) {\n\t\t\tthis.log.v('Setting EXTERNAL PANEL');\n\t\t\treturn externalDirectives.panel.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT PANEL');\n\t\t\treturn defaultTemplates.panel;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the layout template\n\t */\n\tprivate setupLayoutTemplate(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateRef<any> {\n\t\tif (externalDirectives.layout) {\n\t\t\tthis.log.v('Setting EXTERNAL LAYOUT');\n\t\t\treturn externalDirectives.layout.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT LAYOUT');\n\t\t\treturn defaultTemplates.layout;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the prejoin template\n\t */\n\tprivate setupPreJoinTemplate(externalDirectives: ExternalDirectives): TemplateRef<any> | undefined {\n\t\tif (externalDirectives.preJoin) {\n\t\t\tthis.log.v('Setting EXTERNAL PREJOIN');\n\t\t\treturn externalDirectives.preJoin.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT PREJOIN (none)');\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the chat panel template\n\t */\n\tprivate setupChatPanelTemplate(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateRef<any> {\n\t\tif (externalDirectives.chatPanel) {\n\t\t\tthis.log.v('Setting EXTERNAL CHAT PANEL');\n\t\t\treturn externalDirectives.chatPanel.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT CHAT PANEL');\n\t\t\treturn defaultTemplates.chatPanel;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the participants panel template\n\t */\n\tprivate setupParticipantsPanelTemplate(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateRef<any> {\n\t\tif (externalDirectives.participantsPanel) {\n\t\t\tthis.log.v('Setting EXTERNAL PARTICIPANTS PANEL');\n\t\t\treturn externalDirectives.participantsPanel.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT PARTICIPANTS PANEL');\n\t\t\treturn defaultTemplates.participantsPanel;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the activities panel template\n\t */\n\tprivate setupActivitiesPanelTemplate(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateRef<any> {\n\t\tif (externalDirectives.activitiesPanel) {\n\t\t\tthis.log.v('Setting EXTERNAL ACTIVITIES PANEL');\n\t\t\treturn externalDirectives.activitiesPanel.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT ACTIVITIES PANEL');\n\t\t\treturn defaultTemplates.activitiesPanel;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the participant panel item template\n\t */\n\tprivate setupParticipantPanelItemTemplate(\n\t\texternalDirectives: ExternalDirectives,\n\t\tdefaultTemplates: DefaultTemplates\n\t): TemplateRef<any> {\n\t\tif (externalDirectives.participantPanelItem) {\n\t\t\tthis.log.v('Setting EXTERNAL PARTICIPANT PANEL ITEM');\n\t\t\treturn externalDirectives.participantPanelItem.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT PARTICIPANT PANEL ITEM');\n\t\t\treturn defaultTemplates.participantPanelItem;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the stream template\n\t */\n\tprivate setupStreamTemplate(externalDirectives: ExternalDirectives, defaultTemplates: DefaultTemplates): TemplateRef<any> {\n\t\tif (externalDirectives.stream) {\n\t\t\tthis.log.v('Setting EXTERNAL STREAM');\n\t\t\treturn externalDirectives.stream.template;\n\t\t} else {\n\t\t\tthis.log.v('Setting DEFAULT STREAM');\n\t\t\treturn defaultTemplates.stream;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up templates for the PanelComponent\n\t */\n\tsetupPanelTemplates(\n\t\texternalParticipantsPanel?: ParticipantsPanelDirective,\n\t\texternalChatPanel?: ChatPanelDirective,\n\t\texternalActivitiesPanel?: ActivitiesPanelDirective,\n\t\texternalAdditionalPanels?: AdditionalPanelsDirective\n\t): PanelTemplateConfiguration {\n\t\tthis.log.v('Setting up panel templates...');\n\n\t\treturn {\n\t\t\tparticipantsPanelTemplate: externalParticipantsPanel?.template,\n\t\t\tchatPanelTemplate: externalChatPanel?.template,\n\t\t\tactivitiesPanelTemplate: externalActivitiesPanel?.template,\n\t\t\tadditionalPanelsTemplate: externalAdditionalPanels?.template\n\t\t};\n\t}\n\n\t/**\n\t * Sets up templates for the ToolbarComponent\n\t */\n\tsetupToolbarTemplates(\n\t\texternalAdditionalButtons?: ToolbarAdditionalButtonsDirective,\n\t\texternalAdditionalPanelButtons?: ToolbarAdditionalPanelButtonsDirective,\n\t\texternalLeaveButton?: LeaveButtonDirective,\n\t\texternalMoreOptionsAdditionalMenuItems?: ToolbarMoreOptionsAdditionalMenuItemsDirective\n\t): ToolbarTemplateConfiguration {\n\t\tthis.log.v('Setting up toolbar templates...');\n\n\t\treturn {\n\t\t\ttoolbarAdditionalButtonsTemplate: externalAdditionalButtons?.template,\n\t\t\ttoolbarAdditionalPanelButtonsTemplate: externalAdditionalPanelButtons?.template,\n\t\t\ttoolbarLeaveButtonTemplate: externalLeaveButton?.template,\n\t\t\ttoolbarMoreOptionsAdditionalMenuItemsTemplate: externalMoreOptionsAdditionalMenuItems?.template\n\t\t};\n\t}\n\n\t/**\n\t * Sets up templates for the LayoutComponent\n\t */\n\tsetupLayoutTemplates(\n\t\texternalStream?: StreamDirective,\n\t\texternalLayoutAdditionalElements?: LayoutAdditionalElementsDirective\n\t): LayoutTemplateConfiguration {\n\t\tthis.log.v('Setting up layout templates...');\n\n\t\treturn {\n\t\t\tlayoutStreamTemplate: externalStream?.template,\n\t\t\tlayoutAdditionalElementsTemplate: externalLayoutAdditionalElements?.template,\n\t\t\tlayoutAdditionalElementsSlot: externalLayoutAdditionalElements?.slot || 'default'\n\t\t};\n\t}\n\n\t/**\n\t * Sets up templates for the ParticipantsPanelComponent\n\t */\n\tsetupParticipantsPanelTemplates(\n\t\texternalParticipantPanelItem?: ParticipantPanelItemDirective,\n\t\tdefaultParticipantPanelItem?: TemplateRef<any>,\n\t\texternalParticipantPanelAfterLocalParticipant?: TemplateRef<any>\n\t): ParticipantsPanelTemplateConfiguration {\n\t\tthis.log.v('Setting up participants panel templates...');\n\n\t\treturn {\n\t\t\tparticipantPanelItemTemplate: externalParticipantPanelItem?.template || defaultParticipantPanelItem,\n\t\t\tparticipantPanelAfterLocalParticipantTemplate: externalParticipantPanelAfterLocalParticipant\n\t\t};\n\t}\n\n\t/**\n\t * Sets up templates for the ParticipantPanelItemComponent\n\t */\n\tsetupParticipantPanelItemTemplates(\n\t\texternalParticipantPanelItemElements?: ParticipantPanelItemElementsDirective\n\t): ParticipantPanelItemTemplateConfiguration {\n\t\tthis.log.v('Setting up participant panel item templates...');\n\n\t\treturn {\n\t\t\tparticipantPanelItemElementsTemplate: externalParticipantPanelItemElements?.template\n\t\t};\n\t}\n\n\t/**\n\t * Sets up templates for the SessionComponent\n\t */\n\tsetupSessionTemplates(\n\t\ttoolbarTemplate?: TemplateRef<any>,\n\t\tpanelTemplate?: TemplateRef<any>,\n\t\tlayoutTemplate?: TemplateRef<any>\n\t): SessionTemplateConfiguration {\n\t\tthis.log.v('Setting up session templates...');\n\n\t\treturn {\n\t\t\ttoolbarTemplate,\n\t\t\tpanelTemplate,\n\t\t\tlayoutTemplate\n\t\t};\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ParticipantTrackPublication, ParticipantModel } from '../models/participant.model';\nimport { TranslateService } from '../services/translate/translate.service';\nimport { Track } from 'livekit-client';\n\n/**\n * The **RemoteParticipantTracksPipe** allows us to get all the tracks from all remote participants.\n * This is used to display the tracks in the videoconference layout.\n * @returns {ParticipantTrackPublication[]} Array of tracks\n */\n@Pipe({ name: 'tracks', standalone: false })\nexport class RemoteParticipantTracksPipe implements PipeTransform {\n\tconstructor() {}\n\n\ttransform(participants: ParticipantModel[]): ParticipantTrackPublication[] {\n\t\treturn participants.map((p) => p.tracks).flat();\n\t}\n}\n\n/**\n * @internal\n */\n@Pipe({ name: 'tracksPublishedTypes', standalone: false })\nexport class TrackPublishedTypesPipe implements PipeTransform {\n\tconstructor(private translateService: TranslateService) {}\n\n\ttransform(participant: ParticipantModel): string {\n\t\tconst trackTypes = participant?.getTracksPublishedTypes() ?? [];\n\t\tconst types: string[] = [];\n\t\ttrackTypes.forEach((source) => {\n\t\t\tif (source === Track.Source.Camera) {\n\t\t\t\ttypes.push(this.translateService.translate('PANEL.PARTICIPANTS.CAMERA'));\n\t\t\t} else if (source === Track.Source.Microphone) {\n\t\t\t\ttypes.push(this.translateService.translate('PANEL.PARTICIPANTS.MICROPHONE'));\n\t\t\t} else if (source === Track.Source.ScreenShare) {\n\t\t\t\ttypes.push(this.translateService.translate('PANEL.PARTICIPANTS.SCREEN'));\n\t\t\t}\n\t\t});\n\t\tif (types.length === 0) {\n\t\t\treturn `(${this.translateService.translate('PANEL.PARTICIPANTS.NO_STREAMS')})`;\n\t\t}\n\t\treturn `(${types.join(', ')})`;\n\t}\n}\n","import { LayoutAdditionalElementsDirective } from '../../directives/template/internals.directive';\n\nimport { CdkDrag } from '@angular/cdk/drag-drop';\nimport {\n\tAfterViewInit,\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tContentChild,\n\tElementRef,\n\tOnDestroy,\n\tOnInit,\n\tTemplateRef,\n\tViewChild,\n\tViewContainerRef\n} from '@angular/core';\nimport { combineLatest, map, Subject, takeUntil } from 'rxjs';\nimport { StreamDirective } from '../../directives/template/openvidu-components-angular.directive';\nimport { ParticipantModel, ParticipantTrackPublication } from '../../models/participant.model';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { GlobalConfigService } from '../../services/config/global-config.service';\nimport { LayoutService } from '../../services/layout/layout.service';\nimport { PanelService } from '../../services/panel/panel.service';\nimport { ParticipantService } from '../../services/participant/participant.service';\nimport { LayoutTemplateConfiguration, TemplateManagerService } from '../../services/template/template-manager.service';\n\n/**\n *\n * The **LayoutComponent** is hosted inside of the {@link VideoconferenceComponent}.\n * It is in charge of displaying the participants streams layout.\n */\n@Component({\n\tselector: 'ov-layout',\n\ttemplateUrl: './layout.component.html',\n\tstyleUrls: ['./layout.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class LayoutComponent implements OnInit, OnDestroy, AfterViewInit {\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('stream', { read: TemplateRef }) streamTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('layoutAdditionalElements', { read: TemplateRef }) layoutAdditionalElementsTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild('layout', { static: false, read: ViewContainerRef }) layoutContainer: ViewContainerRef;\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild(CdkDrag) cdkDrag: CdkDrag;\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild('localLayoutElement', { static: false, read: ElementRef }) localLayoutElement: ElementRef;\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(StreamDirective)\n\tset externalStream(externalStream: StreamDirective) {\n\t\t// This directive will has value only when STREAM component tagget with '*ovStream' directive\n\t\t// is inside of the layout component tagged with '*ovLayout' directive\n\t\tif (externalStream) {\n\t\t\tthis.streamTemplate = externalStream.template;\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(LayoutAdditionalElementsDirective) set externalAdditionalElements(\n\t\texternalAdditionalElements: LayoutAdditionalElementsDirective\n\t) {\n\t\tif (externalAdditionalElements) {\n\t\t\tthis._externalLayoutAdditionalElements = externalAdditionalElements;\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttemplateConfig: LayoutTemplateConfiguration = {};\n\n\tlocalParticipant: ParticipantModel | undefined;\n\tremoteParticipants: ParticipantModel[] = [];\n\t/**\n\t * @ignore\n\t */\n\tcaptionsEnabled = true;\n\n\tprivate _externalStream?: StreamDirective;\n\tprivate _externalLayoutAdditionalElements?: LayoutAdditionalElementsDirective;\n\n\tprivate destroy$ = new Subject<void>();\n\tprivate resizeObserver: ResizeObserver;\n\tprivate resizeTimeout: NodeJS.Timeout;\n\tprivate videoIsAtRight: boolean = false;\n\tprivate lastLayoutWidth: number = 0;\n\tprivate lastLayoutHeight: number = 0;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate layoutService: LayoutService,\n\t\tprivate panelService: PanelService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate globalService: GlobalConfigService,\n\t\tprivate directiveService: OpenViduComponentsConfigService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate templateManagerService: TemplateManagerService\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.setupTemplates();\n\n\t\tthis.subscribeToParticipants();\n\t\tthis.subscribeToCaptions();\n\t}\n\n\tngAfterViewInit() {\n\t\tconsole.log('LayoutComponent.ngAfterViewInit');\n\t\tthis.layoutService.initialize(this.layoutContainer.element.nativeElement);\n\t\tconst rect = this.layoutContainer.element.nativeElement.getBoundingClientRect();\n\t\tthis.lastLayoutWidth = rect.width;\n\t\tthis.lastLayoutHeight = rect.height;\n\t\tthis.listenToResizeLayout();\n\t\tthis.listenToCdkDrag();\n\t}\n\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.localParticipant = undefined;\n\t\tthis.remoteParticipants = [];\n\t\tthis.resizeObserver?.disconnect();\n\t\tthis.layoutService.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttrackParticipantElement(_: number, track: ParticipantTrackPublication) {\n\t\t// This method is used for trackBy in ngFor with the aim of improving performance\n\t\t// https://angular.io/api/core/TrackByFunction\n\t\treturn track;\n\t}\n\n\tprivate setupTemplates() {\n\t\tthis.templateConfig = this.templateManagerService.setupLayoutTemplates(\n\t\t\tthis._externalStream,\n\t\t\tthis._externalLayoutAdditionalElements\n\t\t);\n\n\t\t// Apply templates to component properties for backward compatibility\n\t\tthis.applyTemplateConfiguration();\n\t}\n\n\tprivate applyTemplateConfiguration() {\n\t\tif (this.templateConfig.layoutStreamTemplate) {\n\t\t\tthis.streamTemplate = this.templateConfig.layoutStreamTemplate;\n\t\t}\n\t\tif (this.templateConfig.layoutAdditionalElementsTemplate) {\n\t\t\tthis.layoutAdditionalElementsTemplate = this.templateConfig.layoutAdditionalElementsTemplate;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Updates templates and triggers change detection\n\t */\n\tprivate updateTemplatesAndMarkForCheck(): void {\n\t\tthis.setupTemplates();\n\t\tthis.cd.markForCheck();\n\t}\n\n\tprivate subscribeToCaptions() {\n\t\tthis.layoutService.captionsTogglingObs.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.captionsEnabled = value;\n\t\t\tthis.cd.markForCheck();\n\t\t\tthis.layoutService.update();\n\t\t});\n\t}\n\n\tprivate subscribeToParticipants() {\n\t\tthis.participantService.localParticipant$.pipe(takeUntil(this.destroy$)).subscribe((p) => {\n\t\t\tif (p) {\n\t\t\t\tthis.localParticipant = p;\n\t\t\t\tif (!this.localParticipant?.isMinimized) {\n\t\t\t\t\tthis.videoIsAtRight = false;\n\t\t\t\t}\n\t\t\t\tthis.layoutService.update();\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\n\t\tcombineLatest([this.participantService.remoteParticipants$, this.directiveService.layoutRemoteParticipants$])\n\t\t\t.pipe(\n\t\t\t\tmap(([serviceParticipants, directiveParticipants]) =>\n\t\t\t\t\tdirectiveParticipants !== undefined ? directiveParticipants : serviceParticipants\n\t\t\t\t),\n\t\t\t\ttakeUntil(this.destroy$)\n\t\t\t)\n\t\t\t.subscribe((participants) => {\n\t\t\t\tthis.remoteParticipants = participants;\n\t\t\t\tthis.layoutService.update();\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t});\n\t}\n\n\tprivate listenToResizeLayout() {\n\t\tthis.resizeObserver = new ResizeObserver((entries) => {\n\t\t\tconst { width: parentWidth, height: parentHeight } = entries[0].contentRect;\n\n\t\t\tclearTimeout(this.resizeTimeout);\n\n\t\t\tthis.resizeTimeout = setTimeout(() => {\n\t\t\t\t// Always update layout when container size changes\n\t\t\t\t// This ensures layout recalculates when parent containers change\n\t\t\t\tconst widthDiff = Math.abs(this.lastLayoutWidth - parentWidth);\n\t\t\t\tconst heightDiff = Math.abs(this.lastLayoutHeight - parentHeight);\n\t\t\t\tif (widthDiff > 1 || heightDiff > 1) {\n\t\t\t\t\tthis.layoutService.update();\n\t\t\t\t\tthis.cd.markForCheck();\n\t\t\t\t}\n\t\t\t\t// Handle minimized participant positioning\n\t\t\t\tif (this.localParticipant?.isMinimized) {\n\t\t\t\t\tif (this.panelService.isPanelOpened()) {\n\t\t\t\t\t\tif (this.lastLayoutWidth < parentWidth) {\n\t\t\t\t\t\t\t// Layout is bigger than before. Maybe the settings panel(wider) has been transitioned to another panel.\n\t\t\t\t\t\t\tif (this.videoIsAtRight) {\n\t\t\t\t\t\t\t\tthis.moveStreamToRight(parentWidth);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Layout is smaller than before. Emit resize event to update video position.\n\t\t\t\t\t\t\twindow.dispatchEvent(new Event('resize'));\n\t\t\t\t\t\t\tconst { x, width } = this.cdkDrag.element.nativeElement.getBoundingClientRect();\n\t\t\t\t\t\t\tthis.videoIsAtRight = x + width >= parentWidth;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.videoIsAtRight) {\n\t\t\t\t\t\t\t// Panel is closed and layout has been resized. Video is at right, so move it to right.\n\t\t\t\t\t\t\tthis.moveStreamToRight(parentWidth);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.lastLayoutWidth = parentWidth;\n\t\t\t\tthis.lastLayoutHeight = parentHeight;\n\t\t\t}, 100);\n\t\t});\n\n\t\tthis.resizeObserver.observe(this.layoutContainer.element.nativeElement);\n\t}\n\tprivate moveStreamToRight(parentWidth: number) {\n\t\tconst { y, width: elementWidth } = this.cdkDrag.element.nativeElement.getBoundingClientRect();\n\t\tconst margin = 10;\n\t\tconst newX = parentWidth - elementWidth - margin;\n\t\tthis.cdkDrag.setFreeDragPosition({ x: newX, y });\n\t}\n\n\tprivate listenToCdkDrag() {\n\t\tconst handler = (event) => {\n\t\t\tif (!this.panelService.isPanelOpened()) return;\n\t\t\tconst { x, width } = this.localLayoutElement.nativeElement.getBoundingClientRect();\n\t\t\tconst { width: parentWidth } = this.layoutContainer.element.nativeElement.getBoundingClientRect();\n\t\t\tif (x === 0) {\n\t\t\t\t// Video is at the left\n\t\t\t\tthis.videoIsAtRight = false;\n\t\t\t} else if (x + width >= parentWidth) {\n\t\t\t\t// Video is at the right\n\t\t\t\tthis.videoIsAtRight = true;\n\t\t\t} else {\n\t\t\t\t// Video is in another position\n\t\t\t\tthis.videoIsAtRight = false;\n\t\t\t}\n\t\t};\n\n\t\tthis.cdkDrag.released.pipe(takeUntil(this.destroy$)).subscribe(handler);\n\n\t\tif (this.globalService.isProduction()) return;\n\t\t// Just for allow E2E testing with drag and drop\n\t\tdocument.addEventListener('webcomponentTestingEndedDragAndDropEvent', handler);\n\t\tdocument.addEventListener('webcomponentTestingEndedDragAndDropRightEvent', (event: any) => {\n\t\t\tconst { x, y } = event.detail;\n\t\t\tthis.cdkDrag.setFreeDragPosition({ x, y });\n\t\t});\n\t}\n}\n","<div class=\"container\" [ngClass]=\"{ withCaptions: captionsEnabled, withMargin: localParticipant.isMinimized }\">\n\t<div id=\"layout\" class=\"layout\" #layout>\n\t\t<!-- Top slot: Render elements that should appear at the top -->\n\t\t@if (layoutAdditionalElementsTemplate && templateConfig.layoutAdditionalElementsSlot === 'top') {\n\t\t\t<ng-container *ngTemplateOutlet=\"layoutAdditionalElementsTemplate\"></ng-container>\n\t\t}\n\n\t\t<div\n\t\t\t#localLayoutElement\n\t\t\t*ngFor=\"let track of localParticipant.tracks; trackBy: trackParticipantElement\"\n\t\t\t[ngClass]=\"{\n\t\t\t\tlocal_participant: true,\n\t\t\t\tOV_root: !track.isAudioTrack && !track.isMinimized,\n\t\t\t\tOV_publisher: !track.isAudioTrack && !track.isMinimized,\n\t\t\t\tOV_minimized: track.isMinimized,\n\t\t\t\tOV_big: track.isPinned,\n\t\t\t\tOV_ignored: track.isAudioTrack && !track.participant.onlyHasAudioTracks,\n\t\t\t\tOV_screen: track.isScreenTrack\n\t\t\t}\"\n\t\t\t[id]=\"'participant-' + track.participant.identity\"\n\t\t\tcdkDrag\n\t\t\tcdkDragBoundary=\".layout\"\n\t\t\t[cdkDragDisabled]=\"!track.isMinimized\"\n\t\t\t[cdkDragFreeDragPosition]=\"!track.isMinimized ? { x: 0, y: 0 } : null\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"streamTemplate; context: { $implicit: track }\"></ng-container>\n\t\t</div>\n\n\t\t<!-- Default slot: Render additional layout elements (backward compatibility and default position) -->\n\t\t@if (layoutAdditionalElementsTemplate && (templateConfig.layoutAdditionalElementsSlot === 'default' || !templateConfig.layoutAdditionalElementsSlot)) {\n\t\t\t<ng-container *ngTemplateOutlet=\"layoutAdditionalElementsTemplate\"></ng-container>\n\t\t}\n\n\t\t<div\n\t\t\t*ngFor=\"let track of remoteParticipants | tracks; trackBy: trackParticipantElement\"\n\t\t\tclass=\"remote-participant\"\n\t\t\t[id]=\"'participant-' + track.participant.identity\"\n\t\t\t[ngClass]=\"{\n\t\t\t\tOV_root: !track.isAudioTrack,\n\t\t\t\tOV_publisher: !track.isAudioTrack,\n\t\t\t\tOV_big: track.isPinned,\n\t\t\t\tOV_ignored: track.isAudioTrack && !track.participant.onlyHasAudioTracks,\n\t\t\t\tOV_screen: track.isScreenTrack\n\t\t\t}\"\n\t\t>\n\t\t\t<ng-container *ngTemplateOutlet=\"streamTemplate; context: { $implicit: track }\"></ng-container>\n\t\t</div>\n\n\t\t<!-- Bottom slot: Render elements that should appear at the bottom -->\n\t\t@if (layoutAdditionalElementsTemplate && templateConfig.layoutAdditionalElementsSlot === 'bottom') {\n\t\t\t<ng-container *ngTemplateOutlet=\"layoutAdditionalElementsTemplate\"></ng-container>\n\t\t}\n\t</div>\n\n\t<!-- <ov-captions *ngIf=\"captionsEnabled\" class=\"OV_ignored\"></ov-captions> -->\n</div>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, OnDestroy, Output } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport {\n\tRecordingDeleteRequestedEvent,\n\tRecordingDownloadClickedEvent,\n\tRecordingInfo,\n\tRecordingPlayClickedEvent,\n\tRecordingStartRequestedEvent,\n\tRecordingStatus,\n\tRecordingStatusInfo,\n\tRecordingStopRequestedEvent\n} from '../../../../models/recording.model';\nimport { ActionService } from '../../../../services/action/action.service';\nimport { ParticipantService } from '../../../../services/participant/participant.service';\nimport { RecordingService } from '../../../../services/recording/recording.service';\nimport { OpenViduService } from '../../../../services/openvidu/openvidu.service';\nimport { ILogger } from '../../../../models/logger.model';\nimport { LoggerService } from '../../../../services/logger/logger.service';\nimport { OpenViduComponentsConfigService } from '../../../../services/config/directive-config.service';\n\n/**\n * The **RecordingActivityComponent** is the component that allows showing the recording activity.\n */\n@Component({\n\tselector: 'ov-recording-activity',\n\ttemplateUrl: './recording-activity.component.html',\n\tstyleUrls: ['./recording-activity.component.scss', '../activities-panel.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\n\n// TODO: Allow to add more than one recording type\n// TODO: Allow to choose where the recording is stored (s3, google cloud, etc)\n// TODO: Allow to choose the layout of the recording\nexport class RecordingActivityComponent implements OnInit, OnDestroy {\n\t/**\n\t * @internal\n\t */\n\t@Input() expanded: boolean;\n\n\t/**\n\t * This event is fired when the user clicks on the start recording button.\n\t * It provides the {@link RecordingStartRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStartRequested: EventEmitter<RecordingStartRequestedEvent> = new EventEmitter<RecordingStartRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when stop recording button has been clicked.\n\t * It provides the {@link RecordingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStopRequested: EventEmitter<RecordingStopRequestedEvent> = new EventEmitter<RecordingStopRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when delete recording button has been clicked.\n\t * It provides the {@link RecordingDeleteRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingDeleteRequested: EventEmitter<RecordingDeleteRequestedEvent> = new EventEmitter<RecordingDeleteRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when download recording button has been clicked.\n\t * It provides the {@link RecordingDownloadClickedEvent} payload as event data.\n\t */\n\t@Output() onRecordingDownloadClicked: EventEmitter<RecordingDownloadClickedEvent> = new EventEmitter<RecordingDownloadClickedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when play recording button has been clicked.\n\t * It provides the {@link RecordingPlayClickedEvent} payload as event data.\n\t */\n\t@Output() onRecordingPlayClicked: EventEmitter<RecordingPlayClickedEvent> = new EventEmitter<RecordingPlayClickedEvent>();\n\n\t/**\n\t * @internal\n\t * Provides event notifications that fire when view recordings button has been clicked.\n\t * This event is triggered when the user wants to view all recordings in an external page.\n\t */\n\t@Output() onViewRecordingsClicked: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * @internal\n\t * This event is fired when the user clicks on the view recording button.\n\t * It provides the recording ID as event data.\n\t */\n\t@Output() onViewRecordingClicked: EventEmitter<string> = new EventEmitter<string>();\n\n\t/**\n\t * @internal\n\t */\n\trecordingStatus: RecordingStatus = RecordingStatus.STOPPED;\n\t/**\n\t * @internal\n\t */\n\toldRecordingStatus: RecordingStatus;\n\t/**\n\t * @internal\n\t */\n\tisPanelOpened: boolean = false;\n\n\t/**\n\t * @internal\n\t */\n\trecStatusEnum = RecordingStatus;\n\n\t/**\n\t * @internal\n\t */\n\trecordingAlive: boolean = false;\n\t/**\n\t * @internal\n\t */\n\trecordingList: RecordingInfo[] = [];\n\n\t/**\n\t * @internal\n\t */\n\trecordingError: any;\n\n\t/**\n\t * @internal\n\t */\n\thasRoomTracksPublished: boolean = false;\n\n\t/**\n\t * @internal\n\t */\n\tmouseHovering: boolean = false;\n\n\t/**\n\t * @internal\n\t */\n\tisReadOnlyMode: boolean = false;\n\n\t/**\n\t * @internal\n\t */\n\tviewButtonText: string = 'PANEL.RECORDING.VIEW';\n\n\t/**\n\t * @internal\n\t */\n\tshowStartStopRecordingButton: boolean = true;\n\n\t/**\n\t * @internal\n\t */\n\tshowViewRecordingsButton: boolean = false;\n\n\t/**\n\t * @internal\n\t */\n\tshowRecordingList: boolean = true; // Controls visibility of the recording list in the panel\n\n\t/**\n\t * @internal\n\t */\n\tshowControls: { play?: boolean; download?: boolean; delete?: boolean; externalView?: boolean } = {\n\t\tplay: true,\n\t\tdownload: true,\n\t\tdelete: true,\n\t\texternalView: false\n\t};\n\n\tprivate log: ILogger;\n\tprivate destroy$ = new Subject<void>();\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate recordingService: RecordingService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate actionService: ActionService,\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {\n\t\tthis.log = this.loggerSrv.get('RecordingActivityComponent');\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngOnInit(): void {\n\t\tthis.subscribeToRecordingStatus();\n\t\tthis.subscribeToTracksChanges();\n\t\tthis.subscribeToConfigChanges();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\ttrackByRecordingId(index: number, recording: RecordingInfo): string | undefined {\n\t\treturn recording.id;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsetPanelOpened(value: boolean) {\n\t\tthis.isPanelOpened = value;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tresetStatus() {\n\t\tif (this.oldRecordingStatus === RecordingStatus.STARTING) {\n\t\t\tthis.recordingService.setRecordingStopped();\n\t\t} else if (this.oldRecordingStatus === RecordingStatus.STOPPING) {\n\t\t\tthis.recordingService.setRecordingStarted();\n\t\t} else {\n\t\t\tthis.recordingService.setRecordingStopped();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tstartRecording() {\n\t\tconst payload: RecordingStartRequestedEvent = {\n\t\t\troomName: this.openviduService.getRoomName()\n\t\t};\n\t\tthis.onRecordingStartRequested.emit(payload);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tstopRecording() {\n\t\tconst currentRecording = this.recordingList.find((rec) => rec.status === RecordingStatus.STARTED);\n\t\tconst payload: RecordingStopRequestedEvent = {\n\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\trecordingId: currentRecording?.id\n\t\t};\n\t\tthis.onRecordingStopRequested.emit(payload);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\n\tdeleteRecording(recording: RecordingInfo) {\n\t\tconst succsessCallback = async () => {\n\t\t\tif (!recording.id) {\n\t\t\t\tthrow new Error('Error deleting recording. Recording id is undefined');\n\t\t\t}\n\t\t\tconst payload: RecordingDeleteRequestedEvent = {\n\t\t\t\troomName: recording.roomName,\n\t\t\t\trecordingId: recording.id\n\t\t\t};\n\t\t\tthis.onRecordingDeleteRequested.emit(payload);\n\t\t};\n\t\tthis.actionService.openDeleteRecordingDialog(succsessCallback.bind(this));\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tdownload(recording: RecordingInfo) {\n\t\tif (!recording.filename) {\n\t\t\tthis.log.e('Error downloading recording. Recording filename is undefined');\n\t\t\treturn;\n\t\t}\n\t\tconst payload: RecordingDownloadClickedEvent = {\n\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\trecordingId: recording.filename\n\t\t};\n\t\tthis.onRecordingDownloadClicked.emit(payload);\n\t\tthis.recordingService.downloadRecording(recording);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tplay(recording: RecordingInfo) {\n\t\tif (!recording.filename) {\n\t\t\tthis.log.e('Error playing recording. Recording filename is undefined');\n\t\t\treturn;\n\t\t}\n\t\tconst payload: RecordingPlayClickedEvent = {\n\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\trecordingId: recording.id\n\t\t};\n\t\tthis.onRecordingPlayClicked.emit(payload);\n\t\tthis.recordingService.playRecording(recording);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tviewRecording(recording: RecordingInfo) {\n\t\t// This method can be overridden or emit a custom event for navigation\n\t\t// For now, it uses the same behavior as play, but can be customized\n\t\tif (!recording.filename) {\n\t\t\tthis.log.e('Error viewing recording. Recording filename is undefined');\n\t\t\treturn;\n\t\t}\n\t\tconst payload: RecordingPlayClickedEvent = {\n\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\trecordingId: recording.id\n\t\t};\n\t\tthis.onRecordingPlayClicked.emit(payload);\n\t\t// You can customize this to navigate to a different page instead\n\t\tthis.recordingService.playRecording(recording);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tviewAllRecordings() {\n\t\tthis.onViewRecordingsClicked.emit();\n\t}\n\n\t/**\n\t * @internal\n\t * Format duration in seconds to a readable format (e.g., \"2m 30s\")\n\t */\n\tformatDuration(seconds: number): string {\n\t\tif (!seconds || seconds < 0) return '0s';\n\n\t\tconst hours = Math.floor(seconds / 3600);\n\t\tconst minutes = Math.floor((seconds % 3600) / 60);\n\t\tconst remainingSeconds = Math.floor(seconds % 60);\n\n\t\tif (hours > 0) {\n\t\t\treturn `${hours}h ${minutes}m`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}m ${remainingSeconds}s`;\n\t\t} else {\n\t\t\treturn `${remainingSeconds}s`;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Format file size in bytes to a readable format (e.g., \"2.5 MB\")\n\t */\n\tformatFileSize(bytes: number): string {\n\t\tif (!bytes || bytes < 0) return '0 B';\n\n\t\tconst sizes = ['B', 'KB', 'MB', 'GB'];\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(1024));\n\t\tconst size = bytes / Math.pow(1024, i);\n\n\t\treturn `${size.toFixed(1)} ${sizes[i]}`;\n\t}\n\n\tprivate subscribeToConfigChanges() {\n\t\tthis.libService.recordingActivityReadOnly$.pipe(takeUntil(this.destroy$)).subscribe((readOnly: boolean) => {\n\t\t\tthis.isReadOnlyMode = readOnly;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.recordingActivityShowControls$\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe((controls: { play?: boolean; download?: boolean; delete?: boolean; externalView?: boolean }) => {\n\t\t\t\tthis.showControls = controls;\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t});\n\n\t\tthis.libService.recordingActivityStartStopRecordingButton$.pipe(takeUntil(this.destroy$)).subscribe((show: boolean) => {\n\t\t\tthis.showStartStopRecordingButton = show;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.recordingActivityViewRecordingsButton$.pipe(takeUntil(this.destroy$)).subscribe((show: boolean) => {\n\t\t\tthis.showViewRecordingsButton = show;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.recordingActivityShowRecordingsList$.pipe(takeUntil(this.destroy$)).subscribe((show: boolean) => {\n\t\t\tthis.showRecordingList = show;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\tprivate subscribeToRecordingStatus() {\n\t\tthis.recordingService.recordingStatusObs.pipe(takeUntil(this.destroy$)).subscribe((event: RecordingStatusInfo) => {\n\t\t\tconst { status, recordingList, error } = event;\n\t\t\tthis.recordingStatus = status;\n\t\t\tthis.recordingList = recordingList;\n\t\t\tthis.recordingError = error;\n\t\t\tthis.recordingAlive = this.recordingStatus === RecordingStatus.STARTED;\n\t\t\tif (this.recordingStatus !== RecordingStatus.FAILED) {\n\t\t\t\tthis.oldRecordingStatus = this.recordingStatus;\n\t\t\t}\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\tprivate subscribeToTracksChanges() {\n\t\tthis.hasRoomTracksPublished = this.openviduService.hasRoomTracksPublished();\n\n\t\tthis.participantService.localParticipant$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n\t\t\tconst newValue = this.openviduService.hasRoomTracksPublished();\n\t\t\tif (this.hasRoomTracksPublished !== newValue) {\n\t\t\t\tthis.hasRoomTracksPublished = newValue;\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\n\t\tthis.participantService.remoteParticipants$.pipe(takeUntil(this.destroy$)).subscribe(() => {\n\t\t\tconst newValue = this.openviduService.hasRoomTracksPublished();\n\t\t\tif (this.hasRoomTracksPublished !== newValue) {\n\t\t\t\tthis.hasRoomTracksPublished = newValue;\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\t}\n}\n","<mat-expansion-panel\n\t(opened)=\"setPanelOpened(true)\"\n\t(closed)=\"setPanelOpened(false)\"\n\t[expanded]=\"expanded\"\n\t[ngClass]=\"{ 'no-body': !isPanelOpened }\"\n>\n\t<mat-expansion-panel-header>\n\t\t<mat-list>\n\t\t\t<mat-list-item>\n\t\t\t\t<div\n\t\t\t\t\tmatListItemIcon\n\t\t\t\t\tclass=\"activity-icon\"\n\t\t\t\t\t[ngClass]=\"{\n\t\t\t\t\t\tstarted: recordingStatus === recStatusEnum.STARTED,\n\t\t\t\t\t\tstopped: recordingStatus === recStatusEnum.STOPPED,\n\t\t\t\t\t\tfailed: recordingStatus === recStatusEnum.FAILED,\n\t\t\t\t\t\tstarting: recordingStatus === recStatusEnum.STARTING || recordingStatus === recStatusEnum.STOPPING\n\t\t\t\t\t}\"\n\t\t\t\t>\n\t\t\t\t\t@if (recordingStatus !== recStatusEnum.FAILED && recordingStatus !== recStatusEnum.STARTED) {\n\t\t\t\t\t\t<mat-icon id=\"recording-icon\"> video_camera_front </mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (recordingStatus === recStatusEnum.FAILED) {\n\t\t\t\t\t\t<mat-icon>error</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t\t@if (recordingStatus === recStatusEnum.STARTED) {\n\t\t\t\t\t\t<mat-icon class=\"blink\">radio_button_checked</mat-icon>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<h3 matListItemTitle class=\"activity-title\">{{ 'PANEL.RECORDING.TITLE' | translate }}</h3>\n\n\t\t\t\t<p matListItemLine class=\"activity-subtitle\">\n\t\t\t\t\t{{ isReadOnlyMode ? ('PANEL.RECORDING.VIEW_ONLY_SUBTITLE' | translate) : ('PANEL.RECORDING.SUBTITLE' | translate) }}\n\t\t\t\t</p>\n\t\t\t\t<div class=\"activity-action-buttons\" matListItemMeta>\n\t\t\t\t\t<div\n\t\t\t\t\t\tid=\"recording-status\"\n\t\t\t\t\t\tclass=\"activity-status\"\n\t\t\t\t\t\t[ngClass]=\"{\n\t\t\t\t\t\t\tstarted: recordingStatus === recStatusEnum.STARTED,\n\t\t\t\t\t\t\tstopped: recordingStatus === recStatusEnum.STOPPED,\n\t\t\t\t\t\t\tfailed: recordingStatus === recStatusEnum.FAILED,\n\t\t\t\t\t\t\tstarting: recordingStatus === recStatusEnum.STARTING || recordingStatus === recStatusEnum.STOPPING\n\t\t\t\t\t\t}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{{ recordingStatus | uppercase }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</mat-list-item>\n\t\t</mat-list>\n\t</mat-expansion-panel-header>\n\t@if (isPanelOpened) {\n\t\t<div class=\"panel-body-container\">\n\t\t\t<div class=\"content\">\n\t\t\t\t<!-- Empty state content -->\n\t\t\t\t@if (recordingList.length === 0 && recordingStatus === recStatusEnum.STOPPED) {\n\t\t\t\t\t<!-- Recording placeholder image -->\n\t\t\t\t\t<div class=\"recording-placeholder\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc=\"data:image/png;base64,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\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Recording title and subtitle -->\n\t\t\t\t\t<div class=\"empty-state\">\n\t\t\t\t\t\t<h2 class=\"recording-title\">\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\tisReadOnlyMode\n\t\t\t\t\t\t\t\t\t? ('PANEL.RECORDING.VIEW_ONLY_CONTENT_TITLE' | translate)\n\t\t\t\t\t\t\t\t\t: ('PANEL.RECORDING.CONTENT_TITLE' | translate)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t<span class=\"recording-subtitle\">\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\tisReadOnlyMode\n\t\t\t\t\t\t\t\t\t? recordingList.length === 0\n\t\t\t\t\t\t\t\t\t\t? ('PANEL.RECORDING.NO_RECORDINGS_AVAILABLE' | translate)\n\t\t\t\t\t\t\t\t\t\t: ('PANEL.RECORDING.VIEW_ONLY_CONTENT_SUBTITLE' | translate)\n\t\t\t\t\t\t\t\t\t: ('PANEL.RECORDING.CONTENT_SUBTITLE' | translate)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\n\t\t\t\t<!-- Panel body messages -->\n\t\t\t\t<div class=\"recording-status-messages\">\n\t\t\t\t\t<!-- Starting message -->\n\t\t\t\t\t@if (recordingStatus === recStatusEnum.STARTING) {\n\t\t\t\t\t\t<div class=\"recording-status recording-status-starting blink\" role=\"status\">\n\t\t\t\t\t\t\t<mat-icon class=\"status-icon\" aria-hidden=\"true\">hourglass_top</mat-icon>\n\t\t\t\t\t\t\t<div class=\"status-content\">\n\t\t\t\t\t\t\t\t<span class=\"status-title\">{{ 'PANEL.RECORDING.STARTING' | translate }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\n\t\t\t\t\t<!-- Stopping message -->\n\t\t\t\t\t@if (recordingStatus === recStatusEnum.STOPPING) {\n\t\t\t\t\t\t<div class=\"recording-status recording-status-stopping blink\" role=\"status\">\n\t\t\t\t\t\t\t<mat-icon class=\"status-icon\" aria-hidden=\"true\">hourglass_bottom</mat-icon>\n\t\t\t\t\t\t\t<div class=\"status-content\">\n\t\t\t\t\t\t\t\t<span class=\"status-title\">{{ 'PANEL.RECORDING.STOPPING' | translate }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\n\t\t\t\t\t<!-- Error message -->\n\t\t\t\t\t@if (showStartStopRecordingButton && recordingStatus === recStatusEnum.FAILED && recordingError) {\n\t\t\t\t\t\t<div class=\"recording-error-container\">\n\t\t\t\t\t\t\t<div class=\"recording-error\" role=\"alert\">\n\t\t\t\t\t\t\t\t<div class=\"error-icon-container\">\n\t\t\t\t\t\t\t\t\t<mat-icon class=\"error-icon\" aria-hidden=\"true\">error_outline</mat-icon>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"error-content\">\n\t\t\t\t\t\t\t\t\t<span class=\"error-title\">{{ 'PANEL.RECORDING.ERROR_STARTING' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<span class=\"error-message\">{{ recordingError }}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button mat-flat-button id=\"reset-recording-status-btn\" (click)=\"resetStatus()\">\n\t\t\t\t\t\t\t\t<span>{{ 'PANEL.RECORDING.ACCEPT' | translate }}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Recording control buttons -->\n\t\t\t\t@if (isReadOnlyMode) {\n\t\t\t\t\t<!-- View all recordings button -->\n\t\t\t\t\t<div class=\"item recording-action-buttons\">\n\t\t\t\t\t\t<button mat-flat-button id=\"view-recordings-btn\" (click)=\"viewAllRecordings()\" class=\"view-recordings-button\">\n\t\t\t\t\t\t\t<span>{{ 'TOOLBAR.VIEW_RECORDINGS' | translate }}</span>\n\t\t\t\t\t\t\t<mat-icon class=\"external-link-icon\">open_in_new</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"item recording-action-buttons\">\n\t\t\t\t\t\t<!-- Stop recording button -->\n\t\t\t\t\t\t@if (recordingAlive && showStartStopRecordingButton) {\n\t\t\t\t\t\t\t<button mat-flat-button id=\"stop-recording-btn\" (click)=\"stopRecording()\">\n\t\t\t\t\t\t\t\t<span>{{ 'TOOLBAR.STOP_RECORDING' | translate }}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t<!-- Start recording button -->\n\t\t\t\t\t\t@if (recordingStatus === recStatusEnum.STOPPED && showStartStopRecordingButton) {\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t[matTooltip]=\"!hasRoomTracksPublished ? ('PANEL.RECORDING.NO_TRACKS_PUBLISHED' | translate) : ''\"\n\t\t\t\t\t\t\t\t[matTooltipDisabled]=\"hasRoomTracksPublished\"\n\t\t\t\t\t\t\t\tclass=\"start-recording-button-container\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t[disabled]=\"!hasRoomTracksPublished\"\n\t\t\t\t\t\t\t\t\t[ngClass]=\"{ 'disable-recording-btn': !hasRoomTracksPublished }\"\n\t\t\t\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\t\t\t\tid=\"start-recording-btn\"\n\t\t\t\t\t\t\t\t\t(click)=\"startRecording()\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span>{{ 'TOOLBAR.START_RECORDING' | translate }}</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t<!-- View all recordings button -->\n\t\t\t\t\t\t@if (showViewRecordingsButton && recordingStatus !== recStatusEnum.FAILED) {\n\t\t\t\t\t\t\t<div class=\"item recording-action-buttons\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\t\t\t\tid=\"view-recordings-btn\"\n\t\t\t\t\t\t\t\t\t(click)=\"viewAllRecordings()\"\n\t\t\t\t\t\t\t\t\tclass=\"view-recordings-button\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span>{{ 'TOOLBAR.VIEW_RECORDINGS' | translate }}</span>\n\t\t\t\t\t\t\t\t\t<mat-icon class=\"external-link-icon\">open_in_new</mat-icon>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<!-- Recording list -->\n\t\t\t@if (showRecordingList && recordingList.length > 0) {\n\t\t\t\t<mat-divider></mat-divider>\n\n\t\t\t\t<div class=\"recording-list-container\">\n\t\t\t\t\t@for (recording of recordingList; track trackByRecordingId($index, recording)) {\n\t\t\t\t\t\t<div class=\"recording-card\" [class.recording-active]=\"recording.status === recStatusEnum.STARTED\">\n\t\t\t\t\t\t\t<!-- Recording header with status indicator and info -->\n\t\t\t\t\t\t\t<div class=\"recording-header\">\n\t\t\t\t\t\t\t\t<div class=\"recording-status-indicator\">\n\t\t\t\t\t\t\t\t\t@if (recording.status === recStatusEnum.STARTED) {\n\t\t\t\t\t\t\t\t\t\t<div class=\"status-dot recording-live\"></div>\n\t\t\t\t\t\t\t\t\t} @else if (recording.status === recStatusEnum.STOPPING) {\n\t\t\t\t\t\t\t\t\t\t<div class=\"status-dot recording-stopping\"></div>\n\t\t\t\t\t\t\t\t\t} @else if (recording.status === recStatusEnum.FAILED) {\n\t\t\t\t\t\t\t\t\t\t<div class=\"status-dot recording-failed\"></div>\n\t\t\t\t\t\t\t\t\t} @else if (recording.status === recStatusEnum.READY) {\n\t\t\t\t\t\t\t\t\t\t<div class=\"status-dot recording-ready\"></div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"recording-info\">\n\t\t\t\t\t\t\t\t\t<div class=\"recording-name\">{{ recording.filename || 'Recording' }}</div>\n\n\t\t\t\t\t\t\t\t\t@if (recording.status === recStatusEnum.STARTED) {\n\t\t\t\t\t\t\t\t\t\t<div class=\"recording-status-text recording-live-text\">\n\t\t\t\t\t\t\t\t\t\t\t{{ 'PANEL.RECORDING.IN_PROGRESS' | translate }}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t<div class=\"recording-metadata\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"metadata-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"metadata-icon\">schedule</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t{{ formatDuration(recording.duration) }}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"metadata-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"metadata-icon\">storage</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t{{ formatFileSize(recording.size) }}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"metadata-item\">\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"metadata-icon\">today</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t{{ recording.startedAt | date: 'MMM d, y' }}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Actions menu row -->\n\t\t\t\t\t\t\t@if (recording.status !== recStatusEnum.STARTED) {\n\t\t\t\t\t\t\t\t<div class=\"recording-actions-menu\">\n\t\t\t\t\t\t\t\t\t@if (isReadOnlyMode) {\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tmat-button\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"onViewRecordingClicked.emit(recording.id)\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"action-btn action-view\"\n\t\t\t\t\t\t\t\t\t\t\tid=\"external-view-recording-btn\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<mat-icon>open_in_new</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t{{ 'PANEL.RECORDING.WATCH' | translate }}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t@if (showControls.play) {\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"play(recording)\"\n\t\t\t\t\t\t\t\t\t\t\t\tmatTooltip=\"{{ 'PANEL.RECORDING.PLAY' | translate }}\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"action-btn action-play\"\n\t\t\t\t\t\t\t\t\t\t\t\tid=\"play-recording-btn\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>play_circle</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t@if (showControls.externalView) {\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tmat-button\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"onViewRecordingClicked.emit(recording.id)\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"action-btn action-view\"\n\t\t\t\t\t\t\t\t\t\t\t\tid=\"external-view-recording-btn\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>visibility</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t{{ 'PANEL.RECORDING.WATCH' | translate }}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t@if (showControls.download) {\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"download(recording)\"\n\t\t\t\t\t\t\t\t\t\t\t\tmatTooltip=\"{{ 'PANEL.RECORDING.DOWNLOAD' | translate }}\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"action-btn action-download\"\n\t\t\t\t\t\t\t\t\t\t\t\tid=\"download-recording-btn\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>download</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t@if (showControls.delete) {\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"deleteRecording(recording)\"\n\t\t\t\t\t\t\t\t\t\t\t\tmatTooltip=\"{{ 'PANEL.RECORDING.DELETE' | translate }}\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"action-btn action-delete\"\n\t\t\t\t\t\t\t\t\t\t\t\tid=\"delete-recording-btn\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon>delete_outline</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t}\n</mat-expansion-panel>\n","/**\n * Enum representing the possible status of a broadcast\n */\nexport enum BroadcastingStatus {\n\tSTARTING = 'STARTING',\n\tSTARTED = 'STARTED',\n\tSTOPPING = 'STOPPING',\n\tSTOPPED = 'STOPPED',\n\tFAILED = 'FAILED'\n}\n\n/**\n * Interface representing information related to the broadcasting status\n */\nexport interface BroadcastingStatusInfo {\n\tstatus: BroadcastingStatus;\n\tbroadcastingId: string | undefined;\n\terror?: string;\n}\n\n/**\n * Interface representing a broadcasting event\n */\ninterface BroadcastingEvent {\n\troomName: string;\n}\n\nexport interface BroadcastingStartRequestedEvent extends BroadcastingEvent {\n\tbroadcastUrl: string;\n}\nexport interface BroadcastingStopRequestedEvent extends BroadcastingEvent {\n\tbroadcastingId: string;\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { BroadcastingStatus, BroadcastingStatusInfo } from '../../models/broadcasting.model';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class BroadcastingService {\n\t/**\n\t * Broadcasting status Observable which pushes the {@link BroadcastingStatusInfo} in every update.\n\t */\n\tbroadcastingStatusObs: Observable<BroadcastingStatusInfo>;\n\n\tprivate broadcastingStatus = <BehaviorSubject<BroadcastingStatusInfo>>new BehaviorSubject({\n\t\tstatus: BroadcastingStatus.STOPPED,\n\t\tbroadcastingId: undefined,\n\t\terror: undefined\n\t});\n\n\t/**\n\t * @internal\n\t */\n\tconstructor() {\n\t\tthis.broadcastingStatusObs = this.broadcastingStatus.asObservable();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsetBroadcastingStarted(broadcastingId: string) {\n\t\tconst statusInfo: BroadcastingStatusInfo = {\n\t\t\tstatus: BroadcastingStatus.STARTED,\n\t\t\tbroadcastingId,\n\t\t\terror: undefined\n\t\t};\n\n\t\tthis.updateStatus(statusInfo);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsetBroadcastingStopped() {\n\t\tconst statusInfo: BroadcastingStatusInfo = {\n\t\t\tstatus: BroadcastingStatus.STOPPED,\n\t\t\tbroadcastingId: undefined\n\t\t};\n\t\tthis.updateStatus(statusInfo);\n\t}\n\n\t/**\n\t * @internal\n\t * @param error\n\t */\n\tsetBroadcastingFailed(error: string) {\n\t\tconst statusInfo: BroadcastingStatusInfo = {\n\t\t\tstatus: BroadcastingStatus.FAILED,\n\t\t\tbroadcastingId: undefined,\n\t\t\terror\n\t\t};\n\t\tthis.updateStatus(statusInfo);\n\t}\n\n\t/**\n\t * Set the broadcasting {@link BroadcastingStatus} to **starting**.\n\t * The `started` status will be updated automatically when the broadcasting is started.\n\t */\n\tsetBroadcastingStarting() {\n\t\tconst statusInfo: BroadcastingStatusInfo = {\n\t\t\tstatus: BroadcastingStatus.STARTING,\n\t\t\tbroadcastingId: undefined,\n\t\t\terror: undefined\n\t\t};\n\t\tthis.updateStatus(statusInfo);\n\t}\n\n\t/**\n\t * Set the broadcasting {@link BroadcastingStatus} to **stopping**.\n\t * The `stopped` status will be updated automatically when the broadcasting is stopped.\n\t */\n\tsetBroadcastingStopping() {\n\t\tconst statusInfo: BroadcastingStatusInfo = {\n\t\t\tstatus: BroadcastingStatus.STOPPING,\n\t\t\tbroadcastingId: this.broadcastingStatus.getValue().broadcastingId\n\t\t};\n\t\tthis.updateStatus(statusInfo);\n\t}\n\n\t/**\n\t * Update the broadcasting status.\n\t * @param status {@link BroadcastingStatusInfo}\n\t * @intenal\n\t */\n\tprivate updateStatus(statusInfo: BroadcastingStatusInfo) {\n\t\tconst { status, broadcastingId, error } = statusInfo;\n\t\tthis.broadcastingStatus.next({\n\t\t\tstatus,\n\t\t\tbroadcastingId,\n\t\t\terror\n\t\t});\n\t}\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport {\n\tBroadcastingStartRequestedEvent,\n\tBroadcastingStatus,\n\tBroadcastingStatusInfo,\n\tBroadcastingStopRequestedEvent\n} from '../../../../models/broadcasting.model';\nimport { BroadcastingService } from '../../../../services/broadcasting/broadcasting.service';\nimport { ParticipantService } from '../../../../services/participant/participant.service';\nimport { OpenViduService } from '../../../../services/openvidu/openvidu.service';\n\n/**\n * The **BroadcastingActivityComponent** is the component that allows showing the broadcasting activity.\n *\n */\n@Component({\n\tselector: 'ov-broadcasting-activity',\n\ttemplateUrl: './broadcasting-activity.component.html',\n\tstyleUrls: ['./broadcasting-activity.component.scss', '../activities-panel.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\n\n// TODO: Allow to add more than one broadcast url\n// TODO: allow to choose the layout of the broadcast\nexport class BroadcastingActivityComponent implements OnInit {\n\t/**\n\t * Provides event notifications that fire when start broadcasting button is clicked.\n\t * It provides the {@link BroadcastingStartRequestedEvent} payload as event data.\n\t */\n\t@Output() onBroadcastingStartRequested: EventEmitter<BroadcastingStartRequestedEvent> =\n\t\tnew EventEmitter<BroadcastingStartRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when stop broadcasting button is clicked.\n\t * It provides the {@link BroadcastingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onBroadcastingStopRequested: EventEmitter<BroadcastingStopRequestedEvent> =\n\t\tnew EventEmitter<BroadcastingStopRequestedEvent>();\n\n\t/**\n\t * @internal\n\t */\n\turlRequiredError: boolean = false;\n\n\t/**\n\t * @internal\n\t */\n\tbroadcastUrl: string = '';\n\n\t/**\n\t * @internal\n\t */\n\t@Input() expanded: boolean;\n\n\t/**\n\t * @internal\n\t */\n\tbroadcastingError: string | undefined;\n\n\t/**\n\t * @internal\n\t */\n\tbroadcastingStatus: BroadcastingStatus = BroadcastingStatus.STOPPED;\n\t/**\n\t * @internal\n\t */\n\tbroadcastingId: string | undefined;\n\t/**\n\t * @internal\n\t */\n\tbroadcastingStatusEnum = BroadcastingStatus;\n\t/**\n\t * @internal\n\t */\n\tisPanelOpened: boolean = false;\n\n\tprivate destroy$ = new Subject<void>();\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate broadcastingService: BroadcastingService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate cd: ChangeDetectorRef\n\t) {}\n\n\t/**\n\t * @internal\n\t */\n\tngOnInit(): void {\n\t\tthis.subscribeToBroadcastingStatus();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tsetPanelOpened(value: boolean) {\n\t\tthis.isPanelOpened = value;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\teventKeyPress(event) {\n\t\t// Pressed 'Enter' key\n\t\tif (event && event.keyCode === 13) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.startBroadcasting();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tstartBroadcasting() {\n\t\tif (!!this.broadcastUrl) {\n\t\t\tconst payload: BroadcastingStartRequestedEvent = {\n\t\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\t\tbroadcastUrl: this.broadcastUrl\n\t\t\t};\n\t\t\tthis.onBroadcastingStartRequested.emit(payload);\n\t\t}\n\t\tthis.urlRequiredError = !this.broadcastUrl;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tstopBroadcasting() {\n\t\tconst payload: BroadcastingStopRequestedEvent = {\n\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\tbroadcastingId: this.broadcastingId as string\n\t\t};\n\t\tthis.broadcastingService.setBroadcastingStopped();\n\t\tthis.onBroadcastingStopRequested.emit(payload);\n\t}\n\n\tprivate subscribeToBroadcastingStatus() {\n\t\tthis.broadcastingService.broadcastingStatusObs.pipe(takeUntil(this.destroy$)).subscribe((event: BroadcastingStatusInfo | undefined) => {\n\t\t\tif (!!event) {\n\t\t\t\tconst { status, broadcastingId, error } = event;\n\t\t\t\tthis.broadcastingStatus = status;\n\t\t\t\tthis.broadcastingError = error;\n\t\t\t\tthis.broadcastingId = broadcastingId;\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\t}\n}\n","<mat-expansion-panel\n\t(opened)=\"setPanelOpened(true)\"\n\t(closed)=\"setPanelOpened(false)\"\n\t[expanded]=\"expanded\"\n\t[ngClass]=\"{ 'no-body': !isPanelOpened }\"\n>\n\t<mat-expansion-panel-header>\n\t\t<mat-list>\n\t\t\t<mat-list-item>\n\t\t\t\t<div\n\t\t\t\t\tmatListItemIcon\n\t\t\t\t\tclass=\"activity-icon\"\n\t\t\t\t\t[ngClass]=\"{\n\t\t\t\t\t\tstarted: broadcastingStatus === broadcastingStatusEnum.STARTED,\n\t\t\t\t\t\tstopped: broadcastingStatus === broadcastingStatusEnum.STOPPED,\n\t\t\t\t\t\tfailed: broadcastingStatus === broadcastingStatusEnum.FAILED,\n\t\t\t\t\t\tstarting:\n\t\t\t\t\t\t\tbroadcastingStatus === broadcastingStatusEnum.STARTING || broadcastingStatus === broadcastingStatusEnum.STOPPING\n\t\t\t\t\t}\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon\n\t\t\t\t\t\tid=\"broadcasting-icon\"\n\t\t\t\t\t\t*ngIf=\"\n\t\t\t\t\t\t\tbroadcastingStatus !== broadcastingStatusEnum.FAILED && broadcastingStatus !== broadcastingStatusEnum.STARTED\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\tsensors\n\t\t\t\t\t</mat-icon>\n\t\t\t\t\t<mat-icon *ngIf=\"broadcastingStatus === broadcastingStatusEnum.FAILED\">error</mat-icon>\n\t\t\t\t\t<mat-icon class=\"blink\" *ngIf=\"broadcastingStatus === broadcastingStatusEnum.STARTED\">sensors</mat-icon>\n\t\t\t\t</div>\n\t\t\t\t<h3 matListItemTitle class=\"activity-title\">{{ 'PANEL.STREAMING.TITLE' | translate }}</h3>\n\t\t\t\t<p matListItemLine class=\"activity-subtitle\">{{ 'PANEL.STREAMING.SUBTITLE' | translate }}</p>\n\t\t\t\t<div class=\"activity-action-buttons\" matListItemMeta>\n\t\t\t\t\t<div\n\t\t\t\t\t\tid=\"broadcasting-status\"\n\t\t\t\t\t\tclass=\"activity-status\"\n\t\t\t\t\t\t[ngClass]=\"{\n\t\t\t\t\t\t\tstarted: broadcastingStatus === broadcastingStatusEnum.STARTED,\n\t\t\t\t\t\t\tstopped: broadcastingStatus === broadcastingStatusEnum.STOPPED,\n\t\t\t\t\t\t\tfailed: broadcastingStatus === broadcastingStatusEnum.FAILED,\n\t\t\t\t\t\t\tstarting:\n\t\t\t\t\t\t\t\tbroadcastingStatus === broadcastingStatusEnum.STARTING ||\n\t\t\t\t\t\t\t\tbroadcastingStatus === broadcastingStatusEnum.STOPPING\n\t\t\t\t\t\t}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{{ broadcastingStatus | uppercase }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</mat-list-item>\n\t\t</mat-list>\n\t</mat-expansion-panel-header>\n\t<div *ngIf=\"isPanelOpened\" class=\"panel-body-container\">\n\t\t<div class=\"content\">\n\t\t\t<!-- Broadcasting image -->\n\t\t\t<div *ngIf=\"broadcastingStatus === broadcastingStatusEnum.STOPPED\">\n\t\t\t\t<img\n\t\t\t\t\tsrc=\"data:image/png;base64,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\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- Broadcasting button -->\n\t\t\t<div class=\"input-container\" id=\"broadcasting-url-input\">\n\t\t\t\t<input\n\t\t\t\t\tplaceholder=\"{{ 'PANEL.STREAMING.URL' | translate }}\"\n\t\t\t\t\t[disabled]=\"\n\t\t\t\t\t\tbroadcastingStatus !== broadcastingStatusEnum.STOPPED && broadcastingStatus !== broadcastingStatusEnum.FAILED\n\t\t\t\t\t\"\n\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t(keypress)=\"eventKeyPress($event)\"\n\t\t\t\t\t[(ngModel)]=\"broadcastUrl\"\n\t\t\t\t\tid=\"broadcast-url-input\"\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\tmat-icon-button\n\t\t\t\t\t*ngIf=\"broadcastingStatus !== broadcastingStatusEnum.STARTED\"\n\t\t\t\t\tid=\"broadcasting-btn\"\n\t\t\t\t\t[disabled]=\"\n\t\t\t\t\t\t!broadcastUrl ||\n\t\t\t\t\t\tbroadcastingStatus === broadcastingStatusEnum.STARTING ||\n\t\t\t\t\t\tbroadcastingStatus === broadcastingStatusEnum.STOPPING\n\t\t\t\t\t\"\n\t\t\t\t\t(click)=\"startBroadcasting()\"\n\t\t\t\t\tmatTooltip=\"{{ 'PANEL.STREAMING.START' | translate }}\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon>play_circle</mat-icon>\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\tmat-icon-button\n\t\t\t\t\t*ngIf=\"broadcastingStatus === broadcastingStatusEnum.STARTED\"\n\t\t\t\t\tid=\"stop-broadcasting-btn\"\n\t\t\t\t\t(click)=\"stopBroadcasting()\"\n\t\t\t\t\tmatTooltip=\"{{ 'PANEL.STREAMING.STOP' | translate }}\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon>stop_circle</mat-icon>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div>\n\t\t\t\t<p>{{ 'CONTENT_SUBTITLE' | translate }}</p>\n\t\t\t\t<p *ngIf=\"urlRequiredError\" class=\"error-text\" id=\"required-url-error\">{{ 'PANEL.STREAMING.REQUIRED_URL' | translate }}</p>\n\t\t\t\t<p *ngIf=\"broadcastingError\" class=\"error-text\" id=\"broadcasting-error\">{{ broadcastingError }}</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</mat-expansion-panel>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { PanelStatusInfo, PanelType } from '../../../models/panel.model';\nimport { OpenViduComponentsConfigService } from '../../../services/config/directive-config.service';\nimport { PanelService } from '../../../services/panel/panel.service';\nimport {\n\tRecordingDeleteRequestedEvent,\n\tRecordingDownloadClickedEvent,\n\tRecordingPlayClickedEvent,\n\tRecordingStartRequestedEvent,\n\tRecordingStopRequestedEvent\n} from '../../../models/recording.model';\nimport { BroadcastingStartRequestedEvent, BroadcastingStopRequestedEvent } from '../../../models/broadcasting.model';\n\n/**\n * The **ActivitiesPanelComponent** is the component that allows showing the activities panel.\n * This panel shows the recording and broadcasting activities.\n */\n@Component({\n\tselector: 'ov-activities-panel',\n\ttemplateUrl: './activities-panel.component.html',\n\tstyleUrls: ['../panel.component.scss', './activities-panel.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class ActivitiesPanelComponent implements OnInit {\n\t/**\n\t * This event is fired when the user clicks on the start recording button.\n\t * It provides the {@link RecordingStartRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStartRequested: EventEmitter<RecordingStartRequestedEvent> = new EventEmitter<RecordingStartRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when stop recording button has been clicked.\n\t * It provides the {@link RecordingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStopRequested: EventEmitter<RecordingStopRequestedEvent> = new EventEmitter<RecordingStopRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when delete recording button has been clicked.\n\t * It provides the {@link RecordingDeleteRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingDeleteRequested: EventEmitter<RecordingDeleteRequestedEvent> = new EventEmitter<RecordingDeleteRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when download recording button has been clicked.\n\t * It provides the {@link RecordingDownloadClickedEvent} payload as event data.\n\t */\n\t@Output() onRecordingDownloadClicked: EventEmitter<RecordingDownloadClickedEvent> = new EventEmitter<RecordingDownloadClickedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when play recording button has been clicked.\n\t * It provides the {@link RecordingPlayClickedEvent} payload as event data.\n\t */\n\t@Output() onRecordingPlayClicked: EventEmitter<RecordingPlayClickedEvent> = new EventEmitter<RecordingPlayClickedEvent>();\n\n\t/**\n\t * @internal\n\t * Provides event notifications that fire when view recordings button has been clicked.\n\t * This event is triggered when the user wants to view all recordings in an external page.\n\t */\n\t@Output() onViewRecordingsClicked: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * @internal\n\t * Provides event notifications that fire when view recording button has been clicked.\n\t * This event is triggered when the user wants to view a specific recording in an external page.\n\t * It provides the recording ID as event data.\n\t */\n\t@Output() onViewRecordingClicked: EventEmitter<string> = new EventEmitter<string>();\n\n\t/**\n\t * Provides event notifications that fire when start broadcasting button is clicked.\n\t * It provides the {@link BroadcastingStartRequestedEvent} payload as event data.\n\t */\n\t@Output() onBroadcastingStartRequested: EventEmitter<BroadcastingStartRequestedEvent> =\n\t\tnew EventEmitter<BroadcastingStartRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when stop broadcasting button is clicked.\n\t * It provides the {@link BroadcastingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onBroadcastingStopRequested: EventEmitter<BroadcastingStopRequestedEvent> =\n\t\tnew EventEmitter<BroadcastingStopRequestedEvent>();\n\n\t/**\n\t * @internal\n\t */\n\texpandedPanel: string = '';\n\t/**\n\t * @internal\n\t */\n\tshowRecordingActivity: boolean = true;\n\t/**\n\t * @internal\n\t */\n\tshowBroadcastingActivity: boolean = true;\n\tprivate destroy$ = new Subject<void>();\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate panelService: PanelService,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate cd: ChangeDetectorRef\n\t) {}\n\n\t/**\n\t * @internal\n\t */\n\tngOnInit(): void {\n\t\tthis.subscribeToPanelToggling();\n\t\tthis.subscribeToActivitiesPanelDirective();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tclose() {\n\t\tthis.panelService.togglePanel(PanelType.ACTIVITIES);\n\t}\n\n\tprivate subscribeToPanelToggling() {\n\t\tthis.panelService.panelStatusObs.pipe(takeUntil(this.destroy$)).subscribe((ev: PanelStatusInfo) => {\n\t\t\tif (ev.panelType === PanelType.ACTIVITIES && !!ev.subOptionType) {\n\t\t\t\tthis.expandedPanel = ev.subOptionType;\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate subscribeToActivitiesPanelDirective() {\n\t\tthis.libService.recordingActivity$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showRecordingActivity = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.broadcastingActivity$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showBroadcastingActivity = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n}\n","<div class=\"panel-container\" id=\"activities-container\">\n\t<div class=\"panel-header-container\">\n\t\t<h3 class=\"panel-title\">{{ 'PANEL.ACTIVITIES.TITLE' | translate }}</h3>\n\t\t<button class=\"panel-close-button\" mat-icon-button matTooltip=\"{{ 'PANEL.CLOSE' | translate }}\" (click)=\"close()\">\n\t\t\t<mat-icon>close</mat-icon>\n\t\t</button>\n\t</div>\n\n\t<div class=\"activities-body-container\">\n\t\t<mat-accordion [multi]=\"false\">\n\t\t\t<ov-recording-activity\n\t\t\t\t*ngIf=\"showRecordingActivity\"\n\t\t\t\tid=\"recording-activity\"\n\t\t\t\t[expanded]=\"expandedPanel === 'recording'\"\n\t\t\t\t(onRecordingStartRequested)=\"onRecordingStartRequested.emit($event)\"\n\t\t\t\t(onRecordingStopRequested)=\"onRecordingStopRequested.emit($event)\"\n\t\t\t\t(onRecordingDeleteRequested)=\"onRecordingDeleteRequested.emit($event)\"\n\t\t\t\t(onRecordingDownloadClicked)=\"onRecordingDownloadClicked.emit($event)\"\n\t\t\t\t(onRecordingPlayClicked)=\"onRecordingPlayClicked.emit($event)\"\n\t\t\t\t(onViewRecordingClicked)=\"onViewRecordingClicked.emit($event)\"\n\t\t\t\t(onViewRecordingsClicked)=\"onViewRecordingsClicked.emit()\"\n\t\t\t></ov-recording-activity>\n\t\t\t<ov-broadcasting-activity\n\t\t\t\t*ngIf=\"showBroadcastingActivity\"\n\t\t\t\tid=\"broadcasting-activity\"\n\t\t\t\t[expanded]=\"expandedPanel === 'broadcasting'\"\n\t\t\t\t(onBroadcastingStartRequested)=\"onBroadcastingStartRequested.emit($event)\"\n\t\t\t\t(onBroadcastingStopRequested)=\"onBroadcastingStopRequested.emit($event)\"\n\t\t\t></ov-broadcasting-activity>\n\t\t</mat-accordion>\n\t</div>\n</div>\n","/**\n * @internal\n */\n\nexport enum DataTopic {\n\tCHAT = 'chat',\n\tRECORDING_STARTING = 'recordingStarting',\n\tRECORDING_STARTED = 'recordingStarted',\n\tRECORDING_STOPPING = 'recordingStopping',\n\tRECORDING_STOPPED = 'recordingStopped',\n\tRECORDING_DELETED = 'recordingDeleted',\n\tRECORDING_FAILED = 'recordingFailed',\n\tBROADCASTING_STARTING = 'broadcastingStarting',\n\tBROADCASTING_STARTED = 'broadcastingStarted',\n\tBROADCASTING_STOPPING = 'broadcastingStopping',\n\tBROADCASTING_STOPPED = 'broadcastingStopped',\n\tBROADCASTING_FAILED = 'broadcastingFailed',\n\tROOM_STATUS = 'roomStatus'\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';\nimport { Observable } from 'rxjs/internal/Observable';\n\nimport { ChatMessage } from '../../models/chat.model';\nimport { ILogger } from '../../models/logger.model';\nimport { INotificationOptions } from '../../models/notification-options.model';\n\nimport { DataTopic } from '../../models/data-topic.model';\nimport { PanelType } from '../../models/panel.model';\nimport { ActionService } from '../action/action.service';\nimport { LoggerService } from '../logger/logger.service';\nimport { PanelService } from '../panel/panel.service';\nimport { ParticipantService } from '../participant/participant.service';\nimport { TranslateService } from '../translate/translate.service';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class ChatService {\n\tchatMessages$: Observable<ChatMessage[]>;\n\tprivate messageSound: HTMLAudioElement;\n\tprivate _messageList = <BehaviorSubject<ChatMessage[]>>new BehaviorSubject<ChatMessage[]>([]);\n\tprivate messageList: ChatMessage[] = [];\n\tprivate log: ILogger;\n\tconstructor(\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate panelService: PanelService,\n\t\tprivate actionService: ActionService,\n\t\tprivate translateService: TranslateService,\n\t) {\n\t\tthis.log = this.loggerSrv.get('ChatService');\n\t\tthis.chatMessages$ = this._messageList.asObservable();\n\t\tthis.messageSound = new Audio(\n\t\t\t'data:audio/wav;base64,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'\n\t\t);\n\t\tthis.messageSound.volume = 0.6;\n\t}\n\n\t/**\n\t * Adds a new message to the chat from a remote participant\n\t * @param message\n\t * @param participantName\n\t */\n\tasync addRemoteMessage(message: string, participantName: string) {\n\t\tthis.addMessage(message, false, participantName);\n\t\tif (!this.panelService.isChatPanelOpened()) {\n\t\t\tconst notificationMessage = this.translateService.translate('PANEL.CHAT.MESSAGE_SENT_NOTIFICATION');\n\t\t\tconst action = this.translateService.translate('PANEL.CHAT.OPEN_CHAT');\n\t\t\tconst notificationOptions: INotificationOptions = {\n\t\t\t\tmessage: `${participantName.toUpperCase()} ${notificationMessage}`,\n\t\t\t\tbuttonActionText: action\n\t\t\t};\n\t\t\tthis.launchNotification(notificationOptions);\n\t\t\tthis.messageSound.play().catch(() => {});\n\t\t}\n\t}\n\n\t/**\n\t * Sends a chat message through the data channel.\n\t *\n\t * @param message The message text to send\n\t */\n\tasync sendMessage(message: string) {\n\t\tconst plainTextMessage = message.replace(/ +(?= )/g, '');\n\t\tif (plainTextMessage !== '' && plainTextMessage !== ' ') {\n\t\t\ttry {\n\t\t\t\t// Create message payload\n\t\t\t\tconst payload = JSON.stringify({ message: plainTextMessage });\n\t\t\t\tconst data: Uint8Array = new TextEncoder().encode(payload);\n\n\t\t\t\t// Send through data channel\n\t\t\t\tawait this.participantService.publishData(data, { topic: DataTopic.CHAT, reliable: true });\n\n\t\t\t\t// Add to local message list\n\t\t\t\tthis.addMessage(plainTextMessage, true, this.participantService.getMyName()!);\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.e('Error sending chat message:', error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate addMessage(message: string, isLocal: boolean, participantName: string) {\n\t\tthis.messageList.push({\n\t\t\tisLocal,\n\t\t\tparticipantName,\n\t\t\tmessage\n\t\t});\n\t\tthis._messageList.next(this.messageList);\n\t}\n\n\tprivate launchNotification(options: INotificationOptions) {\n\t\tthis.actionService.launchNotification(options, this.panelService.togglePanel.bind(this.panelService, PanelType.CHAT));\n\t}\n}\n","import { Autolinker, AutolinkerConfig } from 'autolinker';\n\n/**\n * @internal\n */\nconst AUTOLINKER_CFGS: AutolinkerConfig = {\n\turls: {\n\t\tschemeMatches: true,\n\t\ttldMatches: true\n\t},\n\temail: true,\n\tphone: true,\n\tmention: 'twitter',\n\thashtag: 'twitter',\n\tstripPrefix: false,\n\tstripTrailingSlash: false,\n\tnewWindow: true,\n\ttruncate: {\n\t\tlength: 0,\n\t\tlocation: 'end'\n\t},\n\tdecodePercentEncoding: true\n};\n\n/**\n * @internal\n */\nexport class Linkifier {\n\tprivate autolinker: Autolinker;\n\n\tconstructor() {\n\t\tthis.autolinker = new Autolinker(AUTOLINKER_CFGS);\n\t}\n\n\tpublic link(textOrHtml: string): string {\n\t\treturn this.autolinker.link(textOrHtml);\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Linkifier } from '../models/linkifier.model';\n\n/**\n * @internal\n */\n@Pipe({ name: 'linkify', standalone: false })\nexport class LinkifyPipe implements PipeTransform {\n\tprivate linkifer: Linkifier;\n\n\tconstructor() {\n\t\tthis.linkifer = new Linkifier();\n\t}\n\n\ttransform(str: string): string {\n\t\treturn str ? this.linkifer.link(str) : str;\n\t}\n}\n","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, ElementRef, OnInit, ViewChild } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { ChatMessage } from '../../../models/chat.model';\nimport { PanelType } from '../../../models/panel.model';\nimport { ChatService } from '../../../services/chat/chat.service';\nimport { E2eeService } from '../../../services/e2ee/e2ee.service';\nimport { PanelService } from '../../../services/panel/panel.service';\nimport { ParticipantService } from '../../../services/participant/participant.service';\n\n/**\n *\n * The **ChatPanelComponent** is an integral part of the {@link PanelComponent} and serves as the interface for displaying the session chat.\n */\n@Component({\n\tselector: 'ov-chat-panel',\n\ttemplateUrl: './chat-panel.component.html',\n\tstyleUrls: ['../panel.component.scss', './chat-panel.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class ChatPanelComponent implements OnInit, AfterViewInit {\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild('chatScroll') chatScroll: ElementRef = new ElementRef(null);\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild('chatInput') chatInput: ElementRef = new ElementRef(null);\n\t/**\n\t * @ignore\n\t */\n\tmessage: string = '';\n\t/**\n\t * @ignore\n\t */\n\tmessageList: ChatMessage[] = [];\n\n\tprivate destroy$ = new Subject<void>();\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate chatService: ChatService,\n\t\tprivate panelService: PanelService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate e2eeService: E2eeService,\n\t\tprivate participantService: ParticipantService\n\t) {\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnInit() {\n\t\tthis.subscribeToMessages();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngAfterViewInit() {\n\t\tsetTimeout(() => {\n\t\t\tthis.scrollToBottom();\n\t\t\tthis.chatInput.nativeElement.focus();\n\t\t}, 100);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\teventKeyPress(event: KeyboardEvent): void {\n\t\t// Pressed 'Enter' key\n\t\tif (event && event.keyCode === 13) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.sendMessage();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tasync sendMessage(): Promise<void> {\n\t\tif (!!this.message) {\n\t\t\tawait this.chatService.sendMessage(this.message);\n\t\t\tthis.message = '';\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tscrollToBottom(): void {\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.chatScroll.nativeElement.scrollTop = this.chatScroll.nativeElement.scrollHeight;\n\t\t\t} catch (err) {}\n\t\t}, 20);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclose() {\n\t\tthis.panelService.togglePanel(PanelType.CHAT);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\thasEncryptionKeyMismatch = computed(() => {\n\t\tif (!this.e2eeService.isEnabled) {\n\t\t\treturn false;\n\t\t}\n\t\tconst remoteParticipants = this.participantService.remoteParticipantsSignal();\n\t\treturn remoteParticipants.some(p => p.hasEncryptionError);\n\t});\n\n\n\n\tprivate subscribeToMessages() {\n\t\tthis.chatService.chatMessages$.pipe(takeUntil(this.destroy$)).subscribe((messages: ChatMessage[]) => {\n\t\t\tthis.messageList = messages;\n\t\t\tif (this.panelService.isChatPanelOpened()) {\n\t\t\t\tthis.scrollToBottom();\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\t}\n}\n","<div class=\"panel-container\" id=\"chat-container\">\n\t<div class=\"panel-header-container\">\n\t\t<h3 class=\"panel-title\">{{ 'PANEL.CHAT.TITLE' | translate }}</h3>\n\t\t<button class=\"panel-close-button\" mat-icon-button matTooltip=\"{{ 'PANEL.CLOSE' | translate }}\" (click)=\"close()\">\n\t\t\t<mat-icon>close</mat-icon>\n\t\t</button>\n\t</div>\n\n\t@if (hasEncryptionKeyMismatch()) {\n\t\t<div class=\"encryption-warning\">\n\t\t\t<mat-icon>warning</mat-icon>\n\t\t\t<p>{{ 'PANEL.CHAT.ENCRYPTION_KEY_MISMATCH' | translate }}</p>\n\t\t</div>\n\t}\n\n\t<div class=\"text-container\">\n\t\t<p class=\"text-info\">{{ 'PANEL.CHAT.SUBTITLE' | translate }}</p>\n\t</div>\n\n\t<div class=\"messages-container\" #chatScroll>\n\t\t<div *ngFor=\"let data of messageList\" class=\"message\" [ngClass]=\"data.isLocal ? 'right' : 'left'\">\n\t\t\t<div class=\"msg-detail\">\n\t\t\t\t<div class=\"participant-name-container\">\n\t\t\t\t\t<p *ngIf=\"data.isLocal\">{{ 'PANEL.CHAT.YOU' | translate }}</p>\n\t\t\t\t\t<p *ngIf=\"!data.isLocal\">{{ data.participantName }}</p>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"chat-message\">\n\t\t\t\t\t<p [innerHTML]=\"data.message | linkify\"></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div class=\"input-container\">\n\t\t<textarea\n\t\t\t#chatInput\n\t\t\tmaxlength=\"500\"\n\t\t\trows=\"4\"\n\t\t\tplaceholder=\"{{ 'PANEL.CHAT.PLACEHOLDER' | translate }}\"\n\t\t\tautocomplete=\"off\"\n\t\t\t(keypress)=\"eventKeyPress($event)\"\n\t\t\t[(ngModel)]=\"message\"\n\t\t\tid=\"chat-input\"\n\t\t\t[ngClass]=\"{ 'vertical-align': !message }\"\n\t\t></textarea>\n\t\t<button mat-icon-button id=\"send-btn\" (click)=\"sendMessage()\" matTooltip=\"{{ 'PANEL.CHAT.SEND' | translate }}\">\n\t\t\t<mat-icon>send</mat-icon>\n\t\t</button>\n\t</div>\n</div>\n","import {\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tContentChild,\n\tEventEmitter,\n\tOnInit,\n\tOutput,\n\tTemplateRef\n} from '@angular/core';\nimport { skip, Subject, takeUntil } from 'rxjs';\nimport {\n\tActivitiesPanelDirective,\n\tAdditionalPanelsDirective,\n\tChatPanelDirective,\n\tParticipantsPanelDirective\n} from '../../directives/template/openvidu-components-angular.directive';\nimport {\n\tActivitiesPanelStatusEvent,\n\tChatPanelStatusEvent,\n\tPanelStatusInfo,\n\tPanelType,\n\tParticipantsPanelStatusEvent,\n\tSettingsPanelStatusEvent\n} from '../../models/panel.model';\nimport { PanelService } from '../../services/panel/panel.service';\nimport { BackgroundEffect } from '../../models/background-effect.model';\nimport { TemplateManagerService, PanelTemplateConfiguration } from '../../services/template/template-manager.service';\n\n/**\n *\n * The **PanelComponent** is hosted inside of the {@link VideoconferenceComponent}.\n * It is in charge of displaying the videoconference panels providing functionalities to the videoconference app\n * such as the chat ({@link ChatPanelComponent}) and list of participants ({@link ParticipantsPanelComponent})\n */\n\n@Component({\n\tselector: 'ov-panel',\n\ttemplateUrl: './panel.component.html',\n\tstyleUrls: ['./panel.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class PanelComponent implements OnInit {\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('participantsPanel', { read: TemplateRef }) participantsPanelTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('backgroundEffectsPanel', { read: TemplateRef }) backgroundEffectsPanelTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('settingsPanel', { read: TemplateRef }) settingsPanelTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('activitiesPanel', { read: TemplateRef }) activitiesPanelTemplate: TemplateRef<any>;\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('chatPanel', { read: TemplateRef }) chatPanelTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('additionalPanels', { read: TemplateRef }) additionalPanelsTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ParticipantsPanelDirective)\n\tset externalParticipantPanel(externalParticipantsPanel: ParticipantsPanelDirective) {\n\t\tthis._externalParticipantPanel = externalParticipantsPanel;\n\t\tif (externalParticipantsPanel) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ActivitiesPanelDirective)\n\tset externalActivitiesPanel(externalActivitiesPanel: ActivitiesPanelDirective) {\n\t\tthis._externalActivitiesPanel = externalActivitiesPanel;\n\t\tif (externalActivitiesPanel) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ChatPanelDirective)\n\tset externalChatPanel(externalChatPanel: ChatPanelDirective) {\n\t\tthis._externalChatPanel = externalChatPanel;\n\t\tif (externalChatPanel) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(AdditionalPanelsDirective)\n\tset externalAdditionalPanels(externalAdditionalPanels: AdditionalPanelsDirective) {\n\t\tthis._externalAdditionalPanels = externalAdditionalPanels;\n\t\tif (externalAdditionalPanels) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * This event is fired when the chat panel status has been changed.\n\t * It provides the new status of the chat panel represented by the {@link ChatPanelStatusEvent} object.\n\t */\n\t@Output() onChatPanelStatusChanged: EventEmitter<ChatPanelStatusEvent> = new EventEmitter<ChatPanelStatusEvent>();\n\n\t/**\n\t * This event is fired when the participants panel status has been changed.\n\t * It provides the new status of the participants panel represented by the {@link ParticipantsPanelStatusEvent} object.\n\t */\n\t@Output() onParticipantsPanelStatusChanged: EventEmitter<ParticipantsPanelStatusEvent> =\n\t\tnew EventEmitter<ParticipantsPanelStatusEvent>();\n\n\t/**\n\t * This event is fired when the settings panel status has been changed.\n\t * It provides the new status of the settings panel represented by the {@link SettingsPanelStatusEvent} object.\n\t */\n\t@Output() onSettingsPanelStatusChanged: EventEmitter<SettingsPanelStatusEvent> = new EventEmitter<SettingsPanelStatusEvent>();\n\n\t/**\n\t * This event is fired when the activities panel status has been changed.\n\t * It provides the new status of the activities panel represented by the {@link ActivitiesPanelStatusEvent} object.\n\t */\n\t@Output() onActivitiesPanelStatusChanged: EventEmitter<ActivitiesPanelStatusEvent> = new EventEmitter<ActivitiesPanelStatusEvent>();\n\n\t/**\n\t * This event is fired when the background effects panel status has been changed.\n\t * It provides the new status of the background effects panel represented by the {@link BackgroundEffectsPanelStatusEvent} object.\n\t * @internal\n\t */\n\t// @Output() onBackgroundEffectsPanelStatusChanged: EventEmitter<BackgroundEffectsPanelStatusEvent> = new EventEmitter<BackgroundEffectsPanelStatusEvent>();\n\n\t/**\n\t * @ignore\n\t */\n\tisParticipantsPanelOpened: boolean;\n\t/**\n\t * @ignore\n\t */\n\tisChatPanelOpened: boolean;\n\t/**\n\t * @ignore\n\t */\n\tisBackgroundEffectsPanelOpened: boolean;\n\t/**\n\t * @ignore\n\t */\n\tisSettingsPanelOpened: boolean;\n\t/**\n\t * @ignore\n\t */\n\tisActivitiesPanelOpened: boolean;\n\n\t/**\n\t * @internal\n\t */\n\tisExternalPanelOpened: boolean;\n\n\t/**\n\t * @internal\n\t * Template configuration managed by the service\n\t */\n\ttemplateConfig: PanelTemplateConfiguration = {};\n\n\t// Store directive references for template setup\n\tprivate _externalParticipantPanel?: ParticipantsPanelDirective;\n\tprivate _externalChatPanel?: ChatPanelDirective;\n\tprivate _externalActivitiesPanel?: ActivitiesPanelDirective;\n\tprivate _externalAdditionalPanels?: AdditionalPanelsDirective;\n\n\tprivate destroy$ = new Subject<void>();\n\n\tprivate panelEmitersHandler: Map<\n\t\tPanelType,\n\t\tEventEmitter<ChatPanelStatusEvent | ParticipantsPanelStatusEvent | SettingsPanelStatusEvent | ActivitiesPanelStatusEvent>\n\t> = new Map();\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate panelService: PanelService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate templateManagerService: TemplateManagerService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnInit(): void {\n\t\tthis.setupTemplates();\n\t\tthis.subscribeToPanelToggling();\n\t\tthis.panelEmitersHandler.set(PanelType.CHAT, this.onChatPanelStatusChanged);\n\t\tthis.panelEmitersHandler.set(PanelType.PARTICIPANTS, this.onParticipantsPanelStatusChanged);\n\t\tthis.panelEmitersHandler.set(PanelType.SETTINGS, this.onSettingsPanelStatusChanged);\n\t\tthis.panelEmitersHandler.set(PanelType.ACTIVITIES, this.onActivitiesPanelStatusChanged);\n\t}\n\n\t/**\n\t * @internal\n\t * Sets up all templates using the template manager service\n\t */\n\tprivate setupTemplates(): void {\n\t\tthis.templateConfig = this.templateManagerService.setupPanelTemplates(\n\t\t\tthis._externalParticipantPanel,\n\t\t\tthis._externalChatPanel,\n\t\t\tthis._externalActivitiesPanel,\n\t\t\tthis._externalAdditionalPanels\n\t\t);\n\n\t\t// Apply templates to component properties for backward compatibility\n\t\tthis.applyTemplateConfiguration();\n\t}\n\n\t/**\n\t * @internal\n\t * Applies the template configuration to component properties\n\t */\n\tprivate applyTemplateConfiguration(): void {\n\t\tif (this.templateConfig.participantsPanelTemplate) {\n\t\t\tthis.participantsPanelTemplate = this.templateConfig.participantsPanelTemplate;\n\t\t}\n\t\tif (this.templateConfig.chatPanelTemplate) {\n\t\t\tthis.chatPanelTemplate = this.templateConfig.chatPanelTemplate;\n\t\t}\n\t\tif (this.templateConfig.activitiesPanelTemplate) {\n\t\t\tthis.activitiesPanelTemplate = this.templateConfig.activitiesPanelTemplate;\n\t\t}\n\t\tif (this.templateConfig.additionalPanelsTemplate) {\n\t\t\tthis.additionalPanelsTemplate = this.templateConfig.additionalPanelsTemplate;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Updates templates and triggers change detection\n\t */\n\tprivate updateTemplatesAndMarkForCheck(): void {\n\t\tthis.setupTemplates();\n\t\tthis.cd.markForCheck();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy() {\n\t\tthis.isChatPanelOpened = false;\n\t\tthis.isParticipantsPanelOpened = false;\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\tprivate subscribeToPanelToggling() {\n\t\tthis.panelService.panelStatusObs.pipe(skip(1), takeUntil(this.destroy$)).subscribe((ev: PanelStatusInfo) => {\n\t\t\tthis.isChatPanelOpened = ev.isOpened && ev.panelType === PanelType.CHAT;\n\t\t\tthis.isParticipantsPanelOpened = ev.isOpened && ev.panelType === PanelType.PARTICIPANTS;\n\t\t\tthis.isBackgroundEffectsPanelOpened = ev.isOpened && ev.panelType === PanelType.BACKGROUND_EFFECTS;\n\t\t\tthis.isSettingsPanelOpened = ev.isOpened && ev.panelType === PanelType.SETTINGS;\n\t\t\tthis.isActivitiesPanelOpened = ev.isOpened && ev.panelType === PanelType.ACTIVITIES;\n\t\t\tthis.isExternalPanelOpened =\n\t\t\t\tev.isOpened &&\n\t\t\t\t!this.isSettingsPanelOpened &&\n\t\t\t\t!this.isBackgroundEffectsPanelOpened &&\n\t\t\t\t!this.isChatPanelOpened &&\n\t\t\t\t!this.isParticipantsPanelOpened &&\n\t\t\t\t!this.isActivitiesPanelOpened;\n\t\t\tthis.cd.markForCheck();\n\n\t\t\tthis.sendPanelStatusChangedEvent(ev);\n\t\t});\n\t}\n\n\tprivate sendPanelStatusChangedEvent(event: PanelStatusInfo) {\n\t\tconst { panelType, isOpened, previousPanelType } = event;\n\n\t\t// Emit to the current panel\n\t\tif (panelType) {\n\t\t\tconst panelMatch = this.panelEmitersHandler.get(panelType as PanelType);\n\t\t\tif (panelMatch) panelMatch.emit({ isOpened });\n\t\t}\n\n\t\t// Emit to the previous panel if it's different from the current one\n\t\tif (previousPanelType && panelType !== previousPanelType) {\n\t\t\tconst previousPanelMatch = this.panelEmitersHandler.get(previousPanelType as PanelType);\n\t\t\tif (previousPanelMatch) previousPanelMatch.emit({ isOpened: false });\n\t\t}\n\t}\n}\n","<!-- CHAT panel -->\n<ng-container *ngIf=\"isChatPanelOpened\">\n\t<ng-container *ngTemplateOutlet=\"chatPanelTemplate\"></ng-container>\n</ng-container>\n\n\n<!-- PARTICIPANTS panel -->\n<ng-container *ngIf=\"isParticipantsPanelOpened\">\n\t<ng-container *ngTemplateOutlet=\"participantsPanelTemplate\"></ng-container>\n</ng-container>\n\n<!-- Background effects panel -->\n<ng-container *ngIf=\"isBackgroundEffectsPanelOpened\">\n\t<ng-container *ngTemplateOutlet=\"backgroundEffectsPanelTemplate\"></ng-container>\n</ng-container>\n\n<!-- Settings panel -->\n<ng-container *ngIf=\"isSettingsPanelOpened\">\n\t<ng-container *ngTemplateOutlet=\"settingsPanelTemplate\"></ng-container>\n</ng-container>\n\n<!-- Activities panel -->\n<ng-container *ngIf=\"isActivitiesPanelOpened\">\n\t<ng-container *ngTemplateOutlet=\"activitiesPanelTemplate\"></ng-container>\n</ng-container>\n\n<!-- External additional panels  -->\n<ng-container *ngIf=\"additionalPanelsTemplate && isExternalPanelOpened\">\n\t<ng-container *ngTemplateOutlet=\"additionalPanelsTemplate\"></ng-container>\n</ng-container>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, Input, OnDestroy, OnInit, TemplateRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ParticipantPanelItemElementsDirective } from '../../../../directives/template/openvidu-components-angular.directive';\nimport { ParticipantPanelParticipantBadgeDirective } from '../../../../directives/template/internals.directive';\nimport { ParticipantModel } from '../../../../models/participant.model';\nimport { OpenViduComponentsConfigService } from '../../../../services/config/directive-config.service';\nimport { ParticipantService } from '../../../../services/participant/participant.service';\nimport { TemplateManagerService, ParticipantPanelItemTemplateConfiguration } from '../../../../services/template/template-manager.service';\n\n/**\n * The **ParticipantPanelItemComponent** is hosted inside of the {@link ParticipantsPanelComponent}.\n * It displays participant information with enhanced UI/UX, including support for custom content\n * injection through structural directives.\n */\n@Component({\n\tselector: 'ov-participant-panel-item',\n\ttemplateUrl: './participant-panel-item.component.html',\n\tstyleUrls: ['./participant-panel-item.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class ParticipantPanelItemComponent implements OnInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('participantPanelItemElements', { read: TemplateRef }) participantPanelItemElementsTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\tshowMuteButton: boolean = true;\n\tprivate muteButtonSub: Subscription;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ParticipantPanelItemElementsDirective)\n\tset externalItemElements(externalItemElements: ParticipantPanelItemElementsDirective) {\n\t\tthis._externalItemElements = externalItemElements;\n\t\tif (externalItemElements) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ParticipantPanelParticipantBadgeDirective)\n\tset externalParticipantBadge(participantBadge: ParticipantPanelParticipantBadgeDirective) {\n\t\tthis._externalParticipantBadge = participantBadge;\n\t\tif (participantBadge) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Template configuration managed by the service\n\t */\n\ttemplateConfig: ParticipantPanelItemTemplateConfiguration = {};\n\n\t// Store directive references for template setup\n\tprivate _externalItemElements?: ParticipantPanelItemElementsDirective;\n\tprivate _externalParticipantBadge?: ParticipantPanelParticipantBadgeDirective;\n\n\t/**\n\t * The participant to be displayed\n\t */\n\t@Input()\n\tset participant(participant: ParticipantModel) {\n\t\tthis._participant = participant;\n\t\tthis.cd.markForCheck();\n\t}\n\n\t/**\n\t * @internal\n\t * Current participant being displayed\n\t */\n\t_participant: ParticipantModel;\n\n\t/**\n\t * Whether to show the mute button for remote participants\n\t */\n\t@Input()\n\tmuteButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate templateManagerService: TemplateManagerService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnInit(): void {\n\t\tthis.setupTemplates();\n\t\tthis.subscribeToParticipantPanelItemDirectives();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tif (this.muteButtonSub) this.muteButtonSub.unsubscribe();\n\t}\n\n\t/**\n\t * Toggles the mute state of a remote participant\n\t */\n\ttoggleMuteForcibly() {\n\t\tif (this._participant && !this._participant.isLocal) {\n\t\t\tthis.participantService.setRemoteMutedForcibly(this._participant.sid, !this._participant.isMutedForcibly);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the template for local participant badge\n\t */\n\tget participantBadgeTemplate(): TemplateRef<any> | undefined {\n\t\treturn this._externalParticipantBadge?.template;\n\t}\n\n\t/**\n\t * Checks if the current participant is the local participant\n\t */\n\tget isLocalParticipant(): boolean {\n\t\treturn this._participant?.isLocal || false;\n\t}\n\n\t/**\n\t * Gets the participant's display name\n\t */\n\tget participantDisplayName(): string {\n\t\treturn this._participant?.name || '';\n\t}\n\n\t/**\n\t * Checks if external elements are available\n\t */\n\tget hasExternalElements(): boolean {\n\t\treturn !!this.participantPanelItemElementsTemplate;\n\t}\n\n\t/**\n\t * @internal\n\t * Sets up all templates using the template manager service\n\t */\n\tprivate setupTemplates(): void {\n\t\tthis.templateConfig = this.templateManagerService.setupParticipantPanelItemTemplates(this._externalItemElements);\n\n\t\t// Apply templates to component properties for backward compatibility\n\t\tthis.applyTemplateConfiguration();\n\t}\n\n\t/**\n\t * @internal\n\t * Applies the template configuration to component properties\n\t */\n\tprivate applyTemplateConfiguration(): void {\n\t\tif (this.templateConfig.participantPanelItemElementsTemplate) {\n\t\t\tthis.participantPanelItemElementsTemplate = this.templateConfig.participantPanelItemElementsTemplate;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Updates templates and triggers change detection\n\t */\n\tprivate updateTemplatesAndMarkForCheck(): void {\n\t\tthis.setupTemplates();\n\t\tthis.cd.markForCheck();\n\t}\n\n\tprivate subscribeToParticipantPanelItemDirectives() {\n\t\tthis.muteButtonSub = this.libService.participantItemMuteButton$.subscribe((value: boolean) => {\n\t\t\tthis.showMuteButton = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n}\n","<mat-list>\n\t<mat-list-item>\n\t\t<!-- Main participant container with improved structure -->\n\t\t<div class=\"participant-container\" [attr.data-participant-id]=\"_participant?.sid\" [attr.data-participant-name]=\"participantDisplayName\">\n\t\t\t<!-- Avatar section with dynamic color -->\n\t\t\t<div\n\t\t\t\tclass=\"participant-avatar\"\n\t\t\t\t[style.background-color]=\"_participant?.colorProfile\"\n\t\t\t\t[attr.aria-label]=\"'Avatar for ' + participantDisplayName\"\n\t\t\t>\n\t\t\t\t<mat-icon>{{ _participant.hasEncryptionError ? 'lock_person' : 'person' }}</mat-icon>\n\t\t\t</div>\n\n\t\t\t<!-- Content section with name and status -->\n\t\t\t<div class=\"participant-content\">\n\t\t\t\t<!-- Name row with better space management -->\n\t\t\t\t<div class=\"participant-name-row\">\n\t\t\t\t\t<div class=\"participant-name\">\n\t\t\t\t\t\t<span class=\"participant-name-text\">{{ participantDisplayName }}</span>\n\t\t\t\t\t\t<span *ngIf=\"isLocalParticipant\" class=\"local-indicator\">\n\t\t\t\t\t\t\t{{ 'PANEL.PARTICIPANTS.YOU' | translate }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Participant badges in separate container -->\n\t\t\t\t\t<div class=\"participant-badges\">\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"participantBadgeTemplate\"></ng-container>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t@if (!_participant.hasEncryptionError) {\n\t\t\t\t\t<div class=\"participant-subtitle\">\n\t\t\t\t\t\t<span class=\"status-indicator\">\n\t\t\t\t\t\t\t{{ _participant | tracksPublishedTypes }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<!-- Action buttons section -->\n\t\t\t@if (!_participant.hasEncryptionError) {\n\t\t\t\t<div class=\"participant-action-buttons\">\n\t\t\t\t\t<!-- Mute/Unmute button for remote participants -->\n\t\t\t\t\t<button\n\t\t\t\t\t\tmat-icon-button\n\t\t\t\t\t\tid=\"mute-btn\"\n\t\t\t\t\t\t*ngIf=\"!isLocalParticipant && showMuteButton\"\n\t\t\t\t\t\t[class.warn-btn]=\"_participant?.isMutedForcibly\"\n\t\t\t\t\t\t(click)=\"toggleMuteForcibly()\"\n\t\t\t\t\t\t[disabled]=\"!_participant\"\n\t\t\t\t\t\t[disableRipple]=\"true\"\n\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t_participant?.isMutedForcibly\n\t\t\t\t\t\t\t\t? ('PANEL.PARTICIPANTS.UNMUTE' | translate) + ' ' + participantDisplayName\n\t\t\t\t\t\t\t\t: ('PANEL.PARTICIPANTS.MUTE' | translate) + ' ' + participantDisplayName\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[matTooltip]=\"\n\t\t\t\t\t\t\t_participant?.isMutedForcibly\n\t\t\t\t\t\t\t\t? ('PANEL.PARTICIPANTS.UNMUTE' | translate)\n\t\t\t\t\t\t\t\t: ('PANEL.PARTICIPANTS.MUTE' | translate)\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<mat-icon *ngIf=\"!_participant?.isMutedForcibly\">volume_up</mat-icon>\n\t\t\t\t\t\t<mat-icon *ngIf=\"_participant?.isMutedForcibly\">volume_off</mat-icon>\n\t\t\t\t\t</button>\n\n\t\t\t\t\t<!-- External item elements with improved structure -->\n\t\t\t\t\t<div class=\"external-elements\" *ngIf=\"hasExternalElements\">\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"participantPanelItemElementsTemplate\"></ng-container>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t</mat-list-item>\n</mat-list>\n","import {\n\tAfterViewInit,\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tContentChild,\n\tOnDestroy,\n\tOnInit,\n\tTemplateRef,\n\tViewChild\n} from '@angular/core';\n// import { ParticipantModel } from '../../../../models/participant.model';\nimport { ParticipantService } from '../../../../services/participant/participant.service';\nimport { PanelService } from '../../../../services/panel/panel.service';\nimport { ParticipantPanelItemDirective } from '../../../../directives/template/openvidu-components-angular.directive';\nimport { Subject, takeUntil } from 'rxjs';\nimport { ParticipantModel } from '../../../../models/participant.model';\nimport { TemplateManagerService, ParticipantsPanelTemplateConfiguration } from '../../../../services/template/template-manager.service';\nimport { OpenViduComponentsConfigService } from '../../../../services/config/directive-config.service';\n\n/**\n * The **ParticipantsPanelComponent** is hosted inside of the {@link PanelComponent}.\n * It is in charge of displaying the participants connected to the session.\n * This component is composed by the {@link ParticipantPanelItemComponent}.\n */\n@Component({\n\tselector: 'ov-participants-panel',\n\ttemplateUrl: './participants-panel.component.html',\n\tstyleUrls: ['../../panel.component.scss', './participants-panel.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class ParticipantsPanelComponent implements OnInit, OnDestroy, AfterViewInit {\n\t/**\n\t * @ignore\n\t */\n\tlocalParticipant: ParticipantModel | undefined;\n\t/**\n\t * @ignore\n\t */\n\tremoteParticipants: ParticipantModel[] = [];\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild('defaultParticipantPanelItem', { static: false, read: TemplateRef }) defaultParticipantPanelItemTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('participantPanelItem', { read: TemplateRef }) participantPanelItemTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('participantPanelAfterLocalParticipant', { read: TemplateRef })\n\tparticipantPanelAfterLocalParticipantTemplate: TemplateRef<any>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ParticipantPanelItemDirective)\n\tset externalParticipantPanelItem(externalParticipantPanelItem: ParticipantPanelItemDirective) {\n\t\tthis._externalParticipantPanelItem = externalParticipantPanelItem;\n\t\tif (externalParticipantPanelItem) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Template configuration managed by the service\n\t */\n\ttemplateConfig: ParticipantsPanelTemplateConfiguration = {};\n\n\t// Store directive references for template setup\n\tprivate _externalParticipantPanelItem?: ParticipantPanelItemDirective;\n\n\tprivate destroy$ = new Subject<void>();\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate participantService: ParticipantService,\n\t\tprivate panelService: PanelService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate templateManagerService: TemplateManagerService,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnInit(): void {\n\t\tthis.setupTemplates();\n\n\t\tthis.subscribeToParticipantsChanges();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngAfterViewInit() {\n\t\tif (!this.participantPanelItemTemplate) {\n\t\t\t// the user has override the default participants panel but not the 'participant-panel-item'\n\t\t\t// so the default component must be injected\n\t\t\tthis.participantPanelItemTemplate = this.defaultParticipantPanelItemTemplate;\n\t\t\tthis.cd.detectChanges();\n\t\t}\n\t}\n\n\tprivate subscribeToParticipantsChanges() {\n\t\tthis.participantService.localParticipant$.pipe(takeUntil(this.destroy$)).subscribe((p: ParticipantModel | undefined) => {\n\t\t\tif (p) {\n\t\t\t\tthis.localParticipant = p;\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\n\t\tthis.participantService.remoteParticipants$.pipe(takeUntil(this.destroy$)).subscribe((p: ParticipantModel[]) => {\n\t\t\tthis.remoteParticipants = p;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\n\t/**\n\t * @internal\n\t * Sets up all templates using the template manager service\n\t */\n\tprivate setupTemplates(): void {\n\t\tthis.templateConfig = this.templateManagerService.setupParticipantsPanelTemplates(\n\t\t\tthis._externalParticipantPanelItem,\n\t\t\tthis.defaultParticipantPanelItemTemplate\n\t\t);\n\n\t\t// Apply templates to component properties for backward compatibility\n\t\tthis.applyTemplateConfiguration();\n\t}\n\n\t/**\n\t * @internal\n\t * Applies the template configuration to component properties\n\t */\n\tprivate applyTemplateConfiguration(): void {\n\t\tif (this.templateConfig.participantPanelItemTemplate) {\n\t\t\tthis.participantPanelItemTemplate = this.templateConfig.participantPanelItemTemplate;\n\t\t}\n\t\tif (this.templateConfig.participantPanelAfterLocalParticipantTemplate) {\n\t\t\tthis.participantPanelAfterLocalParticipantTemplate = this.templateConfig.participantPanelAfterLocalParticipantTemplate;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Updates templates and triggers change detection\n\t */\n\tprivate updateTemplatesAndMarkForCheck(): void {\n\t\tthis.setupTemplates();\n\t\tthis.cd.markForCheck();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclose() {\n\t\tthis.panelService.closePanel();\n\t}\n}\n","<div class=\"panel-container\" id=\"participants-container\">\n\t<div class=\"panel-header-container\">\n\t\t<h3 class=\"panel-title\">{{ 'PANEL.PARTICIPANTS.TITLE' | translate }}</h3>\n\t\t<button class=\"panel-close-button\" mat-icon-button matTooltip=\"{{ 'PANEL.CLOSE' | translate }}\" (click)=\"close()\">\n\t\t\t<mat-icon>close</mat-icon>\n\t\t</button>\n\t</div>\n\n\t<div class=\"scrollable\">\n\t\t<div class=\"local-participant-container\" *ngIf=\"localParticipant\">\n\t\t\t<ng-container *ngTemplateOutlet=\"participantPanelItemTemplate; context: { $implicit: localParticipant }\"></ng-container>\n\t\t\t<mat-divider *ngIf=\"true\"></mat-divider>\n\t\t</div>\n\t\t<ng-container *ngTemplateOutlet=\"participantPanelAfterLocalParticipantTemplate\"></ng-container>\n\n\t\t<div class=\"remote-participants-container\" id=\"remote-participants-container\" *ngIf=\"remoteParticipants.length > 0\">\n\t\t\t<div *ngFor=\"let participant of this.remoteParticipants\" id=\"remote-participant-item\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"participantPanelItemTemplate; context: { $implicit: participant }\"></ng-container>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n\n<ng-template #defaultParticipantPanelItem let-participant>\n\t<ov-participant-panel-item [participant]=\"participant\" id=\"default-participant-panel-item\"></ov-participant-panel-item>\n</ng-template>\n","import { OverlayContainer } from '@angular/cdk/overlay';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class CdkOverlayContainer extends OverlayContainer {\n\tprivate readonly cdkContainerClass: string = '.cdk-overlay-container';\n\tprivate defaultSelector = 'body';\n\tprivate currentSelector = this.defaultSelector;\n\n\tsetContainerSelector(selector: string): void {\n\t\tconst newContainer = this.getElementWithSelector(selector);\n\t\tconst overlayContainerElement = this.getElementWithSelector(this.cdkContainerClass);\n\t\tconst currentContainer = this.getElementWithSelector(this.currentSelector);\n\n\t\tif (newContainer === currentContainer) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (newContainer && currentContainer && overlayContainerElement) {\n\t\t\tcurrentContainer.removeChild(overlayContainerElement);\n\t\t\tnewContainer.appendChild(overlayContainerElement);\n\t\t\tthis.currentSelector = selector;\n\t\t} else {\n\t\t\tconsole.error(`Failed to find fullscreen element with selector: ${selector}`);\n\t\t}\n\t}\n\n\tprivate getElementWithSelector(selector: string): Element | null {\n\t\treturn document.querySelector(selector);\n\t}\n}\n","import { Injectable } from '@angular/core';\nimport { CdkOverlayContainer } from '../../config/custom-cdk-overlay';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class CdkOverlayService {\n\tconstructor(private cdkOverlayModel: CdkOverlayContainer) {}\n\n\tsetSelector(selector: string) {\n\t\tthis.cdkOverlayModel.setContainerSelector(selector);\n\t}\n}\n","import { Component } from '@angular/core';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-audio-wave',\n\ttemplate: `\n\t\t<div class=\"audio-container audio-wave-indicator\">\n\t\t\t<div class=\"stick normal play\"></div>\n\t\t\t<div class=\"stick loud play\"></div>\n\t\t\t<div class=\"stick normal play\"></div>\n\t\t</div>\n\t`,\n\tstyleUrls: ['./audio-wave.component.scss'],\n\tstandalone: false\n})\nexport class AudioWaveComponent {}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n\tselector: 'ov-video-poster',\n\ttemplateUrl: './video-poster.component.html',\n\tstyleUrl: './video-poster.component.scss',\n\tstandalone: false\n})\nexport class VideoPosterComponent {\n\tletter: string = '';\n\n\t@Input()\n\tset nickname(name: string) {\n\t\tif (name) this.letter = name[0];\n\t}\n\t@Input() color: string = '#000000';\n\t@Input() showAvatar: boolean = true;\n\n\t@Input() hasEncryptionError: boolean = false;\n}\n","@if (hasEncryptionError) {\n\t<div class=\"encryption-error-poster\">\n\t\t<div class=\"encryption-error-content\">\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\twidth=\"48\"\n\t\t\t\theight=\"48\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\"\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t>\n\t\t\t\t<rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\n\t\t\t\t<path d=\"M7 11V7a5 5 0 0 1 9.9-1\"></path>\n\t\t\t\t<line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"18\"></line>\n\t\t\t</svg>\n\t\t\t<h3>{{ 'ERRORS.E2EE_ERROR_TITLE' | translate }}</h3>\n\t\t\t<p>{{ 'ERRORS.E2EE_ERROR_CONTENT' | translate }}</p>\n\t\t</div>\n\t</div>\n} @else if (showAvatar) {\n\t<div class=\"poster\" id=\"video-poster\">\n\t\t@if (letter) {\n\t\t\t<div class=\"initial\" [ngStyle]=\"{ 'background-color': color }\">\n\t\t\t\t<span id=\"poster-text\">{{ letter }}</span>\n\t\t\t</div>\n\t\t}\n\t</div>\n}\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport { AfterViewInit, Component, ElementRef, Input, OnDestroy, ViewChild } from '@angular/core';\nimport { Track } from 'livekit-client';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-media-element',\n\ttemplate: `\n\t\t<ov-video-poster\n\t\t\t@posterAnimation\n\t\t\t[showAvatar]=\"showAvatar\"\n\t\t\t[nickname]=\"avatarName\"\n\t\t\t[color]=\"avatarColor\"\n\t\t\t[hasEncryptionError]=\"hasEncryptionError\"\n\t\t></ov-video-poster>\n\t\t<video #videoElement *ngIf=\"_track?.kind === 'video'\" class=\"OV_video-element\" [attr.id]=\"_track?.sid\"></video>\n\t\t<audio #audioElement *ngIf=\"_track?.kind === 'audio'\" [attr.id]=\"_track?.sid\"></audio>\n\t`,\n\tstyleUrls: ['./media-element.component.scss'],\n\tanimations: [\n\t\ttrigger('posterAnimation', [\n\t\t\ttransition(':enter', [style({ opacity: 0 }), animate('100ms', style({ opacity: 1 }))]),\n\t\t\ttransition(':leave', [style({ opacity: 1 }), animate('200ms', style({ opacity: 0 }))])\n\t\t])\n\t],\n\tstandalone: false\n})\nexport class MediaElementComponent implements AfterViewInit, OnDestroy {\n\t_track: Track;\n\t_videoElement: ElementRef;\n\t_audioElement: ElementRef;\n\ttype: Track.Source = Track.Source.Camera;\n\tprivate _muted: boolean = false;\n\tprivate previousTrack: Track | null = null;\n\n\t@Input() showAvatar: boolean = false;\n\t@Input() avatarColor: string = '#000000';\n\t@Input() avatarName: string = 'User';\n\t@Input() isLocal: boolean = false;\n\t@Input() hasEncryptionError: boolean = false;\n\n\t@ViewChild('videoElement', { static: false })\n\tset videoElement(element: ElementRef) {\n\t\tthis._videoElement = element;\n\t\tthis.attachTracks();\n\t}\n\n\t@ViewChild('audioElement', { static: false })\n\tset audioElement(element: ElementRef) {\n\t\tthis._audioElement = element;\n\t\tthis.attachTracks();\n\t}\n\n\t@Input()\n\tset track(track: Track) {\n\t\tif (!track) return;\n\n\t\t// Detach previous track if it's different\n\t\tif (this.previousTrack && this.previousTrack !== track) {\n\t\t\tthis.detachPreviousTrack();\n\t\t}\n\n\t\tthis._track = track;\n\t\tthis.previousTrack = track;\n\t\tthis.attachTracks();\n\t}\n\n\t@Input()\n\tset muted(muted: boolean) {\n\t\tthis._muted = muted;\n\t\tif (this._audioElement && !this.isLocal) {\n\t\t\tthis.muteAudioTrack(this._muted);\n\t\t}\n\t}\n\n\tngAfterViewInit() {\n\t\tsetTimeout(() => {\n\t\t\tif (!this._track) return;\n\t\t\tthis.attachTracks();\n\t\t});\n\t}\n\n\tngOnDestroy() {\n\t\tthis.detachPreviousTrack();\n\t}\n\n\tprivate detachPreviousTrack() {\n\t\tif (this.previousTrack) {\n\t\t\t// Detach from video element\n\t\t\tif (this.isVideoTrack() && this._videoElement?.nativeElement) {\n\t\t\t\tthis.previousTrack.detach(this._videoElement.nativeElement);\n\t\t\t}\n\t\t\t// Detach from audio element\n\t\t\tif (this.isAudioTrack() && this._audioElement?.nativeElement) {\n\t\t\t\tthis.previousTrack.detach(this._audioElement.nativeElement);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateVideoStyles() {\n\t\tthis.type = this._track.source;\n\t\tif (this.type === Track.Source.ScreenShare) {\n\t\t\tthis._videoElement.nativeElement.style.objectFit = 'contain';\n\t\t\tthis._videoElement.nativeElement.classList.add('screen-type');\n\t\t} else if (this.type === Track.Source.Camera) {\n\t\t\tif (this.isLocal) {\n\t\t\t\tthis._videoElement.nativeElement.style.transform = 'scaleX(-1)';\n\t\t\t}\n\t\t\tthis._videoElement.nativeElement.style.objectFit = 'cover';\n\t\t\tthis._videoElement.nativeElement.classList.add('camera-type');\n\t\t}\n\t}\n\n\tprivate attachTracks() {\n\t\tif (this.isAudioTrack() && !!this._audioElement && !this.isLocal) {\n\t\t\tthis.attachAudioTrack();\n\t\t} else if (this.isVideoTrack() && !!this._videoElement) {\n\t\t\tthis.updateVideoStyles();\n\t\t\tthis.attachVideoTrack();\n\t\t}\n\t}\n\n\tprivate attachVideoTrack() {\n\t\tthis._track.attach(this._videoElement.nativeElement);\n\t}\n\n\tprivate attachAudioTrack() {\n\t\tthis._track.attach(this._audioElement.nativeElement);\n\t\tthis.muteAudioTrack(this._muted);\n\t}\n\tprivate muteAudioTrack(mute: boolean) {\n\t\tthis._audioElement.nativeElement.muted = mute;\n\t\tthis._track.mediaStreamTrack.enabled = !mute;\n\t}\n\n\tprivate isAudioTrack(): boolean {\n\t\treturn this._track?.kind === Track.Kind.Audio;\n\t}\n\n\tprivate isVideoTrack(): boolean {\n\t\treturn this._track?.kind === Track.Kind.Video;\n\t}\n}\n","import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { MatMenuPanel, MatMenuTrigger } from '@angular/material/menu';\nimport { Track } from 'livekit-client';\nimport { Subject, takeUntil } from 'rxjs';\nimport { ParticipantTrackPublication } from '../../models/participant.model';\nimport { CdkOverlayService } from '../../services/cdk-overlay/cdk-overlay.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { LayoutService } from '../../services/layout/layout.service';\nimport { ParticipantService } from '../../services/participant/participant.service';\n\n/**\n * The **StreamComponent** is hosted inside of the {@link LayoutComponent}.\n * It is in charge of displaying the participant video stream in the videoconference layout.\n */\n@Component({\n\tselector: 'ov-stream',\n\ttemplateUrl: './stream.component.html',\n\tstyleUrls: ['./stream.component.scss'],\n\tstandalone: false\n})\nexport class StreamComponent implements OnInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild(MatMenuTrigger) public menuTrigger: MatMenuTrigger;\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild('menu') menu: MatMenuPanel;\n\n\t/**\n\t * @ignore\n\t */\n\tvideoTypeEnum = Track.Source;\n\n\t/**\n\t * @ignore\n\t */\n\t_track: ParticipantTrackPublication | undefined;\n\n\t/**\n\t * @ignore\n\t */\n\tisMinimal: boolean = false;\n\t/**\n\t * @ignore\n\t */\n\tshowParticipantName: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tshowAudioDetection: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tshowVideoControls: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tshowVideo: boolean;\n\n\t/**\n\t * @ignore\n\t */\n\tmouseHovering: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\thoveringTimeout: ReturnType<typeof setTimeout>;\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild('streamContainer', { static: false, read: ElementRef })\n\tset streamContainer(streamContainer: ElementRef) {\n\t\tsetTimeout(() => {\n\t\t\tif (streamContainer) {\n\t\t\t\tthis._streamContainer = streamContainer;\n\t\t\t\t// This is a workaround for fixing a layout bug which provide a bad UX with each new elements created.\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showVideo = true;\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\t@Input()\n\tset track(track: ParticipantTrackPublication) {\n\t\tthis._track = track;\n\t}\n\n\tprivate _streamContainer: ElementRef;\n\tprivate destroy$ = new Subject<void>();\n\tprivate readonly HOVER_TIMEOUT = 2000;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate layoutService: LayoutService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate cdkSrv: CdkOverlayService,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngOnInit() {\n\t\tthis.subscribeToStreamDirectives();\n\t}\n\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.cdkSrv.setSelector('body');\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleVideoPinned() {\n\t\tconst sid = this._track?.trackSid;\n\t\tif (this._track?.participant) {\n\t\t\tif (this._track?.participant.isLocal) {\n\t\t\t\tif (this._track?.participant.isMinimized) {\n\t\t\t\t\tthis.participantService.toggleMyVideoMinimized(sid);\n\t\t\t\t}\n\t\t\t\tthis.participantService.toggleMyVideoPinned(sid);\n\t\t\t} else {\n\t\t\t\tthis.participantService.toggleRemoteVideoPinned(sid);\n\t\t\t}\n\t\t}\n\t\tthis.layoutService.update();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleMinimize() {\n\t\tconst sid = this._track?.trackSid;\n\t\tif (this._track?.participant && this._track?.participant.isLocal) {\n\t\t\tthis.participantService.toggleMyVideoMinimized(sid);\n\t\t\tthis.layoutService.update();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleVideoMenu(event) {\n\t\tif (this.menuTrigger.menuOpen) {\n\t\t\tthis.menuTrigger.closeMenu();\n\t\t\treturn;\n\t\t}\n\t\tthis.cdkSrv.setSelector('#container-' + this._track?.trackSid);\n\t\tthis.menuTrigger.openMenu();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleMuteForcibly() {\n\t\tif (this._track?.participant) {\n\t\t\tthis.participantService.setRemoteMutedForcibly(this._track?.participant.sid, !this._track?.isMutedForcibly);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tmouseHover(event: MouseEvent) {\n\t\tevent.preventDefault();\n\t\tclearTimeout(this.hoveringTimeout);\n\t\tthis.mouseHovering = true;\n\t\tthis.hoveringTimeout = setTimeout(() => {\n\t\t\tthis.mouseHovering = false;\n\t\t}, this.HOVER_TIMEOUT);\n\t}\n\n\tprivate subscribeToStreamDirectives() {\n\t\tthis.libService.minimal$\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe((value: boolean) => {\n\t\t\t\tthis.isMinimal = value;\n\t\t\t});\n\n\t\tthis.libService.displayParticipantName$\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe((value: boolean) => {\n\t\t\t\tthis.showParticipantName = value;\n\t\t\t\t// this.cd.markForCheck();\n\t\t\t});\n\n\t\tthis.libService.displayAudioDetection$\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe((value: boolean) => {\n\t\t\t\tthis.showAudioDetection = value;\n\t\t\t\t// this.cd.markForCheck();\n\t\t\t});\n\n\t\tthis.libService.streamVideoControls$\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe((value: boolean) => {\n\t\t\t\tthis.showVideoControls = value;\n\t\t\t\t// this.cd.markForCheck();\n\t\t\t});\n\t}\n}\n","<div\n\t*ngIf=\"_track.participant\"\n\t[ngClass]=\"{\n\t\tOV_stream: !_track.isAudioTrack || (_track.isAudioTrack && _track.participant.onlyHasAudioTracks),\n\t\t'no-size': !showVideo,\n\t\tlocal: _track.participant.isLocal,\n\t\tremote: !_track.participant.isLocal,\n\t\tspeaking: !isMinimal && showAudioDetection && _track.participant.isSpeaking && _track.isCameraTrack\n\t}\"\n\t[id]=\"'stream-' + _track.source + '-' + _track.trackSid\"\n\t(mousemove)=\"mouseHover($event)\"\n\t#streamContainer\n>\n\t<div\n\t\t*ngIf=\"!isMinimal && showParticipantName && !_track.isAudioTrack || (_track.isAudioTrack && _track.participant.onlyHasAudioTracks)\"\n\t\tid=\"participant-name-container\"\n\t\tclass=\"participant-name\"\n\t\t[class.fullscreen]=\"isFullscreen\"\n\t>\n\t\t<div class=\"participant-name-container\">\n\t\t\t<span id=\"participant-name\">{{ _track.participant.name }}</span>\n\t\t\t<span *ngIf=\"_track.isScreenTrack\" id=\"participant-name\">_SCREEN</span>\n\t\t</div>\n\t</div>\n\n\t<div *ngIf=\"!isMinimal && showAudioDetection && _track.participant.isSpeaking && _track.isCameraTrack\" id=\"audio-wave-container\">\n\t\t<ov-audio-wave></ov-audio-wave>\n\t</div>\n\n\t<ov-media-element\n\t\t[track]=\"_track.track\"\n\t\t[showAvatar]=\"_track.participant.onlyHasAudioTracks || (_track.isCameraTrack && !_track.participant.isCameraEnabled)\"\n\t\t[avatarColor]=\"_track.participant.colorProfile\"\n\t\t[avatarName]=\"_track.participant.name\"\n\t\t[muted]=\"_track.isMutedForcibly\"\n\t\t[isLocal]=\"_track.participant.isLocal\"\n\t\t[hasEncryptionError]=\"_track.participant.hasEncryptionError\"\n\t></ov-media-element>\n\n\t@if (!_track.participant.hasEncryptionError) {\n\t\t<div class=\"status-icons\" *ngIf=\"!_track.participant?.isMicrophoneEnabled || _track.isMutedForcibly || _track.isPinned\">\n\t\t\t<mat-icon id=\"status-mic\" fontIcon=\"mic_off\" *ngIf=\"!_track.participant?.isMicrophoneEnabled\"></mat-icon>\n\t\t\t<mat-icon id=\"status-muted-forcibly\" fontIcon=\"volume_off\" *ngIf=\"_track.isMutedForcibly\"></mat-icon>\n\t\t\t<mat-icon id=\"status-pinned\" fontIcon=\"push_pin\" *ngIf=\"_track.isPinned\"></mat-icon>\n\t\t</div>\n\n\t\t<div class=\"stream-video-controls\" *ngIf=\"!isMinimal && showVideoControls && mouseHovering\">\n\t\t\t<div class=\"flex-container\">\n\t\t\t\t<button\n\t\t\t\t\tmat-icon-button\n\t\t\t\t\tid=\"pin-btn\"\n\t\t\t\t\t(click)=\"toggleVideoPinned()\"\n\t\t\t\t\t[matTooltip]=\"_track.isPinned ? ('STREAM.UNPIN' | translate) : ('STREAM.PIN' | translate)\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon *ngIf=\"_track.isPinned\" fontSet=\"material-symbols-outlined\" fontIcon=\"keep\">keep_off</mat-icon>\n\t\t\t\t\t<mat-icon *ngIf=\"!_track.isPinned\" id=\"status-pinned\" fontIcon=\"push_pin\"></mat-icon>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\t*ngIf=\"!_track.participant.isLocal\"\n\t\t\t\t\tmat-icon-button\n\t\t\t\t\tid=\"silence-btn\"\n\t\t\t\t\t(click)=\"toggleMuteForcibly()\"\n\t\t\t\t\t[class.muted-btn]=\"_track.isMutedForcibly\"\n\t\t\t\t\t[matTooltip]=\"_track.isMutedForcibly ? ('STREAM.UNMUTE_SOUND' | translate) : ('STREAM.MUTE_SOUND' | translate)\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon *ngIf=\"_track.isMutedForcibly\">volume_off</mat-icon>\n\t\t\t\t\t<mat-icon *ngIf=\"!_track.isMutedForcibly\">volume_up</mat-icon>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\t*ngIf=\"_track.participant.isLocal\"\n\t\t\t\t\tmat-icon-button\n\t\t\t\t\tid=\"minimize-btn\"\n\t\t\t\t\t[disabled]=\"_track.isPinned\"\n\t\t\t\t\t(click)=\"toggleMinimize()\"\n\t\t\t\t\t[matTooltip]=\"_track.isMinimized ? ('STREAM.MAXIMIZE' | translate) : ('STREAM.MINIMIZE' | translate)\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon *ngIf=\"_track.isMinimized\">open_in_full</mat-icon>\n\t\t\t\t\t<mat-icon *ngIf=\"!_track.isMinimized\">close_fullscreen</mat-icon>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t}\n</div>\n","import { Component, ContentChild, EventEmitter, Output, TemplateRef, computed, inject, input } from '@angular/core';\nimport { RecordingStatus } from '../../../models/recording.model';\nimport { BroadcastingStatus } from '../../../models/broadcasting.model';\nimport { ToolbarAdditionalButtonsPosition } from '../../../models/toolbar.model';\nimport { ViewportService } from '../../../services/viewport/viewport.service';\nimport { ToolbarMoreOptionsAdditionalMenuItemsDirective } from '../../../directives/template/internals.directive';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-toolbar-media-buttons',\n\ttemplateUrl: './toolbar-media-buttons.component.html',\n\tstyleUrl: './toolbar-media-buttons.component.scss',\n\tstandalone: false\n})\nexport class ToolbarMediaButtonsComponent {\n\t// Camera related inputs\n\tshowCameraButton = input<boolean>(true);\n\tisCameraEnabled = input<boolean>(true);\n\tcameraMuteChanging = input<boolean>(false);\n\n\t// Microphone related inputs\n\tshowMicrophoneButton = input<boolean>(true);\n\tisMicrophoneEnabled = input<boolean>(true);\n\tmicrophoneMuteChanging = input<boolean>(false);\n\n\t// Screenshare related inputs\n\tshowScreenshareButton = input<boolean>(true);\n\tisScreenShareEnabled = input<boolean>(false);\n\tisFirefoxBrowser = input<boolean>(false);\n\n\t// Device availability inputs\n\thasVideoDevices = input<boolean>(true);\n\thasAudioDevices = input<boolean>(true);\n\n\t// Connection state inputs\n\tisConnectionLost = input<boolean>(false);\n\n\t// UI state inputs\n\tisMinimal = input<boolean>(false);\n\n\t// More options menu inputs\n\tshowMoreOptionsButton = input<boolean>(true);\n\tshowFullscreenButton = input<boolean>(true);\n\tshowRecordingButton = input<boolean>(true);\n\tshowViewRecordingsButton = input<boolean>(false);\n\tshowBroadcastingButton = input<boolean>(true);\n\tshowBackgroundEffectsButton = input<boolean>(true);\n\tshowCaptionsButton = input<boolean>(true);\n\tshowSettingsButton = input<boolean>(true);\n\n\t// Fullscreen state\n\tisFullscreenActive = input<boolean>(false);\n\n\t// Recording related inputs\n\trecordingStatus = input<RecordingStatus>(RecordingStatus.STOPPED);\n\thasRoomTracksPublished = input<boolean>(false);\n\n\t// Broadcasting related inputs\n\tbroadcastingStatus = input<BroadcastingStatus>(BroadcastingStatus.STOPPED);\n\n\t// Captions\n\tcaptionsEnabled = input<boolean>(false);\n\n\t// Leave button\n\tshowLeaveButton = input<boolean>(true);\n\n\t// Additional buttons template\n\ttoolbarAdditionalButtonsTemplate = input<TemplateRef<any> | null>(null);\n\tadditionalButtonsPosition = input<ToolbarAdditionalButtonsPosition | undefined>(undefined);\n\n\t// Leave button template\n\ttoolbarLeaveButtonTemplate = input<TemplateRef<any> | null>(null);\n\n\t/**\n\t * @internal\n\t * ContentChild for custom menu items in more options menu\n\t */\n\t@ContentChild(ToolbarMoreOptionsAdditionalMenuItemsDirective)\n\texternalMoreOptionsAdditionalMenuItems!: ToolbarMoreOptionsAdditionalMenuItemsDirective;\n\n\t/**\n\t * @internal\n\t * Gets the template for additional menu items in more options\n\t */\n\tget moreOptionsAdditionalMenuItemsTemplate(): TemplateRef<any> | undefined {\n\t\treturn this.externalMoreOptionsAdditionalMenuItems?.template;\n\t}\n\n\t// Status enums for template usage\n\t_recordingStatus = RecordingStatus;\n\t_broadcastingStatus = BroadcastingStatus;\n\n\t// Viewport service for responsive behavior\n\tprivate viewportService = inject(ViewportService);\n\n\t// Computed properties for responsive button grouping\n\treadonly isMobileView = computed(() => this.viewportService.isMobile());\n\treadonly isTabletView = computed(() => this.viewportService.isTablet());\n\treadonly isDesktopView = computed(() => this.viewportService.isDesktop());\n\n\t// Essential buttons that always stay visible\n\treadonly showCameraButtonDirect = computed(() => this.showCameraButton() && !this.isMinimal());\n\n\treadonly showMicrophoneButtonDirect = computed(() => this.showMicrophoneButton() && !this.isMinimal());\n\n\t// Screenshare button - visible on tablet+ or when already active\n\treadonly showScreenshareButtonDirect = computed(\n\t\t() => this.showScreenshareButton() && !this.isMinimal() && (!this.isMobileView() || this.isScreenShareEnabled())\n\t);\n\n\t// More options button - always visible when not minimal\n\treadonly showMoreOptionsButtonDirect = computed(() => this.showMoreOptionsButton() && !this.isMinimal());\n\n\t// Check if there are active features that should show a badge on More Options\n\treadonly hasActiveFeatures = computed(\n\t\t() =>\n\t\t\tthis.isScreenShareEnabled() ||\n\t\t\tthis.recordingStatus() === this._recordingStatus.STARTED ||\n\t\t\tthis.broadcastingStatus() === this._broadcastingStatus.STARTED\n\t);\n\n\t// Check if additional buttons should be shown outside (desktop/tablet) or inside More Options (mobile)\n\treadonly showAdditionalButtonsOutside = computed(() => {\n\t\treturn !this.isMobileView() && this.toolbarAdditionalButtonsTemplate();\n\t});\n\n\t// Check if additional buttons should be shown inside More Options menu (mobile only)\n\treadonly showAdditionalButtonsInsideMenu = computed(() => {\n\t\treturn this.isMobileView() && this.toolbarAdditionalButtonsTemplate();\n\t});\n\n\t// Media button outputs\n\t@Output() cameraToggled = new EventEmitter<void>();\n\t@Output() microphoneToggled = new EventEmitter<void>();\n\t@Output() screenShareToggled = new EventEmitter<void>();\n\t@Output() screenTrackReplaced = new EventEmitter<void>();\n\n\t// More options menu outputs\n\t@Output() fullscreenToggled = new EventEmitter<void>();\n\t@Output() recordingToggled = new EventEmitter<void>();\n\t@Output() viewRecordingsClicked = new EventEmitter<void>();\n\t@Output() broadcastingToggled = new EventEmitter<void>();\n\t@Output() backgroundEffectsToggled = new EventEmitter<void>();\n\t@Output() captionsToggled = new EventEmitter<void>();\n\t@Output() settingsToggled = new EventEmitter<void>();\n\n\t// Leave button output\n\t@Output() leaveClicked = new EventEmitter<void>();\n\n\t// Event handler methods\n\tonCameraToggle(): void {\n\t\tthis.cameraToggled.emit();\n\t}\n\n\tonMicrophoneToggle(): void {\n\t\tthis.microphoneToggled.emit();\n\t}\n\n\tonScreenShareToggle(): void {\n\t\tthis.screenShareToggled.emit();\n\t}\n\n\tonScreenTrackReplace(): void {\n\t\tthis.screenTrackReplaced.emit();\n\t}\n\n\tonFullscreenToggle(): void {\n\t\tthis.fullscreenToggled.emit();\n\t}\n\n\tonRecordingToggle(): void {\n\t\tthis.recordingToggled.emit();\n\t}\n\n\tonViewRecordingsClick(): void {\n\t\tthis.viewRecordingsClicked.emit();\n\t}\n\n\tonBroadcastingToggle(): void {\n\t\tthis.broadcastingToggled.emit();\n\t}\n\n\tonBackgroundEffectsToggle(): void {\n\t\tthis.backgroundEffectsToggled.emit();\n\t}\n\n\tonCaptionsToggle(): void {\n\t\tthis.captionsToggled.emit();\n\t}\n\n\tonSettingsToggle(): void {\n\t\tthis.settingsToggled.emit();\n\t}\n\n\tonLeaveClick(): void {\n\t\tthis.leaveClicked.emit();\n\t}\n}\n","<!-- Camera button -->\n@if (showCameraButtonDirect()) {\n\t<button\n\t\tid=\"camera-btn\"\n\t\tmat-icon-button\n\t\t(click)=\"onCameraToggle()\"\n\t\t[disabled]=\"isConnectionLost() || !hasVideoDevices() || cameraMuteChanging()\"\n\t\t[class.disabled]=\"!isCameraEnabled()\"\n\t\t[class.mobile-btn]=\"isMobileView()\"\n\t\t[matTooltip]=\"isCameraEnabled() ? ('TOOLBAR.STOP_VIDEO' | translate) : ('TOOLBAR.START_VIDEO' | translate)\"\n\t\t[matTooltipDisabled]=\"!hasVideoDevices()\"\n\t>\n\t\t<mat-icon [id]=\"isCameraEnabled() ? 'videocam' : 'videocam_off'\">\n\t\t\t{{ isCameraEnabled() ? 'videocam' : 'videocam_off' }}\n\t\t</mat-icon>\n\t</button>\n}\n\n<!-- Microphone button -->\n@if (showMicrophoneButtonDirect()) {\n\t<button\n\t\tid=\"mic-btn\"\n\t\tmat-icon-button\n\t\t(click)=\"onMicrophoneToggle()\"\n\t\t[disabled]=\"isConnectionLost() || !hasAudioDevices() || microphoneMuteChanging()\"\n\t\t[class.disabled]=\"!isMicrophoneEnabled()\"\n\t\t[class.mobile-btn]=\"isMobileView()\"\n\t\t[matTooltip]=\"isMicrophoneEnabled() ? ('TOOLBAR.MUTE_AUDIO' | translate) : ('TOOLBAR.UNMUTE_AUDIO' | translate)\"\n\t\t[matTooltipDisabled]=\"!hasAudioDevices()\"\n\t>\n\t\t<mat-icon [id]=\"isMicrophoneEnabled() ? 'mic' : 'mic_off'\">\n\t\t\t{{ isMicrophoneEnabled() ? 'mic' : 'mic_off' }}\n\t\t</mat-icon>\n\t</button>\n}\n\n<!-- Screenshare button - Only visible on tablet+ or when active -->\n@if (showScreenshareButtonDirect()) {\n\t@if (isFirefoxBrowser()) {\n\t\t<button\n\t\t\tmat-icon-button\n\t\t\tid=\"screenshare-btn\"\n\t\t\t[disabled]=\"isConnectionLost()\"\n\t\t\t[class.active-btn]=\"isScreenShareEnabled()\"\n\t\t\t[class.mobile-btn]=\"isMobileView()\"\n\t\t\tmatTooltip=\"{{ isScreenShareEnabled() ? ('TOOLBAR.DISABLE_SCREEN' | translate) : ('TOOLBAR.ENABLE_SCREEN' | translate) }}\"\n\t\t\t(click)=\"onScreenShareToggle()\"\n\t\t>\n\t\t\t<mat-icon>screen_share</mat-icon>\n\t\t</button>\n\t} @else {\n\t\t<button\n\t\t\tmat-icon-button\n\t\t\tid=\"screenshare-btn\"\n\t\t\t[matMenuTriggerFor]=\"isScreenShareEnabled() ? screenshareMenu : null\"\n\t\t\t[disabled]=\"isConnectionLost()\"\n\t\t\t[class.active-btn]=\"isScreenShareEnabled()\"\n\t\t\t[class.mobile-btn]=\"isMobileView()\"\n\t\t\tmatTooltip=\"{{ isScreenShareEnabled() ? ('TOOLBAR.DISABLE_SCREEN' | translate) : ('TOOLBAR.ENABLE_SCREEN' | translate) }}\"\n\t\t\t(click)=\"!isScreenShareEnabled() && onScreenShareToggle()\"\n\t\t>\n\t\t\t<mat-icon>screen_share</mat-icon>\n\t\t</button>\n\n\t\t<!-- Screenshare button menu -->\n\t\t<mat-menu #screenshareMenu=\"matMenu\" id=\"screenshare-menu\">\n\t\t\t<button mat-menu-item (click)=\"onScreenTrackReplace()\" id=\"replace-screen-button\">\n\t\t\t\t<mat-icon>picture_in_picture</mat-icon>\n\t\t\t\t<span>{{ 'STREAM.REPLACE_SCREEN' | translate }}</span>\n\t\t\t</button>\n\t\t\t<mat-divider class=\"divider\"></mat-divider>\n\t\t\t<button mat-menu-item (click)=\"onScreenShareToggle()\" id=\"disable-screen-button\">\n\t\t\t\t<mat-icon>stop_screen_share</mat-icon>\n\t\t\t\t<span>{{ 'TOOLBAR.DISABLE_SCREEN' | translate }}</span>\n\t\t\t</button>\n\t\t</mat-menu>\n\t}\n}\n\n<!-- Additional buttons injection from parent component (desktop/tablet only) -->\n@if (showAdditionalButtonsOutside() && additionalButtonsPosition() === 'beforeMenu') {\n\t<ng-container *ngTemplateOutlet=\"toolbarAdditionalButtonsTemplate(); context: { $implicit: additionalButtonsPosition() }\"></ng-container>\n}\n\n<!-- More options button -->\n@if (showMoreOptionsButtonDirect()) {\n\t<button\n\t\tmat-icon-button\n\t\tid=\"more-options-btn\"\n\t\t[matMenuTriggerFor]=\"settingsMenu\"\n\t\t[disabled]=\"isConnectionLost()\"\n\t\t[class.mobile-btn]=\"isMobileView()\"\n\t\tmatTooltip=\"{{ 'TOOLBAR.MORE_OPTIONS' | translate }}\"\n\t>\n\t\t<mat-icon>more_vert</mat-icon>\n\t</button>\n\t<mat-menu #settingsMenu=\"matMenu\" id=\"more-options-menu\">\n\t\t<!-- Additional buttons injection inside menu (mobile only) -->\n\t\t@if (showAdditionalButtonsInsideMenu() && additionalButtonsPosition() === 'beforeMenu') {\n\t\t\t<ng-container *ngTemplateOutlet=\"toolbarAdditionalButtonsTemplate(); context: { $implicit: additionalButtonsPosition() }\">\n\t\t\t</ng-container>\n\t\t}\n\n\t\t<!-- Fullscreen button -->\n\t\t@if (showFullscreenButton()) {\n\t\t\t<button mat-menu-item id=\"fullscreen-btn\" (click)=\"onFullscreenToggle()\">\n\t\t\t\t<mat-icon>{{ isFullscreenActive() ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n\t\t\t\t<span>{{ isFullscreenActive() ? ('TOOLBAR.EXIT_FULLSCREEN' | translate) : ('TOOLBAR.FULLSCREEN' | translate) }}</span>\n\t\t\t</button>\n\t\t}\n\n\t\t<!-- Recording button -->\n\t\t@if (showRecordingButton()) {\n\t\t\t<button\n\t\t\t\tmat-menu-item\n\t\t\t\tid=\"recording-btn\"\n\t\t\t\t[disabled]=\"\n\t\t\t\t\trecordingStatus() === _recordingStatus.STARTING ||\n\t\t\t\t\trecordingStatus() === _recordingStatus.STOPPING ||\n\t\t\t\t\t!hasRoomTracksPublished()\n\t\t\t\t\"\n\t\t\t\t[matTooltip]=\"!hasRoomTracksPublished() ? ('TOOLBAR.NO_TRACKS_PUBLISHED' | translate) : ''\"\n\t\t\t\t(click)=\"onRecordingToggle()\"\n\t\t\t>\n\t\t\t\t<mat-icon color=\"warn\">radio_button_checked</mat-icon>\n\t\t\t\t<span>\n\t\t\t\t\t{{\n\t\t\t\t\t\trecordingStatus() === _recordingStatus.STOPPED ||\n\t\t\t\t\t\trecordingStatus() === _recordingStatus.STOPPING ||\n\t\t\t\t\t\trecordingStatus() === _recordingStatus.FAILED\n\t\t\t\t\t\t\t? ('TOOLBAR.START_RECORDING' | translate)\n\t\t\t\t\t\t\t: ('TOOLBAR.STOP_RECORDING' | translate)\n\t\t\t\t\t}}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t}\n\n\t\t<!-- View recordings button -->\n\t\t@if (showViewRecordingsButton()) {\n\t\t\t<button mat-menu-item id=\"view-recordings-btn\" (click)=\"onViewRecordingsClick()\">\n\t\t\t\t<mat-icon>video_library</mat-icon>\n\t\t\t\t<span>{{ 'TOOLBAR.VIEW_RECORDINGS' | translate }}</span>\n\t\t\t</button>\n\t\t}\n\n\t\t<!-- Broadcasting button -->\n\t\t@if (showBroadcastingButton()) {\n\t\t\t<button\n\t\t\t\tmat-menu-item\n\t\t\t\tid=\"toolbar-broadcasting-btn\"\n\t\t\t\t[disabled]=\"broadcastingStatus() === _broadcastingStatus.STARTING || recordingStatus() === _broadcastingStatus.STOPPING\"\n\t\t\t\t(click)=\"onBroadcastingToggle()\"\n\t\t\t>\n\t\t\t\t<mat-icon>sensors</mat-icon>\n\t\t\t\t<span>\n\t\t\t\t\t{{\n\t\t\t\t\t\tbroadcastingStatus() === _broadcastingStatus.STOPPED ||\n\t\t\t\t\t\tbroadcastingStatus() === _broadcastingStatus.STOPPING ||\n\t\t\t\t\t\tbroadcastingStatus() === _broadcastingStatus.FAILED\n\t\t\t\t\t\t\t? ('PANEL.STREAMING.START' | translate)\n\t\t\t\t\t\t\t: ('PANEL.STREAMING.STOP' | translate)\n\t\t\t\t\t}}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t}\n\n\t\t<!-- Virtual background button -->\n\t\t@if (showBackgroundEffectsButton()) {\n\t\t\t<button mat-menu-item id=\"virtual-bg-btn\" [disabled]=\"!isCameraEnabled()\" (click)=\"onBackgroundEffectsToggle()\">\n\t\t\t\t<mat-icon><span class=\"material-symbols-outlined\">background_replace</span></mat-icon>\n\t\t\t\t<span>{{ 'TOOLBAR.BACKGROUND' | translate }}</span>\n\t\t\t</button>\n\t\t}\n\n\t\t<!-- Captions button -->\n\t\t<!-- <button\n\t\t\t*ngIf=\"!isMinimal && showCaptionsButton\"\n\t\t\t[disabled]=\"isConnectionLost\"\n\t\t\tmat-menu-item\n\t\t\tid=\"captions-btn\"\n\t\t\t(click)=\"onCaptionsToggle()\"\n\t\t>\n\t\t\t<mat-icon>closed_caption</mat-icon>\n\t\t\t<span *ngIf=\"captionsEnabled\">{{ 'TOOLBAR.DISABLE_CAPTIONS' | translate }}</span>\n\t\t\t<span *ngIf=\"!captionsEnabled\">{{ 'TOOLBAR.ENABLE_CAPTIONS' | translate }}</span>\n\t\t</button> -->\n\n\t\t<!-- Additional buttons injection inside menu (mobile only) -->\n\t\t@if (showAdditionalButtonsInsideMenu() && additionalButtonsPosition() === 'afterMenu') {\n\t\t\t<ng-container *ngTemplateOutlet=\"toolbarAdditionalButtonsTemplate(); context: { $implicit: additionalButtonsPosition() }\">\n\t\t\t</ng-container>\n\t\t}\n\n\t\t<!-- Additional menu items injected via directive -->\n\t\t@if (moreOptionsAdditionalMenuItemsTemplate) {\n\t\t\t<ng-container *ngTemplateOutlet=\"moreOptionsAdditionalMenuItemsTemplate\"></ng-container>\n\t\t}\n\n\t\t<!-- Divider before settings -->\n\t\t@if (showSettingsButton()) {\n\t\t\t<mat-divider class=\"divider\"></mat-divider>\n\t\t}\n\n\t\t<!-- Settings button -->\n\t\t@if (showSettingsButton()) {\n\t\t\t<button mat-menu-item id=\"toolbar-settings-btn\" (click)=\"onSettingsToggle()\">\n\t\t\t\t<mat-icon>settings</mat-icon>\n\t\t\t\t<span>{{ 'TOOLBAR.SETTINGS' | translate }}</span>\n\t\t\t</button>\n\t\t}\n\t</mat-menu>\n}\n\n<!-- Additional buttons injection from parent component (desktop/tablet only) -->\n@if (showAdditionalButtonsOutside() && additionalButtonsPosition() === 'afterMenu') {\n\t<ng-container *ngTemplateOutlet=\"toolbarAdditionalButtonsTemplate()\"></ng-container>\n}\n\n<!-- Leave session button -->\n@if (showLeaveButton()) {\n\t<button\n\t\tmat-icon-button\n\t\t(click)=\"onLeaveClick()\"\n\t\tid=\"leave-btn\"\n\t\t[class.mobile-btn]=\"isMobileView()\"\n\t\tmatTooltip=\"{{ 'TOOLBAR.LEAVE' | translate }}\"\n\t>\n\t\t<mat-icon>call_end</mat-icon>\n\t</button>\n}\n\n@if (toolbarLeaveButtonTemplate()) {\n\t<ng-container *ngTemplateOutlet=\"toolbarLeaveButtonTemplate()\"></ng-container>\n}\n","import { Component, TemplateRef, computed, input, output } from '@angular/core';\nimport { ViewportService } from '../../../services/viewport/viewport.service';\n\n@Component({\n\tselector: 'ov-toolbar-panel-buttons',\n\ttemplateUrl: './toolbar-panel-buttons.component.html',\n\tstyleUrl: './toolbar-panel-buttons.component.scss',\n\tstandalone: false\n})\nexport class ToolbarPanelButtonsComponent {\n\t// Signal inputs from toolbar\n\tisMinimal = input<boolean>(false);\n\tisConnectionLost = input<boolean>(false);\n\tisActivitiesOpened = input<boolean>(false);\n\tisParticipantsOpened = input<boolean>(false);\n\tisChatOpened = input<boolean>(false);\n\tunreadMessages = input<number>(0);\n\tshowActivitiesPanelButton = input<boolean>(true);\n\tshowParticipantsPanelButton = input<boolean>(true);\n\tshowChatPanelButton = input<boolean>(true);\n\trecordingStatus = input<any>();\n\tbroadcastingStatus = input<any>();\n\ttoolbarAdditionalPanelButtonsTemplate = input<TemplateRef<any> | undefined>();\n\ttotalParticipants = input<number>(0);\n\n\t// Signal outputs back to toolbar\n\ttoggleActivitiesPanel = output<string | undefined>();\n\ttoggleParticipantsPanel = output<void>();\n\ttoggleChatPanel = output<void>();\n\n\t// Computed signals\n\tvisibleButtonsCount = computed(() => {\n\t\tlet count = 0;\n\t\tif (!this.isMinimal() && this.showActivitiesPanelButton()) count++;\n\t\tif (!this.isMinimal() && this.showParticipantsPanelButton()) count++;\n\t\tif (!this.isMinimal() && this.showChatPanelButton()) count++;\n\t\treturn count;\n\t});\n\n\tisAnyPanelOpened = computed(() => {\n\t\treturn this.isActivitiesOpened() || this.isParticipantsOpened() || this.isChatOpened();\n\t});\n\n\tconstructor(public viewportService: ViewportService) {}\n\n\t// Computed property to determine if we should show collapsed menu\n\tget shouldShowCollapsed(): boolean {\n\t\treturn this.viewportService.isMobileView()\n\t}\n\n\t// Local methods that emit events\n\tonToggleActivities(expand?: string) {\n\t\tthis.toggleActivitiesPanel.emit(expand);\n\t}\n\n\tonToggleParticipants() {\n\t\tthis.toggleParticipantsPanel.emit();\n\t}\n\n\tonToggleChat() {\n\t\tthis.toggleChatPanel.emit();\n\t}\n}\n","<!-- Responsive container: show individual buttons on larger screens, collapsed menu on smaller screens -->\n<ng-container *ngIf=\"shouldShowCollapsed; else uncollapsedButtons\">\n\t<div class=\"collapsed-menu-container\" *ngIf=\"visibleButtonsCount() > 0\">\n\t\t<button\n\t\t\tmat-icon-button\n\t\t\tclass=\"fab-menu-trigger\"\n\t\t\t[matMenuTriggerFor]=\"panelsMenu\"\n\t\t\t[disabled]=\"isConnectionLost()\"\n\t\t\t[class.active-btn]=\"isAnyPanelOpened()\"\n\t\t\tmatTooltip=\"{{ 'TOOLBAR.PANELS' | translate }}\"\n\t\t\t#menuTrigger=\"matMenuTrigger\"\n\t\t>\n\t\t\t<mat-icon class=\"material-symbols-outlined\" [class.rotated]=\"menuTrigger.menuOpen\">keyboard_arrow_up</mat-icon>\n\t\t</button>\n\n\t\t<!-- Vertical panels menu -->\n\t\t<mat-menu #panelsMenu=\"matMenu\" class=\"panels-menu\">\n\t\t\t<!-- Activities menu item -->\n\t\t\t<button\n\t\t\t\tmat-menu-item\n\t\t\t\tclass=\"panel-menu-item\"\n\t\t\t\t*ngIf=\"!isMinimal() && showActivitiesPanelButton()\"\n\t\t\t\t(click)=\"onToggleActivities()\"\n\t\t\t\t[disabled]=\"isConnectionLost()\"\n\t\t\t\t[class.active-menu-item]=\"isActivitiesOpened()\"\n\t\t\t>\n\t\t\t\t<mat-icon>category</mat-icon>\n\t\t\t</button>\n\n\t\t\t<!-- Participants menu item -->\n\t\t\t<button\n\t\t\t\t*ngIf=\"!isMinimal() && showParticipantsPanelButton()\"\n\t\t\t\tmat-menu-item\n\t\t\t\t[matBadge]=\"totalParticipants()\"\n\t\t\t\t[matBadgeHidden]=\"totalParticipants() === 0\"\n\t\t\t\tmatBadgePosition=\"above before\"\n\t\t\t\tclass=\"panel-menu-item\"\n\t\t\t\t(click)=\"onToggleParticipants()\"\n\t\t\t\t[disabled]=\"isConnectionLost()\"\n\t\t\t\t[class.active-menu-item]=\"isParticipantsOpened()\"\n\t\t\t>\n\t\t\t\t<mat-icon aria-hidden=\"false\"> people</mat-icon>\n\t\t\t</button>\n\n\t\t\t<!-- Chat menu item -->\n\t\t\t<button\n\t\t\t\tmat-menu-item\n\t\t\t\tclass=\"panel-menu-item\"\n\t\t\t\t*ngIf=\"!isMinimal() && showChatPanelButton()\"\n\t\t\t\t(click)=\"onToggleChat()\"\n\t\t\t\t[disabled]=\"isConnectionLost()\"\n\t\t\t\t[class.active-menu-item]=\"isChatOpened()\"\n\t\t\t>\n\t\t\t\t<mat-icon\n\t\t\t\t\t[matBadge]=\"unreadMessages()\"\n\t\t\t\t\t[matBadgeHidden]=\"unreadMessages() === 0\"\n\t\t\t\t\tmatBadgePosition=\"above before\"\n\t\t\t\t\tmatBadgeSize=\"small\"\n\t\t\t\t\taria-hidden=\"false\"\n\t\t\t\t>\n\t\t\t\t\tchat\n\t\t\t\t</mat-icon>\n\t\t\t</button>\n\n\t\t\t<!-- External additional panel buttons in menu -->\n\t\t\t<ng-container *ngIf=\"toolbarAdditionalPanelButtonsTemplate()\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"toolbarAdditionalPanelButtonsTemplate()\"></ng-container>\n\t\t\t</ng-container>\n\t\t</mat-menu>\n\t</div>\n</ng-container>\n\n<!-- Collapsed menu template for small screens -->\n<ng-template #uncollapsedButtons>\n\t<!-- Default activities button -->\n\t<button\n\t\tmat-icon-button\n\t\tid=\"activities-panel-btn\"\n\t\tclass=\"panel-button\"\n\t\t*ngIf=\"!isMinimal() && showActivitiesPanelButton()\"\n\t\tmatTooltip=\"{{ 'TOOLBAR.ACTIVITIES' | translate }}\"\n\t\t(click)=\"onToggleActivities()\"\n\t\t[disabled]=\"isConnectionLost()\"\n\t\t[class.active-btn]=\"isActivitiesOpened()\"\n\t>\n\t\t<mat-icon>category</mat-icon>\n\t</button>\n\n\t<!-- Default participants button -->\n\t<button\n\t\tmat-icon-button\n\t\tclass=\"panel-button\"\n\t\tid=\"participants-panel-btn\"\n\t\t*ngIf=\"!isMinimal() && showParticipantsPanelButton()\"\n\t\tmatTooltip=\"{{ 'TOOLBAR.PARTICIPANTS' | translate }}\"\n\t\t(click)=\"onToggleParticipants()\"\n\t\t[disabled]=\"isConnectionLost()\"\n\t\t[class.active-btn]=\"isParticipantsOpened()\"\n\t>\n\t\t<mat-icon\n\t\t\t[matBadge]=\"totalParticipants()\"\n\t\t\t[matBadgeHidden]=\"totalParticipants() === 0\"\n\t\t\tmatBadgePosition=\"above before\"\n\t\t\tmatBadgeSize=\"small\"\n\t\t\taria-hidden=\"false\"\n\t\t\t>people</mat-icon\n\t\t>\n\t</button>\n\n\t<!-- Default chat button -->\n\t<button\n\t\tmat-icon-button\n\t\tclass=\"panel-button\"\n\t\tid=\"chat-panel-btn\"\n\t\t*ngIf=\"!isMinimal() && showChatPanelButton()\"\n\t\tmatTooltip=\"{{ 'TOOLBAR.CHAT' | translate }}\"\n\t\t(click)=\"onToggleChat()\"\n\t\t[disabled]=\"isConnectionLost()\"\n\t\t[class.active-btn]=\"isChatOpened()\"\n\t>\n\t\t<mat-icon\n\t\t\t[matBadge]=\"unreadMessages()\"\n\t\t\t[matBadgeHidden]=\"unreadMessages() === 0\"\n\t\t\tmatBadgePosition=\"above before\"\n\t\t\tmatBadgeSize=\"small\"\n\t\t\taria-hidden=\"false\"\n\t\t>\n\t\t\tchat\n\t\t</mat-icon>\n\t</button>\n\n\t<!-- External additional panel buttons  -->\n\t<ng-container *ngIf=\"toolbarAdditionalPanelButtonsTemplate()\">\n\t\t<ng-container *ngTemplateOutlet=\"toolbarAdditionalPanelButtonsTemplate()\"></ng-container>\n\t</ng-container>\n</ng-template>\n","import { Injectable } from '@angular/core';\nimport { LayoutClass } from '../../models/layout/layout.model';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class DocumentService {\n\tconstructor() {}\n\n\ttoggleFullscreen(elementId: string) {\n\t\tconst document: any = this.getDocument();\n\t\tconst fs = this.getElementById(elementId);\n\n\t\tif (this.isInFullscreen()) {\n\t\t\tthis.exitFullscreen(document);\n\t\t} else {\n\t\t\tthis.requestFullscreen(fs);\n\t\t}\n\t}\n\n\tisSmallElement(element: HTMLElement | Element): boolean {\n\t\treturn element?.className.includes(LayoutClass.SMALL_ELEMENT);\n\t}\n\n\t/**\n\t * @internal\n\t * Get the document object (can be overridden for testing)\n\t */\n\tprotected getDocument(): any {\n\t\treturn window.document;\n\t}\n\n\t/**\n\t * @internal\n\t * Get element by ID (can be overridden for testing)\n\t */\n\tprotected getElementById(elementId: string): any {\n\t\treturn this.getDocument().getElementById(elementId);\n\t}\n\n\t/**\n\t * @internal\n\t * Check if currently in fullscreen mode\n\t */\n\tprotected isInFullscreen(): boolean {\n\t\tconst document: any = this.getDocument();\n\t\treturn !!(\n\t\t\tdocument.fullscreenElement ||\n\t\t\tdocument.mozFullScreenElement ||\n\t\t\tdocument.webkitFullscreenElement ||\n\t\t\tdocument.msFullscreenElement\n\t\t);\n\t}\n\n\t/**\n\t * @internal\n\t * Request fullscreen on element using vendor-specific methods\n\t */\n\tprotected requestFullscreen(element: any): void {\n\t\tif (!element) return;\n\n\t\tif (element.requestFullscreen) {\n\t\t\telement.requestFullscreen();\n\t\t} else if (element.msRequestFullscreen) {\n\t\t\telement.msRequestFullscreen();\n\t\t} else if (element.mozRequestFullScreen) {\n\t\t\telement.mozRequestFullScreen();\n\t\t} else if (element.webkitRequestFullscreen) {\n\t\t\telement.webkitRequestFullscreen();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Exit fullscreen using vendor-specific methods\n\t */\n\tprotected exitFullscreen(document: any): void {\n\t\tif (!document) return;\n\n\t\tif (document.exitFullscreen) {\n\t\t\tdocument.exitFullscreen();\n\t\t} else if (document.msExitFullscreen) {\n\t\t\tdocument.msExitFullscreen();\n\t\t} else if (document.mozCancelFullScreen) {\n\t\t\tdocument.mozCancelFullScreen();\n\t\t} else if (document.webkitExitFullscreen) {\n\t\t\tdocument.webkitExitFullscreen();\n\t\t}\n\t}\n}\n","// * Internal directives *\n\nimport { AfterViewInit, Directive, ElementRef, HostListener, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ParticipantModel } from '../../models/participant.model';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\n\n/**\n * Load default OpenVidu logo if custom one is not exist\n * @internal\n */\n@Directive({\n\tselector: 'img[ovLogo]',\n\tstandalone: false\n})\nexport class FallbackLogoDirective implements OnInit {\n\tdefaultLogo =\n\t\t'data:image/png;base64,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';\n\tassetsLogo = 'assets/images/logo.png';\n\t@Input() ovLogo: string;\n\tconstructor(public elementRef: ElementRef) {}\n\n\tngOnInit() {\n\t\tthis.loadImage(this.ovLogo || this.assetsLogo);\n\t}\n\n\tprivate loadImage(url: string) {\n\t\tconst element = this.elementRef.nativeElement as HTMLImageElement;\n\t\tconst tempImage = new Image();\n\n\t\tconst handleImageErrorOrLoad = (url: string) => {\n\t\t\tif (tempImage.width <= 1 && tempImage.height <= 1) {\n\t\t\t\tif (url === this.ovLogo) {\n\t\t\t\t\tthis.loadImage(this.assetsLogo);\n\t\t\t\t} else if (url === this.assetsLogo) {\n\t\t\t\t\telement.src = this.defaultLogo;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telement.src = url;\n\t\t\t}\n\t\t};\n\n\t\ttempImage.onload = () => {\n\t\t\thandleImageErrorOrLoad(url);\n\t\t};\n\n\t\ttempImage.onerror = () => {\n\t\t\thandleImageErrorOrLoad(url);\n\t\t};\n\t\ttempImage.src = url;\n\t}\n}\n\n/**\n * @internal\n */\n@Directive({\n\tselector: 'ov-layout[ovRemoteParticipants]',\n\tstandalone: false\n})\nexport class LayoutRemoteParticipantsDirective {\n\tprivate _ovRemoteParticipants: ParticipantModel[] | undefined;\n\n\t@Input() set ovRemoteParticipants(value: ParticipantModel[] | undefined) {\n\t\tthis._ovRemoteParticipants = value;\n\t\tthis.update(value);\n\t}\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate directiveService: OpenViduComponentsConfigService\n\t) {}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tngAfterViewInit() {\n\t\tthis.update(this._ovRemoteParticipants);\n\t}\n\n\tupdate(value: ParticipantModel[] | undefined) {\n\t\tthis.directiveService.setLayoutRemoteParticipants(value);\n\t}\n\n\tclear() {\n\t\tthis.update(undefined);\n\t}\n}\n\n/**\n * @internal\n */\n@Directive({\n\tselector: 'ov-videoconference[brandingLogo], ov-toolbar[brandingLogo]',\n\tstandalone: false\n})\nexport class ToolbarBrandingLogoDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set brandingLogo(value: string) {\n\t\tthis._brandingLogo = value;\n\t\tthis.update(this._brandingLogo);\n\t}\n\n\tprivate _brandingLogo: string = '';\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this._brandingLogo);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis._brandingLogo = '';\n\t\tthis.update(this._brandingLogo);\n\t}\n\n\tprivate update(value: string) {\n\t\tthis.libService.updateToolbarConfig({ brandingLogo: value });\n\t}\n}\n\n/**\n * @internal\n */\n@Directive({\n\tselector: 'ov-videoconference[prejoinDisplayParticipantName]',\n\tstandalone: false\n})\nexport class PrejoinDisplayParticipantName implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set prejoinDisplayParticipantName(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateGeneralConfig({ prejoinDisplayParticipantName: value });\n\t}\n}\n\n/**\n * @internal\n *\n * The **recordingActivityReadOnly** directive sets the recording activity panel to read-only mode.\n * In this mode, users can only view recordings without the ability to start, stop, or delete them.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: `false`\n *\n * @example\n * <ov-videoconference [recordingActivityReadOnly]=\"true\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[recordingActivityReadOnly]',\n\tstandalone: false\n})\nexport class RecordingActivityReadOnlyDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set recordingActivityReadOnly(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(false);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: boolean) {\n\t\tthis.libService.updateRecordingActivityConfig({ readOnly: value });\n\t}\n}\n\n/**\n *\n * @internal\n *\n * The **recordingActivityShowControls** directive allows to show/hide specific recording controls (play, download, delete, externalView).\n * You can pass an object with boolean properties to control which buttons are shown.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: `{ play: true, download: true, delete: true, externalView: false }`\n *\n * @example\n * <ov-videoconference [recordingActivityShowControls]=\"{ play: false, download: true, delete: false }\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[recordingActivityShowControls]',\n\tstandalone: false\n})\nexport class RecordingActivityShowControlsDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set recordingActivityShowControls(value: { play: boolean; download: boolean; delete: boolean; externalView: boolean }) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update({ play: true, download: true, delete: true, externalView: false });\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: { play: boolean; download: boolean; delete: boolean; externalView: boolean }) {\n\t\tthis.libService.updateRecordingActivityConfig({ showControls: value });\n\t}\n}\n\n/**\n * @internal\n * The **viewRecordingsButton** directive allows show/hide the view recordings toolbar button.\n *\n * Default: `false`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarViewRecordingsButton]=\"true\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [viewRecordingsButton]=\"true\"></ov-toolbar>\n *\n * When the button is clicked, it will fire the `onViewRecordingsClicked` event.\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarViewRecordingsButton], ov-toolbar[viewRecordingsButton]',\n\tstandalone: false\n})\nexport class ToolbarViewRecordingsButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarViewRecordingsButton(value: boolean) {\n\t\tthis.viewRecordingsValue = value;\n\t\tthis.update(this.viewRecordingsValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set viewRecordingsButton(value: boolean) {\n\t\tthis.viewRecordingsValue = value;\n\t\tthis.update(this.viewRecordingsValue);\n\t}\n\n\tprivate viewRecordingsValue: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.viewRecordingsValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.viewRecordingsValue = false;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ viewRecordings: value });\n\t}\n}\n\n/**\n * @internal\n *\n * The **recordingActivityStartStopRecordingButton** directive allows to show or hide the start/stop recording buttons in recording activity.\n *\n * Default: `true`\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * @example\n * <ov-videoconference [recordingActivityStartStopRecordingButton]=\"false\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[recordingActivityStartStopRecordingButton]',\n\tstandalone: false\n})\nexport class StartStopRecordingButtonsDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set recordingActivityStartStopRecordingButton(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateRecordingActivityConfig({ startStopButton: value });\n\t}\n}\n\n/**\n * @internal\n * The **recordingActivityViewRecordingsButton** directive allows to show/hide the view recordings button in the recording activity panel.\n *\n * Default: `false`\n *\n * Can be used in {@link VideoconferenceComponent}.\n *\n * @example\n * <ov-videoconference [recordingActivityViewRecordingsButton]=\"true\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[recordingActivityViewRecordingsButton]',\n\tstandalone: false\n})\nexport class RecordingActivityViewRecordingsButtonDirective implements AfterViewInit, OnDestroy {\n\t@Input() set recordingActivityViewRecordingsButton(value: boolean) {\n\t\tthis._value = value;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate _value: boolean = false;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this._value);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis._value = false;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateRecordingActivityConfig({ viewRecordingsButton: value });\n\t}\n}\n\n/**\n * @internal\n * The **recordingActivityShowRecordingsList** directive allows to show or hide the recordings list in the recording activity panel.\n *\n * Default: `true`\n *\n * Can be used in {@link VideoconferenceComponent}.\n *\n * @example\n * <ov-videoconference [recordingActivityShowRecordingsList]=\"false\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[recordingActivityShowRecordingsList]',\n\tstandalone: false\n})\nexport class RecordingActivityShowRecordingsListDirective implements AfterViewInit, OnDestroy {\n\t@Input() set recordingActivityShowRecordingsList(value: boolean) {\n\t\tthis._value = value;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate _value: boolean = true;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this._value);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis._value = true;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateRecordingActivityConfig({ showRecordingsList: value });\n\t}\n}\n\n/**\n * @internal\n * The **toolbarRoomName** directive allows to display a specific room name in the toolbar.\n * If the room name is not set, it will display the room ID instead.\n *\n * Can be used in {@link ToolbarComponent}.\n *\n * @example\n * <ov-videoconference [toolbarRoomName]=\"roomName\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarRoomName], ov-toolbar[roomName]',\n\tstandalone: false\n})\nexport class ToolbarRoomNameDirective implements AfterViewInit, OnDestroy {\n\t@Input() set toolbarRoomName(value: string | undefined) {\n\t\tthis._roomName = value;\n\t\tthis.updateRoomName();\n\t}\n\n\t@Input() set roomName(value: string | undefined) {\n\t\tthis._roomName = value;\n\t\tthis.updateRoomName();\n\t}\n\n\tprivate _roomName?: string;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.updateRoomName();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis._roomName = undefined;\n\t\tthis.updateRoomName();\n\t}\n\n\tprivate updateRoomName() {\n\t\tthis.libService.updateToolbarConfig({ roomName: this._roomName || '' });\n\t}\n}\n\n/**\n * @internal\n *\n * The **showThemeSelector** directive allows to enable or disable the theme selector control.\n * When disabled, users won't be able to change the UI theme.\n *\n * Default: `false`\n *\n * Usage:\n * <ov-videoconference [showThemeSelector]=\"false\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[showThemeSelector]',\n\tstandalone: false\n})\nexport class ShowThemeSelectorDirective implements AfterViewInit, OnDestroy {\n\t@Input() set showThemeSelector(value: boolean) {\n\t\tthis._value = value;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate _value: boolean = false;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this._value);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis._value = true;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateGeneralConfig({ showThemeSelector: value });\n\t}\n}\n\n/**\n * @internal\n *\n * The **e2eeKey** directive allows to configure end-to-end encryption for the videoconference.\n * When provided, the room will be configured with E2EE using an external key provider.\n *\n * Default: `undefined`\n *\n * Usage:\n * <ov-videoconference [e2eeKey]=\"yourEncryptionKey\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[e2eeKey]',\n\tstandalone: false\n})\nexport class E2EEKeyDirective implements AfterViewInit, OnDestroy {\n\t@Input() set e2eeKey(value: string | undefined) {\n\t\tthis._value = value;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate _value: string | undefined;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this._value);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis._value = undefined;\n\t\tthis.update(this._value);\n\t}\n\n\tprivate update(value: string | undefined) {\n\t\t// Only update if value is valid (not undefined, not null, not empty string)\n\t\tconst validValue = value && value.trim() !== '' ? value.trim() : undefined;\n\t\tthis.libService.updateGeneralConfig({ e2eeKey: validValue });\n\t}\n}\n","import {\n\tAfterViewInit,\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tcomputed,\n\tContentChild,\n\teffect,\n\tEventEmitter,\n\tHostListener,\n\tOnDestroy,\n\tOnInit,\n\tOutput,\n\tTemplateRef,\n\tViewChild\n} from '@angular/core';\nimport { fromEvent, skip, Subject, takeUntil } from 'rxjs';\nimport { ChatService } from '../../services/chat/chat.service';\nimport { DocumentService } from '../../services/document/document.service';\nimport { PanelService } from '../../services/panel/panel.service';\n\nimport { MatMenuTrigger } from '@angular/material/menu';\nimport { Room, RoomEvent } from 'livekit-client';\nimport { LeaveButtonDirective, ToolbarMoreOptionsAdditionalMenuItemsDirective } from '../../directives/template/internals.directive';\nimport {\n\tToolbarAdditionalButtonsDirective,\n\tToolbarAdditionalPanelButtonsDirective\n} from '../../directives/template/openvidu-components-angular.directive';\nimport { BroadcastingStatus, BroadcastingStatusInfo, BroadcastingStopRequestedEvent } from '../../models/broadcasting.model';\nimport { ChatMessage } from '../../models/chat.model';\nimport { ILogger } from '../../models/logger.model';\nimport { PanelStatusInfo, PanelType } from '../../models/panel.model';\nimport { ParticipantLeftEvent, ParticipantLeftReason } from '../../models/participant.model';\nimport {\n\tRecordingInfo,\n\tRecordingStartRequestedEvent,\n\tRecordingStatus,\n\tRecordingStatusInfo,\n\tRecordingStopRequestedEvent\n} from '../../models/recording.model';\nimport { ToolbarAdditionalButtonsPosition } from '../../models/toolbar.model';\nimport { ActionService } from '../../services/action/action.service';\nimport { BroadcastingService } from '../../services/broadcasting/broadcasting.service';\nimport { CdkOverlayService } from '../../services/cdk-overlay/cdk-overlay.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { DeviceService } from '../../services/device/device.service';\nimport { LayoutService } from '../../services/layout/layout.service';\nimport { LoggerService } from '../../services/logger/logger.service';\nimport { OpenViduService } from '../../services/openvidu/openvidu.service';\nimport { ParticipantService } from '../../services/participant/participant.service';\nimport { PlatformService } from '../../services/platform/platform.service';\nimport { RecordingService } from '../../services/recording/recording.service';\nimport { StorageService } from '../../services/storage/storage.service';\nimport { TemplateManagerService, ToolbarTemplateConfiguration } from '../../services/template/template-manager.service';\nimport { TranslateService } from '../../services/translate/translate.service';\n\n/**\n * The **ToolbarComponent** is hosted inside of the {@link VideoconferenceComponent}.\n * It is in charge of displaying the participants controlls for handling the media, panels and more videoconference features.\n */\n@Component({\n\tselector: 'ov-toolbar',\n\ttemplateUrl: './toolbar.component.html',\n\tstyleUrls: ['./toolbar.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class ToolbarComponent implements OnInit, OnDestroy, AfterViewInit {\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('toolbarAdditionalButtons', { read: TemplateRef }) toolbarAdditionalButtonsTemplate: TemplateRef<any> | undefined;\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('toolbarLeaveButton', { read: TemplateRef }) toolbarLeaveButtonTemplate: TemplateRef<any> | undefined;\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild('toolbarAdditionalPanelButtons', { read: TemplateRef }) toolbarAdditionalPanelButtonsTemplate:\n\t\t| TemplateRef<any>\n\t\t| undefined;\n\n\t/**\n\t * @internal\n\t * Template for additional menu items in the more options menu\n\t */\n\tmoreOptionsAdditionalMenuItemsTemplate: TemplateRef<any> | undefined;\n\n\tprivate _externalMoreOptionsAdditionalMenuItems?: ToolbarMoreOptionsAdditionalMenuItemsDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ToolbarMoreOptionsAdditionalMenuItemsDirective)\n\tset externalMoreOptionsAdditionalMenuItems(value: ToolbarMoreOptionsAdditionalMenuItemsDirective) {\n\t\tthis._externalMoreOptionsAdditionalMenuItems = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalMoreOptionsAdditionalMenuItems(): ToolbarMoreOptionsAdditionalMenuItemsDirective | undefined {\n\t\treturn this._externalMoreOptionsAdditionalMenuItems;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ToolbarAdditionalButtonsDirective)\n\tset externalAdditionalButtons(externalAdditionalButtons: ToolbarAdditionalButtonsDirective) {\n\t\tthis._externalAdditionalButtons = externalAdditionalButtons;\n\t\tif (externalAdditionalButtons) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(LeaveButtonDirective)\n\tset externalLeaveButton(externalLeaveButton: LeaveButtonDirective) {\n\t\tthis._externalLeaveButton = externalLeaveButton;\n\t\tif (externalLeaveButton) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@ContentChild(ToolbarAdditionalPanelButtonsDirective)\n\tset externalAdditionalPanelButtons(externalAdditionalPanelButtons: ToolbarAdditionalPanelButtonsDirective) {\n\t\tthis._externalAdditionalPanelButtons = externalAdditionalPanelButtons;\n\t\tif (externalAdditionalPanelButtons) {\n\t\t\tthis.updateTemplatesAndMarkForCheck();\n\t\t}\n\t}\n\n\t/**\n\t * This event is emitted when the room has been disconnected.\n\t *  @deprecated Use {@link ToolbarComponent.onParticipantLeft} instead.\n\t */\n\t@Output() onRoomDisconnected: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * This event is emitted when the local participant leaves the room.\n\t */\n\t@Output() onParticipantLeft: EventEmitter<ParticipantLeftEvent> = new EventEmitter<ParticipantLeftEvent>();\n\n\t/**\n\t * This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).\n\t */\n\t@Output() onVideoEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n\t/**\n\t * This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).\n\t */\n\t@Output() onAudioEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n\t/**\n\t * This event is emitted when the fullscreen state changes, providing information about if the fullscreen is enabled (true) or disabled (false).\n\t */\n\t@Output() onFullscreenEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n\t/**\n\t * This event is emitted when the screen share state changes, providing information about if the screen share is enabled (true) or disabled (false).\n\t */\n\t@Output() onScreenShareEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n\t/**\n\t * This event is fired when the user clicks on the start recording button.\n\t * It provides the {@link RecordingStartRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStartRequested: EventEmitter<RecordingStartRequestedEvent> = new EventEmitter<RecordingStartRequestedEvent>();\n\t/**\n\t * Provides event notifications that fire when stop recording has been requested.\n\t * It provides the {@link RecordingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStopRequested: EventEmitter<RecordingStopRequestedEvent> = new EventEmitter<RecordingStopRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when stop broadcasting has been requested.\n\t * It provides the {@link BroadcastingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onBroadcastingStopRequested: EventEmitter<BroadcastingStopRequestedEvent> =\n\t\tnew EventEmitter<BroadcastingStopRequestedEvent>();\n\n\t/**\n\t * @internal\n\t * This event is fired when the user clicks on the view recordings button.\n\t */\n\t@Output() onViewRecordingsClicked: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild(MatMenuTrigger) public menuTrigger: MatMenuTrigger | undefined;\n\n\t/**\n\t * @ignore\n\t */\n\troom!: Room;\n\t/**\n\t * @ignore\n\t */\n\tunreadMessages: number = 0;\n\t/**\n\t * @ignore\n\t */\n\tmessageList: ChatMessage[] = [];\n\t/**\n\t * @ignore\n\t */\n\tisScreenShareEnabled: boolean = false;\n\t/**\n\t * @ignore\n\t */\n\tisCameraEnabled: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tisMicrophoneEnabled: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tisConnectionLost: boolean = false;\n\t/**\n\t * @ignore\n\t */\n\thasVideoDevices: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\thasAudioDevices: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tisFullscreenActive: boolean = false;\n\t/**\n\t * @ignore\n\t */\n\tisChatOpened: boolean = false;\n\t/**\n\t * @ignore\n\t */\n\tisParticipantsOpened: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tisActivitiesOpened: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tisMinimal: boolean = false;\n\t/**\n\t * @ignore\n\t */\n\tshowCameraButton: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tshowMicrophoneButton: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tshowScreenshareButton = true;\n\t/**\n\t * @ignore\n\t */\n\tshowFullscreenButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowBackgroundEffectsButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowLeaveButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowRecordingButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowViewRecordingsButton: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tshowBroadcastingButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowSettingsButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowMoreOptionsButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowParticipantsPanelButton: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tshowActivitiesPanelButton: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tshowChatPanelButton: boolean = true;\n\t/**\n\t * @ignore\n\t */\n\tshowLogo: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tbrandingLogo: string = '';\n\t/**\n\t * @ignore\n\t */\n\tshowRoomName: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\troomName: string = '';\n\n\t/**\n\t * @ignore\n\t */\n\tshowCaptionsButton: boolean = true;\n\n\t/**\n\t * @internal\n\t */\n\tisFirefoxBrowser: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tadditionalButtonsPosition: ToolbarAdditionalButtonsPosition = ToolbarAdditionalButtonsPosition.BEFORE_MENU;\n\n\t/**\n\t * @ignore\n\t */\n\tcaptionsEnabled: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tcameraMuteChanging: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tmicrophoneMuteChanging: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\trecordingStatus: RecordingStatus = RecordingStatus.STOPPED;\n\n\t/**\n\t * @ignore\n\t */\n\tisRecordingReadOnlyMode: boolean = false;\n\n\t/**\n\t * @ignore\n\t */\n\tprivate startedRecording: RecordingInfo | undefined;\n\n\t/**\n\t * @ignore\n\t */\n\tbroadcastingStatus: BroadcastingStatus = BroadcastingStatus.STOPPED;\n\t/**\n\t * @ignore\n\t */\n\tbroadcastingId: string | undefined;\n\t/**\n\t * @ignore\n\t */\n\t_recordingStatus = RecordingStatus;\n\t/**\n\t * @ignore\n\t */\n\t_broadcastingStatus = BroadcastingStatus;\n\n\t/**\n\t * @ignore\n\t */\n\trecordingTime: Date | undefined;\n\n\t/**\n\t * @internal\n\t * Template configuration managed by the service\n\t */\n\ttemplateConfig: ToolbarTemplateConfiguration = {};\n\n\t/**\n\t * @internal\n\t * Computed signal for total participants count (local + remote)\n\t */\n\ttotalParticipants = computed(() => {\n\t\tconst local = this.participantService.localParticipantSignal();\n\t\tconst remotes = this.participantService.remoteParticipantsSignal();\n\t\treturn (local ? 1 : 0) + remotes.length;\n\t});\n\n\t// Store directive references for template setup\n\tprivate _externalAdditionalButtons?: ToolbarAdditionalButtonsDirective;\n\tprivate _externalLeaveButton?: LeaveButtonDirective;\n\tprivate _externalAdditionalPanelButtons?: ToolbarAdditionalPanelButtonsDirective;\n\n\tprivate log: ILogger;\n\tprivate destroy$ = new Subject<void>();\n\tprivate currentWindowHeight = window.innerHeight;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate layoutService: LayoutService,\n\t\tprivate documentService: DocumentService,\n\t\tprivate chatService: ChatService,\n\t\tprivate panelService: PanelService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate deviceService: DeviceService,\n\t\tprivate actionService: ActionService,\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate platformService: PlatformService,\n\t\tprivate recordingService: RecordingService,\n\t\tprivate broadcastingService: BroadcastingService,\n\t\tprivate translateService: TranslateService,\n\t\tprivate storageSrv: StorageService,\n\t\tprivate cdkOverlayService: CdkOverlayService,\n\t\tprivate templateManagerService: TemplateManagerService\n\t) {\n\t\tthis.log = this.loggerSrv.get('ToolbarComponent');\n\t\tthis.isFirefoxBrowser = this.platformService.isFirefox();\n\n\t\t// Effect to react to local participant changes\n\t\teffect(() => {\n\t\t\tconst p = this.participantService.localParticipantSignal();\n\t\t\tif (p) {\n\t\t\t\tif (this.isCameraEnabled !== p.isCameraEnabled) {\n\t\t\t\t\tthis.onVideoEnabledChanged.emit(p.isCameraEnabled);\n\t\t\t\t\tthis.isCameraEnabled = p.isCameraEnabled;\n\t\t\t\t\tthis.storageSrv.setCameraEnabled(this.isCameraEnabled);\n\t\t\t\t}\n\n\t\t\t\tif (this.isMicrophoneEnabled !== p.isMicrophoneEnabled) {\n\t\t\t\t\tthis.onAudioEnabledChanged.emit(p.isMicrophoneEnabled);\n\t\t\t\t\tthis.isMicrophoneEnabled = p.isMicrophoneEnabled;\n\t\t\t\t\tthis.storageSrv.setMicrophoneEnabled(this.isMicrophoneEnabled);\n\t\t\t\t}\n\n\t\t\t\tif (this.isScreenShareEnabled !== p.isScreenShareEnabled) {\n\t\t\t\t\tthis.onScreenShareEnabledChanged.emit(p.isScreenShareEnabled);\n\t\t\t\t\tthis.isScreenShareEnabled = p.isScreenShareEnabled;\n\t\t\t\t}\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tget isRecordingStarted(): boolean {\n\t\treturn this.recordingStatus === this._recordingStatus.STARTED;\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tget isBroadcastingStarted(): boolean {\n\t\treturn this.broadcastingStatus === this._broadcastingStatus.STARTED;\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@HostListener('window:resize', ['$event'])\n\tsizeChange(_: Event) {\n\t\tif (this.currentWindowHeight >= window.innerHeight) {\n\t\t\t// The user has exit the fullscreen mode\n\t\t\tthis.currentWindowHeight = window.innerHeight;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@HostListener('document:keydown', ['$event'])\n\tkeyDown(event: KeyboardEvent) {\n\t\tif (event.key === 'F11') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.toggleFullscreen();\n\t\t\tthis.currentWindowHeight = window.innerHeight;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync ngOnInit() {\n\t\tthis.room = this.openviduService.getRoom();\n\t\tthis.evalAndSetRoomName(this.libService.getRoomName());\n\n\t\tthis.hasVideoDevices = this.deviceService.hasVideoDeviceAvailable();\n\t\tthis.hasAudioDevices = this.deviceService.hasAudioDeviceAvailable();\n\n\t\tthis.setupTemplates();\n\t\tthis.subscribeToToolbarDirectives();\n\n\t\tthis.subscribeToReconnection();\n\t\tthis.subscribeToMenuToggling();\n\t\tthis.subscribeToChatMessages();\n\t\tthis.subscribeToRecordingStatus();\n\t\tthis.subscribeToBroadcastingStatus();\n\t\tthis.subscribeToCaptionsToggling();\n\t}\n\n\tngAfterViewInit() {\n\t\tthis.subscribeToFullscreenChanged();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.panelService.clear();\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.isFullscreenActive = false;\n\t\tthis.cdkOverlayService.setSelector('body');\n\t}\n\n\t/**\n\t * @internal\n\t * Sets up all templates using the template manager service\n\t */\n\tprivate setupTemplates(): void {\n\t\tthis.templateConfig = this.templateManagerService.setupToolbarTemplates(\n\t\t\tthis._externalAdditionalButtons,\n\t\t\tthis._externalAdditionalPanelButtons,\n\t\t\tthis._externalLeaveButton,\n\t\t\tthis._externalMoreOptionsAdditionalMenuItems\n\t\t);\n\n\t\t// Apply templates to component properties for backward compatibility\n\t\tthis.applyTemplateConfiguration();\n\t}\n\n\t/**\n\t * @internal\n\t * Applies the template configuration to component properties\n\t */\n\tprivate applyTemplateConfiguration(): void {\n\t\tif (this.templateConfig.toolbarAdditionalButtonsTemplate) {\n\t\t\tthis.toolbarAdditionalButtonsTemplate = this.templateConfig.toolbarAdditionalButtonsTemplate;\n\t\t}\n\t\tif (this.templateConfig.toolbarAdditionalPanelButtonsTemplate) {\n\t\t\tthis.toolbarAdditionalPanelButtonsTemplate = this.templateConfig.toolbarAdditionalPanelButtonsTemplate;\n\t\t}\n\t\tif (this.templateConfig.toolbarLeaveButtonTemplate) {\n\t\t\tthis.toolbarLeaveButtonTemplate = this.templateConfig.toolbarLeaveButtonTemplate;\n\t\t}\n\t\tif (this.templateConfig.toolbarMoreOptionsAdditionalMenuItemsTemplate) {\n\t\t\tthis.moreOptionsAdditionalMenuItemsTemplate = this.templateConfig.toolbarMoreOptionsAdditionalMenuItemsTemplate;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Updates templates and triggers change detection\n\t */\n\tprivate updateTemplatesAndMarkForCheck(): void {\n\t\tthis.setupTemplates();\n\t\tthis.cd.markForCheck();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget hasRoomTracksPublished(): boolean {\n\t\treturn this.openviduService.hasRoomTracksPublished();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tasync toggleMicrophone() {\n\t\ttry {\n\t\t\tthis.microphoneMuteChanging = false;\n\t\t\tconst isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n\t\t\tawait this.participantService.setMicrophoneEnabled(!isMicrophoneEnabled);\n\t\t} catch (error: unknown) {\n\t\t\tthis.log.e('There was an error toggling microphone:', (error as any).code, (error as any).message);\n\t\t\tthis.actionService.openDialog(\n\t\t\t\tthis.translateService.translate('ERRORS.TOGGLE_MICROPHONE'),\n\t\t\t\t(error as any)?.error || (error as any)?.message || error\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.microphoneMuteChanging = false;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tasync toggleCamera() {\n\t\ttry {\n\t\t\tthis.cameraMuteChanging = true;\n\t\t\tconst isCameraEnabled = this.participantService.isMyCameraEnabled();\n\t\t\tif (this.panelService.isBackgroundEffectsPanelOpened() && isCameraEnabled) {\n\t\t\t\tthis.panelService.togglePanel(PanelType.BACKGROUND_EFFECTS);\n\t\t\t}\n\t\t\tawait this.participantService.setCameraEnabled(!isCameraEnabled);\n\t\t} catch (error) {\n\t\t\tthis.log.e('There was an error toggling camera:', (error as any).code, (error as any).message);\n\t\t\tthis.actionService.openDialog(\n\t\t\t\tthis.translateService.translate('ERRORS.TOGGLE_CAMERA'),\n\t\t\t\t(error as any)?.error || (error as any)?.message || error\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.cameraMuteChanging = false;\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tasync toggleScreenShare() {\n\t\tconst isScreenShareEnabled = this.participantService.isMyScreenShareEnabled();\n\t\tawait this.participantService.setScreenShareEnabled(!isScreenShareEnabled);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tasync replaceScreenTrack() {\n\t\tawait this.participantService.switchScreenShare();\n\t}\n\n\t/**\n\t * The participant leaves the room voluntarily.\n\t * @ignore\n\t */\n\tasync disconnect() {\n\t\ttry {\n\t\t\tawait this.openviduService.disconnectRoom(() => {\n\t\t\t\tthis.onParticipantLeft.emit({\n\t\t\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\t\t\tparticipantName: this.participantService.localParticipantSignal()!.name || '',\n\t\t\t\t\tidentity: this.participantService.localParticipantSignal()!.identity || '',\n\t\t\t\t\treason: ParticipantLeftReason.LEAVE\n\t\t\t\t});\n\t\t\t\tthis.onRoomDisconnected.emit();\n\t\t\t}, false);\n\t\t} catch (error) {\n\t\t\tthis.log.e('There was an error disconnecting:', (error as any).code, (error as any).message);\n\t\t\tthis.actionService.openDialog(\n\t\t\t\tthis.translateService.translate('ERRORS.DISCONNECT'),\n\t\t\t\t(error as any)?.error || (error as any)?.message || error\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\topenRecordingActivityPanel() {\n\t\tif (this.showActivitiesPanelButton && !this.isActivitiesOpened) {\n\t\t\tthis.panelService.togglePanel(PanelType.ACTIVITIES, 'recording');\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\topenBroadcastingActivityPanel() {\n\t\tif (this.showActivitiesPanelButton && !this.isActivitiesOpened) {\n\t\t\tthis.panelService.togglePanel(PanelType.ACTIVITIES, 'broadcasting');\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleRecording() {\n\t\tif (this.recordingStatus === RecordingStatus.FAILED) {\n\t\t\tthis.openRecordingActivityPanel();\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload: RecordingStartRequestedEvent = {\n\t\t\troomName: this.openviduService.getRoomName()\n\t\t};\n\t\tif (this.recordingStatus === RecordingStatus.STARTED) {\n\t\t\tthis.log.d('Stopping recording');\n\t\t\tpayload.recordingId = this.startedRecording?.id;\n\t\t\tthis.onRecordingStopRequested.emit(payload);\n\t\t} else if (this.recordingStatus === RecordingStatus.STOPPED) {\n\t\t\tthis.onRecordingStartRequested.emit(payload);\n\t\t\tthis.openRecordingActivityPanel();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleBroadcasting() {\n\t\tif (this.broadcastingStatus === BroadcastingStatus.STARTED) {\n\t\t\tthis.log.d('Stopping broadcasting');\n\t\t\tconst payload: BroadcastingStopRequestedEvent = {\n\t\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\t\tbroadcastingId: this.broadcastingId as string\n\t\t\t};\n\t\t\tthis.onBroadcastingStopRequested.emit(payload);\n\t\t\tthis.broadcastingService.setBroadcastingStopped();\n\t\t} else if (this.broadcastingStatus === BroadcastingStatus.STOPPED) {\n\t\t\tthis.openBroadcastingActivityPanel();\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleBackgroundEffects() {\n\t\tthis.panelService.togglePanel(PanelType.BACKGROUND_EFFECTS);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tonCaptionsToggle() {\n\t\t// if (this.openviduService.isOpenViduPro()) {\n\t\t// \tthis.layoutService.toggleCaptions();\n\t\t// } else {\n\t\t// \tthis.actionService.openProFeatureDialog(\n\t\t// \t\tthis.translateService.translate('PANEL.SETTINGS.CAPTIONS'),\n\t\t// \t\tthis.translateService.translate('PANEL.PRO_FEATURE')\n\t\t// \t);\n\t\t// }\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleSettings() {\n\t\tthis.panelService.togglePanel(PanelType.SETTINGS);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleParticipantsPanel() {\n\t\tthis.panelService.togglePanel(PanelType.PARTICIPANTS);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleChatPanel() {\n\t\tthis.panelService.togglePanel(PanelType.CHAT);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\ttoggleFullscreen() {\n\t\tthis.documentService.toggleFullscreen('session-container');\n\t}\n\n\t/**\n\t * @internal\n\t * @param expandPanel\n\t */\n\ttoggleActivitiesPanel(expandPanel: string) {\n\t\tthis.panelService.togglePanel(PanelType.ACTIVITIES, expandPanel);\n\t}\n\n\tprivate subscribeToReconnection() {\n\t\tthis.room.on(RoomEvent.Reconnecting, () => {\n\t\t\tif (this.panelService.isPanelOpened()) {\n\t\t\t\tthis.panelService.closePanel();\n\t\t\t}\n\t\t\tthis.isConnectionLost = true;\n\t\t});\n\t\tthis.room.on(RoomEvent.Reconnected, () => (this.isConnectionLost = false));\n\t}\n\n\tprivate subscribeToFullscreenChanged() {\n\t\tfromEvent(document, 'fullscreenchange')\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe(() => {\n\t\t\t\tconst isFullscreen = Boolean(document.fullscreenElement);\n\t\t\t\tif (isFullscreen) {\n\t\t\t\t\tthis.cdkOverlayService.setSelector('#session-container');\n\t\t\t\t} else {\n\t\t\t\t\tthis.cdkOverlayService.setSelector('body');\n\t\t\t\t}\n\t\t\t\tthis.isFullscreenActive = isFullscreen;\n\t\t\t\tthis.onFullscreenEnabledChanged.emit(this.isFullscreenActive);\n\t\t\t\tthis.cd.detectChanges();\n\t\t\t});\n\t}\n\n\tprivate subscribeToMenuToggling() {\n\t\tthis.panelService.panelStatusObs.pipe(takeUntil(this.destroy$)).subscribe((ev: PanelStatusInfo) => {\n\t\t\tthis.isChatOpened = ev.isOpened && ev.panelType === PanelType.CHAT;\n\t\t\tthis.isParticipantsOpened = ev.isOpened && ev.panelType === PanelType.PARTICIPANTS;\n\t\t\tthis.isActivitiesOpened = ev.isOpened && ev.panelType === PanelType.ACTIVITIES;\n\t\t\tif (this.isChatOpened) {\n\t\t\t\tthis.unreadMessages = 0;\n\t\t\t}\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\tprivate subscribeToChatMessages() {\n\t\tthis.chatService.chatMessages$.pipe(skip(1), takeUntil(this.destroy$)).subscribe((messages) => {\n\t\t\tif (!this.panelService.isChatPanelOpened()) {\n\t\t\t\tthis.unreadMessages++;\n\t\t\t}\n\t\t\tthis.messageList = messages;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\tprivate subscribeToRecordingStatus() {\n\t\tthis.libService.recordingActivityReadOnly$.pipe(takeUntil(this.destroy$)).subscribe((readOnly: boolean) => {\n\t\t\tthis.isRecordingReadOnlyMode = readOnly;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.recordingService.recordingStatusObs.pipe(takeUntil(this.destroy$)).subscribe((event: RecordingStatusInfo) => {\n\t\t\tconst { status, startedAt } = event;\n\t\t\tthis.recordingStatus = status;\n\t\t\tif (status === RecordingStatus.STARTED) {\n\t\t\t\tthis.startedRecording = event.recordingList.find((rec) => rec.status === RecordingStatus.STARTED);\n\t\t\t} else {\n\t\t\t\tthis.startedRecording = undefined;\n\t\t\t}\n\n\t\t\tif (startedAt) {\n\t\t\t\tthis.recordingTime = startedAt;\n\t\t\t}\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\tprivate subscribeToBroadcastingStatus() {\n\t\tthis.broadcastingService.broadcastingStatusObs.pipe(takeUntil(this.destroy$)).subscribe((ev: BroadcastingStatusInfo) => {\n\t\t\tif (!!ev) {\n\t\t\t\tthis.broadcastingStatus = ev.status;\n\t\t\t\tthis.broadcastingId = ev.broadcastingId;\n\t\t\t\tthis.cd.markForCheck();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate subscribeToToolbarDirectives() {\n\t\tthis.libService.minimal$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.isMinimal = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.brandingLogo$.pipe(takeUntil(this.destroy$)).subscribe((value: string) => {\n\t\t\tthis.brandingLogo = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.toolbarViewRecordingsButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showViewRecordingsButton = value;\n\t\t\tthis.checkDisplayMoreOptions();\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.cameraButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showCameraButton = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.microphoneButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showMicrophoneButton = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.screenshareButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showScreenshareButton = value && !this.platformService.isMobile();\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.fullscreenButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showFullscreenButton = value;\n\t\t\tthis.checkDisplayMoreOptions();\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.leaveButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showLeaveButton = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.recordingButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showRecordingButton = value;\n\t\t\tthis.checkDisplayMoreOptions();\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.broadcastingButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showBroadcastingButton = value;\n\t\t\tthis.checkDisplayMoreOptions();\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.toolbarSettingsButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showSettingsButton = value;\n\t\t\tthis.checkDisplayMoreOptions();\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.chatPanelButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showChatPanelButton = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.participantsPanelButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showParticipantsPanelButton = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.activitiesPanelButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showActivitiesPanelButton = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.backgroundEffectsButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showBackgroundEffectsButton = value;\n\t\t\tthis.checkDisplayMoreOptions();\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\tthis.libService.displayLogo$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showLogo = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.displayRoomName$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showRoomName = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\n\t\tthis.libService.roomName$.pipe(takeUntil(this.destroy$)).subscribe((value: string) => {\n\t\t\tthis.evalAndSetRoomName(value);\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t\t// this.libService.captionsButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t// \tthis.showCaptionsButton = value;\n\t\t// \tthis.cd.markForCheck();\n\t\t// });\n\n\t\tthis.libService.toolbarAdditionalButtonsPosition$\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe((value: ToolbarAdditionalButtonsPosition) => {\n\t\t\t\t// Using Promise.resolve() to defer change detection until the next microtask.\n\t\t\t\t// This ensures that Angular's change detection has the latest value before updating the view.\n\t\t\t\t// Without this, Angular's OnPush strategy might not immediately reflect the change,\n\t\t\t\t// due to asynchronous operations affecting the timing of the detection cycle.\n\n\t\t\t\tPromise.resolve().then(() => {\n\t\t\t\t\tthis.additionalButtonsPosition = value;\n\t\t\t\t\tthis.cd.markForCheck();\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tprivate subscribeToCaptionsToggling() {\n\t\tthis.layoutService.captionsTogglingObs.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.captionsEnabled = value;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\tprivate checkDisplayMoreOptions() {\n\t\tthis.showMoreOptionsButton =\n\t\t\tthis.showFullscreenButton ||\n\t\t\tthis.showBackgroundEffectsButton ||\n\t\t\tthis.showRecordingButton ||\n\t\t\tthis.showBroadcastingButton ||\n\t\t\tthis.showSettingsButton;\n\t}\n\n\tprivate evalAndSetRoomName(value: string) {\n\t\tif (!!value) {\n\t\t\tthis.roomName = value;\n\t\t} else if (!!this.room && this.room.name) {\n\t\t\tthis.roomName = this.room.name;\n\t\t} else {\n\t\t\tthis.roomName = '';\n\t\t}\n\t}\n}\n","<mat-toolbar id=\"toolbar\" class=\"toolbar-container\">\n\t<!-- Info container (logo, room name, recording/broadcasting status) -->\n\t<div id=\"info-container\" class=\"info-container\">\n\t\t<div>\n\t\t\t<!-- Branding Logo -->\n\t\t\t@if (!isMinimal && showLogo) {\n\t\t\t\t<img id=\"branding-logo\" [ovLogo]=\"brandingLogo\" />\n\t\t\t}\n\n\t\t\t<!-- Session Info -->\n\t\t\t<div id=\"session-info-container\" [class.collapsed]=\"isRecordingStarted || isBroadcastingStarted\">\n\t\t\t\t<!-- Room Name -->\n\t\t\t\t@if (!isMinimal && showRoomName) {\n\t\t\t\t\t<span id=\"session-name\">{{ roomName }}</span>\n\t\t\t\t}\n\n\t\t\t\t<!-- Activities (Recording / Broadcasting) -->\n\t\t\t\t@if (isRecordingStarted || isBroadcastingStarted) {\n\t\t\t\t\t<div id=\"activities-tag\">\n\t\t\t\t\t\t@if (isRecordingStarted) {\n\t\t\t\t\t\t\t<div id=\"recording-tag\" class=\"recording-tag\" (click)=\"openRecordingActivityPanel()\">\n\t\t\t\t\t\t\t\t<mat-icon class=\"blink\">radio_button_checked</mat-icon>\n\t\t\t\t\t\t\t\t<span class=\"blink\">REC</span>\n\t\t\t\t\t\t\t\t<span *ngIf=\"recordingTime\"> | {{ recordingTime | date: 'H:mm:ss' }}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t@if (isBroadcastingStarted) {\n\t\t\t\t\t\t\t<!-- Broadcasting tag -->\n\t\t\t\t\t\t\t<div id=\"broadcasting-tag\" class=\"broadcasting-tag\">\n\t\t\t\t\t\t\t\t<mat-icon class=\"blink\">sensors</mat-icon>\n\t\t\t\t\t\t\t\t<span class=\"blink\">LIVE</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- Media and menu buttons container -->\n\t<div class=\"media-buttons-container\" id=\"media-buttons-container\">\n\t\t<ov-toolbar-media-buttons\n\t\t\t[showCameraButton]=\"showCameraButton\"\n\t\t\t[isCameraEnabled]=\"isCameraEnabled\"\n\t\t\t[cameraMuteChanging]=\"cameraMuteChanging\"\n\t\t\t[showMicrophoneButton]=\"showMicrophoneButton\"\n\t\t\t[isMicrophoneEnabled]=\"isMicrophoneEnabled\"\n\t\t\t[microphoneMuteChanging]=\"microphoneMuteChanging\"\n\t\t\t[showScreenshareButton]=\"showScreenshareButton\"\n\t\t\t[isScreenShareEnabled]=\"isScreenShareEnabled\"\n\t\t\t[isFirefoxBrowser]=\"isFirefoxBrowser\"\n\t\t\t[hasVideoDevices]=\"hasVideoDevices\"\n\t\t\t[hasAudioDevices]=\"hasAudioDevices\"\n\t\t\t[isConnectionLost]=\"isConnectionLost\"\n\t\t\t[isMinimal]=\"isMinimal\"\n\t\t\t[showMoreOptionsButton]=\"showMoreOptionsButton\"\n\t\t\t[showFullscreenButton]=\"showFullscreenButton\"\n\t\t\t[showRecordingButton]=\"showRecordingButton\"\n\t\t\t[showViewRecordingsButton]=\"showViewRecordingsButton\"\n\t\t\t[showBroadcastingButton]=\"showBroadcastingButton\"\n\t\t\t[showBackgroundEffectsButton]=\"showBackgroundEffectsButton\"\n\t\t\t[showCaptionsButton]=\"showCaptionsButton\"\n\t\t\t[showSettingsButton]=\"showSettingsButton\"\n\t\t\t[isFullscreenActive]=\"isFullscreenActive\"\n\t\t\t[recordingStatus]=\"recordingStatus\"\n\t\t\t[hasRoomTracksPublished]=\"hasRoomTracksPublished\"\n\t\t\t[broadcastingStatus]=\"broadcastingStatus\"\n\t\t\t[captionsEnabled]=\"captionsEnabled\"\n\t\t\t[showLeaveButton]=\"showLeaveButton\"\n\t\t\t[toolbarAdditionalButtonsTemplate]=\"toolbarAdditionalButtonsTemplate\"\n\t\t\t[additionalButtonsPosition]=\"additionalButtonsPosition\"\n\t\t\t[toolbarLeaveButtonTemplate]=\"toolbarLeaveButtonTemplate\"\n\t\t\t(cameraToggled)=\"toggleCamera()\"\n\t\t\t(microphoneToggled)=\"toggleMicrophone()\"\n\t\t\t(screenShareToggled)=\"toggleScreenShare()\"\n\t\t\t(screenTrackReplaced)=\"replaceScreenTrack()\"\n\t\t\t(fullscreenToggled)=\"toggleFullscreen()\"\n\t\t\t(recordingToggled)=\"toggleRecording()\"\n\t\t\t(viewRecordingsClicked)=\"onViewRecordingsClicked.emit()\"\n\t\t\t(broadcastingToggled)=\"toggleBroadcasting()\"\n\t\t\t(backgroundEffectsToggled)=\"toggleBackgroundEffects()\"\n\t\t\t(captionsToggled)=\"onCaptionsToggle()\"\n\t\t\t(settingsToggled)=\"toggleSettings()\"\n\t\t\t(leaveClicked)=\"disconnect()\"\n\t\t>\n\t\t\t<!-- Inject additional menu items via content projection -->\n\t\t\t<ng-container *ovToolbarMoreOptionsAdditionalMenuItems>\n\t\t\t\t<ng-container *ngTemplateOutlet=\"externalMoreOptionsAdditionalMenuItems?.template\"></ng-container>\n\t\t\t</ng-container>\n\t\t</ov-toolbar-media-buttons>\n\t</div>\n\n\t<!-- Panel buttons -->\n\t<div class=\"menu-buttons-container\" id=\"menu-buttons-container\">\n\t\t<ov-toolbar-panel-buttons\n\t\t\t[isMinimal]=\"isMinimal\"\n\t\t\t[isConnectionLost]=\"isConnectionLost\"\n\t\t\t[isActivitiesOpened]=\"isActivitiesOpened\"\n\t\t\t[isParticipantsOpened]=\"isParticipantsOpened\"\n\t\t\t[isChatOpened]=\"isChatOpened\"\n\t\t\t[unreadMessages]=\"unreadMessages\"\n\t\t\t[showActivitiesPanelButton]=\"showActivitiesPanelButton\"\n\t\t\t[showParticipantsPanelButton]=\"showParticipantsPanelButton\"\n\t\t\t[showChatPanelButton]=\"showChatPanelButton\"\n\t\t\t[recordingStatus]=\"recordingStatus\"\n\t\t\t[broadcastingStatus]=\"broadcastingStatus\"\n\t\t\t[totalParticipants]=\"totalParticipants()\"\n\t\t\t[toolbarAdditionalPanelButtonsTemplate]=\"toolbarAdditionalPanelButtonsTemplate\"\n\t\t\t(toggleActivitiesPanel)=\"toggleActivitiesPanel($event)\"\n\t\t\t(toggleParticipantsPanel)=\"toggleParticipantsPanel()\"\n\t\t\t(toggleChatPanel)=\"toggleChatPanel()\"\n\t\t></ov-toolbar-panel-buttons>\n\t</div>\n</mat-toolbar>\n","/**\n * Enum representing the possible states of the videoconference component\n */\nexport enum VideoconferenceState {\n\t/**\n\t * Initial state when the component is loading\n\t */\n\tINITIALIZING = 'INITIALIZING',\n\n\t/**\n\t * Prejoin page is being shown to the user\n\t */\n\tPREJOIN_SHOWN = 'PREJOIN_SHOWN',\n\n\t/**\n\t * User has initiated the join process, waiting for token\n\t */\n\tJOINING = 'JOINING',\n\n\t/**\n\t * Token received and room is ready to connect\n\t */\n\tREADY_TO_CONNECT = 'READY_TO_CONNECT',\n\n\t/**\n\t * Successfully connected to the room\n\t */\n\tCONNECTED = 'CONNECTED',\n\n\t/**\n\t * Disconnected from the room\n\t */\n\tDISCONNECTED = 'DISCONNECTED',\n\n\t/**\n\t * Error state\n\t */\n\tERROR = 'ERROR'\n}\n\n/**\n * Interface representing the state information of the videoconference component\n */\nexport interface VideoconferenceStateInfo {\n\t/**\n\t * Current state of the videoconference\n\t */\n\tstate: VideoconferenceState;\n\n\t/**\n\t * Whether prejoin page should be visible\n\t */\n\tshowPrejoin: boolean;\n\n\t/**\n\t * Whether room is ready for connection\n\t */\n\tisRoomReady: boolean;\n\n\t/**\n\t * Whether user is connected to the room\n\t */\n\tisConnected: boolean;\n\n\t/**\n\t * Whether audio devices are available\n\t */\n\thasAudioDevices: boolean;\n\n\t/**\n\t * Whether video devices are available\n\t */\n\thasVideoDevices: boolean;\n\n\t/**\n\t * Whether user has initiated the join process\n\t */\n\thasUserInitiatedJoin: boolean;\n\n\t/**\n\t * Whether prejoin was shown to the user at least once\n\t */\n\twasPrejoinShown: boolean;\n\n\t/**\n\t * Whether the component is in loading state\n\t */\n\tisLoading: boolean;\n\n\t/**\n\t * Error information if any\n\t */\n\terror?: {\n\t\thasError: boolean;\n\t\tmessage?: string;\n\t\ttokenError?: any;\n\t};\n}\n","/**\n * Represents the possible theme modes for OpenVidu components\n * @internal\n */\nexport enum OpenViduThemeMode {\n\tLight = 'light',\n\tDark = 'dark',\n\tClassic = 'classic'\n}\n\n/**\n * Interface representing the complete set of theme variables for OpenVidu components\n * @internal\n */\nexport interface OpenViduThemeVariables {\n\t// === Core Background Colors ===\n\t'--ov-background-color'?: string;\n\t'--ov-surface-color'?: string;\n\t'--ov-surface-container-color'?: string;\n\n\t// === Action Colors ===\n\t'--ov-primary-action-color'?: string;\n\t'--ov-secondary-action-color'?: string;\n\t'--ov-accent-action-color'?: string;\n\n\t// === State Colors ===\n\t'--ov-error-color'?: string;\n\t'--ov-warn-color'?: string;\n\t'--ov-success-color'?: string;\n\n\t// === Text Colors ===\n\t'--ov-text-primary-color'?: string;\n\t'--ov-text-surface-color'?: string;\n\t'--ov-text-secondary-color'?: string;\n\t'--ov-text-disabled-color'?: string;\n\n\t// === Interactive States ===\n\t'--ov-hover-color'?: string;\n\t'--ov-disabled-background'?: string;\n\t'--ov-disabled-border-color'?: string;\n\n\t// === Input & Form Colors ===\n\t'--ov-border-color'?: string;\n\n\t// === Layout & Spacing ===\n\t'--ov-toolbar-buttons-radius'?: string;\n\t'--ov-leave-button-radius'?: string;\n\t'--ov-video-radius'?: string;\n\t'--ov-surface-radius'?: string;\n\t'--ov-input-radius'?: string;\n\n\t// === Special Colors ===\n\t'--ov-recording-color'?: string;\n\t'--ov-broadcasting-color'?: string;\n\t'--ov-selection-color'?: string;\n\t'--ov-selection-color-btn'?: string;\n\t'--ov-activity-status-color'?: string;\n\n\t// === Video/Media Specific ===\n\t'--ov-video-background'?: string;\n\t'--ov-captions-height'?: string;\n\n\t// Allow for custom variables\n\t[key: string]: string | undefined;\n}\n\n/**\n * Predefined theme configurations\n * @internal\n */\nexport const OPENVIDU_COMPONENTS_LIGHT_THEME: OpenViduThemeVariables = {\n\t'--ov-background-color': '#f5f5f5',\n\t'--ov-surface-color': '#ffffff',\n\t'--ov-surface-container-color': '#f8f9fa',\n\t'--ov-primary-action-color': '#d6d6d6ff',\n\t'--ov-secondary-action-color': '#d6d6d6ff',\n\t'--ov-accent-action-color': '#a9e3f0ff',\n\t'--ov-error-color': '#dc3545',\n\t'--ov-warn-color': '#eea300',\n\t'--ov-success-color': '#28a745',\n\t'--ov-text-primary-color': '#4e4f50',\n\t'--ov-text-surface-color': '#212529',\n\t'--ov-text-secondary-color': '#6c757d',\n\t'--ov-text-disabled-color': '#adb5bd',\n\t'--ov-hover-color': '#f8f9fa',\n\t'--ov-disabled-background': '#f8f9fa',\n\t'--ov-disabled-border-color': '#dee2e6',\n\t'--ov-border-color': '#ced4da',\n\t'--ov-activity-status-color': '#c8cdd6',\n\t'--ov-broadcasting-color': '#8837f1',\n\t'--ov-video-background': '#000000',\n\n\t'--ov-toolbar-buttons-radius': '50%',\n\t'--ov-leave-button-radius': '10px',\n\t'--ov-video-radius': '5px',\n\t'--ov-surface-radius': '5px'\n};\n\n/**\n * Predefined dark theme configuration\n * @internal\n */\nexport const OPENVIDU_COMPONENTS_DARK_THEME: OpenViduThemeVariables = {\n\t'--ov-background-color': '#1f2020',\n\t'--ov-surface-color': '#2d2d2d',\n\t'--ov-surface-container-color': '#3a3a3a',\n\t'--ov-primary-action-color': '#4a4e4e',\n\t'--ov-secondary-action-color': '#5c5c5cff',\n\t'--ov-accent-action-color': '#009ab9',\n\t'--ov-error-color': '#dc3545',\n\t'--ov-warn-color': '#eea300',\n\t'--ov-success-color': '#69db7c',\n\t'--ov-text-primary-color': '#ffffff',\n\t'--ov-text-surface-color': '#f0f0f0',\n\t'--ov-text-secondary-color': '#b3b3b3',\n\t'--ov-text-disabled-color': '#666666',\n\t'--ov-hover-color': '#4a4a4a',\n\t'--ov-disabled-background': '#3a3a3a',\n\t'--ov-disabled-border-color': '#555555',\n\t'--ov-border-color': '#555555',\n\t'--ov-activity-status-color': '#c8cdd6',\n\t'--ov-broadcasting-color': '#9d5af3',\n\t'--ov-video-background': '#000000',\n\n\t'--ov-toolbar-buttons-radius': '50%',\n\t'--ov-leave-button-radius': '10px',\n\t'--ov-video-radius': '5px',\n\t'--ov-surface-radius': '5px'\n};\n","import { Injectable, Inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport {\n\tOPENVIDU_COMPONENTS_DARK_THEME,\n\tOPENVIDU_COMPONENTS_LIGHT_THEME,\n\tOpenViduThemeMode,\n\tOpenViduThemeVariables\n} from '../../models/theme.model';\nimport { StorageService } from '../storage/storage.service';\n\n/**\n * Service for managing OpenVidu component themes dynamically\n *\n * This service allows you to:\n * - Switch between light, dark and classic themes\n * - Apply custom theme variables\n * - Listen to theme changes\n * - Integrate with Angular Material themes\n *\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class OpenViduThemeService {\n\tprivate readonly THEME_ATTRIBUTE = 'data-ov-theme';\n\tprivate currentThemeSubject = new BehaviorSubject<OpenViduThemeMode>(OpenViduThemeMode.Classic);\n\tprivate currentVariablesSubject = new BehaviorSubject<OpenViduThemeVariables>({});\n\n\t/**\n\t * Observable that emits the current theme mode\n\t */\n\tpublic readonly currentTheme$: Observable<OpenViduThemeMode> = this.currentThemeSubject.asObservable();\n\n\t/**\n\t * Observable that emits the current theme variables\n\t */\n\tpublic readonly currentVariables$: Observable<OpenViduThemeVariables> = this.currentVariablesSubject.asObservable();\n\n\tconstructor(\n\t\t@Inject(DOCUMENT) private document: Document,\n\t\tprotected storageService: StorageService\n\t) {}\n\n\tinitializeTheme(): void {\n\t\tconst savedTheme = this.storageService.getTheme();\n\t\tconst initialTheme = savedTheme || OpenViduThemeMode.Classic;\n\t\tthis.applyTheme(initialTheme);\n\t\tthis.currentThemeSubject.next(initialTheme);\n\t}\n\n\tgetAllThemes(): OpenViduThemeMode[] {\n\t\treturn Object.values(OpenViduThemeMode);\n\t}\n\n\t/**\n\t * Gets the current theme mode\n\t */\n\tgetCurrentTheme(): OpenViduThemeMode {\n\t\treturn this.currentThemeSubject.value;\n\t}\n\n\t/**\n\t * Gets the current theme variables\n\t */\n\tgetCurrentVariables(): OpenViduThemeVariables {\n\t\treturn this.currentVariablesSubject.value;\n\t}\n\n\t/**\n\t * Sets the theme mode to apply {@link OpenViduThemeMode}\n\t * @param theme The theme mode to apply\n\t */\n\tsetTheme(theme: OpenViduThemeMode): void {\n\t\tthis.applyTheme(theme);\n\t\tthis.currentThemeSubject.next(theme);\n\t\tthis.storageService.setTheme(theme);\n\t}\n\n\t/**\n\t * Updates specific theme variables\n\t * @param variables Object containing CSS variables to update\n\t */\n\tupdateThemeVariables(variables: OpenViduThemeVariables): void {\n\t\tconst mergedVariables = { ...this.currentVariablesSubject.value, ...variables };\n\t\tthis.currentVariablesSubject.next(mergedVariables);\n\t\tthis.applyCSSVariables(variables);\n\t}\n\n\t/**\n\t * Replaces all theme variables with a new set\n\t * @param variables Complete set of theme variables\n\t */\n\tsetThemeVariables(variables: OpenViduThemeVariables): void {\n\t\tthis.currentVariablesSubject.next(variables);\n\t\tthis.applyCSSVariables(variables);\n\t}\n\n\t/**\n\t * Resets theme variables to default values based on current theme\n\t */\n\tresetThemeVariables(): void {\n\t\tconst currentTheme = this.getCurrentTheme();\n\t\tconst defaultVariables = this.getDefaultVariablesForTheme(currentTheme);\n\t\tthis.setThemeVariables(defaultVariables);\n\t}\n\n\t/**\n\t * Applies a predefined theme configuration\n\t * @param themeVariables Predefined theme configuration (e.g., OPENVIDU_LIGHT_THEME)\n\t */\n\tapplyThemeConfiguration(themeVariables: OpenViduThemeVariables): void {\n\t\tthis.setThemeVariables(themeVariables);\n\t}\n\n\t/**\n\t * Toggles between light and dark themes\n\t */\n\ttoggleTheme(): void {\n\t\tconst currentTheme = this.getCurrentTheme();\n\t\tif (currentTheme === OpenViduThemeMode.Light) {\n\t\t\tthis.setTheme(OpenViduThemeMode.Dark);\n\t\t} else if (currentTheme === OpenViduThemeMode.Dark) {\n\t\t\tthis.setTheme(OpenViduThemeMode.Light);\n\t\t} else {\n\t\t\t// If auto, switch to opposite of system preference\n\t\t\tconst prefersDark = this.prefersDarkMode();\n\t\t\tthis.setTheme(prefersDark ? OpenViduThemeMode.Light : OpenViduThemeMode.Dark);\n\t\t}\n\t}\n\n\t/**\n\t * Gets a specific CSS variable value\n\t * @param variableName The CSS variable name (with or without --)\n\t */\n\tgetThemeVariable(variableName: string): string {\n\t\tconst varName = variableName.startsWith('--') ? variableName : `--${variableName}`;\n\t\treturn getComputedStyle(this.document.documentElement).getPropertyValue(varName).trim();\n\t}\n\n\t/**\n\t * Checks if the system prefers dark mode\n\t */\n\tprefersDarkMode(): boolean {\n\t\treturn window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n\t}\n\n\tprivate applyTheme(theme: OpenViduThemeMode): void {\n\t\tconst documentElement = this.document.documentElement;\n\t\tconst currentTheme = this.getCurrentTheme();\n\t\tif (theme === OpenViduThemeMode.Classic) {\n\t\t\tdocumentElement.removeAttribute(this.THEME_ATTRIBUTE);\n\t\t\tconst currentVariables = this.getDefaultVariablesForTheme(currentTheme);\n\t\t\tthis.removeCSSVariables(currentVariables);\n\t\t} else {\n\t\t\tdocumentElement.setAttribute(this.THEME_ATTRIBUTE, theme);\n\t\t}\n\n\t\t// Apply default variables for the theme\n\t\tconst defaultVariables = this.getDefaultVariablesForTheme(theme);\n\t\tthis.applyCSSVariables(defaultVariables);\n\t}\n\n\tprivate applyCSSVariables(variables: OpenViduThemeVariables): void {\n\t\tconst documentElement = this.document.documentElement;\n\n\t\tObject.entries(variables).forEach(([property, value]) => {\n\t\t\tif (value !== undefined) {\n\t\t\t\tdocumentElement.style.setProperty(property, value);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate removeCSSVariables(variables: OpenViduThemeVariables): void {\n\t\tconst documentElement = this.document.documentElement;\n\n\t\tObject.keys(variables).forEach((property) => {\n\t\t\tdocumentElement.style.removeProperty(property);\n\t\t});\n\t}\n\n\tprivate getDefaultVariablesForTheme(theme: OpenViduThemeMode): OpenViduThemeVariables {\n\t\tswitch (theme) {\n\t\t\tcase OpenViduThemeMode.Light:\n\t\t\t\treturn OPENVIDU_COMPONENTS_LIGHT_THEME;\n\t\t\tcase OpenViduThemeMode.Dark:\n\t\t\t\treturn OPENVIDU_COMPONENTS_DARK_THEME;\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t}\n}\n","/**\n * @internal\n */\nexport enum EffectType {\n\tNONE = 'NONE',\n\tBLUR = 'BLUR',\n\tIMAGE = 'IMAGE'\n}\n\n/**\n * @internal\n */\nexport interface BackgroundEffect {\n\tid: string;\n\ttype: EffectType;\n\tthumbnail: string;\n\tsrc?: string;\n}\n","import { computed, Injectable, Signal } from '@angular/core';\nimport { SwitchBackgroundProcessorOptions } from '@livekit/track-processors';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { BackgroundEffect, EffectType } from '../../models/background-effect.model';\nimport { ILogger } from '../../models/logger.model';\nimport { LoggerService } from '../logger/logger.service';\nimport { OpenViduService } from '../openvidu/openvidu.service';\nimport { StorageService } from '../storage/storage.service';\n\n/**\n * @internal\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class VirtualBackgroundService {\n\tbackgroundIdSelected = <BehaviorSubject<string>>new BehaviorSubject('');\n\tbackgroundIdSelected$: Observable<string>;\n\tbackgrounds: BackgroundEffect[] = [\n\t\t{ id: 'no_effect', type: EffectType.NONE, thumbnail: 'block' },\n\t\t{ id: 'soft_blur', type: EffectType.BLUR, thumbnail: 'blur_on' },\n\t\t{ id: 'hard_blur', type: EffectType.BLUR, thumbnail: 'blur_on' },\n\t\t{ id: '1', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-1.jpg', src: 'assets/backgrounds/bg-1.jpg' },\n\t\t{ id: '2', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-2.jpg', src: 'assets/backgrounds/bg-2.jpg' },\n\t\t{ id: '3', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-3.jpg', src: 'assets/backgrounds/bg-3.jpg' },\n\t\t{ id: '4', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-4.jpg', src: 'assets/backgrounds/bg-4.jpg' },\n\t\t{ id: '5', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-5.jpg', src: 'assets/backgrounds/bg-5.jpg' },\n\t\t{ id: '6', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-6.jpg', src: 'assets/backgrounds/bg-6.jpg' },\n\t\t{ id: '7', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-7.jpg', src: 'assets/backgrounds/bg-7.jpg' },\n\t\t{ id: '8', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-8.jpg', src: 'assets/backgrounds/bg-8.jpg' },\n\t\t{ id: '9', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-9.jpg', src: 'assets/backgrounds/bg-9.jpg' },\n\t\t{ id: '10', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-10.jpg', src: 'assets/backgrounds/bg-10.jpg' },\n\t\t{ id: '11', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-11.jpg', src: 'assets/backgrounds/bg-11.jpg' },\n\t\t{ id: '12', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-12.jpg', src: 'assets/backgrounds/bg-12.jpg' },\n\t\t{ id: '13', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-13.jpg', src: 'assets/backgrounds/bg-13.jpg' },\n\t\t{ id: '14', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-14.jpg', src: 'assets/backgrounds/bg-14.jpg' },\n\t\t{ id: '15', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-15.jpg', src: 'assets/backgrounds/bg-15.jpg' },\n\t\t{ id: '16', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-16.jpg', src: 'assets/backgrounds/bg-16.jpg' },\n\t\t{ id: '17', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-17.jpg', src: 'assets/backgrounds/bg-17.jpg' },\n\t\t{ id: '18', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-18.jpg', src: 'assets/backgrounds/bg-18.jpg' },\n\t\t{ id: '19', type: EffectType.IMAGE, thumbnail: 'assets/backgrounds/thumbnails/bg-19.jpg', src: 'assets/backgrounds/bg-19.jpg' }\n\t];\n\n\tprivate SOFT_BLUR_INTENSITY = 20;\n\tprivate HARD_BLUR_INTENSITY = 60;\n\n\tprivate log: ILogger;\n\n\tconstructor(\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate storageService: StorageService,\n\t\tprivate loggerSrv: LoggerService\n\t) {\n\t\tthis.log = this.loggerSrv.get('VirtualBackgroundService');\n\t\tthis.backgroundIdSelected$ = this.backgroundIdSelected.asObservable();\n\t}\n\n\tgetBackgrounds(): BackgroundEffect[] {\n\t\treturn this.backgrounds;\n\t}\n\n\t/**\n\t * Computed signal that checks if virtual background is supported (requires GPU).\n\t * Reactively tracks the support status from OpenViduService.\n\t */\n\treadonly isVirtualBackgroundSupported: Signal<boolean> = computed(() =>\n\t\tthis.openviduService.isBackgroundProcessorSupported()\n\t);\n\n\tisBackgroundApplied(): boolean {\n\t\tconst bgSelected = this.backgroundIdSelected.getValue();\n\t\treturn !!bgSelected && bgSelected !== 'no_effect';\n\t}\n\n\tasync applyBackgroundFromStorage() {\n\t\tconst bgId = this.storageService.getBackground();\n\t\tif (!!bgId) {\n\t\t\tconst background = this.backgrounds.find((bg) => bg.id === bgId);\n\t\t\tif (background) {\n\t\t\t\tawait this.applyBackground(background);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Applies a background effect to the local video track.\n\t * Works both in prejoin (using OpenViduService's processor) and in-room states.\n\t * The background processor is centralized in OpenViduService for consistency.\n\t */\n\tasync applyBackground(bg: BackgroundEffect) {\n\t\t// Check if virtual background is supported before proceeding\n\t\tif (!this.isVirtualBackgroundSupported()) {\n\t\t\tthis.log.w('Virtual background not supported (GPU disabled). Skipping background application.');\n\t\t\treturn;\n\t\t}\n\n\t\t// If the background is already applied, do nothing\n\t\tif (this.backgroundIsAlreadyApplied(bg.id)) return;\n\n\t\ttry {\n\t\t\tconst options = this.getBackgroundOptions(bg);\n\t\t\tawait this.openviduService.switchBackgroundMode(options);\n\n\t\t\tthis.storageService.setBackground(bg.id);\n\t\t\tthis.backgroundIdSelected.next(bg.id);\n\t\t\tthis.log.d('Background applied:', options);\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error applying background effect:', error);\n\t\t}\n\t}\n\n\tasync removeBackground() {\n\t\tif (this.isBackgroundApplied()) {\n\t\t\tthis.backgroundIdSelected.next('no_effect');\n\t\t\ttry {\n\t\t\t\tawait this.openviduService.switchBackgroundMode({ mode: 'disabled' });\n\t\t\t} catch (e) {\n\t\t\t\tthis.log.w('Error disabling processor:', e);\n\t\t\t}\n\t\t\tthis.storageService.removeBackground();\n\t\t}\n\t}\n\n\tprivate getBackgroundOptions(bg: BackgroundEffect): SwitchBackgroundProcessorOptions {\n\t\tif (bg.type === EffectType.NONE) {\n\t\t\treturn { mode: 'disabled' };\n\t\t} else if (bg.type === EffectType.IMAGE && bg.src) {\n\t\t\treturn { mode: 'virtual-background', imagePath: bg.src };\n\t\t} else if (bg.type === EffectType.BLUR) {\n\t\t\treturn {\n\t\t\t\tmode: 'background-blur',\n\t\t\t\tblurRadius: bg.id === 'soft_blur' ? this.SOFT_BLUR_INTENSITY : this.HARD_BLUR_INTENSITY\n\t\t\t};\n\t\t}\n\t\treturn { mode: 'disabled' };\n\t}\n\n\tprivate backgroundIsAlreadyApplied(backgroundId: string): boolean {\n\t\treturn backgroundId === this.backgroundIdSelected.getValue();\n\t}\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, EventEmitter, Input, OnInit, Output, Signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { BackgroundEffect, EffectType } from '../../../models/background-effect.model';\nimport { PanelType } from '../../../models/panel.model';\nimport { PanelService } from '../../../services/panel/panel.service';\nimport { VirtualBackgroundService } from '../../../services/virtual-background/virtual-background.service';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-background-effects-panel',\n\ttemplateUrl: './background-effects-panel.component.html',\n\tstyleUrls: ['../panel.component.scss', './background-effects-panel.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class BackgroundEffectsPanelComponent implements OnInit {\n\t@Input() mode: 'prejoin' | 'meeting' = 'meeting';\n\t@Output() onClose = new EventEmitter<void>();\n\n\tbackgroundSelectedId: string;\n\teffectType = EffectType;\n\tbackgroundImages: BackgroundEffect[] = [];\n\tnoEffectAndBlurredBackground: BackgroundEffect[] = [];\n\tprivate backgrounds: BackgroundEffect[] = [];\n\tprivate backgroundSubs: Subscription;\n\n\t/**\n\t * @internal\n\t * @param panelService\n\t * @param backgroundService\n\t * @param cd\n\t */\n\tconstructor(\n\t\tprivate panelService: PanelService,\n\t\tprivate backgroundService: VirtualBackgroundService,\n\t\tprivate cd: ChangeDetectorRef\n\t) {}\n\n\t/**\n\t * Computed signal that reactively tracks if virtual background is supported.\n\t * Updates automatically when browser support changes.\n\t */\n\treadonly isVirtualBackgroundSupported: Signal<boolean> = computed(() =>\n\t\tthis.backgroundService.isVirtualBackgroundSupported()\n\t);\n\n\tngOnInit(): void {\n\t\tthis.subscribeToBackgroundSelected();\n\t\tthis.backgrounds = this.backgroundService.getBackgrounds();\n\t\tthis.noEffectAndBlurredBackground = this.backgrounds.filter((f) => f.type === EffectType.BLUR || f.type === EffectType.NONE);\n\t\tthis.backgroundImages = this.backgrounds.filter((f) => f.type === EffectType.IMAGE);\n\t}\n\n\tngOnDestroy() {\n\t\tif (this.backgroundSubs) this.backgroundSubs.unsubscribe();\n\t}\n\tsubscribeToBackgroundSelected() {\n\t\tthis.backgroundSubs = this.backgroundService.backgroundIdSelected$.subscribe((id) => {\n\t\t\tthis.backgroundSelectedId = id;\n\t\t\tthis.cd.markForCheck();\n\t\t});\n\t}\n\n\tclose() {\n\t\tif (this.mode === 'prejoin') {\n\t\t\tthis.onClose.emit();\n\t\t} else {\n\t\t\tthis.panelService.togglePanel(PanelType.BACKGROUND_EFFECTS);\n\t\t}\n\t}\n\n\tasync applyBackground(effect: BackgroundEffect) {\n\t\tawait this.backgroundService.applyBackground(effect);\n\t}\n}\n","<div class=\"panel-container\" id=\"background-effects-container\" [class.prejoin-mode]=\"mode === 'prejoin'\">\n\t@if (mode === 'meeting') {\n\t\t<div class=\"panel-header-container\">\n\t\t\t<h3 class=\"panel-title\">{{ 'PANEL.BACKGROUND.TITLE' | translate }}</h3>\n\n\t\t\t<button class=\"panel-close-button\" mat-icon-button matTooltip=\"{{ 'PANEL.CLOSE' | translate }}\" (click)=\"close()\">\n\t\t\t\t<mat-icon>close</mat-icon>\n\t\t\t</button>\n\t\t</div>\n\t} @else {\n\t\t<button class=\"panel-close-button\" mat-icon-button matTooltip=\"{{ 'PANEL.CLOSE' | translate }}\" (click)=\"close()\">\n\t\t\t<mat-icon>arrow_back</mat-icon>\n\t\t</button>\n\t}\n\n\t@if (!isVirtualBackgroundSupported()) {\n\t\t<div class=\"not-supported-message\">\n\t\t\t<p class=\"warning-title\">{{ 'PANEL.BACKGROUND.NOT_SUPPORTED' | translate }}</p>\n\t\t\t<p class=\"warning-description\">{{ 'PANEL.BACKGROUND.NOT_SUPPORTED_DESCRIPTION' | translate }}</p>\n\t\t</div>\n\t}\n\n\t<div class=\"effects-container\" fxFlex=\"100%\" fxLayoutAlign=\"space-evenly none\">\n\t\t<div>\n\t\t\t<h4 class=\"background-title\">{{ 'PANEL.BACKGROUND.BLURRED_SECTION' | translate }}</h4>\n\t\t\t<div>\n\t\t\t\t<button\n\t\t\t\t\t*ngFor=\"let effect of noEffectAndBlurredBackground\"\n\t\t\t\t\tmat-icon-button\n\t\t\t\t\tclass=\"effect-button\"\n\t\t\t\t\t[class.active-effect-btn]=\"backgroundSelectedId === effect.id\"\n\t\t\t\t\t(click)=\"applyBackground(effect)\"\n\t\t\t\t\t[attr.id]=\"effect.id + '-btn'\"\n\t\t\t\t\t[disabled]=\"!isVirtualBackgroundSupported()\"\n\t\t\t\t\t[matTooltip]=\"\n\t\t\t\t\t\teffect.type === effectType.NONE\n\t\t\t\t\t\t\t? ('PANEL.BACKGROUND.NO_EFFECTS' | translate)\n\t\t\t\t\t\t\t: ('PANEL.BACKGROUND.BLURRED_EFFECT' | translate)\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon>{{ effect.thumbnail }}</mat-icon>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<hr />\n\t\t<div>\n\t\t\t<h4 class=\"background-title\">{{ 'PANEL.BACKGROUND.IMAGES_SECTION' | translate }}</h4>\n\n\t\t\t<div class=\"grid\">\n\t\t\t\t<div\n\t\t\t\t\t*ngFor=\"let effect of backgroundImages\"\n\t\t\t\t\tclass=\"effect-button\"\n\t\t\t\t\t[id]=\"'effect-' + effect.id\"\n\t\t\t\t\t[class.active-effect-btn]=\"backgroundSelectedId === effect.id\"\n\t\t\t\t\t[class.disabled]=\"!isVirtualBackgroundSupported()\"\n\t\t\t\t\t(click)=\"isVirtualBackgroundSupported() && applyBackground(effect)\"\n\t\t\t\t>\n\t\t\t\t\t<img [src]=\"effect.thumbnail\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n","import { Component, effect, EventEmitter, Input, OnInit, Output, Signal, WritableSignal } from '@angular/core';\nimport { CustomDevice } from '../../../models/device.model';\nimport { ILogger } from '../../../models/logger.model';\nimport { DeviceService } from '../../../services/device/device.service';\nimport { LoggerService } from '../../../services/logger/logger.service';\nimport { ParticipantService } from '../../../services/participant/participant.service';\nimport { StorageService } from '../../../services/storage/storage.service';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-video-devices-select',\n\ttemplateUrl: './video-devices.component.html',\n\tstyleUrls: ['./video-devices.component.scss'],\n\tstandalone: false\n})\nexport class VideoDevicesComponent implements OnInit {\n\t@Input() compact: boolean = false;\n\t@Output() onVideoDeviceChanged = new EventEmitter<CustomDevice>();\n\t@Output() onVideoEnabledChanged = new EventEmitter<boolean>();\n\t@Output() onVideoDevicesLoaded = new EventEmitter<CustomDevice[]>();\n\n\tcameraStatusChanging: boolean = false;\n\tisCameraEnabled: boolean = false;\n\n\tprotected readonly cameras: WritableSignal<CustomDevice[]>;\n\tprotected readonly cameraSelected: WritableSignal<CustomDevice | undefined>;\n\tprotected readonly hasVideoDevices: Signal<boolean>;\n\n\tprivate log: ILogger;\n\n\tconstructor(\n\t\tprivate storageSrv: StorageService,\n\t\tprivate deviceSrv: DeviceService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate loggerSrv: LoggerService\n\t) {\n\t\tthis.log = this.loggerSrv.get('VideoDevicesComponent');\n\t\tthis.cameras = this.deviceSrv.cameras;\n\t\tthis.cameraSelected = this.deviceSrv.cameraSelected;\n\t\tthis.hasVideoDevices = this.deviceSrv.hasVideoDevices;\n\n\t\t// Use effect instead of subscription for reactive updates\n\t\teffect(() => {\n\t\t\tconst participant = this.participantService.localParticipantSignal();\n\t\t\tif (participant) {\n\t\t\t\tthis.isCameraEnabled = participant.isCameraEnabled;\n\t\t\t\tthis.storageSrv.setCameraEnabled(this.isCameraEnabled);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync ngOnInit() {\n\t\t// Emit initial device list (reactively)\n\t\tthis.onVideoDevicesLoaded.emit(this.cameras());\n\t\tthis.isCameraEnabled = this.participantService.isMyCameraEnabled();\n\t}\n\n\tasync toggleCam(event: any) {\n\t\tevent.stopPropagation();\n\t\tthis.cameraStatusChanging = true;\n\t\tthis.isCameraEnabled = !this.isCameraEnabled;\n\t\tawait this.participantService.setCameraEnabled(this.isCameraEnabled);\n\t\tthis.storageSrv.setCameraEnabled(this.isCameraEnabled);\n\t\tthis.onVideoEnabledChanged.emit(this.isCameraEnabled);\n\t\tthis.cameraStatusChanging = false;\n\t}\n\n\tasync onCameraSelected(event: any) {\n\t\ttry {\n\t\t\tconst device: CustomDevice = event?.value;\n\n\t\t\t// Is New deviceId different from the old one?\n\t\t\tif (this.deviceSrv.needUpdateVideoTrack(device)) {\n\t\t\t\tthis.cameraStatusChanging = true;\n\t\t\t\tawait this.participantService.switchCamera(device.device);\n\t\t\t\tthis.deviceSrv.setCameraSelected(device.device);\n\t\t\t\tthis.onVideoDeviceChanged.emit(this.cameraSelected());\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error switching camera', error);\n\t\t} finally {\n\t\t\tthis.cameraStatusChanging = false;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Compare two devices to check if they are the same. Used by the mat-select\n\t */\n\tcompareObjectDevices(o1: CustomDevice, o2: CustomDevice): boolean {\n\t\treturn o1.label === o2.label;\n\t}\n}\n","<div class=\"video-device-selector\" [class.compact]=\"compact\">\n\t<!-- Unified Device Button (Compact Mode) -->\n\t@if (compact) {\n\t\t@if (hasVideoDevices()) {\n\t\t\t<div class=\"unified-device-button\">\n\t\t\t\t<!-- Main toggle button -->\n\t\t\t\t<button\n\t\t\t\t\tmat-flat-button\n\t\t\t\t\tclass=\"toggle-section\"\n\t\t\t\t[disabled]=\"!hasVideoDevices() || cameraStatusChanging\"\n\t\t\t\t[class.device-enabled]=\"isCameraEnabled\"\n\t\t\t\t[class.device-disabled]=\"!isCameraEnabled\"\n\t\t\t\t(click)=\"toggleCam($event)\"\n\t\t\t\t[matTooltip]=\"isCameraEnabled ? ('TOOLBAR.STOP_VIDEO' | translate) : ('TOOLBAR.START_VIDEO' | translate)\"\n\t\t\t\t[matTooltipDisabled]=\"!hasVideoDevices()\"\n\t\t\t\t\tid=\"camera-button\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon [id]=\"isCameraEnabled ? 'videocam' : 'videocam_off'\">\n\t\t\t\t\t\t{{ isCameraEnabled ? 'videocam' : 'videocam_off' }}\n\t\t\t\t\t</mat-icon>\n\t\t\t\t</button>\n\n\t\t\t\t<!-- Dropdown section -->\n\t\t\t\t@if (isCameraEnabled) {\n\t\t\t\t\t<button\n\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\tid=\"video-dropdown\"\n\t\t\t\t\t\tclass=\"dropdown-section\"\n\t\t\t\t\t\t[matMenuTriggerFor]=\"cameraMenu\"\n\t\t\t\t\t\t[disabled]=\"cameraStatusChanging\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<mat-icon>expand_more</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t} @else {\n\t\t\t<!-- No Camera Available -->\n\t\t\t<div id=\"no-video-device-message\" class=\"no-device-message\">\n\t\t\t\t<mat-icon class=\"warning-icon\">warning</mat-icon>\n\t\t\t\t<span>{{ 'PREJOIN.NO_VIDEO_DEVICE' | translate }}</span>\n\t\t\t</div>\n\t\t}\n\t} @else {\n\t\t<!-- Normal Mode - Input-style Selector -->\n\t\t<div class=\"normal-device-selector\">\n\t\t\t<!-- Device Selector (Input Style) -->\n\t\t\t@if (isCameraEnabled) {\n\t\t\t\t<div class=\"device-input-selector\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\tid=\"video-dropdown\"\n\t\t\t\t\t\tclass=\"selector-button\"\n\t\t\t\t\t\t[matMenuTriggerFor]=\"cameraMenu\"\n\t\t\t\t\t\t[disabled]=\"cameraStatusChanging || cameras().length <= 1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<mat-icon class=\"device-icon\">videocam</mat-icon>\n\t\t\t\t\t\t<span class=\"selected-device-name\">{{ cameraSelected()?.label || 'No camera selected' }}</span>\n\t\t\t\t\t\t<mat-icon class=\"dropdown-icon\" *ngIf=\"cameras().length > 1\">expand_more</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t@if (hasVideoDevices()) {\n\t\t\t\t\t<!-- Disabled state message -->\n\t\t\t\t\t<div class=\"device-input-selector disabled\">\n\t\t\t\t\t\t<div class=\"selector-button disabled\">\n\t\t\t\t\t\t\t<mat-icon class=\"device-icon\">videocam_off</mat-icon>\n\t\t\t\t\t\t\t<span class=\"selected-device-name\">{{ 'PANEL.SETTINGS.DISABLED_VIDEO' | translate }}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t<!-- No Camera Available -->\n\t\t\t\t\t<div id=\"no-video-device-message\" class=\"no-device-message\">\n\t\t\t\t\t\t<mat-icon class=\"warning-icon\">warning</mat-icon>\n\t\t\t\t\t\t<span>{{ 'PREJOIN.NO_VIDEO_DEVICE' | translate }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t}\n\t\t</div>\n\t}\n\n\t<!-- Device Selection Menu (Shared) -->\n\t<mat-menu #cameraMenu=\"matMenu\" class=\"device-menu\">\n\t\t@for (camera of cameras(); track camera.device) {\n\t\t\t<button\n\t\t\t\tmat-menu-item\n\t\t\t\tid=\"option-{{ camera.label }}\"\n\t\t\t\t(click)=\"onCameraSelected({ value: camera })\"\n\t\t\t\t[class.selected]=\"camera.device === cameraSelected()?.device\"\n\t\t\t>\n\t\t\t\t<mat-icon *ngIf=\"camera.device === cameraSelected()?.device\" class=\"check-icon\">check</mat-icon>\n\t\t\t\t<span>{{ camera.label }}</span>\n\t\t\t</button>\n\t\t}\n\t</mat-menu>\n</div>\n","import { Component, effect, EventEmitter, Input, OnInit, Output, Signal, WritableSignal } from '@angular/core';\nimport { CustomDevice } from '../../../models/device.model';\nimport { ILogger } from '../../../models/logger.model';\nimport { DeviceService } from '../../../services/device/device.service';\nimport { LoggerService } from '../../../services/logger/logger.service';\nimport { ParticipantService } from '../../../services/participant/participant.service';\nimport { StorageService } from '../../../services/storage/storage.service';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-audio-devices-select',\n\ttemplateUrl: './audio-devices.component.html',\n\tstyleUrls: ['./audio-devices.component.scss'],\n\tstandalone: false\n})\nexport class AudioDevicesComponent implements OnInit {\n\t@Input() compact: boolean = false;\n\t@Output() onAudioDeviceChanged = new EventEmitter<CustomDevice>();\n\t@Output() onAudioEnabledChanged = new EventEmitter<boolean>();\n\n\tmicrophoneStatusChanging: boolean = false;\n\tisMicrophoneEnabled: boolean = false;\n\tprivate log: ILogger;\n\n\t// Expose signals directly from service (reactive)\n\tprotected readonly microphones: WritableSignal<CustomDevice[]>;\n\tprotected readonly microphoneSelected: WritableSignal<CustomDevice | undefined>;\n\tprotected readonly hasAudioDevices: Signal<boolean>;\n\n\tconstructor(\n\t\tprivate deviceSrv: DeviceService,\n\t\tprivate storageSrv: StorageService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate loggerSrv: LoggerService\n\t) {\n\t\tthis.log = this.loggerSrv.get('AudioDevicesComponent');\n\t\tthis.microphones = this.deviceSrv.microphones;\n\t\tthis.microphoneSelected = this.deviceSrv.microphoneSelected;\n\t\tthis.hasAudioDevices = this.deviceSrv.hasAudioDevices;\n\n\t\t// Use effect instead of subscription for reactive updates\n\t\teffect(() => {\n\t\t\tconst participant = this.participantService.localParticipantSignal();\n\t\t\tif (participant) {\n\t\t\t\tthis.isMicrophoneEnabled = participant.isMicrophoneEnabled;\n\t\t\t\tthis.storageSrv.setMicrophoneEnabled(this.isMicrophoneEnabled);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync ngOnInit() {\n\t\tthis.isMicrophoneEnabled = this.participantService.isMyMicrophoneEnabled();\n\t}\n\n\tasync toggleMic(event: any) {\n\t\tevent.stopPropagation();\n\t\tthis.microphoneStatusChanging = true;\n\t\tthis.isMicrophoneEnabled = !this.isMicrophoneEnabled;\n\t\tawait this.participantService.setMicrophoneEnabled(this.isMicrophoneEnabled);\n\t\tthis.microphoneStatusChanging = false;\n\t\tthis.storageSrv.setMicrophoneEnabled(this.isMicrophoneEnabled);\n\t\tthis.onAudioEnabledChanged.emit(this.isMicrophoneEnabled);\n\t}\n\n\tasync onMicrophoneSelected(event: any) {\n\t\ttry {\n\t\t\tconst device: CustomDevice = event?.value;\n\t\t\tif (this.deviceSrv.needUpdateAudioTrack(device)) {\n\t\t\t\tthis.microphoneStatusChanging = true;\n\t\t\t\tawait this.participantService.switchMicrophone(device.device);\n\t\t\t\tthis.deviceSrv.setMicSelected(device.device);\n\t\t\t\tthis.onAudioDeviceChanged.emit(this.microphoneSelected());\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error switching microphone', error);\n\t\t} finally {\n\t\t\tthis.microphoneStatusChanging = false;\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Compare two devices to check if they are the same. Used by the mat-select\n\t */\n\tcompareObjectDevices(o1: CustomDevice, o2: CustomDevice): boolean {\n\t\treturn o1.label === o2.label;\n\t}\n}\n","<div class=\"audio-device-selector\" [class.compact]=\"compact\">\n\t<!-- Unified Device Button (Compact Mode) -->\n\t@if (compact) {\n\t\t@if (hasAudioDevices()) {\n\t\t\t<div class=\"unified-device-button\">\n\t\t\t\t<!-- Main toggle button -->\n\t\t\t\t<button\n\t\t\t\t\tmat-flat-button\n\t\t\t\t\tclass=\"toggle-section\"\n\t\t\t\t[disabled]=\"!hasAudioDevices() || microphoneStatusChanging\"\n\t\t\t\t[class.device-enabled]=\"isMicrophoneEnabled\"\n\t\t\t\t[class.device-disabled]=\"!isMicrophoneEnabled\"\n\t\t\t\t(click)=\"toggleMic($event)\"\n\t\t\t\t[matTooltip]=\"isMicrophoneEnabled ? ('TOOLBAR.MUTE_AUDIO' | translate) : ('TOOLBAR.UNMUTE_AUDIO' | translate)\"\n\t\t\t\t[matTooltipDisabled]=\"!hasAudioDevices()\"\n\t\t\t\t\tid=\"microphone-button\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon [id]=\"isMicrophoneEnabled ? 'mic' : 'mic_off'\">{{ isMicrophoneEnabled ? 'mic' : 'mic_off' }}</mat-icon>\n\t\t\t\t</button>\n\n\t\t\t\t<!-- Dropdown section -->\n\t\t\t\t@if (isMicrophoneEnabled) {\n\t\t\t\t\t<button\n\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\tid=\"audio-dropdown\"\n\t\t\t\t\t\tclass=\"dropdown-section\"\n\t\t\t\t\t\t[matMenuTriggerFor]=\"microphoneMenu\"\n\t\t\t\t\t\t[disabled]=\"microphoneStatusChanging\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<mat-icon>expand_more</mat-icon>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t} @else {\n\t\t\t<!-- No Microphone Available -->\n\t\t\t<div id=\"no-audio-device-message\" class=\"no-device-message\">\n\t\t\t\t<mat-icon class=\"warning-icon\">warning</mat-icon>\n\t\t\t\t<span>{{ 'PREJOIN.NO_AUDIO_DEVICE' | translate }}</span>\n\t\t\t</div>\n\t\t}\n\t} @else {\n\t\t<!-- Normal Mode - Input Style Selector -->\n\t\t<div class=\"normal-device-selector\">\n\t\t\t<!-- Input-style Device Selector -->\n\t\t\t<div class=\"device-input-selector\" [class.disabled]=\"!hasAudioDevices() || !isMicrophoneEnabled\">\n\t\t\t\t<!-- When microphone is enabled -->\n\t\t\t\t@if (isMicrophoneEnabled) {\n\t\t\t\t\t<div class=\"device-input-selector\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\t\tid=\"audio-dropdown\"\n\t\t\t\t\t\t\tclass=\"selector-button\"\n\t\t\t\t\t\t[disabled]=\"microphoneStatusChanging || microphones().length <= 1\"\n\t\t\t\t\t\t[matMenuTriggerFor]=\"microphoneMenu\"\n\t\t\t\t\t\t[attr.aria-expanded]=\"false\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<mat-icon class=\"device-icon\">mic</mat-icon>\n\t\t\t\t\t\t<span class=\"selected-device-name\">{{ microphoneSelected()?.label || 'No microphone selected' }}</span>\n\t\t\t\t\t\t<mat-icon class=\"dropdown-icon\" *ngIf=\"microphones().length > 1\">expand_more</mat-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t} @else {\n\t\t\t\t\t@if (hasAudioDevices()) {\n\t\t\t\t\t\t<!-- When microphone is disabled -->\n\t\t\t\t\t\t<div class=\"device-input-selector disabled\">\n\t\t\t\t\t\t\t<div class=\"selector-button disabled\">\n\t\t\t\t\t\t\t\t<mat-icon class=\"device-icon\">mic_off</mat-icon>\n\t\t\t\t\t\t\t\t<span class=\"selected-device-name\">\n\t\t\t\t\t\t\t\t{{ !hasAudioDevices() ? ('PREJOIN.NO_AUDIO_DEVICE' | translate) : 'Microphone disabled' }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<!-- No Microphone Available -->\n\t\t\t\t\t\t<div id=\"no-audio-device-message\" class=\"no-device-message\">\n\t\t\t\t\t\t\t<mat-icon class=\"warning-icon\">warning</mat-icon>\n\t\t\t\t\t\t\t<span>{{ 'PREJOIN.NO_AUDIO_DEVICE' | translate }}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t}\n\n\t<!-- Device Selection Menu (Shared) -->\n\t<mat-menu #microphoneMenu=\"matMenu\" class=\"device-menu\">\n\t\t@for (microphone of microphones(); track microphone.device) {\n\t\t\t<button\n\t\t\t\tmat-menu-item\n\t\t\t\tid=\"option-{{ microphone.label }}\"\n\t\t\t\t(click)=\"onMicrophoneSelected({ value: microphone })\"\n\t\t\t\t[class.selected]=\"microphone.device === microphoneSelected()?.device\"\n\t\t\t>\n\t\t\t\t<mat-icon *ngIf=\"microphone.device === microphoneSelected()?.device\">check</mat-icon>\n\t\t\t\t<span>{{ microphone.label }}</span>\n\t\t\t</button>\n\t\t}\n\t</mat-menu>\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ParticipantService } from '../../../services/participant/participant.service';\nimport { StorageService } from '../../../services/storage/storage.service';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-participant-name-input',\n\ttemplateUrl: './participant-name-input.component.html',\n\tstyleUrls: ['./participant-name-input.component.scss'],\n\tstandalone: false\n})\nexport class ParticipantNameInputComponent implements OnInit {\n\tname: string;\n\tlocalParticipantSubscription: Subscription;\n\t@Input() isPrejoinPage: boolean;\n\t@Input() error: boolean;\n\t@Output() onNameUpdated = new EventEmitter<string>();\n\t@Output() onEnterPressed = new EventEmitter<void>();\n\n\tconstructor(\n\t\tprivate participantService: ParticipantService,\n\t\tprivate storageSrv: StorageService\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.subscribeToParticipantProperties();\n\t\tconst myName = this.participantService.getMyName();\n\t\tconst storedName = this.storageSrv.getParticipantName();\n\n\t\tthis.name = myName ?? storedName ?? this.generateRandomName();\n\n\t\tif (!myName && !storedName) {\n\t\t\tthis.storageSrv.setParticipantName(this.name);\n\t\t}\n\n\t\tthis.onNameUpdated.emit(this.name);\n\t}\n\n\t/**\n\t * As updating name requires that the participant has the `canUpdateOwnMetadata` to true in server side, which is a little bit insecure,\n\t * we decided to not allow this feature for now.\n\t */\n\tupdateName() {\n\t\tif (this.isPrejoinPage) {\n\t\t\tthis.name = this.name ?? this.participantService.getMyName();\n\t\t\t// this.participantService.setMyName(this.name);\n\t\t\tthis.storageSrv.setParticipantName(this.name);\n\t\t\tthis.onNameUpdated.emit(this.name);\n\t\t}\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\teventKeyPress(event) {\n\t\t// Pressed 'Enter' key\n\t\tif (event && event.keyCode === 13 && this.name) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.updateName();\n\t\t\tthis.onEnterPressed.emit();\n\t\t}\n\t}\n\n\tprivate subscribeToParticipantProperties() {\n\t\t// this.localParticipantSubscription = this.participantService.localParticipant$.subscribe((p: ParticipantModel | undefined) => {\n\t\t// \tif (p) {\n\t\t// \t\tthis.name = p.name;\n\t\t// \t}\n\t\t// });\n\t}\n\n\tprivate generateRandomName(): string {\n\t\treturn 'OpenVidu_User_' + Math.floor(Math.random() * 100);\n\t}\n}\n","<div class=\"participant-name-input-container\" [class.error]=\"error\">\n\t<div class=\"input-wrapper\">\n\t\t<mat-icon class=\"input-icon\">person</mat-icon>\n\t\t<input\n\t\t\tid=\"participant-name-input\"\n\t\t\ttype=\"text\"\n\t\t\tmaxlength=\"20\"\n\t\t\t[(ngModel)]=\"name\"\n\t\t\tautocomplete=\"off\"\n\t\t\t[disabled]=\"!isPrejoinPage\"\n\t\t\t(input)=\"updateName()\"\n\t\t\t(keypress)=\"eventKeyPress($event)\"\n\t\t\t[placeholder]=\"'PREJOIN.NICKNAME' | translate\"\n\t\t\tclass=\"name-input-field\"\n\t\t/>\n\t</div>\n</div>\n","import { Component, OnInit, Output, ViewChild, EventEmitter, Input, OnDestroy } from '@angular/core';\nimport { MatMenuTrigger } from '@angular/material/menu';\nimport { MatSelect } from '@angular/material/select';\nimport { StorageService } from '../../../services/storage/storage.service';\nimport { TranslateService } from '../../../services/translate/translate.service';\nimport { AvailableLangs, LangOption } from '../../../models/lang.model';\nimport { Subscription } from 'rxjs';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-lang-selector',\n\ttemplateUrl: './lang-selector.component.html',\n\tstyleUrls: ['./lang-selector.component.scss'],\n\tstandalone: false\n})\nexport class LangSelectorComponent implements OnInit, OnDestroy {\n\t/**\n\t * @internal\n\t */\n\t@Input() compact: boolean;\n\t@Output() onLangChanged: EventEmitter<LangOption> = new EventEmitter<LangOption>();\n\tlangSelected: LangOption;\n\tlanguages: LangOption[] = [];\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild(MatMenuTrigger) public menuTrigger: MatMenuTrigger;\n\n\t/**\n\t * @ignore\n\t */\n\t@ViewChild(MatSelect) matSelect: MatSelect;\n\n\tprivate langSub: Subscription;\n\n\tconstructor(\n\t\tprivate translateService: TranslateService,\n\t\tprivate storageSrv: StorageService\n\t) {}\n\n\tngOnInit(): void {\n\t\tthis.subscribeToLangSelected();\n\t\tthis.languages = this.translateService.getAvailableLanguages();\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.langSub?.unsubscribe();\n\t}\n\n\tonLangSelected(lang: AvailableLangs) {\n\t\tthis.translateService.setCurrentLanguage(lang);\n\t\tthis.storageSrv.setLang(lang);\n\t}\n\n\tsubscribeToLangSelected() {\n\t\tthis.langSub = this.translateService.selectedLanguageOption$.subscribe((lang) => {\n\t\t\tthis.langSelected = lang;\n\t\t\tthis.onLangChanged.emit(lang);\n\t\t});\n\t}\n}\n","<div class=\"language-selector-container\">\n\t@if (compact) {\n\t\t<!-- Compact version (icon only) -->\n\t\t<button mat-icon-button [matMenuTriggerFor]=\"langMenu\" class=\"compact-lang-button\" [matTooltip]=\"'Change language'\" disableRipple>\n\t\t\t<mat-icon>translate</mat-icon>\n\t\t</button>\n\t} @else {\n\t\t<!-- Full version (with text) -->\n\t\t<button mat-flat-button [matMenuTriggerFor]=\"langMenu\" class=\"full-lang-button\">\n\t\t\t<!-- <mat-icon class=\"lang-icon\">translate</mat-icon> -->\n\t\t\t<span class=\"lang-name\">\n\t\t\t\t{{ langSelected?.name }}\n\t\t\t\t<mat-icon class=\"expand-icon\">expand_more</mat-icon>\n\t\t\t</span>\n\t\t</button>\n\t}\n\n\t<!-- Language Menu -->\n\t<mat-menu #langMenu=\"matMenu\" class=\"language-menu\">\n\t\t@for (lang of languages; track lang.lang) {\n\t\t\t<button\n\t\t\t\tmat-menu-item\n\t\t\t\t(click)=\"onLangSelected(lang.lang)\"\n\t\t\t\t[attr.id]=\"'lang-opt-' + lang.lang\"\n\t\t\t\t[class.selected]=\"langSelected?.lang === lang.lang\"\n\t\t\t\tclass=\"language-option\"\n\t\t\t>\n\t\t\t\t<mat-icon *ngIf=\"langSelected?.lang === lang.lang\" class=\"check-icon\">check</mat-icon>\n\t\t\t\t<span class=\"lang-option-name\">{{ lang.name }}</span>\n\t\t\t</button>\n\t\t}\n\t</mat-menu>\n</div>\n","import {\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tEventEmitter,\n\tHostListener,\n\tInput,\n\tOnDestroy,\n\tOnInit,\n\tOutput\n} from '@angular/core';\nimport { LocalTrack, Track } from 'livekit-client';\nimport { filter, Subject, take, takeUntil } from 'rxjs';\nimport { CustomDevice } from '../../models/device.model';\nimport { LangOption } from '../../models/lang.model';\nimport { ILogger } from '../../models/logger.model';\nimport { CdkOverlayService } from '../../services/cdk-overlay/cdk-overlay.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { LoggerService } from '../../services/logger/logger.service';\nimport { OpenViduService } from '../../services/openvidu/openvidu.service';\nimport { TranslateService } from '../../services/translate/translate.service';\nimport { ViewportService } from '../../services/viewport/viewport.service';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-pre-join',\n\ttemplateUrl: './pre-join.component.html',\n\tstyleUrls: ['./pre-join.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class PreJoinComponent implements OnInit, OnDestroy {\n\t@Input() set error(error: { name: string; message: string } | undefined) {\n\t\tif (error) this._error = error.message ?? error.name;\n\t}\n\t@Output() onVideoDeviceChanged = new EventEmitter<CustomDevice>();\n\t@Output() onAudioDeviceChanged = new EventEmitter<CustomDevice>();\n\t@Output() onVideoEnabledChanged = new EventEmitter<boolean>();\n\t@Output() onAudioEnabledChanged = new EventEmitter<boolean>();\n\t@Output() onLangChanged = new EventEmitter<LangOption>();\n\t@Output() onReadyToJoin = new EventEmitter<any>();\n\n\t_error: string | undefined;\n\twindowSize!: number;\n\tisLoading = true;\n\tparticipantName: string | undefined = '';\n\n\t/**\n\t * @ignore\n\t */\n\tisMinimal: boolean = false;\n\tshowCameraButton: boolean = true;\n\tshowMicrophoneButton: boolean = true;\n\tshowLogo: boolean = true;\n\tshowParticipantName: boolean = true;\n\n\t// Future feature preparation\n\tbackgroundEffectEnabled: boolean = true; // Enable virtual backgrounds by default\n\tshowBackgroundPanel: boolean = false;\n\n\tvideoTrack: LocalTrack | undefined;\n\taudioTrack: LocalTrack | undefined;\n\tisVideoEnabled: boolean = false;\n\thasVideoDevices: boolean = true;\n\tprivate tracks: LocalTrack[] = [];\n\tprivate log: ILogger;\n\tprivate destroy$ = new Subject<void>();\n\tprivate shouldRemoveTracksWhenComponentIsDestroyed: boolean = true;\n\n\t@HostListener('window:resize')\n\tsizeChange() {\n\t\tthis.windowSize = window.innerWidth;\n\t}\n\n\tconstructor(\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate cdkSrv: CdkOverlayService,\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate translateService: TranslateService,\n\t\tprivate changeDetector: ChangeDetectorRef,\n\t\tprotected viewportService: ViewportService\n\t) {\n\t\tthis.log = this.loggerSrv.get('PreJoinComponent');\n\t}\n\n\tasync ngOnInit() {\n\t\tthis.subscribeToPrejoinDirectives();\n\t\tawait this.initializeDevicesWithRetry();\n\t\tthis.windowSize = window.innerWidth;\n\t\tthis.isLoading = false;\n\t\tthis.changeDetector.markForCheck();\n\t}\n\n\t// ngAfterContentChecked(): void {\n\t// \t// this.changeDetector.detectChanges();\n\t// \tthis.isLoading = false;\n\t// }\n\n\tasync ngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.cdkSrv.setSelector('body');\n\n\t\tif (this.shouldRemoveTracksWhenComponentIsDestroyed) {\n\t\t\tthis.tracks?.forEach((track) => {\n\t\t\t\ttrack.stop();\n\t\t\t});\n\t\t}\n\t}\n\n\tonDeviceSelectorClicked() {\n\t\t// Some devices as iPhone do not show the menu panels correctly\n\t\t// Updating the container where the panel is added fix the problem.\n\t\tthis.cdkSrv.setSelector('#prejoin-container');\n\t}\n\n\tjoin() {\n\t\tif (this.showParticipantName && !this.participantName?.trim()) {\n\t\t\tthis._error = this.translateService.translate('PREJOIN.NICKNAME_REQUIRED');\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear any previous errors\n\t\tthis._error = undefined;\n\n\t\t// Mark tracks as permanent for avoiding to be removed in ngOnDestroy\n\t\tthis.shouldRemoveTracksWhenComponentIsDestroyed = false;\n\n\t\t// Assign participant name to the observable if it is defined\n\t\tif (this.participantName?.trim()) {\n\t\t\tthis.libService.updateGeneralConfig({ participantName: this.participantName.trim() });\n\n\t\t\tthis.libService.participantName$\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter((name) => name === this.participantName?.trim()),\n\t\t\t\t\ttake(1)\n\t\t\t\t)\n\t\t\t\t.subscribe(() => this.onReadyToJoin.emit());\n\t\t} else {\n\t\t\t// No participant name to set, emit immediately\n\t\t\tthis.onReadyToJoin.emit();\n\t\t}\n\t}\n\n\tonParticipantNameChanged(name: string) {\n\t\tthis.participantName = name?.trim() || '';\n\t\t// Clear error when user starts typing\n\t\tif (this._error && this.participantName) {\n\t\t\tthis._error = undefined;\n\t\t}\n\t}\n\n\tonEnterPressed() {\n\t\tthis.join();\n\t}\n\n\tprivate subscribeToPrejoinDirectives() {\n\t\tthis.libService.minimal$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.isMinimal = value;\n\t\t\tthis.changeDetector.markForCheck();\n\t\t});\n\n\t\tthis.libService.cameraButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showCameraButton = value;\n\t\t\tthis.changeDetector.markForCheck();\n\t\t});\n\n\t\tthis.libService.microphoneButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showMicrophoneButton = value;\n\t\t\tthis.changeDetector.markForCheck();\n\t\t});\n\n\t\tthis.libService.displayLogo$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showLogo = value;\n\t\t\tthis.changeDetector.markForCheck();\n\t\t});\n\n\t\tthis.libService.participantName$.pipe(takeUntil(this.destroy$)).subscribe((value: string) => {\n\t\t\tif (value) {\n\t\t\t\tthis.participantName = value;\n\t\t\t\tthis.changeDetector.markForCheck();\n\t\t\t}\n\t\t});\n\n\t\tthis.libService.prejoinDisplayParticipantName$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.showParticipantName = value;\n\t\t\tthis.changeDetector.markForCheck();\n\t\t});\n\t}\n\n\tasync videoEnabledChanged(enabled: boolean) {\n\t\tthis.isVideoEnabled = enabled;\n\t\tif (!enabled) {\n\t\t\tthis.closeBackgroundPanel();\n\t\t} else if (!this.videoTrack) {\n\t\t\tconst newVideoTrack = await this.openviduService.createLocalTracks(true, false);\n\t\t\tthis.videoTrack = newVideoTrack[0];\n\t\t\tthis.tracks.push(this.videoTrack);\n\t\t\tthis.openviduService.setLocalTracks(this.tracks);\n\t\t}\n\n\t\tthis.onVideoEnabledChanged.emit(enabled);\n\t}\n\n\tasync videoDeviceChanged(device: CustomDevice) {\n\t\ttry {\n\t\t\tthis.log.d('Video device changed to:', device);\n\n\t\t\t// Get the updated tracks from the service\n\t\t\tconst updatedTracks = this.openviduService.getLocalTracks();\n\n\t\t\t// Find the new video track\n\t\t\tconst newVideoTrack = updatedTracks.find((track) => track.kind === Track.Kind.Video);\n\n\t\t\t// if (newVideoTrack && newVideoTrack !== this.videoTrack) {\n\t\t\tthis.tracks = updatedTracks;\n\t\t\tthis.videoTrack = newVideoTrack;\n\n\t\t\tthis.onVideoDeviceChanged.emit(device);\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error handling video device change:', error);\n\t\t\tthis.handleError(error);\n\t\t}\n\t}\n\n\tonVideoDevicesLoaded(devices: CustomDevice[]) {\n\t\tthis.hasVideoDevices = devices.length > 0;\n\t}\n\n\taudioDeviceChanged(device: CustomDevice) {\n\t\ttry {\n\t\t\tthis.log.d('Audio device changed to:', device);\n\n\t\t\t// Get the updated tracks from the service\n\t\t\tconst updatedTracks = this.openviduService.getLocalTracks();\n\n\t\t\t// Find the new audio track\n\t\t\tconst newAudioTrack = updatedTracks.find((track) => track.kind === Track.Kind.Audio);\n\n\t\t\tthis.tracks = updatedTracks;\n\t\t\tthis.audioTrack = newAudioTrack;\n\n\t\t\tthis.onAudioDeviceChanged.emit(device);\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error handling audio device change:', error);\n\t\t\tthis.handleError(error);\n\t\t}\n\t}\n\n\tasync audioEnabledChanged(enabled: boolean) {\n\t\tif (enabled && !this.audioTrack) {\n\t\t\tconst newAudioTrack = await this.openviduService.createLocalTracks(false, true);\n\t\t\tthis.audioTrack = newAudioTrack[0];\n\t\t\tthis.tracks.push(this.audioTrack);\n\t\t\tthis.openviduService.setLocalTracks(this.tracks);\n\t\t}\n\t\tthis.onAudioEnabledChanged.emit(enabled);\n\t}\n\n\t/**\n\t * Toggle virtual background panel visibility with smooth animation\n\t */\n\ttoggleBackgroundPanel() {\n\t\t// Add a small delay to ensure smooth transition\n\t\tif (!this.showBackgroundPanel) {\n\t\t\t// Opening panel\n\t\t\tthis.showBackgroundPanel = true;\n\t\t\tthis.changeDetector.markForCheck();\n\t\t} else {\n\t\t\t// Closing panel - add slight delay for smooth animation\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.showBackgroundPanel = false;\n\t\t\t\tthis.changeDetector.markForCheck();\n\t\t\t}, 50);\n\t\t}\n\t}\n\n\t/**\n\t * Close virtual background panel with smooth animation\n\t */\n\tcloseBackgroundPanel() {\n\t\t// Add animation delay for smooth closing\n\t\tsetTimeout(() => {\n\t\t\tthis.showBackgroundPanel = false;\n\t\t\tthis.changeDetector.markForCheck();\n\t\t}, 100);\n\t}\n\n\t/**\n\t * Enhanced error handling with better UX\n\t */\n\tprivate handleError(error: any) {\n\t\tthis.log.e('PreJoin component error:', error);\n\t\tthis._error = error.message || 'An unexpected error occurred';\n\t\tthis.changeDetector.markForCheck();\n\t}\n\n\t/**\n\t * Improved device initialization with error handling\n\t */\n\tprivate async initializeDevicesWithRetry(maxRetries: number = 3): Promise<void> {\n\t\tfor (let attempt = 1; attempt <= maxRetries; attempt++) {\n\t\t\ttry {\n\t\t\t\tthis.tracks = await this.openviduService.createLocalTracks();\n\t\t\t\tthis.openviduService.setLocalTracks(this.tracks);\n\t\t\t\tthis.videoTrack = this.tracks.find((track) => track.kind === Track.Kind.Video);\n\t\t\t\tthis.audioTrack = this.tracks.find((track) => track.kind === Track.Kind.Audio);\n\t\t\t\tthis.isVideoEnabled = this.openviduService.isVideoTrackEnabled();\n\n\t\t\t\treturn; // Success, exit retry loop\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.w(`Device initialization attempt ${attempt} failed:`, error);\n\n\t\t\t\tif (attempt === maxRetries) {\n\t\t\t\t\tthis.handleError(error);\n\t\t\t\t} else {\n\t\t\t\t\t// Wait before retrying\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000 * attempt));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","@if (viewportService.shouldShowLandscapeWarning()) {\n\t<ov-landscape-warning></ov-landscape-warning>\n} @else {\n\t<div class=\"prejoin-container\" id=\"prejoin-container\" [class.mobile]=\"viewportService.isMobile()\" [class.name-error]=\"!!_error\">\n\t\t<!-- Top Language Toolbar -->\n\t\t@if (!isMinimal) {\n\t\t\t<div class=\"top-toolbar\">\n\t\t\t\t<ov-lang-selector [compact]=\"false\" class=\"language-selector\" (onLangChanged)=\"onLangChanged.emit($event)\">\n\t\t\t\t</ov-lang-selector>\n\t\t\t</div>\n\t\t}\n\n\t\t<!-- Loading State -->\n\t\t@if (isLoading) {\n\t\t\t<div class=\"loading-overlay\">\n\t\t\t\t<div class=\"loading-content\">\n\t\t\t\t\t<mat-spinner [diameter]=\"40\"></mat-spinner>\n\t\t\t\t\t<span class=\"loading-text\">{{ 'PREJOIN.PREPARING' | translate }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t} @else {\n\t\t\t<!-- Main Content -->\n\t\t\t<div class=\"prejoin-content\">\n\t\t\t\t<!-- Main Card -->\n\t\t\t\t<div class=\"prejoin-main\">\n\t\t\t\t\t<!-- Video Preview Section -->\n\t\t\t\t\t<div class=\"video-preview-section\">\n\t\t\t\t\t\t<div class=\"video-preview-container\" [class.compact]=\"showBackgroundPanel\">\n\t\t\t\t\t\t\t<div class=\"video-frame\">\n\t\t\t\t\t\t\t\t<ov-media-element\n\t\t\t\t\t\t\t\t\t[track]=\"videoTrack\"\n\t\t\t\t\t\t\t\t\t[showAvatar]=\"!isVideoEnabled\"\n\t\t\t\t\t\t\t\t\t[avatarName]=\"participantName\"\n\t\t\t\t\t\t\t\t\t[avatarColor]=\"'hsl(48, 100%, 50%)'\"\n\t\t\t\t\t\t\t\t\t[isLocal]=\"true\"\n\t\t\t\t\t\t\t\t\tclass=\"video-element\"\n\t\t\t\t\t\t\t\t\t[id]=\"videoTrack?.id || 'no-video'\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</ov-media-element>\n\n\t\t\t\t\t\t\t\t<!-- Video Controls Overlay -->\n\t\t\t\t\t\t\t\t<div class=\"video-overlay\">\n\t\t\t\t\t\t\t\t\t<div class=\"device-controls\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"control-group\" *ngIf=\"showCameraButton\">\n\t\t\t\t\t\t\t\t\t\t\t<ov-video-devices-select\n\t\t\t\t\t\t\t\t\t\t\t\t[compact]=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(onVideoDeviceChanged)=\"videoDeviceChanged($event)\"\n\t\t\t\t\t\t\t\t\t\t\t\t(onVideoEnabledChanged)=\"videoEnabledChanged($event)\"\n\t\t\t\t\t\t\t\t\t\t\t\t(onVideoDevicesLoaded)=\"onVideoDevicesLoaded($event)\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"device-selector\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t</ov-video-devices-select>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t<div class=\"control-group\" *ngIf=\"showMicrophoneButton\">\n\t\t\t\t\t\t\t\t\t\t\t<ov-audio-devices-select\n\t\t\t\t\t\t\t\t\t\t\t\t[compact]=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t(onAudioDeviceChanged)=\"audioDeviceChanged($event)\"\n\t\t\t\t\t\t\t\t\t\t\t\t(onAudioEnabledChanged)=\"audioEnabledChanged($event)\"\n\t\t\t\t\t\t\t\t\t\t\t\t(onDeviceSelectorClicked)=\"onDeviceSelectorClicked()\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"device-selector\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t</ov-audio-devices-select>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<!-- Virtual Background Button -->\n\t\t\t\t\t\t\t\t\t@if (backgroundEffectEnabled && hasVideoDevices) {\n\t\t\t\t\t\t\t\t\t\t<div class=\"background-control\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"background-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"toggleBackgroundPanel()\"\n\t\t\t\t\t\t\t\t\t\t\t\t[matTooltip]=\"'Virtual Backgrounds'\"\n\t\t\t\t\t\t\t\t\t\t\t\t[disabled]=\"!isVideoEnabled\"\n\t\t\t\t\t\t\t\t\t\t\t\tid=\"backgrounds-button\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-icon class=\"material-symbols-outlined\">background_replace</mat-icon>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t@if (showBackgroundPanel) {\n\t\t\t\t\t\t<div class=\"vb-container\">\n\t\t\t\t\t\t\t<ov-background-effects-panel [mode]=\"'prejoin'\" (onClose)=\"closeBackgroundPanel()\">\n\t\t\t\t\t\t\t</ov-background-effects-panel>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<!-- Configuration Section -->\n\t\t\t\t\t\t<div class=\"configuration-section\">\n\t\t\t\t\t\t\t<!-- Participant Name Input -->\n\t\t\t\t\t\t\t<div class=\"participant-name-container input-section\" *ngIf=\"showParticipantName\">\n\t\t\t\t\t\t\t\t<ov-participant-name-input\n\t\t\t\t\t\t\t\t\t[isPrejoinPage]=\"true\"\n\t\t\t\t\t\t\t\t\t[error]=\"!!_error\"\n\t\t\t\t\t\t\t\t\t(onNameUpdated)=\"onParticipantNameChanged($event)\"\n\t\t\t\t\t\t\t\t\t(onEnterPressed)=\"onEnterPressed()\"\n\t\t\t\t\t\t\t\t\tclass=\"name-input\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</ov-participant-name-input>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Error Message -->\n\t\t\t\t\t\t\t<div *ngIf=\"!!_error\" class=\"error-message\" id=\"token-error\">\n\t\t\t\t\t\t\t\t<mat-icon class=\"error-icon\">error_outline</mat-icon>\n\t\t\t\t\t\t\t\t<span class=\"error-text\">{{ _error }}</span>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Join Button -->\n\t\t\t\t\t\t\t<div class=\"join-section\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tmat-flat-button\n\t\t\t\t\t\t\t\t\t(click)=\"join()\"\n\t\t\t\t\t\t\t\t\tclass=\"join-button\"\n\t\t\t\t\t\t\t\t\tid=\"join-button\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"showParticipantName && !participantName\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ 'PREJOIN.JOIN' | translate }}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t}\n\t</div>\n}\n","export const safeJsonParse = <T = any>(text: string): T | null => {\n\ttry {\n\t\treturn JSON.parse(text) as T;\n\t} catch (e) {\n\t\treturn null;\n\t}\n};\n","import {\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tContentChild,\n\tElementRef,\n\tEventEmitter,\n\tHostListener,\n\tOnDestroy,\n\tOnInit,\n\tOutput,\n\tTemplateRef,\n\tViewChild\n} from '@angular/core';\n\nimport { animate, style, transition, trigger } from '@angular/animations';\nimport { MatDrawerContainer, MatSidenav } from '@angular/material/sidenav';\nimport { skip, Subject, takeUntil } from 'rxjs';\nimport { DataTopic } from '../../models/data-topic.model';\nimport { SidenavMode } from '../../models/layout/layout.model';\nimport { ILogger } from '../../models/logger.model';\nimport { PanelStatusInfo, PanelType } from '../../models/panel.model';\nimport { RoomStatusData } from '../../models/room.model';\nimport { ActionService } from '../../services/action/action.service';\nimport { BroadcastingService } from '../../services/broadcasting/broadcasting.service';\n// import { CaptionService } from '../../services/caption/caption.service';\nimport {\n\tDataPacket_Kind,\n\tDisconnectReason,\n\tLocalParticipant,\n\tParticipant,\n\tRemoteParticipant,\n\tRemoteTrack,\n\tRemoteTrackPublication,\n\tRoom,\n\tRoomEvent,\n\tTrack\n} from 'livekit-client';\nimport { ParticipantLeftEvent, ParticipantLeftReason, ParticipantModel } from '../../models/participant.model';\nimport { RecordingStatus } from '../../models/recording.model';\nimport { ChatService } from '../../services/chat/chat.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { LayoutService } from '../../services/layout/layout.service';\nimport { LoggerService } from '../../services/logger/logger.service';\nimport { OpenViduService } from '../../services/openvidu/openvidu.service';\nimport { PanelService } from '../../services/panel/panel.service';\nimport { ParticipantService } from '../../services/participant/participant.service';\nimport { RecordingService } from '../../services/recording/recording.service';\nimport { SessionTemplateConfiguration, TemplateManagerService } from '../../services/template/template-manager.service';\nimport { TranslateService } from '../../services/translate/translate.service';\nimport { ViewportService } from '../../services/viewport/viewport.service';\nimport { VirtualBackgroundService } from '../../services/virtual-background/virtual-background.service';\nimport { safeJsonParse } from '../../utils/utils';\n\n/**\n * @internal\n */\n\n@Component({\n\tselector: 'ov-session',\n\ttemplateUrl: './session.component.html',\n\tstyleUrls: ['./session.component.scss'],\n\tanimations: [\n\t\ttrigger('inOutAnimation', [\n\t\t\ttransition(':enter', [style({ opacity: 0 }), animate('200ms', style({ opacity: 1 }))]),\n\t\t\ttransition(':leave', [animate('200ms', style({ opacity: 0 }))])\n\t\t])\n\t],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tstandalone: false\n})\nexport class SessionComponent implements OnInit, OnDestroy {\n\t@ContentChild('toolbar', { read: TemplateRef }) toolbarTemplate: TemplateRef<any> | undefined;\n\t@ContentChild('panel', { read: TemplateRef }) panelTemplate: TemplateRef<any> | undefined;\n\t@ContentChild('layout', { read: TemplateRef }) layoutTemplate: TemplateRef<any> | undefined;\n\t/**\n\t * Provides event notifications that fire when Room is created for the local participant.\n\t */\n\t@Output() onRoomCreated: EventEmitter<Room> = new EventEmitter<Room>();\n\n\t/**\n\t * Provides event notifications that fire when Room is being reconnected for the local participant.\n\t */\n\t@Output() onRoomReconnecting: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when Room is reconnected for the local participant.\n\t */\n\t@Output() onRoomReconnected: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when participant is disconnected from Room.\n\t * @deprecated Use {@link SessionComponent.onParticipantLeft} instead.\n\t */\n\t@Output() onRoomDisconnected: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when local participant is connected to the Room.\n\t */\n\t@Output() onParticipantConnected: EventEmitter<ParticipantModel> = new EventEmitter<ParticipantModel>();\n\n\t/**\n\t * This event is emitted when the local participant leaves the room.\n\t */\n\t@Output() onParticipantLeft: EventEmitter<ParticipantLeftEvent> = new EventEmitter<ParticipantLeftEvent>();\n\n\troom!: Room;\n\tsideMenu: MatSidenav;\n\tsidenavMode: SidenavMode = SidenavMode.SIDE;\n\tsettingsPanelOpened: boolean;\n\tdrawer: MatDrawerContainer;\n\tloading: boolean = true;\n\n\t/**\n\t * @internal\n\t * Template configuration managed by the service\n\t */\n\ttemplateConfig: SessionTemplateConfiguration = {};\n\n\tprivate shouldDisconnectRoomWhenComponentIsDestroyed: boolean = true;\n\tprivate readonly SIDENAV_WIDTH_LIMIT_MODE = 790;\n\tprivate destroy$ = new Subject<void>();\n\tprivate updateLayoutInterval: NodeJS.Timeout;\n\tprivate log: ILogger;\n\n\tconstructor(\n\t\tprivate layoutService: LayoutService,\n\t\tprivate actionService: ActionService,\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate participantService: ParticipantService,\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate chatService: ChatService,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate panelService: PanelService,\n\t\tprivate recordingService: RecordingService,\n\t\tprivate broadcastingService: BroadcastingService,\n\t\tprivate translateService: TranslateService,\n\t\t// private captionService: CaptionService,\n\t\tprivate backgroundService: VirtualBackgroundService,\n\t\tprivate cd: ChangeDetectorRef,\n\t\tprivate templateManagerService: TemplateManagerService,\n\t\tprotected viewportService: ViewportService,\n\t) {\n\t\tthis.log = this.loggerSrv.get('SessionComponent');\n\t\tthis.setupTemplates();\n\t}\n\n\t@HostListener('window:beforeunload')\n\tbeforeunloadHandler() {\n\t\tthis.disconnectRoom(ParticipantLeftReason.BROWSER_UNLOAD);\n\t}\n\n\t@HostListener('window:resize')\n\tsizeChange() {\n\t\tthis.layoutService.update();\n\t}\n\n\t@ViewChild('sidenav')\n\tset sidenavMenu(menu: MatSidenav) {\n\t\tsetTimeout(() => {\n\t\t\tif (menu) {\n\t\t\t\tthis.sideMenu = menu;\n\t\t\t\tthis.subscribeToTogglingMenu();\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\t@ViewChild('videoContainer', { static: false, read: ElementRef })\n\tset videoContainer(container: ElementRef) {\n\t\tsetTimeout(() => {\n\t\t\tif (container && !this.toolbarTemplate) {\n\t\t\t\tcontainer.nativeElement.style.height = '100%';\n\t\t\t\tcontainer.nativeElement.style.minHeight = '100%';\n\t\t\t\tthis.layoutService.update();\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\t@ViewChild('container')\n\tset container(container: MatDrawerContainer) {\n\t\tsetTimeout(() => {\n\t\t\tif (container) {\n\t\t\t\tthis.drawer = container;\n\t\t\t\tthis.drawer._contentMarginChanges.subscribe(() => {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.stopUpdateLayoutInterval();\n\t\t\t\t\t\tthis.layoutService.update();\n\t\t\t\t\t\tthis.drawer.autosize = false;\n\t\t\t\t\t}, 250);\n\t\t\t\t});\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\t@ViewChild('layoutContainer')\n\tset layoutContainer(container: ElementRef) {\n\t\tsetTimeout(async () => {\n\t\t\tif (container) {\n\t\t\t\tif (this.libService.showBackgroundEffectsButton()) {\n\t\t\t\t\t// Apply background from storage when layout container is in DOM only when background effects button is enabled\n\t\t\t\t\tawait this.backgroundService.applyBackgroundFromStorage();\n\t\t\t\t}\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\tasync ngOnInit() {\n\t\tthis.shouldDisconnectRoomWhenComponentIsDestroyed = true;\n\n\t\t// Check if room is available before proceeding\n\t\tif (!this.openviduService.isRoomInitialized()) {\n\t\t\tthis.log.e('Room is not initialized when SessionComponent starts. This indicates a timing issue.');\n\t\t\tthis.actionService.openDialog(\n\t\t\t\tthis.translateService.translate('ERRORS.SESSION'),\n\t\t\t\t'Room is not ready. Please ensure the token is properly configured.'\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Get room instance\n\t\ttry {\n\t\t\tthis.room = this.openviduService.getRoom();\n\t\t\tthis.log.d('Room successfully obtained for SessionComponent');\n\t\t} catch (error) {\n\t\t\tthis.log.e('Unexpected error getting room:', error);\n\t\t\tthis.actionService.openDialog(\n\t\t\t\tthis.translateService.translate('ERRORS.SESSION'),\n\t\t\t\t'Failed to get room instance: ' + (error?.message || error)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// this.subscribeToCaptionLanguage();\n\t\tthis.subscribeToEncryptionErrors();\n\t\tthis.subscribeToActiveSpeakersChanged();\n\t\tthis.subscribeToParticipantConnected();\n\t\tthis.subscribeToTrackSubscribed();\n\t\tthis.subscribeToTrackUnsubscribed();\n\t\tthis.subscribeToParticipantDisconnected();\n\t\tthis.subscribeToParticipantMetadataChanged();\n\n\t\t// this.subscribeToParticipantNameChanged();\n\t\tthis.subscribeToDataMessage();\n\t\tthis.subscribeToReconnection();\n\t\tthis.subscribeToVirtualBackground();\n\n\t\t// if (this.libService.isRecordingEnabled()) {\n\t\t// this.subscribeToRecordingEvents();\n\t\t// }\n\n\t\t// if (this.libService.isBroadcastingEnabled()) {\n\t\t// this.subscribeToBroadcastingEvents();\n\t\t// }\n\t\ttry {\n\t\t\tawait this.participantService.connect();\n\t\t\t// Send room created after participant connect for avoiding to send incomplete room payload\n\t\t\tthis.onRoomCreated.emit(this.room);\n\t\t\tthis.cd.markForCheck();\n\t\t\tthis.loading = false;\n\t\t\tthis.onParticipantConnected.emit(this.participantService.getLocalParticipant());\n\t\t} catch (error) {\n\t\t\tthis.log.e('There was an error connecting to the room:', error.code, error.message);\n\t\t\tthis.actionService.openDialog(this.translateService.translate('ERRORS.SESSION'), error?.error || error?.message || error);\n\t\t}\n\t}\n\n\tprotected subscribeToEncryptionErrors() {\n\t\tthis.room.on(RoomEvent.EncryptionError, (error: Error, participant?: Participant) => {\n\t\t\tif (!participant) {\n\t\t\t\tthis.log.w('Encryption error received without participant info:', error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.participantService.setEncryptionError(participant.sid, true);\n\t\t});\n\t}\n\n\tprotected subscribeToActiveSpeakersChanged() {\n\t\tthis.room.on(RoomEvent.ActiveSpeakersChanged, (speakers: Participant[]) => {\n\t\t\tthis.participantService.setSpeaking(speakers);\n\t\t});\n\t}\n\n\t/**\n\t * @internal\n\t * Sets up all templates using the template manager service\n\t */\n\tprivate setupTemplates(): void {\n\t\tthis.templateConfig = this.templateManagerService.setupSessionTemplates(\n\t\t\tthis.toolbarTemplate,\n\t\t\tthis.panelTemplate,\n\t\t\tthis.layoutTemplate\n\t\t);\n\t}\n\n\tasync ngOnDestroy() {\n\t\tif (this.shouldDisconnectRoomWhenComponentIsDestroyed) {\n\t\t\tawait this.disconnectRoom(ParticipantLeftReason.LEAVE);\n\t\t}\n\t\tif (this.room) this.room.removeAllListeners();\n\t\tthis.participantService.clear();\n\t\t// this.room = undefined;\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\t// \tif (this.captionLanguageSubscription) this.captionLanguageSubscription.unsubscribe();\n\t}\n\n\tasync disconnectRoom(reason: ParticipantLeftReason) {\n\t\t// Mark session as disconnected for avoiding to do it again in ngOnDestroy\n\t\tthis.shouldDisconnectRoomWhenComponentIsDestroyed = false;\n\t\tawait this.openviduService.disconnectRoom(() => {\n\t\t\tthis.onParticipantLeft.emit({\n\t\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\t\tparticipantName: this.participantService.getLocalParticipant()?.name || '',\n\t\t\t\tidentity: this.participantService.getLocalParticipant()?.identity || '',\n\t\t\t\treason\n\t\t\t});\n\t\t}, false);\n\t}\n\n\tprivate subscribeToTogglingMenu() {\n\t\tthis.sideMenu.openedChange.subscribe(() => {\n\t\t\tthis.stopUpdateLayoutInterval();\n\t\t\tthis.layoutService.update();\n\t\t});\n\n\t\tthis.sideMenu.openedStart.subscribe(() => {\n\t\t\tthis.startUpdateLayoutInterval();\n\t\t});\n\n\t\tthis.sideMenu.closedStart.subscribe(() => {\n\t\t\tthis.startUpdateLayoutInterval();\n\t\t});\n\n\t\tthis.panelService.panelStatusObs.pipe(skip(1), takeUntil(this.destroy$)).subscribe((ev: PanelStatusInfo) => {\n\t\t\tif (this.sideMenu) {\n\t\t\t\tthis.settingsPanelOpened = ev.isOpened && ev.panelType === PanelType.SETTINGS;\n\n\t\t\t\tif (this.sideMenu.opened && ev.isOpened) {\n\t\t\t\t\tif (ev.panelType === PanelType.SETTINGS || ev.previousPanelType === PanelType.SETTINGS) {\n\t\t\t\t\t\t// Switch from SETTINGS to another panel and vice versa.\n\t\t\t\t\t\t// As the SETTINGS panel will be bigger than others, the sidenav container must be updated.\n\t\t\t\t\t\t// Setting autosize to 'true' allows update it.\n\t\t\t\t\t\tthis.drawer.autosize = true;\n\t\t\t\t\t\tthis.startUpdateLayoutInterval();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tev.isOpened ? this.sideMenu.open() : this.sideMenu.close();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate subscribeToLayoutWidth() {\n\t\tthis.layoutService.layoutWidthObs.pipe(takeUntil(this.destroy$)).subscribe((width) => {\n\t\t\tthis.sidenavMode = width <= this.SIDENAV_WIDTH_LIMIT_MODE ? SidenavMode.OVER : SidenavMode.SIDE;\n\t\t});\n\t}\n\n\tprivate subscribeToParticipantConnected() {\n\t\tthis.room.on(RoomEvent.ParticipantConnected, (participant: RemoteParticipant) => {\n\t\t\tthis.participantService.addRemoteParticipant(participant);\n\t\t});\n\t}\n\n\t/**\n\t * The LocalParticipant has subscribed to a new track because of the RoomConnectionOptions has beed set with autosubscribe = 'true'.\n\t * The LocalParticipant will subscribe to all tracks after joining.\n\t */\n\tprivate subscribeToTrackSubscribed() {\n\t\t// this.room.on(RoomEvent.TrackPublished, (publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n\t\t// \tconsole.warn(\"NEW TrackPublished\", participant);\n\t\t// \tconsole.warn(\"NEW TrackPublished\", publication);\n\t\t// });\n\t\tthis.room.on(\n\t\t\tRoomEvent.TrackSubscribed,\n\t\t\t(track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n\t\t\t\tconst isScreenTrack = track.source === Track.Source.ScreenShare;\n\t\t\t\tthis.participantService.addRemoteParticipant(participant);\n\t\t\t\tif (isScreenTrack) {\n\t\t\t\t\t// Set all videos to normal size when a new screen is being shared\n\t\t\t\t\tthis.participantService.resetMyStreamsToNormalSize();\n\t\t\t\t\tthis.participantService.resetRemoteStreamsToNormalSize();\n\t\t\t\t\tthis.participantService.toggleRemoteVideoPinned(track.sid);\n\t\t\t\t\tif (track.sid) this.participantService.setScreenTrackPublicationDate(participant.sid, track.sid, new Date().getTime());\n\t\t\t\t}\n\t\t\t\t// if (this.openviduService.isSttReady() && this.captionService.areCaptionsEnabled() && isCameraType) {\n\t\t\t\t// \t// Only subscribe to STT when is ready and stream is CAMERA type and it is a remote stream\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tawait this.openviduService.subscribeStreamToStt(event.stream, lang);\n\t\t\t\t// \t} catch (error) {\n\t\t\t\t// \t\tthis.log.e('Error subscribing from STT: ', error);\n\t\t\t\t// \t\t// I assume the only reason of an STT error is a STT crash.\n\t\t\t\t// \t\t// It must be subscribed to all remotes again\n\t\t\t\t// \t\t// await this.openviduService.unsubscribeRemotesFromSTT();\n\t\t\t\t// \t\tawait this.openviduService.subscribeRemotesToSTT(lang);\n\t\t\t\t// \t}\n\t\t\t\t// }\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * The LocalParticipant has unsubscribed from a track.\n\t */\n\tprivate subscribeToTrackUnsubscribed() {\n\t\tthis.room.on(\n\t\t\tRoomEvent.TrackUnsubscribed,\n\t\t\t(track: RemoteTrack, publication: RemoteTrackPublication, participant: RemoteParticipant) => {\n\t\t\t\tthis.log.d('TrackUnSubscribed', track, participant);\n\t\t\t\t// TODO: Check if this is the last track of the participant before removing it\n\t\t\t\tconst isScreenTrack = track.source === Track.Source.ScreenShare;\n\t\t\t\tif (isScreenTrack) {\n\t\t\t\t\tif (track.sid) this.participantService.setScreenTrackPublicationDate(participant.sid, track.sid, -1);\n\t\t\t\t\tthis.participantService.resetMyStreamsToNormalSize();\n\t\t\t\t\tthis.participantService.resetRemoteStreamsToNormalSize();\n\t\t\t\t\t// Set last screen track shared to pinned size\n\t\t\t\t\tthis.participantService.setLastScreenPinned();\n\t\t\t\t}\n\n\t\t\t\tif (track.sid) this.participantService.removeRemoteParticipantTrack(participant, track.sid);\n\t\t\t\t// \tif (this.openviduService.isSttReady() && this.captionService.areCaptionsEnabled() && isRemoteConnection && isCameraType) {\n\t\t\t\t// \t\ttry {\n\t\t\t\t// \t\t\tawait this.session.unsubscribeFromSpeechToText(event.stream);\n\t\t\t\t// \t\t} catch (error) {\n\t\t\t\t// \t\t\tthis.log.e('Error unsubscribing from STT: ', error);\n\t\t\t\t// \t\t}\n\t\t\t\t// \t}\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate subscribeToParticipantDisconnected() {\n\t\tthis.room.on(RoomEvent.ParticipantDisconnected, (participant: RemoteParticipant) => {\n\t\t\tthis.participantService.removeRemoteParticipant(participant.sid);\n\t\t});\n\t}\n\n\tprivate subscribeToParticipantMetadataChanged() {\n\t\tthis.room.on(\n\t\t\tRoomEvent.ParticipantMetadataChanged,\n\t\t\t(metadata: string | undefined, participant: RemoteParticipant | LocalParticipant) => {\n\t\t\t\tconsole.log('ParticipantMetadataChanged', participant);\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate subscribeToDataMessage() {\n\t\tthis.room.on(\n\t\t\tRoomEvent.DataReceived,\n\t\t\tasync (payload: Uint8Array, participant?: RemoteParticipant, _?: DataPacket_Kind, topic?: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst decoder = new TextDecoder();\n\t\t\t\t\tconst fromServer = participant === undefined;\n\t\t\t\t\t// Validate source and resolve participant info\n\t\t\t\t\tconst storedParticipant = participant\n\t\t\t\t\t\t? this.participantService.getRemoteParticipantBySid(participant.sid || '')\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (participant && !storedParticipant) {\n\t\t\t\t\t\tthis.log.w('DataReceived from unknown participant', participant);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!fromServer && !participant) {\n\t\t\t\t\t\tthis.log.w('DataReceived from unknown source', payload);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst participantIdentity = storedParticipant?.identity || '';\n\t\t\t\t\tconst participantName = storedParticipant?.name || '';\n\n\t\t\t\t\tconst rawText = decoder.decode(payload);\n\t\t\t\t\tthis.log.d('DataReceived (raw)', { topic });\n\n\t\t\t\t\tconst eventMessage = safeJsonParse(rawText);\n\t\t\t\t\tif (!eventMessage) {\n\t\t\t\t\t\tthis.log.w('Discarding data: malformed JSON', rawText);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.log.d(`Data event received: ${topic}`);\n\n\t\t\t\t\t// Dispatch handling\n\t\t\t\t\tthis.handleDataEvent(topic, eventMessage, participantName || participantIdentity || 'Unknown');\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.log.e('Unhandled error processing DataReceived', err);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate handleDataEvent(topic: string | undefined, event: any, participantName: string) {\n\t\t// Handle the event based on topic\n\t\tswitch (topic) {\n\t\t\tcase DataTopic.CHAT:\n\t\t\t\tthis.chatService.addRemoteMessage(event.message, participantName);\n\t\t\t\tbreak;\n\t\t\tcase DataTopic.RECORDING_STARTING:\n\t\t\t\tthis.log.d('Recording is starting', event);\n\t\t\t\tthis.recordingService.setRecordingStarting();\n\t\t\t\tbreak;\n\t\t\tcase DataTopic.RECORDING_STARTED:\n\t\t\t\tthis.log.d('Recording has been started', event);\n\t\t\t\tthis.recordingService.setRecordingStarted(event);\n\t\t\t\tbreak;\n\t\t\tcase DataTopic.RECORDING_STOPPING:\n\t\t\t\tthis.log.d('Recording is stopping', event);\n\t\t\t\tthis.recordingService.setRecordingStopping();\n\t\t\t\tbreak;\n\t\t\tcase DataTopic.RECORDING_STOPPED:\n\t\t\t\tthis.log.d('RECORDING_STOPPED', event);\n\t\t\t\tthis.recordingService.setRecordingStopped(event);\n\t\t\t\tbreak;\n\n\t\t\tcase DataTopic.RECORDING_DELETED:\n\t\t\t\tthis.log.d('RECORDING_DELETED', event);\n\t\t\t\tthis.recordingService.deleteRecording(event);\n\t\t\t\tbreak;\n\n\t\t\tcase DataTopic.RECORDING_FAILED:\n\t\t\t\tthis.log.d('RECORDING_FAILED', event);\n\t\t\t\tthis.recordingService.setRecordingFailed(event.error);\n\t\t\t\tbreak;\n\n\t\t\tcase DataTopic.BROADCASTING_STARTING:\n\t\t\t\tthis.broadcastingService.setBroadcastingStarting();\n\t\t\t\tbreak;\n\t\t\tcase DataTopic.BROADCASTING_STARTED:\n\t\t\t\tthis.log.d('Broadcasting has been started', event);\n\t\t\t\tthis.broadcastingService.setBroadcastingStarted(event);\n\t\t\t\tbreak;\n\n\t\t\tcase DataTopic.BROADCASTING_STOPPING:\n\t\t\t\tthis.broadcastingService.setBroadcastingStopping();\n\t\t\t\tbreak;\n\t\t\tcase DataTopic.BROADCASTING_STOPPED:\n\t\t\t\tthis.broadcastingService.setBroadcastingStopped();\n\t\t\t\tbreak;\n\n\t\t\tcase DataTopic.BROADCASTING_FAILED:\n\t\t\t\tthis.broadcastingService.setBroadcastingFailed(event.error);\n\t\t\t\tbreak;\n\n\t\t\tcase DataTopic.ROOM_STATUS:\n\t\t\t\tconst { recordingList, isRecordingStarted, isBroadcastingStarted, broadcastingId } = event as RoomStatusData;\n\n\t\t\t\tif (this.libService.showRecordingActivityRecordingsList()) {\n\t\t\t\t\tthis.recordingService.setRecordingList(recordingList);\n\t\t\t\t}\n\t\t\t\tif (isRecordingStarted) {\n\t\t\t\t\tconst recordingActive = recordingList.find((recording) => recording.status === RecordingStatus.STARTED);\n\t\t\t\t\tthis.recordingService.setRecordingStarted(recordingActive);\n\t\t\t\t}\n\t\t\t\tif (isBroadcastingStarted) {\n\t\t\t\t\tthis.broadcastingService.setBroadcastingStarted(broadcastingId);\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// private async decryptIfNeeded(topic: string | undefined, payload: Uint8Array, identity: string): Promise<Uint8Array> {\n\t// \tif (topic === DataTopic.CHAT && this.e2eeService.isEnabled) {\n\t// \t\ttry {\n\t// \t\t\treturn await this.e2eeService.decryptOrMask(payload, identity, JSON.stringify({ message: '******' }));\n\t// \t\t} catch (e) {\n\t// \t\t\tthis.log.e('Error decrypting payload, using masked fallback', e);\n\t// \t\t\t// In case of decryption error, return a masked JSON so subsequent parsing won't crash\n\t// \t\t\treturn new TextEncoder().encode(JSON.stringify({ message: '******' }));\n\t// \t\t}\n\t// \t}\n\t// \treturn payload;\n\t// }\n\n\tprivate subscribeToReconnection() {\n\t\tthis.room.on(RoomEvent.Reconnecting, () => {\n\t\t\tthis.log.w('Connection lost: Reconnecting');\n\t\t\tthis.actionService.openConnectionDialog(\n\t\t\t\tthis.translateService.translate('ERRORS.CONNECTION'),\n\t\t\t\tthis.translateService.translate('ERRORS.RECONNECT')\n\t\t\t);\n\t\t\tthis.onRoomReconnecting.emit();\n\t\t});\n\t\tthis.room.on(RoomEvent.Reconnected, () => {\n\t\t\tthis.log.w('Connection lost: Reconnected');\n\t\t\tthis.actionService.closeConnectionDialog();\n\t\t\tthis.onRoomReconnected.emit();\n\t\t});\n\n\t\tthis.room.on(RoomEvent.Disconnected, async (reason: DisconnectReason | undefined) => {\n\t\t\tthis.shouldDisconnectRoomWhenComponentIsDestroyed = false;\n\t\t\tthis.actionService.closeConnectionDialog();\n\t\t\tconst participantLeftEvent: ParticipantLeftEvent = {\n\t\t\t\troomName: this.openviduService.getRoomName(),\n\t\t\t\tparticipantName: this.participantService.getLocalParticipant()?.name || '',\n\t\t\t\tidentity: this.participantService.getLocalParticipant()?.identity || '',\n\t\t\t\treason: ParticipantLeftReason.NETWORK_DISCONNECT\n\t\t\t};\n\t\t\tconst messageErrorKey = 'ERRORS.DISCONNECT';\n\t\t\tlet descriptionErrorKey = '';\n\t\t\tswitch (reason) {\n\t\t\t\tcase DisconnectReason.CLIENT_INITIATED:\n\t\t\t\t\t// Skip disconnect reason if a default disconnect method has been called\n\t\t\t\t\tif (!this.openviduService.shouldHandleClientInitiatedDisconnectEvent) return;\n\t\t\t\t\tparticipantLeftEvent.reason = ParticipantLeftReason.LEAVE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase DisconnectReason.DUPLICATE_IDENTITY:\n\t\t\t\t\tparticipantLeftEvent.reason = ParticipantLeftReason.DUPLICATE_IDENTITY;\n\t\t\t\t\tdescriptionErrorKey = 'ERRORS.DUPLICATE_IDENTITY';\n\t\t\t\t\tbreak;\n\t\t\t\tcase DisconnectReason.SERVER_SHUTDOWN:\n\t\t\t\t\tdescriptionErrorKey = 'ERRORS.SERVER_SHUTDOWN';\n\t\t\t\t\tparticipantLeftEvent.reason = ParticipantLeftReason.SERVER_SHUTDOWN;\n\t\t\t\t\tbreak;\n\t\t\t\tcase DisconnectReason.PARTICIPANT_REMOVED:\n\t\t\t\t\tparticipantLeftEvent.reason = ParticipantLeftReason.PARTICIPANT_REMOVED;\n\t\t\t\t\tdescriptionErrorKey = 'ERRORS.PARTICIPANT_REMOVED';\n\t\t\t\t\tbreak;\n\t\t\t\tcase DisconnectReason.ROOM_DELETED:\n\t\t\t\t\tparticipantLeftEvent.reason = ParticipantLeftReason.ROOM_DELETED;\n\t\t\t\t\tdescriptionErrorKey = 'ERRORS.ROOM_DELETED';\n\t\t\t\t\tbreak;\n\t\t\t\tcase DisconnectReason.SIGNAL_CLOSE:\n\t\t\t\t\tparticipantLeftEvent.reason = ParticipantLeftReason.SIGNAL_CLOSE;\n\t\t\t\t\tdescriptionErrorKey = 'ERRORS.SIGNAL_CLOSE';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tparticipantLeftEvent.reason = ParticipantLeftReason.OTHER;\n\t\t\t\t\tdescriptionErrorKey = 'ERRORS.DISCONNECT';\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.log.d('Participant disconnected', participantLeftEvent);\n\t\t\tthis.onParticipantLeft.emit(participantLeftEvent);\n\t\t\tthis.onRoomDisconnected.emit();\n\t\t\tif (this.libService.getShowDisconnectionDialog() && descriptionErrorKey) {\n\t\t\t\tthis.actionService.openDialog(\n\t\t\t\t\tthis.translateService.translate(messageErrorKey),\n\t\t\t\t\tthis.translateService.translate(descriptionErrorKey)\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate subscribeToVirtualBackground() {\n\t\tthis.libService.backgroundEffectsButton$.subscribe(async (enable) => {\n\t\t\tif (!enable && this.backgroundService.isBackgroundApplied()) {\n\t\t\t\tawait this.backgroundService.removeBackground();\n\t\t\t\tif (this.panelService.isBackgroundEffectsPanelOpened()) {\n\t\t\t\t\tthis.panelService.closePanel();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate startUpdateLayoutInterval() {\n\t\tthis.updateLayoutInterval = setInterval(() => {\n\t\t\tthis.layoutService.update();\n\t\t}, 50);\n\t}\n\n\tprivate stopUpdateLayoutInterval() {\n\t\tif (this.updateLayoutInterval) {\n\t\t\tclearInterval(this.updateLayoutInterval);\n\t\t}\n\t}\n}\n","@if (loading) {\n\t<div id=\"spinner\" [@inOutAnimation]>\n\t\t<mat-spinner [diameter]=\"50\"></mat-spinner>\n\t\t<span>{{ 'ROOM.JOINING' | translate }}</span>\n\t</div>\n} @else {\n\t@if (viewportService.shouldShowLandscapeWarning()) {\n\t\t<ov-landscape-warning></ov-landscape-warning>\n\t}\n\t<div id=\"session-container\" [@inOutAnimation]>\n\t\t<mat-sidenav-container #container #videoContainer class=\"sidenav-container\">\n\t\t\t<mat-sidenav\n\t\t\t\t#sidenav\n\t\t\t\tmode=\"{{ sidenavMode }}\"\n\t\t\t\tposition=\"end\"\n\t\t\t\tclass=\"sidenav-menu\"\n\t\t\t\t[ngClass]=\"{ big: settingsPanelOpened }\"\n\t\t\t\tfixedInViewport=\"true\"\n\t\t\t\tfixedTopGap=\"0\"\n\t\t\t\tfixedBottomGap=\"0\"\n\t\t\t>\n\t\t\t\t<ng-container *ngTemplateOutlet=\"panelTemplate\"></ng-container>\n\t\t\t</mat-sidenav>\n\n\t\t\t<mat-sidenav-content class=\"sidenav-main\">\n\t\t\t\t<div id=\"layout-container\" #layoutContainer>\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"layoutTemplate\"></ng-container>\n\t\t\t\t</div>\n\t\t\t</mat-sidenav-content>\n\t\t</mat-sidenav-container>\n\n\t\t<div id=\"footer-container\" *ngIf=\"toolbarTemplate\">\n\t\t\t<ng-container *ngTemplateOutlet=\"toolbarTemplate\"></ng-container>\n\t\t</div>\n\t</div>\n}\n","import { Component } from '@angular/core';\nimport { OpenViduThemeService } from '../../../services/theme/theme.service';\nimport { OpenViduThemeMode } from '../../../models/theme.model';\n\n@Component({\n\tselector: 'ov-theme-selector',\n\tstandalone: false,\n\ttemplate: `\n\t\t<div class=\"theme-selector-container\">\n\t\t\t<button\n\t\t\t\tmat-flat-button\n\t\t\t\t[matMenuTriggerFor]=\"themeMenu\"\n\t\t\t\taria-haspopup=\"true\"\n\t\t\t\taria-label=\"Select theme\"\n\t\t\t\tclass=\"theme-selector-button\"\n\t\t\t>\n\t\t\t\t<span class=\"theme-name\">\n\t\t\t\t\t{{ currentTheme || 'Select theme' }}\n\t\t\t\t\t<mat-icon class=\"expand-icon\">expand_more</mat-icon>\n\t\t\t\t</span>\n\t\t\t</button>\n\n\t\t\t<!-- Theme selection menu -->\n\t\t\t<mat-menu #themeMenu=\"matMenu\" class=\"theme-menu\">\n\t\t\t\t@for (theme of predefinedThemes; track theme) {\n\t\t\t\t\t<button\n\t\t\t\t\t\tmat-menu-item\n\t\t\t\t\t\t(click)=\"setTheme(theme)\"\n\t\t\t\t\t\t[attr.id]=\"'theme-' + theme\"\n\t\t\t\t\t\t[class.selected]=\"currentTheme === theme\"\n\t\t\t\t\t\tclass=\"theme-option\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@if (currentTheme === theme) {\n\t\t\t\t\t\t\t<mat-icon class=\"check-icon\">check</mat-icon>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<span class=\"theme-option-name\">{{ theme }}</span>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</mat-menu>\n\t\t</div>\n\t`,\n\tstyleUrl: './theme-selector.component.scss'\n})\nexport class ThemeSelectorComponent {\n\tprotected predefinedThemes: OpenViduThemeMode[] = [];\n\tconstructor(private themeService: OpenViduThemeService) {}\n\n\tngOnInit() {\n\t\tthis.predefinedThemes = this.themeService.getAllThemes();\n\t}\n\n\tget currentTheme() {\n\t\treturn this.themeService.getCurrentTheme();\n\t}\n\n\tsetTheme(theme: OpenViduThemeMode) {\n\t\tthis.themeService.setTheme(theme);\n\t}\n}\n","import { Component, ContentChild, EventEmitter, OnInit, Output, TemplateRef } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { PanelStatusInfo, PanelSettingsOptions, PanelType } from '../../../models/panel.model';\nimport { OpenViduComponentsConfigService } from '../../../services/config/directive-config.service';\nimport { PanelService } from '../../../services/panel/panel.service';\nimport { PlatformService } from '../../../services/platform/platform.service';\nimport { ViewportService } from '../../../services/viewport/viewport.service';\nimport { CustomDevice } from '../../../models/device.model';\nimport { LangOption } from '../../../models/lang.model';\nimport { SettingsPanelGeneralAdditionalElementsDirective } from '../../../directives/template/internals.directive';\n\n/**\n * @internal\n */\n@Component({\n\tselector: 'ov-settings-panel',\n\ttemplateUrl: './settings-panel.component.html',\n\tstyleUrls: ['../panel.component.scss', './settings-panel.component.scss'],\n\tstandalone: false\n})\nexport class SettingsPanelComponent implements OnInit {\n\t@Output() onVideoEnabledChanged = new EventEmitter<boolean>();\n\t@Output() onVideoDeviceChanged = new EventEmitter<CustomDevice>();\n\t@Output() onAudioEnabledChanged = new EventEmitter<boolean>();\n\t@Output() onAudioDeviceChanged = new EventEmitter<CustomDevice>();\n\t@Output() onLangChanged = new EventEmitter<LangOption>();\n\n\t/**\n\t * @internal\n\t * ContentChild for custom elements in general section\n\t */\n\t@ContentChild(SettingsPanelGeneralAdditionalElementsDirective)\n\texternalGeneralAdditionalElements!: SettingsPanelGeneralAdditionalElementsDirective;\n\n\tsettingsOptions: typeof PanelSettingsOptions = PanelSettingsOptions;\n\tselectedOption: PanelSettingsOptions = PanelSettingsOptions.GENERAL;\n\tshowCameraButton: boolean = true;\n\tshowMicrophoneButton: boolean = true;\n\tshowCaptions: boolean = true;\n\tshowThemeSelector: boolean = false;\n\tisMobile: boolean = false;\n\tprivate destroy$ = new Subject<void>();\n\n\t/**\n\t * @internal\n\t * Gets the template for additional elements in general section\n\t */\n\tget generalAdditionalElementsTemplate(): TemplateRef<any> | undefined {\n\t\treturn this.externalGeneralAdditionalElements?.template;\n\t}\n\n\tconstructor(\n\t\tprivate panelService: PanelService,\n\t\tprivate platformService: PlatformService,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tpublic viewportService: ViewportService\n\t) {}\n\n\t// Computed properties for responsive behavior\n\tget isCompactView(): boolean {\n\t\treturn this.viewportService.isMobileView() || this.viewportService.isTabletDown();\n\t}\n\n\tget isVerticalLayout(): boolean {\n\t\treturn this.viewportService.isMobileView();\n\t}\n\n\tget shouldHideMenuText(): boolean {\n\t\treturn !this.viewportService.isMobileView() && this.viewportService.isTablet();\n\t}\n\tngOnInit() {\n\t\tthis.isMobile = this.platformService.isMobile();\n\t\tthis.subscribeToPanelToggling();\n\t\tthis.subscribeToDirectives();\n\t}\n\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t}\n\n\tclose() {\n\t\tthis.panelService.togglePanel(PanelType.SETTINGS);\n\t}\n\tonSelectionChanged(option: PanelSettingsOptions) {\n\t\tthis.selectedOption = option;\n\t}\n\n\tprivate subscribeToDirectives() {\n\t\tthis.libService.cameraButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => (this.showCameraButton = value));\n\t\tthis.libService.microphoneButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => (this.showMicrophoneButton = value));\n\t\tthis.libService.captionsButton$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => (this.showCaptions = value));\n\t\tthis.libService.showThemeSelector$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => (this.showThemeSelector = value));\n\t}\n\n\tprivate subscribeToPanelToggling() {\n\t\tthis.panelService.panelStatusObs.pipe(takeUntil(this.destroy$)).subscribe((ev: PanelStatusInfo) => {\n\t\t\tif (ev.panelType === PanelType.SETTINGS && !!ev.subOptionType) {\n\t\t\t\tthis.selectedOption = ev.subOptionType as PanelSettingsOptions;\n\t\t\t}\n\t\t});\n\t}\n}\n","<div class=\"panel-container\" id=\"settings-container\" [class.vertical-layout]=\"isVerticalLayout\" [class.compact-view]=\"isCompactView\">\n\t<div class=\"panel-header-container\">\n\t\t<h3 class=\"panel-title\">{{ 'PANEL.SETTINGS.TITLE' | translate }}</h3>\n\t\t<button class=\"panel-close-button\" mat-icon-button matTooltip=\"{{ 'PANEL.CLOSE' | translate }}\" (click)=\"close()\">\n\t\t\t<mat-icon>close</mat-icon>\n\t\t</button>\n\t</div>\n\n\t<div class=\"settings-container\" [class.vertical-layout]=\"isVerticalLayout\">\n\t\t<div class=\"item-menu\" [class.compact]=\"isCompactView\" [class.icons-only]=\"shouldHideMenuText\">\n\t\t\t<mat-selection-list\n\t\t\t\t#optionList\n\t\t\t\t(selectionChange)=\"onSelectionChanged(optionList.selectedOptions.selected[0]?.value)\"\n\t\t\t\t[multiple]=\"false\"\n\t\t\t\t[hideSingleSelectionIndicator]=\"true\"\n\t\t\t\t[disableRipple]=\"true\"\n\t\t\t>\n\t\t\t\t<mat-list-option\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tid=\"general-opt\"\n\t\t\t\t\t[selected]=\"selectedOption === settingsOptions.GENERAL\"\n\t\t\t\t\t[value]=\"settingsOptions.GENERAL\"\n\t\t\t\t\tmatTooltip=\"{{ shouldHideMenuText ? ('PANEL.SETTINGS.GENERAL' | translate) : '' }}\"\n\t\t\t\t\t[matTooltipDisabled]=\"!shouldHideMenuText\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon matListItemIcon>manage_accounts</mat-icon>\n\t\t\t\t\t<div *ngIf=\"!shouldHideMenuText\" class=\"option-text\">{{ 'PANEL.SETTINGS.GENERAL' | translate }}</div>\n\t\t\t\t</mat-list-option>\n\t\t\t\t<mat-list-option\n\t\t\t\t\t*ngIf=\"showCameraButton\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tid=\"video-opt\"\n\t\t\t\t\t[selected]=\"selectedOption === settingsOptions.VIDEO\"\n\t\t\t\t\t[value]=\"settingsOptions.VIDEO\"\n\t\t\t\t\tmatTooltip=\"{{ shouldHideMenuText ? ('PANEL.SETTINGS.VIDEO' | translate) : '' }}\"\n\t\t\t\t\t[matTooltipDisabled]=\"!shouldHideMenuText\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon matListItemIcon>videocam</mat-icon>\n\t\t\t\t\t<div *ngIf=\"!shouldHideMenuText\" class=\"option-text\">{{ 'PANEL.SETTINGS.VIDEO' | translate }}</div>\n\t\t\t\t</mat-list-option>\n\t\t\t\t<mat-list-option\n\t\t\t\t\t*ngIf=\"showMicrophoneButton\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tid=\"audio-opt\"\n\t\t\t\t\t[selected]=\"selectedOption === settingsOptions.AUDIO\"\n\t\t\t\t\t[value]=\"settingsOptions.AUDIO\"\n\t\t\t\t\tmatTooltip=\"{{ shouldHideMenuText ? ('PANEL.SETTINGS.AUDIO' | translate) : '' }}\"\n\t\t\t\t\t[matTooltipDisabled]=\"!shouldHideMenuText\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon matListItemIcon>mic</mat-icon>\n\t\t\t\t\t<div *ngIf=\"!shouldHideMenuText\" class=\"option-text\">{{ 'PANEL.SETTINGS.AUDIO' | translate }}</div>\n\t\t\t\t</mat-list-option>\n\t\t\t\t<!-- <mat-list-option\n\t\t\t\t\t*ngIf=\"showCaptions\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\t[selected]=\"selectedOption === settingsOptions.CAPTIONS\"\n\t\t\t\t\t[value]=\"settingsOptions.CAPTIONS\"\n\t\t\t\t\tid=\"captions-opt\"\n\t\t\t\t\tmatTooltip=\"{{ shouldHideMenuText ? ('PANEL.SETTINGS.CAPTIONS' | translate) : '' }}\"\n\t\t\t\t\t[matTooltipDisabled]=\"!shouldHideMenuText\"\n\t\t\t\t>\n\t\t\t\t\t<mat-icon matListItemIcon>closed_caption</mat-icon>\n\t\t\t\t\t<div mat-line *ngIf=\"!shouldHideMenuText\">{{ 'PANEL.SETTINGS.CAPTIONS' | translate }}</div>\n\t\t\t\t</mat-list-option> -->\n\t\t\t</mat-selection-list>\n\t\t</div>\n\n\t\t<div class=\"item-content\" [class.full-width]=\"isVerticalLayout\">\n\t\t\t<div *ngIf=\"selectedOption === settingsOptions.GENERAL\" class=\"general-settings\">\n\t\t\t\t<div class=\"nickname-section\">\n\t\t\t\t\t<mat-label class=\"input-label\">{{ 'PREJOIN.NICKNAME' | translate }}</mat-label>\n\t\t\t\t\t<div class=\"nickname-input-container\">\n\t\t\t\t\t\t<ov-participant-name-input></ov-participant-name-input>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"language-section\">\n\t\t\t\t\t<mat-list>\n\t\t\t\t\t\t<mat-list-item class=\"lang-selector\">\n\t\t\t\t\t\t\t<mat-icon matListItemIcon>translate</mat-icon>\n\t\t\t\t\t\t\t<div matListItemTitle>{{ 'PANEL.SETTINGS.LANGUAGE' | translate }}</div>\n\t\t\t\t\t\t\t<ov-lang-selector matListItemMeta (onLangChanged)=\"onLangChanged.emit($event)\"></ov-lang-selector>\n\t\t\t\t\t\t</mat-list-item>\n\t\t\t\t\t</mat-list>\n\t\t\t\t</div>\n\t\t\t\t@if (showThemeSelector) {\n\t\t\t\t\t<div class=\"theme-section\">\n\t\t\t\t\t\t<mat-list>\n\t\t\t\t\t\t\t<mat-list-item class=\"theme-selector\">\n\t\t\t\t\t\t\t\t<mat-icon matListItemIcon class=\"material-symbols-outlined\">routine</mat-icon>\n\t\t\t\t\t\t\t\t<div matListItemTitle>{{ 'PANEL.SETTINGS.THEME' | translate }}</div>\n\t\t\t\t\t\t\t\t<ov-theme-selector matListItemMeta></ov-theme-selector>\n\t\t\t\t\t\t\t</mat-list-item>\n\t\t\t\t\t\t</mat-list>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t\t<!-- Additional elements injected via directive -->\n\t\t\t\t@if (generalAdditionalElementsTemplate) {\n\t\t\t\t\t<div class=\"additional-elements-section\">\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"generalAdditionalElementsTemplate\"></ng-container>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div *ngIf=\"showCameraButton && selectedOption === settingsOptions.VIDEO\" class=\"video-settings\">\n\t\t\t\t<ov-video-devices-select\n\t\t\t\t\t(onVideoDeviceChanged)=\"onVideoDeviceChanged.emit($event)\"\n\t\t\t\t\t(onVideoEnabledChanged)=\"onVideoEnabledChanged.emit($event)\"\n\t\t\t\t></ov-video-devices-select>\n\t\t\t</div>\n\t\t\t<div *ngIf=\"showMicrophoneButton && selectedOption === settingsOptions.AUDIO\" class=\"audio-settings\">\n\t\t\t\t<ov-audio-devices-select\n\t\t\t\t\t(onAudioDeviceChanged)=\"onAudioDeviceChanged.emit($event)\"\n\t\t\t\t\t(onAudioEnabledChanged)=\"onAudioEnabledChanged.emit($event)\"\n\t\t\t\t></ov-audio-devices-select>\n\t\t\t</div>\n\t\t\t<!-- <div *ngIf=\"selectedOption === settingsOptions.CAPTIONS && showCaptions\" class=\"captions-settings\">\n\t\t\t\t<ov-captions-settings></ov-captions-settings>\n\t\t\t</div> -->\n\t\t</div>\n\t</div>\n</div>\n","import { animate, style, transition, trigger } from '@angular/animations';\nimport {\n\tAfterViewInit,\n\tComponent,\n\tContentChild,\n\tEventEmitter,\n\tOnDestroy,\n\tOutput,\n\tTemplateRef,\n\tViewChild\n} from '@angular/core';\nimport { Room } from 'livekit-client';\nimport { Subject, filter, skip, take, takeUntil } from 'rxjs';\nimport {\n\tLayoutAdditionalElementsDirective,\n\tLeaveButtonDirective,\n\tParticipantPanelAfterLocalParticipantDirective,\n\tPreJoinDirective,\n\tSettingsPanelGeneralAdditionalElementsDirective,\n\tToolbarMoreOptionsAdditionalMenuItemsDirective\n} from '../../directives/template/internals.directive';\nimport {\n\tActivitiesPanelDirective,\n\tAdditionalPanelsDirective,\n\tChatPanelDirective,\n\tLayoutDirective,\n\tPanelDirective,\n\tParticipantPanelItemDirective,\n\tParticipantPanelItemElementsDirective,\n\tParticipantsPanelDirective,\n\tStreamDirective,\n\tToolbarAdditionalButtonsDirective,\n\tToolbarAdditionalPanelButtonsDirective,\n\tToolbarDirective\n} from '../../directives/template/openvidu-components-angular.directive';\nimport { BroadcastingStartRequestedEvent, BroadcastingStopRequestedEvent } from '../../models/broadcasting.model';\nimport { CustomDevice } from '../../models/device.model';\nimport { LangOption } from '../../models/lang.model';\nimport { ILogger } from '../../models/logger.model';\nimport {\n\tActivitiesPanelStatusEvent,\n\tChatPanelStatusEvent,\n\tParticipantsPanelStatusEvent,\n\tSettingsPanelStatusEvent\n} from '../../models/panel.model';\nimport { ParticipantLeftEvent, ParticipantModel } from '../../models/participant.model';\nimport {\n\tRecordingDeleteRequestedEvent,\n\tRecordingDownloadClickedEvent,\n\tRecordingPlayClickedEvent,\n\tRecordingStartRequestedEvent,\n\tRecordingStopRequestedEvent\n} from '../../models/recording.model';\nimport { VideoconferenceState, VideoconferenceStateInfo } from '../../models/videoconference-state.model';\nimport { ActionService } from '../../services/action/action.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { DeviceService } from '../../services/device/device.service';\nimport { E2eeService } from '../../services/e2ee/e2ee.service';\nimport { LoggerService } from '../../services/logger/logger.service';\nimport { OpenViduService } from '../../services/openvidu/openvidu.service';\nimport { StorageService } from '../../services/storage/storage.service';\nimport {\n\tDefaultTemplates,\n\tExternalDirectives,\n\tTemplateConfiguration,\n\tTemplateManagerService\n} from '../../services/template/template-manager.service';\nimport { OpenViduThemeService } from '../../services/theme/theme.service';\n\n/**\n * The **VideoconferenceComponent** is the parent of all OpenVidu components.\n * It allow us to create a modern, useful and powerful videoconference apps with ease.\n */\n@Component({\n\tselector: 'ov-videoconference',\n\ttemplateUrl: './videoconference.component.html',\n\tstyleUrls: ['./videoconference.component.scss'],\n\tanimations: [\n\t\ttrigger('inOutAnimation', [\n\t\t\ttransition(':enter', [\n\t\t\t\tstyle({ opacity: 0 }),\n\t\t\t\tanimate(`${VideoconferenceComponent.ANIMATION_DURATION_MS}ms ease-out`, style({ opacity: 1 }))\n\t\t\t])\n\t\t\t// transition(':leave', [style({ opacity: 1 }), animate('50ms ease-in', style({ opacity: 0.9 }))])\n\t\t])\n\t],\n\tstandalone: false\n})\nexport class VideoconferenceComponent implements OnDestroy, AfterViewInit {\n\t// Constants\n\tprivate static readonly PARTICIPANT_NAME_TIMEOUT_MS = 1000;\n\tprivate static readonly ANIMATION_DURATION_MS = 300;\n\tprivate static readonly MATERIAL_ICONS_URL = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined';\n\tprivate static readonly MATERIAL_ICONS_SELECTOR = 'link[href*=\"Material+Symbols+Outlined\"]';\n\tprivate static readonly SPINNER_DIAMETER = 50;\n\t// *** Toolbar ***\n\n\tprivate _externalToolbar?: ToolbarDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ToolbarDirective)\n\tset externalToolbar(value: ToolbarDirective) {\n\t\tthis._externalToolbar = value;\n\t\tthis.setupTemplates();\n\t}\n\n\tget externalToolbar(): ToolbarDirective | undefined {\n\t\treturn this._externalToolbar;\n\t}\n\n\tprivate _externalToolbarAdditionalButtons?: ToolbarAdditionalButtonsDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ToolbarAdditionalButtonsDirective)\n\tset externalToolbarAdditionalButtons(value: ToolbarAdditionalButtonsDirective) {\n\t\tthis._externalToolbarAdditionalButtons = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalToolbarAdditionalButtons(): ToolbarAdditionalButtonsDirective | undefined {\n\t\treturn this._externalToolbarAdditionalButtons;\n\t}\n\n\tprivate _externalToolbarLeaveButton?: LeaveButtonDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(LeaveButtonDirective)\n\tset externalToolbarLeaveButton(value: LeaveButtonDirective) {\n\t\tthis._externalToolbarLeaveButton = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalToolbarLeaveButton(): LeaveButtonDirective | undefined {\n\t\treturn this._externalToolbarLeaveButton;\n\t}\n\n\tprivate _externalToolbarAdditionalPanelButtons?: ToolbarAdditionalPanelButtonsDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ToolbarAdditionalPanelButtonsDirective)\n\tset externalToolbarAdditionalPanelButtons(value: ToolbarAdditionalPanelButtonsDirective) {\n\t\tthis._externalToolbarAdditionalPanelButtons = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalToolbarAdditionalPanelButtons(): ToolbarAdditionalPanelButtonsDirective | undefined {\n\t\treturn this._externalToolbarAdditionalPanelButtons;\n\t}\n\n\tprivate _externalAdditionalPanels?: AdditionalPanelsDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(AdditionalPanelsDirective)\n\tset externalAdditionalPanels(value: AdditionalPanelsDirective) {\n\t\tthis._externalAdditionalPanels = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalAdditionalPanels(): AdditionalPanelsDirective | undefined {\n\t\treturn this._externalAdditionalPanels;\n\t}\n\n\t// *** Panels ***\n\n\tprivate _externalPanel?: PanelDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(PanelDirective)\n\tset externalPanel(value: PanelDirective) {\n\t\tthis._externalPanel = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalPanel(): PanelDirective | undefined {\n\t\treturn this._externalPanel;\n\t}\n\n\tprivate _externalChatPanel?: ChatPanelDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ChatPanelDirective)\n\tset externalChatPanel(value: ChatPanelDirective) {\n\t\tthis._externalChatPanel = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalChatPanel(): ChatPanelDirective | undefined {\n\t\treturn this._externalChatPanel;\n\t}\n\n\tprivate _externalActivitiesPanel?: ActivitiesPanelDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ActivitiesPanelDirective)\n\tset externalActivitiesPanel(value: ActivitiesPanelDirective) {\n\t\tthis._externalActivitiesPanel = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalActivitiesPanel(): ActivitiesPanelDirective | undefined {\n\t\treturn this._externalActivitiesPanel;\n\t}\n\n\tprivate _externalParticipantsPanel?: ParticipantsPanelDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ParticipantsPanelDirective)\n\tset externalParticipantsPanel(value: ParticipantsPanelDirective) {\n\t\tthis._externalParticipantsPanel = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalParticipantsPanel(): ParticipantsPanelDirective | undefined {\n\t\treturn this._externalParticipantsPanel;\n\t}\n\n\tprivate _externalParticipantPanelItem?: ParticipantPanelItemDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ParticipantPanelItemDirective)\n\tset externalParticipantPanelItem(value: ParticipantPanelItemDirective) {\n\t\tthis._externalParticipantPanelItem = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalParticipantPanelItem(): ParticipantPanelItemDirective | undefined {\n\t\treturn this._externalParticipantPanelItem;\n\t}\n\n\tprivate _externalParticipantPanelItemElements?: ParticipantPanelItemElementsDirective;\n\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ParticipantPanelItemElementsDirective)\n\tset externalParticipantPanelItemElements(value: ParticipantPanelItemElementsDirective) {\n\t\tthis._externalParticipantPanelItemElements = value;\n\t\tthis.setupTemplates();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget externalParticipantPanelItemElements(): ParticipantPanelItemElementsDirective | undefined {\n\t\treturn this._externalParticipantPanelItemElements;\n\t}\n\n\t// *** Layout ***\n\n\tprivate _externalLayout?: LayoutDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(LayoutDirective)\n\tset externalLayout(value: LayoutDirective) {\n\t\tthis._externalLayout = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalLayout(): LayoutDirective | undefined {\n\t\treturn this._externalLayout;\n\t}\n\n\tprivate _externalStream?: StreamDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(StreamDirective)\n\tset externalStream(value: StreamDirective) {\n\t\tthis._externalStream = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalStream(): StreamDirective | undefined {\n\t\treturn this._externalStream;\n\t}\n\n\t// *** PreJoin ***\n\n\tprivate _externalPreJoin?: PreJoinDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(PreJoinDirective)\n\tset externalPreJoin(value: PreJoinDirective) {\n\t\tthis._externalPreJoin = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalPreJoin(): PreJoinDirective | undefined {\n\t\treturn this._externalPreJoin;\n\t}\n\n\tprivate _externalParticipantPanelAfterLocalParticipant?: ParticipantPanelAfterLocalParticipantDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ParticipantPanelAfterLocalParticipantDirective)\n\tset externalParticipantPanelAfterLocalParticipant(value: ParticipantPanelAfterLocalParticipantDirective) {\n\t\tthis._externalParticipantPanelAfterLocalParticipant = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalParticipantPanelAfterLocalParticipant(): ParticipantPanelAfterLocalParticipantDirective | undefined {\n\t\treturn this._externalParticipantPanelAfterLocalParticipant;\n\t}\n\n\tprivate _externalLayoutAdditionalElements?: LayoutAdditionalElementsDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(LayoutAdditionalElementsDirective)\n\tset externalLayoutAdditionalElements(value: LayoutAdditionalElementsDirective) {\n\t\tthis._externalLayoutAdditionalElements = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalLayoutAdditionalElements(): LayoutAdditionalElementsDirective | undefined {\n\t\treturn this._externalLayoutAdditionalElements;\n\t}\n\n\tprivate _externalSettingsPanelGeneralAdditionalElements?: SettingsPanelGeneralAdditionalElementsDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(SettingsPanelGeneralAdditionalElementsDirective)\n\tset externalSettingsPanelGeneralAdditionalElements(value: SettingsPanelGeneralAdditionalElementsDirective) {\n\t\tthis._externalSettingsPanelGeneralAdditionalElements = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalSettingsPanelGeneralAdditionalElements(): SettingsPanelGeneralAdditionalElementsDirective | undefined {\n\t\treturn this._externalSettingsPanelGeneralAdditionalElements;\n\t}\n\n\tprivate _externalToolbarMoreOptionsAdditionalMenuItems?: ToolbarMoreOptionsAdditionalMenuItemsDirective;\n\t/**\n\t * @internal\n\t */\n\t@ContentChild(ToolbarMoreOptionsAdditionalMenuItemsDirective)\n\tset externalToolbarMoreOptionsAdditionalMenuItems(value: ToolbarMoreOptionsAdditionalMenuItemsDirective) {\n\t\tthis._externalToolbarMoreOptionsAdditionalMenuItems = value;\n\t\tthis.setupTemplates();\n\t}\n\t/**\n\t * @internal\n\t */\n\tget externalToolbarMoreOptionsAdditionalMenuItems(): ToolbarMoreOptionsAdditionalMenuItemsDirective | undefined {\n\t\treturn this._externalToolbarMoreOptionsAdditionalMenuItems;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultToolbar', { static: false, read: TemplateRef }) defaultToolbarTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultPanel', { static: false, read: TemplateRef }) defaultPanelTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultChatPanel', { static: false, read: TemplateRef }) defaultChatPanelTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultParticipantsPanel', { static: false, read: TemplateRef }) defaultParticipantsPanelTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultActivitiesPanel', { static: false, read: TemplateRef })\n\tdefaultActivitiesPanelTemplate: TemplateRef<any>;\n\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultParticipantPanelItem', { static: false, read: TemplateRef }) defaultParticipantPanelItemTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultLayout', { static: false, read: TemplateRef }) defaultLayoutTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\t@ViewChild('defaultStream', { static: false, read: TemplateRef }) defaultStreamTemplate: TemplateRef<any>;\n\n\t/**\n\t * @internal\n\t */\n\topenviduAngularToolbarTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularToolbarAdditionalButtonsTemplate: TemplateRef<any>;\n\n\t/**\n\t * @internal\n\t */\n\topenviduAngularToolbarLeaveButtonTemplate: TemplateRef<any> | undefined;\n\n\t/**\n\t * @internal\n\t */\n\topenviduAngularActivitiesPanelTemplate: TemplateRef<any>;\n\n\t/**\n\t * @internal\n\t */\n\topenviduAngularToolbarAdditionalPanelButtonsTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularPanelTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularChatPanelTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularParticipantsPanelTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularAdditionalPanelsTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularParticipantPanelAfterLocalParticipantTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularParticipantPanelItemTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularParticipantPanelItemElementsTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularLayoutTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularStreamTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\topenviduAngularPreJoinTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\tovLayoutAdditionalElementsTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\tovSettingsPanelGeneralAdditionalElementsTemplate: TemplateRef<any>;\n\t/**\n\t * @internal\n\t */\n\tovToolbarMoreOptionsAdditionalMenuItemsTemplate: TemplateRef<any>;\n\n\t/**\n\t * @internal\n\t * Template configuration managed by TemplateManagerService\n\t */\n\tprivate templateConfig: TemplateConfiguration;\n\n\t/**\n\t * Provides event notifications that fire when the local participant is ready to join to the room.\n\t * This event emits the participant name as data.\n\t */\n\t@Output() onTokenRequested: EventEmitter<string> = new EventEmitter<string>();\n\n\t/**\n\t * Provides event notifications that fire when the local participant is ready to join to the room.\n\t * This event is only emitted when the prejoin page has been shown.\n\t */\n\t@Output() onReadyToJoin: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when Room is disconnected for the local participant.\n\t * @deprecated Use {@link VideoconferenceComponent.onParticipantLeft} instead\n\t */\n\t@Output() onRoomDisconnected: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when Room is being reconnected for the local participant.\n\t */\n\t@Output() onRoomReconnecting: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when Room is reconnected for the local participant.\n\t */\n\t@Output() onRoomReconnected: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * This event is emitted when the local participant leaves the room.\n\t */\n\t@Output() onParticipantLeft: EventEmitter<ParticipantLeftEvent> = new EventEmitter<ParticipantLeftEvent>();\n\n\t/**\n\t * This event is emitted when the video state changes, providing information about if the video is enabled (true) or disabled (false).\n\t */\n\t@Output() onVideoEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\t/**\n\t * This event is emitted when the selected video device changes, providing information about the new custom device that has been selected.\n\t */\n\t@Output() onVideoDeviceChanged: EventEmitter<CustomDevice> = new EventEmitter<CustomDevice>();\n\n\t/**\n\t * This event is emitted when the audio state changes, providing information about if the audio is enabled (true) or disabled (false).\n\t */\n\t@Output() onAudioEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n\t/**\n\t * This event is emitted when the selected audio device changes, providing information about the new custom device that has been selected.\n\t */\n\t@Output() onAudioDeviceChanged: EventEmitter<CustomDevice> = new EventEmitter<CustomDevice>();\n\n\t/**\n\t * This event is emitted when the language changes, providing information about the new language that has been selected.\n\t */\n\t@Output() onLangChanged: EventEmitter<LangOption> = new EventEmitter<LangOption>();\n\n\t/**\n\t * This event is emitted when the screen share state changes, providing information about if the screen share is enabled (true) or disabled (false).\n\t */\n\t@Output() onScreenShareEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n\t/**\n\t * The event is emitted when the fullscreen state changes, providing information about if the fullscreen is enabled (true) or disabled (false).\n\t */\n\t@Output() onFullscreenEnabledChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n\t/**\n\t * This event is fired when the chat panel status has been changed.\n\t * It provides the new status of the chat panel as {@link ChatPanelStatusEvent} payload.\n\t */\n\t@Output() onChatPanelStatusChanged: EventEmitter<ChatPanelStatusEvent> = new EventEmitter<ChatPanelStatusEvent>();\n\n\t/**\n\t * This event is fired when the participants panel status has been changed.\n\t * It provides the new status of the participants panel as {@link ParticipantsPanelStatusEvent} payload.\n\t */\n\t@Output() onParticipantsPanelStatusChanged: EventEmitter<ParticipantsPanelStatusEvent> =\n\t\tnew EventEmitter<ParticipantsPanelStatusEvent>();\n\n\t/**\n\t * This event is fired when the settings panel status has been changed.\n\t * It provides the new status of the settings panel as {@link SettingsPanelStatusEvent} payload.\n\t */\n\t@Output() onSettingsPanelStatusChanged: EventEmitter<SettingsPanelStatusEvent> = new EventEmitter<SettingsPanelStatusEvent>();\n\n\t/**\n\t * This event is fired when the activities panel status has been changed.\n\t * It provides the new status of the activities panel as {@link ActivitiesPanelStatusEvent} payload.\n\t */\n\t@Output() onActivitiesPanelStatusChanged: EventEmitter<ActivitiesPanelStatusEvent> = new EventEmitter<ActivitiesPanelStatusEvent>();\n\n\t/**\n\t * Provides event notifications that fire when stop recording button has been clicked.\n\t * It provides the {@link RecordingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStopRequested: EventEmitter<RecordingStopRequestedEvent> = new EventEmitter<RecordingStopRequestedEvent>();\n\n\t/**\n\t * This event is fired when the user clicks on the start recording button.\n\t * It provides the {@link RecordingStartRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingStartRequested: EventEmitter<RecordingStartRequestedEvent> = new EventEmitter<RecordingStartRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when delete recording button has been clicked.\n\t * It provides the {@link RecordingDeleteRequestedEvent} payload as event data.\n\t */\n\t@Output() onRecordingDeleteRequested: EventEmitter<RecordingDeleteRequestedEvent> = new EventEmitter<RecordingDeleteRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when play recording button is clicked from {@link ActivitiesPanelComponent}.\n\t * It provides the {@link RecordingPlayClickedEvent} payload as event data.\n\t */\n\t@Output() onRecordingPlayClicked: EventEmitter<RecordingPlayClickedEvent> = new EventEmitter<RecordingPlayClickedEvent>();\n\n\t/**\n\t * @internal\n\t * This event is fired when the user clicks on the view recording button.\n\t * It provides the recording ID as event data.\n\t */\n\t@Output() onViewRecordingClicked: EventEmitter<string> = new EventEmitter<string>();\n\n\t/**\n\t * Provides event notifications that fire when download recording button is clicked from {@link ActivitiesPanelComponent}.\n\t * It provides the {@link RecordingDownloadClickedEvent} payload as event data.\n\t */\n\t@Output() onRecordingDownloadClicked: EventEmitter<RecordingDownloadClickedEvent> = new EventEmitter<RecordingDownloadClickedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when start broadcasting button is clicked.\n\t * It provides the {@link BroadcastingStartRequestedEvent} payload as event data.\n\t */\n\t@Output() onBroadcastingStartRequested: EventEmitter<BroadcastingStartRequestedEvent> =\n\t\tnew EventEmitter<BroadcastingStartRequestedEvent>();\n\n\t/**\n\t * Provides event notifications that fire when stop broadcasting button is clicked.\n\t * It provides the {@link BroadcastingStopRequestedEvent} payload as event data.\n\t */\n\t@Output() onBroadcastingStopRequested: EventEmitter<BroadcastingStopRequestedEvent> =\n\t\tnew EventEmitter<BroadcastingStopRequestedEvent>();\n\n\t/**\n\t * @internal\n\t * This event is fired when the user clicks on the view recordings button.\n\t */\n\t@Output() onViewRecordingsClicked: EventEmitter<void> = new EventEmitter<void>();\n\n\t/**\n\t * Provides event notifications that fire when Room is created for the local participant.\n\t * It provides the {@link https://openvidu.io/latest/docs/getting-started/#room Room} payload as event data.\n\t */\n\t@Output() onRoomCreated: EventEmitter<Room> = new EventEmitter<Room>();\n\n\t/**\n\t * Provides event notifications that fire when local participant is created and connected to the Room.\n\t * @deprecated Use `onParticipantConnected` instead\n\t */\n\t@Output() onParticipantCreated: EventEmitter<ParticipantModel> = new EventEmitter<ParticipantModel>();\n\n\t/**\n\t * Provides event notifications that fire when local participant is connected to the Room.\n\t * It provides the {@link ParticipantModel} payload as event data.\n\t */\n\t@Output() onParticipantConnected: EventEmitter<ParticipantModel> = new EventEmitter<ParticipantModel>();\n\n\t/**\n\t * @internal\n\t * Centralized state management for the videoconference component\n\t */\n\tcomponentState: VideoconferenceStateInfo = {\n\t\tstate: VideoconferenceState.INITIALIZING,\n\t\tshowPrejoin: true,\n\t\tisRoomReady: false,\n\t\tisConnected: false,\n\t\thasAudioDevices: false,\n\t\thasVideoDevices: false,\n\t\thasUserInitiatedJoin: false,\n\t\twasPrejoinShown: false,\n\t\tisLoading: true,\n\t\terror: {\n\t\t\thasError: false,\n\t\t\tmessage: '',\n\t\t\ttokenError: null\n\t\t}\n\t};\n\n\tprivate destroy$ = new Subject<void>();\n\tprivate log: ILogger;\n\tprivate latestParticipantName: string | undefined;\n\n\t// Expose constants to template\n\tget spinnerDiameter(): number {\n\t\treturn VideoconferenceComponent.SPINNER_DIAMETER;\n\t}\n\n\t/**\n\t * @internal\n\t * Updates the component state\n\t */\n\tprivate updateComponentState(newState: Partial<VideoconferenceStateInfo>): void {\n\t\tthis.componentState = { ...this.componentState, ...newState };\n\t\tthis.log.d(`State updated to: ${this.componentState.state}`, this.componentState);\n\t}\n\n\t/**\n\t * @internal\n\t * Checks if user has initiated the join process\n\t */\n\tprivate hasUserInitiatedJoin(): boolean {\n\t\treturn (\n\t\t\tthis.componentState.state === VideoconferenceState.JOINING ||\n\t\t\tthis.componentState.state === VideoconferenceState.READY_TO_CONNECT ||\n\t\t\tthis.componentState.state === VideoconferenceState.CONNECTED\n\t\t);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(\n\t\tprivate loggerSrv: LoggerService,\n\t\tprivate storageSrv: StorageService,\n\t\tprivate deviceSrv: DeviceService,\n\t\tprivate openviduService: OpenViduService,\n\t\tprivate actionService: ActionService,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate templateManagerService: TemplateManagerService,\n\t\tprivate themeService: OpenViduThemeService,\n\t\tprivate e2eeService: E2eeService\n\t) {\n\t\tthis.log = this.loggerSrv.get('VideoconferenceComponent');\n\n\t\tthis.addMaterialIconsIfNeeded();\n\n\t\t// Initialize state\n\t\tthis.updateComponentState({\n\t\t\tstate: VideoconferenceState.INITIALIZING,\n\t\t\tshowPrejoin: true,\n\t\t\tisRoomReady: false,\n\t\t\twasPrejoinShown: false,\n\t\t\tisLoading: true,\n\t\t\terror: { hasError: false }\n\t\t});\n\n\t\tthis.themeService.initializeTheme();\n\t\tthis.subscribeToVideconferenceDirectives();\n\t}\n\n\tngOnDestroy() {\n\t\tthis.destroy$.next();\n\t\tthis.destroy$.complete();\n\t\tthis.deviceSrv.clear();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tngAfterViewInit() {\n\t\tthis.setupTemplates();\n\t\tthis.deviceSrv.initializeDevices().then(() => {\n\t\t\tthis.updateComponentState({\n\t\t\t\tisLoading: false\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tprivate addMaterialIconsIfNeeded(): void {\n\t\t//Add material icons to the page if not already present\n\t\tconst existingLink = document.querySelector(VideoconferenceComponent.MATERIAL_ICONS_SELECTOR);\n\t\tif (!existingLink) {\n\t\t\tconst link = document.createElement('link');\n\t\t\tlink.href = VideoconferenceComponent.MATERIAL_ICONS_URL;\n\t\t\tlink.rel = 'stylesheet';\n\t\t\tdocument.head.appendChild(link);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tprivate setupTemplates(): void {\n\t\tconst externalDirectives: ExternalDirectives = {\n\t\t\ttoolbar: this.externalToolbar,\n\t\t\ttoolbarAdditionalButtons: this.externalToolbarAdditionalButtons,\n\t\t\ttoolbarAdditionalPanelButtons: this.externalToolbarAdditionalPanelButtons,\n\t\t\ttoolbarLeaveButton: this.externalToolbarLeaveButton,\n\t\t\tadditionalPanels: this.externalAdditionalPanels,\n\t\t\tpanel: this.externalPanel,\n\t\t\tchatPanel: this.externalChatPanel,\n\t\t\tactivitiesPanel: this.externalActivitiesPanel,\n\t\t\tparticipantsPanel: this.externalParticipantsPanel,\n\t\t\tparticipantPanelAfterLocalParticipant: this.externalParticipantPanelAfterLocalParticipant,\n\t\t\tparticipantPanelItem: this.externalParticipantPanelItem,\n\t\t\tparticipantPanelItemElements: this.externalParticipantPanelItemElements,\n\t\t\tlayout: this.externalLayout,\n\t\t\tstream: this.externalStream,\n\t\t\tpreJoin: this.externalPreJoin,\n\t\t\tlayoutAdditionalElements: this.externalLayoutAdditionalElements,\n\t\t\tsettingsPanelGeneralAdditionalElements: this.externalSettingsPanelGeneralAdditionalElements,\n\t\t\ttoolbarMoreOptionsAdditionalMenuItems: this.externalToolbarMoreOptionsAdditionalMenuItems\n\t\t};\n\n\t\tconst defaultTemplates: DefaultTemplates = {\n\t\t\ttoolbar: this.defaultToolbarTemplate,\n\t\t\tpanel: this.defaultPanelTemplate,\n\t\t\tchatPanel: this.defaultChatPanelTemplate,\n\t\t\tparticipantsPanel: this.defaultParticipantsPanelTemplate,\n\t\t\tactivitiesPanel: this.defaultActivitiesPanelTemplate,\n\t\t\tparticipantPanelItem: this.defaultParticipantPanelItemTemplate,\n\t\t\tlayout: this.defaultLayoutTemplate,\n\t\t\tstream: this.defaultStreamTemplate\n\t\t};\n\n\t\t// Use the template manager service to set up all templates\n\t\tthis.templateConfig = this.templateManagerService.setupTemplates(externalDirectives, defaultTemplates);\n\n\t\t// Apply the configuration to the component properties\n\t\tthis.applyTemplateConfiguration();\n\t}\n\n\t/**\n\t * @internal\n\t * Applies the template configuration to component properties\n\t */\n\tprivate applyTemplateConfiguration(): void {\n\t\tconst assignIfChanged = <K extends keyof this>(prop: K, value: this[K]) => {\n\t\t\tif (this[prop] !== value) {\n\t\t\t\tthis[prop] = value;\n\t\t\t}\n\t\t};\n\n\t\tassignIfChanged('openviduAngularToolbarTemplate', this.templateConfig.toolbarTemplate);\n\t\tassignIfChanged('openviduAngularPanelTemplate', this.templateConfig.panelTemplate);\n\t\tassignIfChanged('openviduAngularChatPanelTemplate', this.templateConfig.chatPanelTemplate);\n\t\tassignIfChanged('openviduAngularParticipantsPanelTemplate', this.templateConfig.participantsPanelTemplate);\n\t\tassignIfChanged('openviduAngularActivitiesPanelTemplate', this.templateConfig.activitiesPanelTemplate);\n\t\tassignIfChanged('openviduAngularParticipantPanelItemTemplate', this.templateConfig.participantPanelItemTemplate);\n\t\tassignIfChanged('openviduAngularLayoutTemplate', this.templateConfig.layoutTemplate);\n\t\tassignIfChanged('openviduAngularStreamTemplate', this.templateConfig.streamTemplate);\n\n\t\t// Optional templates\n\t\tif (this.templateConfig.toolbarAdditionalButtonsTemplate) {\n\t\t\tassignIfChanged('openviduAngularToolbarAdditionalButtonsTemplate', this.templateConfig.toolbarAdditionalButtonsTemplate);\n\t\t}\n\t\tif (this.templateConfig.toolbarLeaveButtonTemplate) {\n\t\t\tassignIfChanged('openviduAngularToolbarLeaveButtonTemplate', this.templateConfig.toolbarLeaveButtonTemplate);\n\t\t}\n\t\tif (this.templateConfig.toolbarAdditionalPanelButtonsTemplate) {\n\t\t\tassignIfChanged(\n\t\t\t\t'openviduAngularToolbarAdditionalPanelButtonsTemplate',\n\t\t\t\tthis.templateConfig.toolbarAdditionalPanelButtonsTemplate\n\t\t\t);\n\t\t}\n\t\tif (this.templateConfig.additionalPanelsTemplate) {\n\t\t\tassignIfChanged('openviduAngularAdditionalPanelsTemplate', this.templateConfig.additionalPanelsTemplate);\n\t\t}\n\t\tif (this.templateConfig.participantPanelAfterLocalParticipantTemplate) {\n\t\t\tassignIfChanged(\n\t\t\t\t'openviduAngularParticipantPanelAfterLocalParticipantTemplate',\n\t\t\t\tthis.templateConfig.participantPanelAfterLocalParticipantTemplate\n\t\t\t);\n\t\t}\n\t\tif (this.templateConfig.participantPanelItemElementsTemplate) {\n\t\t\tassignIfChanged(\n\t\t\t\t'openviduAngularParticipantPanelItemElementsTemplate',\n\t\t\t\tthis.templateConfig.participantPanelItemElementsTemplate\n\t\t\t);\n\t\t}\n\t\tif (this.templateConfig.preJoinTemplate) {\n\t\t\tassignIfChanged('openviduAngularPreJoinTemplate', this.templateConfig.preJoinTemplate);\n\t\t}\n\t\tif (this.templateConfig.layoutAdditionalElementsTemplate) {\n\t\t\tassignIfChanged('ovLayoutAdditionalElementsTemplate', this.templateConfig.layoutAdditionalElementsTemplate);\n\t\t}\n\t\tif (this.templateConfig.settingsPanelGeneralAdditionalElementsTemplate) {\n\t\t\tassignIfChanged('ovSettingsPanelGeneralAdditionalElementsTemplate', this.templateConfig.settingsPanelGeneralAdditionalElementsTemplate);\n\t\t}\n\t\tif (this.templateConfig.toolbarMoreOptionsAdditionalMenuItemsTemplate) {\n\t\t\tassignIfChanged('ovToolbarMoreOptionsAdditionalMenuItemsTemplate', this.templateConfig.toolbarMoreOptionsAdditionalMenuItemsTemplate);\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t * Handles the ready-to-join event, initializing the room and managing the prejoin flow.\n\t * This method coordinates the transition from prejoin state to actual room joining.\n\t */\n\t_onReadyToJoin(): void {\n\t\tthis.log.d('Ready to join - initializing room and handling prejoin flow');\n\t\ttry {\n\t\t\t// Mark that user has initiated the join process\n\t\t\tthis.updateComponentState({\n\t\t\t\tstate: VideoconferenceState.JOINING,\n\t\t\t\twasPrejoinShown: this.componentState.showPrejoin\n\t\t\t});\n\n\t\t\t// Always initialize the room when ready to join\n\t\t\tthis.openviduService.initRoom();\n\n\t\t\t// Get the most current participant name from the service\n\t\t\t// This ensures we have the latest value after any batch updates\n\t\t\tconst participantName = this.libService.getCurrentParticipantName() || this.latestParticipantName;\n\n\t\t\tif (this.componentState.isRoomReady) {\n\t\t\t\t// Room is ready, hide prejoin and proceed\n\t\t\t\tthis.log.d('Room is ready, proceeding to join');\n\t\t\t\tthis.updateComponentState({\n\t\t\t\t\tstate: VideoconferenceState.READY_TO_CONNECT,\n\t\t\t\t\tshowPrejoin: false\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Room not ready, request token if we have a participant name\n\t\t\t\tif (participantName) {\n\t\t\t\t\tthis.log.d(`Requesting token for participant: ${participantName}`);\n\t\t\t\t\tthis.onTokenRequested.emit(participantName);\n\t\t\t\t} else {\n\t\t\t\t\tthis.log.w('No participant name available when requesting token');\n\t\t\t\t\t// Wait a bit and try again in case name is still propagating\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tconst retryName = this.libService.getCurrentParticipantName() || this.latestParticipantName;\n\t\t\t\t\t\tif (retryName) {\n\t\t\t\t\t\t\tthis.log.d(`Retrying token request for participant: ${retryName}`);\n\t\t\t\t\t\t\tthis.onTokenRequested.emit(retryName);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.log.e('Still no participant name available after retry');\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 10);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Emit onReadyToJoin event only if prejoin page was actually shown\n\t\t\t// This ensures the event semantics are correct\n\t\t\tif (this.componentState.wasPrejoinShown) {\n\t\t\t\tthis.log.d('Emitting onReadyToJoin event (prejoin was shown)');\n\t\t\t\tthis.onReadyToJoin.emit();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.log.e('Error during ready to join process', error);\n\t\t\tthis.updateComponentState({\n\t\t\t\tstate: VideoconferenceState.ERROR,\n\t\t\t\terror: {\n\t\t\t\t\thasError: true,\n\t\t\t\t\tmessage: 'Error during ready to join process'\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t * @internal\n\t */\n\t_onParticipantLeft(event: ParticipantLeftEvent) {\n\t\tthis.onParticipantLeft.emit(event);\n\n\t\t// Reset to disconnected state\n\t\t// Set showPrejoin to false to prevent prejoin from showing and creating tracks\n\t\t// This avoids the race condition where tracks are created before navigation\n\t\tthis.updateComponentState({\n\t\t\tstate: VideoconferenceState.DISCONNECTED,\n\t\t\tisRoomReady: false,\n\t\t\tshowPrejoin: false\n\t\t});\n\t}\n\n\tprivate subscribeToVideconferenceDirectives() {\n\t\tthis.libService.token$.pipe(skip(1), takeUntil(this.destroy$)).subscribe((token: string) => {\n\t\t\ttry {\n\t\t\t\tif (!token) {\n\t\t\t\t\tthis.log.e('Token is empty');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst livekitUrl = this.libService.getLivekitUrl();\n\t\t\t\tthis.openviduService.initializeAndSetToken(token, livekitUrl);\n\t\t\t\tthis.log.d('Token has been successfully set. Room is ready to join');\n\n\t\t\t\tif (this.hasUserInitiatedJoin()) {\n\t\t\t\t\t// User has initiated join, proceed to hide prejoin and continue\n\t\t\t\t\tthis.log.d('User has initiated join, hiding prejoin and proceeding');\n\t\t\t\t\tthis.updateComponentState({\n\t\t\t\t\t\tstate: VideoconferenceState.READY_TO_CONNECT,\n\t\t\t\t\t\tisRoomReady: true,\n\t\t\t\t\t\tshowPrejoin: false\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Only update showPrejoin if user hasn't initiated join process yet\n\t\t\t\t\t// This prevents prejoin from showing again after user clicked join\n\t\t\t\t\tthis.updateComponentState({\n\t\t\t\t\t\tstate: VideoconferenceState.PREJOIN_SHOWN,\n\t\t\t\t\t\tisRoomReady: true,\n\t\t\t\t\t\tshowPrejoin: this.libService.showPrejoin()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.log.e('Error trying to set token', error);\n\t\t\t\tthis.updateComponentState({\n\t\t\t\t\tstate: VideoconferenceState.ERROR,\n\t\t\t\t\terror: {\n\t\t\t\t\t\thasError: true,\n\t\t\t\t\t\tmessage: 'Error setting token',\n\t\t\t\t\t\ttokenError: error\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.libService.tokenError$.pipe(takeUntil(this.destroy$)).subscribe((error: any) => {\n\t\t\tif (!error) return;\n\n\t\t\tthis.log.e('Token error received', error);\n\t\t\tthis.updateComponentState({\n\t\t\t\tstate: VideoconferenceState.ERROR,\n\t\t\t\terror: {\n\t\t\t\t\thasError: true,\n\t\t\t\t\tmessage: 'Token error',\n\t\t\t\t\ttokenError: error\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!this.componentState.showPrejoin) {\n\t\t\t\tthis.actionService.openDialog(error.name, error.message, false);\n\t\t\t}\n\t\t});\n\n\t\tthis.libService.prejoin$.pipe(takeUntil(this.destroy$)).subscribe((value: boolean) => {\n\t\t\tthis.updateComponentState({\n\t\t\t\tshowPrejoin: value\n\t\t\t});\n\n\t\t\tif (!value) {\n\t\t\t\t// Emit token ready if the prejoin page won't be shown\n\n\t\t\t\t// Ensure we have a participant name before proceeding with the join\n\t\t\t\tthis.log.d('Prejoin page is hidden, checking participant name');\n\t\t\t\t// Check if we have a participant name already\n\t\t\t\tif (this.latestParticipantName) {\n\t\t\t\t\t// We have a name, proceed immediately\n\t\t\t\t\tthis._onReadyToJoin();\n\t\t\t\t} else {\n\t\t\t\t\t// No name yet - set up a one-time subscription to wait for it\n\t\t\t\t\tthis.libService.participantName$\n\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\tfilter((name) => !!name),\n\t\t\t\t\t\t\ttake(1),\n\t\t\t\t\t\t\ttakeUntil(this.destroy$)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.subscribe(() => {\n\t\t\t\t\t\t\t// Now we have the name in latestParticipantName\n\t\t\t\t\t\t\tthis._onReadyToJoin();\n\t\t\t\t\t\t});\n\t\t\t\t\t// Add safety timeout in case name never arrives\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (!this.latestParticipantName) {\n\t\t\t\t\t\t\tthis.log.w('No participant name received after timeout, proceeding anyway');\n\t\t\t\t\t\t\tconst storedName = this.storageSrv.getParticipantName();\n\t\t\t\t\t\t\tif (storedName) {\n\t\t\t\t\t\t\t\tthis.latestParticipantName = storedName;\n\t\t\t\t\t\t\t\tthis.libService.updateGeneralConfig({ participantName: storedName });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._onReadyToJoin();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, VideoconferenceComponent.PARTICIPANT_NAME_TIMEOUT_MS);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.libService.participantName$.pipe(takeUntil(this.destroy$)).subscribe(async (name: string) => {\n\t\t\tif (name) {\n\t\t\t\tthis.latestParticipantName = await this.e2eeService.decrypt(name);\n\t\t\t\tthis.storageSrv.setParticipantName(name);\n\n\t\t\t\t// If we're waiting for a participant name to proceed with joining, do it now\n\t\t\t\tif (\n\t\t\t\t\tthis.componentState.state === VideoconferenceState.JOINING &&\n\t\t\t\t\tthis.componentState.isRoomReady &&\n\t\t\t\t\t!this.componentState.showPrejoin\n\t\t\t\t) {\n\t\t\t\t\tthis.log.d('Participant name received, proceeding to join');\n\t\t\t\t\tthis.updateComponentState({\n\t\t\t\t\t\tstate: VideoconferenceState.READY_TO_CONNECT,\n\t\t\t\t\t\tshowPrejoin: false\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","<div id=\"call-container\">\n\t<!-- Loading spinner -->\n\t@if (componentState.isLoading) {\n\t\t<div id=\"spinner\">\n\t\t\t<mat-spinner [diameter]=\"spinnerDiameter\"></mat-spinner>\n\t\t\t<span>{{ 'PREJOIN.PREPARING' | translate }}</span>\n\t\t</div>\n\t} @else if (componentState.showPrejoin) {\n\t\t<!-- Prejoin -->\n\t\t<div [@inOutAnimation] id=\"pre-join-container\">\n\t\t\t<ng-container *ngIf=\"openviduAngularPreJoinTemplate; else defaultPreJoin\">\n\t\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularPreJoinTemplate\"></ng-container>\n\t\t\t</ng-container>\n\t\t\t<ng-template #defaultPreJoin>\n\t\t\t\t<ov-pre-join\n\t\t\t\t\t[error]=\"componentState.error?.tokenError\"\n\t\t\t\t\t(onReadyToJoin)=\"_onReadyToJoin()\"\n\t\t\t\t\t(onVideoDeviceChanged)=\"onVideoDeviceChanged.emit($event)\"\n\t\t\t\t\t(onVideoEnabledChanged)=\"onVideoEnabledChanged.emit($event)\"\n\t\t\t\t\t(onAudioDeviceChanged)=\"onAudioDeviceChanged.emit($event)\"\n\t\t\t\t\t(onAudioEnabledChanged)=\"onAudioEnabledChanged.emit($event)\"\n\t\t\t\t\t(onLangChanged)=\"onLangChanged.emit($event)\"\n\t\t\t\t></ov-pre-join>\n\t\t\t</ng-template>\n\t\t</div>\n\t} @else if (componentState.error?.hasError) {\n\t\t<!-- Error -->\n\n\t\t<div id=\"spinner\">\n\t\t\t<mat-icon class=\"error-icon\">error</mat-icon>\n\t\t\t<span>{{ componentState.error?.message }}</span>\n\t\t</div>\n\t} @else if (componentState.state === 'DISCONNECTED') {\n\t\t<!-- Disconnected state -->\n\n\t\t<div id=\"spinner\">\n\t\t\t<mat-icon class=\"info-icon\">check_circle</mat-icon>\n\t\t\t<span>{{ 'ROOM.DISCONNECTED' | translate }}</span>\n\t\t\t<p class=\"subtitle\">{{ 'ROOM.DISCONNECTED_SUBTITLE' | translate }}</p>\n\t\t</div>\n\t} @else if (componentState.isRoomReady) {\n\t\t<!-- VideoConference -->\n\n\t\t<div [@inOutAnimation] id=\"vc-container\">\n\t\t\t<ov-session\n\t\t\t\t(onRoomCreated)=\"onRoomCreated.emit($event)\"\n\t\t\t\t(onRoomReconnecting)=\"onRoomDisconnected.emit()\"\n\t\t\t\t(onRoomDisconnected)=\"onRoomDisconnected.emit()\"\n\t\t\t\t(onRoomReconnected)=\"onRoomReconnected.emit()\"\n\t\t\t\t(onParticipantConnected)=\"onParticipantCreated.emit($event)\"\n\t\t\t\t(onParticipantConnected)=\"onParticipantConnected.emit($event)\"\n\t\t\t\t(onParticipantLeft)=\"_onParticipantLeft($event)\"\n\t\t\t>\n\t\t\t\t<ng-template #toolbar>\n\t\t\t\t\t<ng-container *ngIf=\"openviduAngularToolbarTemplate\">\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularToolbarTemplate\"></ng-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</ng-template>\n\n\t\t\t\t<ng-template #panel>\n\t\t\t\t\t<ng-container *ngIf=\"openviduAngularPanelTemplate\">\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularPanelTemplate\"></ng-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</ng-template>\n\n\t\t\t\t<ng-template #layout>\n\t\t\t\t\t<ng-container *ngIf=\"openviduAngularLayoutTemplate\">\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularLayoutTemplate\"></ng-container>\n\t\t\t\t\t</ng-container>\n\t\t\t\t</ng-template>\n\t\t\t</ov-session>\n\t\t</div>\n\t} @else {\n\t\t<!-- Fallback / unknown state -->\n\t\t<div id=\"unknown-state\">\n\t\t\t<mat-icon class=\"warning-icon\">help_outline</mat-icon>\n\t\t\t<span>An error occurred in the video conference</span>\n\t\t</div>\n\t}\n</div>\n\n<ng-template #defaultToolbar>\n\t<ov-toolbar\n\t\tid=\"default-toolbar\"\n\t\t(onParticipantLeft)=\"_onParticipantLeft($event)\"\n\t\t(onRoomDisconnected)=\"onRoomDisconnected.emit()\"\n\t\t(onVideoEnabledChanged)=\"onVideoEnabledChanged.emit($event)\"\n\t\t(onAudioEnabledChanged)=\"onAudioEnabledChanged.emit($event)\"\n\t\t(onScreenShareEnabledChanged)=\"onScreenShareEnabledChanged.emit($event)\"\n\t\t(onFullscreenEnabledChanged)=\"onFullscreenEnabledChanged.emit($event)\"\n\t\t(onRecordingStartRequested)=\"onRecordingStartRequested.emit($event)\"\n\t\t(onRecordingStopRequested)=\"onRecordingStopRequested.emit($event)\"\n\t\t(onBroadcastingStopRequested)=\"onBroadcastingStopRequested.emit($event)\"\n\t\t(onViewRecordingsClicked)=\"onViewRecordingsClicked.emit()\"\n\t>\n\t\t<ng-template #toolbarAdditionalButtons>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularToolbarAdditionalButtonsTemplate\"></ng-container>\n\t\t</ng-template>\n\n\t\t<ng-template #toolbarAdditionalPanelButtons>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularToolbarAdditionalPanelButtonsTemplate\"></ng-container>\n\t\t</ng-template>\n\n\t\t<ng-template #toolbarLeaveButton>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularToolbarLeaveButtonTemplate\"></ng-container>\n\t\t</ng-template>\n\n\t\t<!-- Inject additional menu items in toolbar more options -->\n\t\t<ng-container *ovToolbarMoreOptionsAdditionalMenuItems>\n\t\t\t<ng-container *ngTemplateOutlet=\"ovToolbarMoreOptionsAdditionalMenuItemsTemplate\"></ng-container>\n\t\t</ng-container>\n\t</ov-toolbar>\n</ng-template>\n\n<ng-template #defaultPanel>\n\t<ov-panel\n\t\tid=\"default-panel\"\n\t\t(onChatPanelStatusChanged)=\"onChatPanelStatusChanged.emit($event)\"\n\t\t(onParticipantsPanelStatusChanged)=\"onParticipantsPanelStatusChanged.emit($event)\"\n\t\t(onSettingsPanelStatusChanged)=\"onSettingsPanelStatusChanged.emit($event)\"\n\t\t(onActivitiesPanelStatusChanged)=\"onActivitiesPanelStatusChanged.emit($event)\"\n\t>\n\t\t<ng-template #chatPanel>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularChatPanelTemplate\"></ng-container>\n\t\t</ng-template>\n\n\t\t<ng-template #participantsPanel>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularParticipantsPanelTemplate\"></ng-container>\n\t\t</ng-template>\n\n\t\t<ng-template #backgroundEffectsPanel>\n\t\t\t<ov-background-effects-panel id=\"default-background-effects-panel\"></ov-background-effects-panel>\n\t\t</ng-template>\n\n\t\t<ng-template #settingsPanel>\n\t\t\t<ov-settings-panel\n\t\t\t\tid=\"default-settings-panel\"\n\t\t\t\t(onVideoDeviceChanged)=\"onVideoDeviceChanged.emit($event)\"\n\t\t\t\t(onVideoEnabledChanged)=\"onVideoEnabledChanged.emit($event)\"\n\t\t\t\t(onAudioDeviceChanged)=\"onAudioDeviceChanged.emit($event)\"\n\t\t\t\t(onAudioEnabledChanged)=\"onAudioEnabledChanged.emit($event)\"\n\t\t\t\t(onLangChanged)=\"onLangChanged.emit($event)\"\n\t\t\t>\n\t\t\t\t<ng-container *ovSettingsPanelGeneralAdditionalElements>\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"ovSettingsPanelGeneralAdditionalElementsTemplate\"></ng-container>\n\t\t\t\t</ng-container>\n\t\t\t</ov-settings-panel>\n\t\t</ng-template>\n\n\t\t<ng-template #activitiesPanel>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularActivitiesPanelTemplate\"></ng-container>\n\t\t</ng-template>\n\n\t\t<ng-template #additionalPanels>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularAdditionalPanelsTemplate\"></ng-container>\n\t\t</ng-template>\n\t</ov-panel>\n</ng-template>\n\n<ng-template #defaultChatPanel>\n\t<ov-chat-panel id=\"default-chat-panel\"></ov-chat-panel>\n</ng-template>\n\n<ng-template #defaultActivitiesPanel>\n\t<ov-activities-panel\n\t\tid=\"default-activities-panel\"\n\t\t(onRecordingStartRequested)=\"onRecordingStartRequested.emit($event)\"\n\t\t(onRecordingStopRequested)=\"onRecordingStopRequested.emit($event)\"\n\t\t(onRecordingDeleteRequested)=\"onRecordingDeleteRequested.emit($event)\"\n\t\t(onRecordingDownloadClicked)=\"onRecordingDownloadClicked.emit($event)\"\n\t\t(onRecordingPlayClicked)=\"onRecordingPlayClicked.emit($event)\"\n\t\t(onViewRecordingClicked)=\"onViewRecordingClicked.emit($event)\"\n\t\t(onViewRecordingsClicked)=\"onViewRecordingsClicked.emit()\"\n\t\t(onBroadcastingStartRequested)=\"onBroadcastingStartRequested.emit($event)\"\n\t\t(onBroadcastingStopRequested)=\"onBroadcastingStopRequested.emit($event)\"\n\t></ov-activities-panel>\n</ng-template>\n\n<ng-template #defaultParticipantsPanel>\n\t<ov-participants-panel id=\"default-participants-panel\">\n\t\t<ng-template #participantPanelItem let-participant>\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"openviduAngularParticipantPanelItemTemplate; context: { $implicit: participant }\"\n\t\t\t></ng-container>\n\t\t</ng-template>\n\t\t<ng-template #participantPanelAfterLocalParticipant>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularParticipantPanelAfterLocalParticipantTemplate\"></ng-container>\n\t\t</ng-template>\n\t</ov-participants-panel>\n</ng-template>\n\n<ng-template #defaultParticipantPanelItem let-participant>\n\t<ov-participant-panel-item [participant]=\"participant\" id=\"default-participant-panel-item\">\n\t\t<ng-template #participantPanelItemElements>\n\t\t\t<ng-container\n\t\t\t\t*ngTemplateOutlet=\"openviduAngularParticipantPanelItemElementsTemplate; context: { $implicit: participant }\"\n\t\t\t></ng-container>\n\t\t</ng-template>\n\t</ov-participant-panel-item>\n</ng-template>\n\n<ng-template #defaultLayout>\n\t<ov-layout id=\"default-layout\">\n\t\t<ng-template #stream let-track>\n\t\t\t<ng-container *ngTemplateOutlet=\"openviduAngularStreamTemplate; context: { $implicit: track }\"></ng-container>\n\t\t</ng-template>\n\n\t\t<ng-template #layoutAdditionalElements>\n\t\t\t<ng-container *ngTemplateOutlet=\"ovLayoutAdditionalElementsTemplate\"></ng-container>\n\t\t</ng-template>\n\t</ov-layout>\n</ng-template>\n\n<ng-template #defaultStream let-track>\n\t<ov-stream [track]=\"track\" id=\"default-stream\"></ov-stream>\n</ng-template>\n","import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from '@angular/core';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\n\n/**\n * The **recordingActivity** directive allows show/hide the recording activity in {@link ActivitiesPanelComponent}.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `activitiesPanel` component:\n *\n * @example\n * <ov-videoconference [activitiesPanelRecordingActivity]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ActivitiesPanelComponent}.\n * @example\n * <ov-activities-panel *ovActivitiesPanel [recordingActivity]=\"false\"></ov-activities-panel>\n */\n@Directive({\n\tselector: 'ov-videoconference[activitiesPanelRecordingActivity], ov-activities-panel[recordingActivity]',\n\tstandalone: false\n})\nexport class ActivitiesPanelRecordingActivityDirective implements AfterViewInit, OnDestroy {\n\t@Input() set activitiesPanelRecordingActivity(value: boolean) {\n\t\tthis.recordingActivityValue = value;\n\t\tthis.update(this.recordingActivityValue);\n\t}\n\t@Input() set recordingActivity(value: boolean) {\n\t\tthis.recordingActivityValue = value;\n\t\tthis.update(this.recordingActivityValue);\n\t}\n\n\trecordingActivityValue: boolean = true;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.recordingActivityValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tclear() {\n\t\tthis.recordingActivityValue = true;\n\t\tthis.update(true);\n\t}\n\n\tupdate(value: boolean) {\n\t\tthis.libService.updateRecordingActivityConfig({ enabled: value });\n\t}\n}\n\n/**\n * The **broadcastingActivity** directive allows show/hide the broadcasting activity in {@link ActivitiesPanelComponent}.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `activitiesPanel` component:\n *\n * @example\n * <ov-videoconference [activitiesPanelBroadcastingActivity]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ActivitiesPanelComponent}.\n * @example\n * <ov-activities-panel *ovActivitiesPanel [broadcastingActivity]=\"false\"></ov-activities-panel>\n */\n@Directive({\n\tselector: 'ov-videoconference[activitiesPanelBroadcastingActivity], ov-activities-panel[broadcastingActivity]',\n\tstandalone: false\n})\nexport class ActivitiesPanelBroadcastingActivityDirective implements AfterViewInit, OnDestroy {\n\t@Input() set activitiesPanelBroadcastingActivity(value: boolean) {\n\t\tthis.broadcastingActivityValue = value;\n\t\tthis.update(this.broadcastingActivityValue);\n\t}\n\t@Input() set broadcastingActivity(value: boolean) {\n\t\tthis.broadcastingActivityValue = value;\n\t\tthis.update(this.broadcastingActivityValue);\n\t}\n\n\tbroadcastingActivityValue: boolean = true;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.broadcastingActivityValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tclear() {\n\t\tthis.broadcastingActivityValue = true;\n\t\tthis.update(true);\n\t}\n\n\tupdate(value: boolean) {\n\t\tthis.libService.setBroadcastingActivity(value);\n\t}\n}\n","import { Directive, AfterViewInit, OnDestroy, Input, ElementRef } from '@angular/core';\nimport { RecordingInfo } from '../../models/recording.model';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\n\n/**\n * The **recordingsList** directive allows show all recordings saved in your OpenVidu deployment in {@link AdminDashboardComponent}.\n *\n * Default: `[]`\n *\n * @example\n * <ov-admin-dashboard [recordingsList]=\"recordings\"></ov-admin-dashboard>\n *\n */\n@Directive({\n\tselector: 'ov-admin-dashboard[recordingsList]',\n\tstandalone: false\n})\nexport class AdminDashboardRecordingsListDirective implements AfterViewInit, OnDestroy {\n\t@Input() set recordingsList(value: RecordingInfo[]) {\n\t\tthis.recordingsValue = value;\n\t\tthis.update(this.recordingsValue);\n\t}\n\n\trecordingsValue: RecordingInfo[] = [];\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.recordingsValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tclear() {\n\t\tthis.recordingsValue = [];\n\t\tthis.update([]);\n\t}\n\n\tupdate(value: RecordingInfo[]) {\n\t\tthis.libService.updateAdminConfig({ recordingsList: value });\n\t}\n}\n\n/**\n * The **navbarTitle** directive allows customize the title of the navbar in {@link AdminLoginComponent}.\n *\n * Default: `'OpenVidu Call Dashboard'`\n *\n * @example\n * <ov-admin-dashboard [navbarTitle]=\"'My Dashboard'\"></ov-admin-dashboard>\n *\n */\n@Directive({\n\tselector: 'ov-admin-dashboard[navbarTitle]',\n\tstandalone: false\n})\nexport class AdminDashboardTitleDirective implements AfterViewInit, OnDestroy {\n\t@Input() set navbarTitle(value: string) {\n\t\tthis.navbarTitleValue = value;\n\t\tthis.update(this.navbarTitleValue);\n\t}\n\n\tnavbarTitleValue: string = 'OpenVidu Dashboard';\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.navbarTitleValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tclear() {\n\t\tthis.navbarTitleValue = 'OpenVidu Dashboard';\n\t\tthis.update(null);\n\t}\n\n\tupdate(value: any) {\n\t\tthis.libService.updateAdminConfig({ dashboardTitle: value });\n\t}\n}\n\n/**\n * The **navbarTitle** directive allows customize the title of the navbar in {@link AdminLoginComponent}.\n *\n * Default: `'OpenVidu Call Dashboard'`\n *\n * @example\n * <ov-admin-login [navbarTitle]=\"'My login'\"></ov-admin-login>\n *\n */\n@Directive({\n\tselector: 'ov-admin-login[navbarTitle]',\n\tstandalone: false\n})\nexport class AdminLoginTitleDirective implements AfterViewInit, OnDestroy {\n\t@Input() set navbarTitle(value: any) {\n\t\tthis.navbarTitleValue = value;\n\t\tthis.update(this.navbarTitleValue);\n\t}\n\n\tnavbarTitleValue: any = null;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.navbarTitleValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tclear() {\n\t\tthis.navbarTitleValue = null;\n\t\tthis.update(null);\n\t}\n\n\tupdate(value: any) {\n\t\tthis.libService.updateAdminConfig({ loginTitle: value });\n\t}\n}\n\n/**\n * The **error** directive allows show the authentication error in {@link AdminLoginComponent}.\n *\n * Default: `null`\n *\n * @example\n * <ov-admin-login [error]=\"error\"></ov-admin-login>\n *\n */\n@Directive({\n\tselector: 'ov-admin-login[error]',\n\tstandalone: false\n})\nexport class AdminLoginErrorDirective implements AfterViewInit, OnDestroy {\n\t@Input() set error(value: any) {\n\t\tthis.errorValue = value;\n\t\tthis.update(this.errorValue);\n\t}\n\n\terrorValue: any = null;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.errorValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tclear() {\n\t\tthis.errorValue = null;\n\t\tthis.update(null);\n\t}\n\n\tupdate(value: any) {\n\t\tthis.libService.updateAdminConfig({ loginError: value });\n\t}\n}\n","import { Directive, AfterViewInit, OnDestroy, Input, ElementRef } from '@angular/core';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\n\n/**\n * The **muteButton** directive allows show/hide the muted button in participant panel item component.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `participantPanelItem` component:\n *\n * @example\n * <ov-videoconference [participantPanelItemMuteButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ParticipantPanelItemComponent}.\n * @example\n * <ov-participant-panel-item [muteButton]=\"false\"></ov-participant-panel-item>\n */\n@Directive({\n\tselector: 'ov-videoconference[participantPanelItemMuteButton], ov-participant-panel-item[muteButton]',\n\tstandalone: false\n})\nexport class ParticipantPanelItemMuteButtonDirective implements AfterViewInit, OnDestroy {\n\t@Input() set participantPanelItemMuteButton(value: boolean) {\n\t\tthis.muteValue = value;\n\t\tthis.update(this.muteValue);\n\t}\n\t@Input() set muteButton(value: boolean) {\n\t\tthis.muteValue = value;\n\t\tthis.update(this.muteValue);\n\t}\n\n\tmuteValue: boolean = true;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.muteValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tclear() {\n\t\tthis.muteValue = true;\n\t\tthis.update(true);\n\t}\n\n\tupdate(value: boolean) {\n\t\tthis.libService.updateStreamConfig({ participantItemMuteButton: value });\n\t}\n}\n","import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from '@angular/core';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\n\n/**\n * The **displayParticipantName** directive allows show/hide the participants name in stream component.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `stream` component:\n *\n * @example\n * <ov-videoconference [streamDisplayParticipantName]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link StreamComponent}.\n * @example\n * <ov-stream [displayParticipantName]=\"false\"></ov-stream>\n */\n@Directive({\n\tselector: 'ov-videoconference[streamDisplayParticipantName], ov-stream[displayParticipantName]',\n\tstandalone: false\n})\nexport class StreamDisplayParticipantNameDirective implements AfterViewInit, OnDestroy {\n\t@Input() set streamDisplayParticipantName(value: boolean) {\n\t\tthis.displayParticipantNameValue = value;\n\t\tthis.update(this.displayParticipantNameValue);\n\t}\n\t@Input() set displayParticipantName(value: boolean) {\n\t\tthis.displayParticipantNameValue = value;\n\t\tthis.update(this.displayParticipantNameValue);\n\t}\n\n\tdisplayParticipantNameValue: boolean;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.displayParticipantNameValue);\n\t}\n\n\tupdate(value: boolean) {\n\t\tthis.libService.updateStreamConfig({ displayParticipantName: value });\n\t}\n\n\tclear() {\n\t\tthis.update(true);\n\t}\n}\n\n/**\n * The **displayAudioDetection** directive allows show/hide the participants audio detection in stream component.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `stream` component:\n *\n * @example\n * <ov-videoconference [streamDisplayAudioDetection]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link StreamComponent}.\n * @example\n * <ov-stream [displayAudioDetection]=\"false\"></ov-stream>\n */\n@Directive({\n\tselector: 'ov-videoconference[streamDisplayAudioDetection], ov-stream[displayAudioDetection]',\n\tstandalone: false\n})\nexport class StreamDisplayAudioDetectionDirective implements AfterViewInit, OnDestroy {\n\t@Input() set streamDisplayAudioDetection(value: boolean) {\n\t\tthis.displayAudioDetectionValue = value;\n\t\tthis.update(this.displayAudioDetectionValue);\n\t}\n\t@Input() set displayAudioDetection(value: boolean) {\n\t\tthis.displayAudioDetectionValue = value;\n\t\tthis.update(this.displayAudioDetectionValue);\n\t}\n\n\tdisplayAudioDetectionValue: boolean;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.displayAudioDetectionValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tupdate(value: boolean) {\n\t\tthis.libService.updateStreamConfig({ displayAudioDetection: value });\n\t}\n\tclear() {\n\t\tthis.update(true);\n\t}\n}\n\n/**\n * The **videoControls** directive allows show/hide the participants video controls in stream component.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `stream` component:\n *\n * @example\n * <ov-videoconference [streamVideoControls]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link StreamComponent}.\n * @example\n * <ov-stream [videoControls]=\"false\"></ov-stream>\n */\n@Directive({\n\tselector: 'ov-videoconference[streamVideoControls], ov-stream[videoControls]',\n\tstandalone: false\n})\nexport class StreamVideoControlsDirective implements AfterViewInit, OnDestroy {\n\t@Input() set streamVideoControls(value: boolean) {\n\t\tthis.videoControlsValue = value;\n\t\tthis.update(this.videoControlsValue);\n\t}\n\t@Input() set videoControls(value: boolean) {\n\t\tthis.videoControlsValue = value;\n\t\tthis.update(this.videoControlsValue);\n\t}\n\n\tvideoControlsValue: boolean;\n\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.videoControlsValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tupdate(value: boolean) {\n\t\tthis.libService.updateStreamConfig({ videoControls: value });\n\t}\n\n\tclear() {\n\t\tthis.update(true);\n\t}\n}\n","import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from '@angular/core';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { ToolbarAdditionalButtonsPosition } from '../../models/toolbar.model';\n\n/**\n * The **cameraButton** directive allows show/hide the camera toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarCameraButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [cameraButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarCameraButton], ov-toolbar[cameraButton]',\n\tstandalone: false\n})\nexport class ToolbarCameraButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarCameraButton(value: boolean) {\n\t\tthis.cameraValue = value;\n\t\tthis.update(this.cameraValue);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@Input() set cameraButton(value: boolean) {\n\t\tthis.cameraValue = value;\n\t\tthis.update(this.cameraValue);\n\t}\n\n\tprivate cameraValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.cameraValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis.cameraValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ camera: value });\n\t}\n}\n\n/**\n * The **microphoneButton** directive allows show/hide the microphone toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarMicrophoneButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [microphoneButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarMicrophoneButton], ov-toolbar[microphoneButton]',\n\tstandalone: false\n})\nexport class ToolbarMicrophoneButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarMicrophoneButton(value: boolean) {\n\t\tthis.microphoneValue = value;\n\t\tthis.update(this.microphoneValue);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@Input() set microphoneButton(value: boolean) {\n\t\tthis.microphoneValue = value;\n\t\tthis.update(this.microphoneValue);\n\t}\n\n\tprivate microphoneValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.microphoneValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis.microphoneValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ microphone: value });\n\t}\n}\n\n/**\n * The **screenshareButton** directive allows show/hide the screenshare toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarScreenshareButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [screenshareButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarScreenshareButton], ov-toolbar[screenshareButton]',\n\tstandalone: false\n})\nexport class ToolbarScreenshareButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarScreenshareButton(value: boolean) {\n\t\tthis.screenshareValue = value;\n\t\tthis.update(this.screenshareValue);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@Input() set screenshareButton(value: boolean) {\n\t\tthis.screenshareValue = value;\n\t\tthis.update(this.screenshareValue);\n\t}\n\n\tprivate screenshareValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.screenshareValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\tprivate clear() {\n\t\tthis.screenshareValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ screenshare: value });\n\t}\n}\n\n/**\n * The **recordingButton** directive allows show/hide the start/stop recording toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarRecordingButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [recordingButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarRecordingButton], ov-toolbar[recordingButton]',\n\tstandalone: false\n})\nexport class ToolbarRecordingButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarRecordingButton(value: boolean) {\n\t\tthis.recordingValue = value;\n\t\tthis.update(this.recordingValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set recordingButton(value: boolean) {\n\t\tthis.recordingValue = value;\n\t\tthis.update(this.recordingValue);\n\t}\n\tprivate recordingValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.recordingValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.recordingValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ recording: value });\n\t}\n}\n\n/**\n * The **broadcastingButton** directive allows show/hide the start/stop broadcasting toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarBroadcastingButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [broadcastingButton]=\"false\"></ov-toolbar>\n *\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarBroadcastingButton], ov-toolbar[broadcastingButton]',\n\tstandalone: false\n})\nexport class ToolbarBroadcastingButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarBroadcastingButton(value: boolean) {\n\t\tthis.broadcastingValue = value;\n\t\tthis.update(this.broadcastingValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set broadcastingButton(value: boolean) {\n\t\tthis.broadcastingValue = value;\n\t\tthis.update(this.broadcastingValue);\n\t}\n\tprivate broadcastingValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.broadcastingValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.broadcastingValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.setBroadcastingButton(value);\n\t}\n}\n\n/**\n * The **fullscreenButton** directive allows show/hide the fullscreen toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarFullscreenButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [fullscreenButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarFullscreenButton], ov-toolbar[fullscreenButton]',\n\tstandalone: false\n})\nexport class ToolbarFullscreenButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarFullscreenButton(value: boolean) {\n\t\tthis.fullscreenValue = value;\n\t\tthis.update(this.fullscreenValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set fullscreenButton(value: boolean) {\n\t\tthis.fullscreenValue = value;\n\t\tthis.update(this.fullscreenValue);\n\t}\n\n\tprivate fullscreenValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.fullscreenValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.fullscreenValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ fullscreen: value });\n\t}\n}\n\n/**\n * The **backgroundEffectsButton** directive allows show/hide the background effects toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarBackgroundEffectsButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [backgroundEffectsButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarBackgroundEffectsButton], ov-toolbar[backgroundEffectsButton]',\n\tstandalone: false\n})\nexport class ToolbarBackgroundEffectsButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarBackgroundEffectsButton(value: boolean) {\n\t\tthis.backgroundEffectsValue = value;\n\t\tthis.update(this.backgroundEffectsValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set backgroundEffectsButton(value: boolean) {\n\t\tthis.backgroundEffectsValue = value;\n\t\tthis.update(this.backgroundEffectsValue);\n\t}\n\n\tprivate backgroundEffectsValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.backgroundEffectsValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.backgroundEffectsValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ backgroundEffects: value });\n\t}\n}\n\n/**\n * The **captionsButton** directive allows show/hide the captions toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarCaptionsButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [captionsButton]=\"false\"></ov-toolbar>\n */\n//  @Directive({\n// \tselector: 'ov-videoconference[toolbarCaptionsButton], ov-toolbar[captionsButton]'\n// })\n// export class ToolbarCaptionsButtonDirective implements AfterViewInit, OnDestroy {\n// \t/**\n// \t * @ignore\n// \t */\n// \t@Input() set toolbarCaptionsButton(value: boolean) {\n// \t\tthis.captionsButtonValue = value;\n// \t\tthis.update(this.captionsButtonValue);\n// \t}\n// \t/**\n// \t * @ignore\n// \t */\n// \t@Input() set captionsButton(value: boolean) {\n// \t\tthis.captionsButtonValue = value;\n// \t\tthis.update(this.captionsButtonValue);\n// \t}\n\n// \tprivate captionsButtonValue: boolean = true;\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tconstructor(public elementRef: ElementRef, private libService: OpenViduAngularConfigService) {}\n\n// \tngAfterViewInit() {\n// \t\tthis.update(this.captionsButtonValue);\n// \t}\n// \tngOnDestroy(): void {\n// \t\tthis.clear();\n// \t}\n// \tprivate clear() {\n// \t\tthis.captionsButtonValue = true;\n// \t\tthis.update(true);\n// \t}\n\n// \tprivate update(value: boolean) {\n// \t\tif (this.libService.captionsButton.getValue() !== value) {\n// \t\t\tthis.libService.captionsButton.next(value);\n// \t\t}\n// \t}\n// }\n\n/**\n * The **settingsButton** directive allows show/hide the settings toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarSettingsButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [settingsButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarSettingsButton], ov-toolbar[settingsButton]',\n\tstandalone: false\n})\nexport class ToolbarSettingsButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarSettingsButton(value: boolean) {\n\t\tthis.settingsValue = value;\n\t\tthis.update(this.settingsValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set settingsButton(value: boolean) {\n\t\tthis.settingsValue = value;\n\t\tthis.update(this.settingsValue);\n\t}\n\n\tprivate settingsValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.settingsValue);\n\t}\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.settingsValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ settings: value });\n\t}\n}\n\n/**\n * The **leaveButton** directive allows show/hide the leave toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarLeaveButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [leaveButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarLeaveButton], ov-toolbar[leaveButton]',\n\tstandalone: false\n})\nexport class ToolbarLeaveButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarLeaveButton(value: boolean) {\n\t\tthis.leaveValue = value;\n\t\tthis.update(this.leaveValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set leaveButton(value: boolean) {\n\t\tthis.leaveValue = value;\n\t\tthis.update(this.leaveValue);\n\t}\n\n\tprivate leaveValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.leaveValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.leaveValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ leave: value });\n\t}\n}\n\n/**\n * The **participantsPanelButton** directive allows show/hide the participants panel toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarParticipantsPanelButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [participantsPanelButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarParticipantsPanelButton], ov-toolbar[participantsPanelButton]',\n\tstandalone: false\n})\nexport class ToolbarParticipantsPanelButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarParticipantsPanelButton(value: boolean) {\n\t\tthis.participantsPanelValue = value;\n\t\tthis.update(this.participantsPanelValue);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\t@Input() set participantsPanelButton(value: boolean) {\n\t\tthis.participantsPanelValue = value;\n\t\tthis.update(this.participantsPanelValue);\n\t}\n\n\tprivate participantsPanelValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.participantsPanelValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.participantsPanelValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ participantsPanel: value });\n\t}\n}\n\n/**\n * The **chatPanelButton** directive allows show/hide the chat panel toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarChatPanelButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [chatPanelButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarChatPanelButton], ov-toolbar[chatPanelButton]',\n\tstandalone: false\n})\nexport class ToolbarChatPanelButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarChatPanelButton(value: boolean) {\n\t\tthis.toolbarChatPanelValue = value;\n\t\tthis.update(this.toolbarChatPanelValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set chatPanelButton(value: boolean) {\n\t\tthis.toolbarChatPanelValue = value;\n\t\tthis.update(this.toolbarChatPanelValue);\n\t}\n\tprivate toolbarChatPanelValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.toolbarChatPanelValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.toolbarChatPanelValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ chatPanel: value });\n\t}\n}\n\n/**\n * The **activitiesPanelButton** directive allows show/hide the activities panel toolbar button.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarActivitiesPanelButton]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [activitiesPanelButton]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarActivitiesPanelButton], ov-toolbar[activitiesPanelButton]',\n\tstandalone: false\n})\nexport class ToolbarActivitiesPanelButtonDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarActivitiesPanelButton(value: boolean) {\n\t\tthis.toolbarActivitiesPanelValue = value;\n\t\tthis.update(this.toolbarActivitiesPanelValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set activitiesPanelButton(value: boolean) {\n\t\tthis.toolbarActivitiesPanelValue = value;\n\t\tthis.update(this.toolbarActivitiesPanelValue);\n\t}\n\tprivate toolbarActivitiesPanelValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.toolbarActivitiesPanelValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.toolbarActivitiesPanelValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ activitiesPanel: value });\n\t}\n}\n\n/**\n * The **displayRoomName** directive allows show/hide the room name.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarDisplayRoomName]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [displayRoomName]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarDisplayRoomName], ov-toolbar[displayRoomName]',\n\tstandalone: false\n})\nexport class ToolbarDisplayRoomNameDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarDisplayRoomName(value: boolean) {\n\t\tthis.displayRoomValue = value;\n\t\tthis.update(this.displayRoomValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set displayRoomName(value: boolean) {\n\t\tthis.displayRoomValue = value;\n\t\tthis.update(this.displayRoomValue);\n\t}\n\n\tprivate displayRoomValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.displayRoomValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.displayRoomValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ displayRoomName: value });\n\t}\n}\n\n/**\n * The **displayLogo** directive allows show/hide the branding logo.\n *\n * Default: `true`\n *\n * It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `toolbar` component:\n *\n * @example\n * <ov-videoconference [toolbarDisplayLogo]=\"false\"></ov-videoconference>\n *\n * \\\n * And it also can be used in the {@link ToolbarComponent}.\n * @example\n * <ov-toolbar [displayLogo]=\"false\"></ov-toolbar>\n */\n@Directive({\n\tselector: 'ov-videoconference[toolbarDisplayLogo], ov-toolbar[displayLogo]',\n\tstandalone: false\n})\nexport class ToolbarDisplayLogoDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set toolbarDisplayLogo(value: boolean) {\n\t\tthis.displayLogoValue = value;\n\t\tthis.update(this.displayLogoValue);\n\t}\n\t/**\n\t * @ignore\n\t */\n\t@Input() set displayLogo(value: boolean) {\n\t\tthis.displayLogoValue = value;\n\t\tthis.update(this.displayLogoValue);\n\t}\n\n\tprivate displayLogoValue: boolean = true;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.displayLogoValue);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.displayLogoValue = true;\n\t\tthis.update(true);\n\t}\n\n\tprivate update(value: boolean) {\n\t\tthis.libService.updateToolbarConfig({ displayLogo: value });\n\t}\n}\n\n/**\n * The **ovToolbarAdditionalButtonsPosition** defines the position where the additional buttons should be inserted.\n *\n * The possible values are: {@link ToolbarAdditionalButtonsPosition}\n * Default: `afterMenu`\n *\n * It can be used in the any element which contains the  structural directive {@link ToolbarAdditionalButtonsDirective}.\n *\n * @example\n * <div *ovToolbarAdditionalButtons [ovToolbarAdditionalButtonsPosition]=\"'beforeMenu'\"></div>\n *\n */\n@Directive({\n\tselector: '[ovToolbarAdditionalButtonsPosition]',\n\tstandalone: false\n})\nexport class ToolbarAdditionalButtonsPossitionDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set ovToolbarAdditionalButtonsPosition(value: ToolbarAdditionalButtonsPosition) {\n\t\tif (!value) return;\n\t\tif (!Object.values(ToolbarAdditionalButtonsPosition).includes(value)) return;\n\n\t\tthis.additionalButtonsPosition = value;\n\t\tthis.update(this.additionalButtonsPosition);\n\t}\n\n\tprivate additionalButtonsPosition: ToolbarAdditionalButtonsPosition = ToolbarAdditionalButtonsPosition.AFTER_MENU;\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\tngAfterViewInit() {\n\t\tthis.update(this.additionalButtonsPosition);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\tprivate clear() {\n\t\tthis.additionalButtonsPosition = ToolbarAdditionalButtonsPosition.AFTER_MENU;\n\t\tthis.update(ToolbarAdditionalButtonsPosition.AFTER_MENU);\n\t}\n\n\tprivate update(value: ToolbarAdditionalButtonsPosition) {\n\t\tthis.libService.updateToolbarConfig({ additionalButtonsPosition: value });\n\t}\n}\n","import { AfterViewInit, Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\nimport { CaptionsLangOption } from '../../models/caption.model';\n// import { CaptionService } from '../../services/caption/caption.service';\nimport { OpenViduComponentsConfigService } from '../../services/config/directive-config.service';\nimport { TranslateService } from '../../services/translate/translate.service';\nimport { AvailableLangs, LangOption } from '../../models/lang.model';\nimport { StorageService } from '../../services/storage/storage.service';\n\n/**\n * The **livekitUrl** directive sets the livekitUrl to grant a participant access to a Room.\n * This Livekit Url will be use by each participant when connecting to a Room.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n *  Default: `\"\"`\n *\n * @example\n * <ov-videoconference [livekitUrl]=\"http://localhost:1234\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[livekitUrl]',\n\tstandalone: false\n})\nexport class LivekitUrlDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set livekitUrl(value: string) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update('');\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: string) {\n\t\tthis.libService.updateGeneralConfig({ livekitUrl: value });\n\t}\n}\n\n/**\n * The **token** directive sets the token to grant a participant access to a Room.\n * This OpenVidu token will be use by each participant when connecting to a Room.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n *  Default: `\"\"`\n *\n * @example\n * <ov-videoconference [token]=\"token\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[token]',\n\tstandalone: false\n})\nexport class TokenDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set token(value: string) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update('');\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: string) {\n\t\tthis.libService.updateGeneralConfig({ token: value });\n\t}\n}\n\n/**\n * The **tokenError** directive allows to display an error message in case of issues during token request.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n *  Default: `undefined`\n *\n * @example\n * <ov-videoconference [tokenError]=\"error\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[tokenError]',\n\tstandalone: false\n})\nexport class TokenErrorDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set tokenError(value: any) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(undefined);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: any) {\n\t\tthis.libService.updateGeneralConfig({ tokenError: value });\n\t}\n}\n\n/**\n * The **minimal** directive applies a minimal UI hiding all controls except for cam and mic.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: `false`\n *\n * @example\n * <ov-videoconference [minimal]=\"true\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[minimal]',\n\tstandalone: false\n})\nexport class MinimalDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set minimal(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(false);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: boolean) {\n\t\tthis.libService.updateGeneralConfig({ minimal: value });\n\t}\n}\n\n/**\n * The **lang** directive allows set the UI language to a default language.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * **Default:** English `en`\n *\n * **Available Langs:**\n *\n * * English: `en`\n * * Spanish: `es`\n * * German: `de`\n * * French: `fr`\n * * Chinese: `cn`\n * * Hindi: `hi`\n * * Italian: `it`\n * * Japanese: `ja`\n * * Netherlands: `nl`\n * * Portuguese: `pt`\n *\n * @example\n * <ov-videoconference [lang]=\"'es'\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[lang]',\n\tstandalone: false\n})\nexport class LangDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set lang(value: AvailableLangs) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate translateService: TranslateService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update('en');\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: AvailableLangs) {\n\t\tthis.translateService.setCurrentLanguage(value);\n\t}\n}\n\n/**\n * The **langOptions** directive allows to set the application language options.\n * It will override the application languages provided by default.\n * This propety is an array of objects which must comply with the {@link LangOption} interface.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: ```\n * [\n * \t{ name: 'English', lang: 'en' },\n *  { name: 'Español', lang: 'es' },\n *  { name: 'Deutsch', lang: 'de' },\n *  { name: 'Français', lang: 'fr' },\n *  { name: '中国', lang: 'cn' },\n *  { name: 'हिन्दी', lang: 'hi' },\n *  { name: 'Italiano', lang: 'it' },\n *  { name: 'やまと', lang: 'ja' },\n *  { name: 'Dutch', lang: 'nl' },\n *  { name: 'Português', lang: 'pt' }\n * ]```\n *\n * Note: If you want to add a new language, you must add a new object with the name and the language code (e.g. `{ name: 'Custom', lang: 'cus' }`)\n * and then add the language file in the `assets/lang` folder with the name `cus.json`.\n *\n *\n * @example\n * <ov-videoconference [langOptions]=\"[{name:'Spanish', lang: 'es'}]\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[langOptions]',\n\tstandalone: false\n})\nexport class LangOptionsDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set langOptions(value: LangOption[]) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate translateService: TranslateService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(undefined);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: LangOption[] | undefined) {\n\t\tthis.translateService.updateLanguageOptions(value);\n\t}\n}\n\n/**\n * The **captionsLang** directive allows specify the deafult language that OpenVidu will try to recognise.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * It must be a valid [BCP-47](https://tools.ietf.org/html/bcp47) language tag like \"en-US\" or \"es-ES\".\n *\n *\n * **Default:** English `en-US`\n *\n * **Available:**\n *\n * * English: `en-US`\n * * Spanish: `es-ES`\n * * German: `de-DE`\n * * French: `fr-FR`\n * * Chinese: `zh-CN`\n * * Hindi: `hi-IN`\n * * Italian: `it-IT`\n * * Japanese: `jp-JP`\n * * Portuguese: `pt-PT`\n *\n * @example\n * <ov-videoconference [captionsLang]=\"'es-ES'\"></ov-videoconference>\n * TODO: Uncomment when captions are implemented\n */\n// @Directive({\n// \tselector: 'ov-videoconference[captionsLang]'\n// })\n// export class CaptionsLangDirective implements OnDestroy {\n// \t/**\n// \t * @ignore\n// \t */\n// \t@Input() set captionsLang(value: string) {\n// \t\tthis.update(value);\n// \t}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tconstructor(\n// \t\tpublic elementRef: ElementRef,\n// \t\tprivate captionService: CaptionService\n// \t) {}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tngOnDestroy(): void {\n// \t\tthis.clear();\n// \t}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tclear() {\n// \t\tthis.update('en-US');\n// \t}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tupdate(value: string) {\n// \t\tthis.captionService.setLanguage(value);\n// \t}\n// }\n\n/**\n * The **captionsLangOptions** directive allows to set the language options for the captions.\n * It will override the languages provided by default.\n * This propety is an array of objects which must comply with the {@link CaptionsLangOption} interface.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: ```\n * [\n * \t{ name: 'English', lang: 'en-US' },\n * \t{ name: 'Español', lang: 'es-ES' },\n * \t{ name: 'Deutsch', lang: 'de-DE' },\n * \t{ name: 'Français', lang: 'fr-FR' },\n * \t{ name: '中国', lang: 'zh-CN' },\n * \t{ name: 'हिन्दी', lang: 'hi-IN' },\n * \t{ name: 'Italiano', lang: 'it-IT' },\n * \t{ name: '日本語', lang: 'jp-JP' },\n * \t{ name: 'Português', lang: 'pt-PT' }\n * ]```\n *\n * @example\n * <ov-videoconference [captionsLangOptions]=\"[{name:'Spanish', lang: 'es-ES'}]\"></ov-videoconference>\n * TODO: Uncomment when captions are implemented\n */\n// @Directive({\n// \tselector: 'ov-videoconference[captionsLangOptions]'\n// })\n// export class CaptionsLangOptionsDirective implements OnDestroy {\n// \t/**\n// \t * @ignore\n// \t */\n// \t@Input() set captionsLangOptions(value: CaptionsLangOption[]) {\n// \t\tthis.update(value);\n// \t}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tconstructor(\n// \t\tpublic elementRef: ElementRef,\n// \t\tprivate captionService: CaptionService\n// \t) {}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tngOnDestroy(): void {\n// \t\tthis.clear();\n// \t}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tclear() {\n// \t\tthis.update(undefined);\n// \t}\n\n// \t/**\n// \t * @ignore\n// \t */\n// \tupdate(value: CaptionsLangOption[] | undefined) {\n// \t\tthis.captionService.setLanguageOptions(value);\n// \t}\n// }\n\n/**\n * The **participantName** directive sets the participant name. It can be useful for aplications which doesn't need the prejoin page.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * @example\n * <ov-videoconference [participantName]=\"'OpenVidu'\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[participantName]',\n\tstandalone: false\n})\nexport class ParticipantNameDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set participantName(name: string) {\n\t\tthis.update(name);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngAfterViewInit(): void {\n\t\tthis.update(this.participantName);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update('');\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(participantName: string) {\n\t\tif (participantName) {\n\t\t\tthis.libService.updateGeneralConfig({ participantName });\n\t\t}\n\t}\n}\n\n/**\n * The **prejoin** directive allows show/hide the prejoin page for selecting media devices.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: `true`\n *\n * @example\n * <ov-videoconference [prejoin]=\"false\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[prejoin]',\n\tstandalone: false\n})\nexport class PrejoinDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set prejoin(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(true);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: boolean) {\n\t\tthis.libService.updateGeneralConfig({ prejoin: value });\n\t}\n}\n\n/**\n * The **videoEnabled** directive allows to join the room with camera enabled or disabled.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: `true`\n *\n *\n * @example\n * <ov-videoconference [videoEnabled]=\"false\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[videoEnabled]',\n\tstandalone: false\n})\nexport class VideoEnabledDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set videoEnabled(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate storageService: StorageService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(true);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(enabled: boolean) {\n\t\tconst storageIsEnabled = this.storageService.isCameraEnabled();\n\n\t\t// Determine the final enabled state of the camera\n\t\tlet finalEnabledState: boolean;\n\t\tif (enabled) {\n\t\t\t// If enabled is true, respect the storage value if it's false\n\t\t\tfinalEnabledState = storageIsEnabled !== false;\n\t\t} else {\n\t\t\t// If enabled is false, disable the camera\n\t\t\tfinalEnabledState = false;\n\t\t}\n\n\t\t// Update the storage with the final state\n\t\tthis.storageService.setCameraEnabled(finalEnabledState);\n\n\t\t// Ensure libService state is consistent with the final enabled state\n\t\tif (this.libService.isVideoEnabled() !== finalEnabledState) {\n\t\t\tthis.libService.updateStreamConfig({ videoEnabled: finalEnabledState });\n\t\t}\n\t}\n}\n\n/**\n * The **audioEnabled** directive allows to join the room with microphone enabled or disabled.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: `true`\n *\n * @example\n * <ov-videoconference [audioEnabled]=\"false\"></ov-videoconference>\n */\n\n@Directive({\n\tselector: 'ov-videoconference[audioEnabled]',\n\tstandalone: false\n})\nexport class AudioEnabledDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set audioEnabled(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService,\n\t\tprivate storageService: StorageService\n\t) {}\n\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(true);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(enabled: boolean) {\n\t\tconst storageIsEnabled = this.storageService.isMicrophoneEnabled();\n\n\t\t// Determine the final enabled state of the microphone\n\t\tlet finalEnabledState: boolean;\n\t\tif (enabled) {\n\t\t\t// If enabled is true, respect the storage value if it's false\n\t\t\tfinalEnabledState = storageIsEnabled !== false;\n\t\t} else {\n\t\t\t// If enabled is false, disable the camera\n\t\t\tfinalEnabledState = false;\n\t\t}\n\n\t\t// Update the storage with the final state\n\t\tthis.storageService.setMicrophoneEnabled(finalEnabledState);\n\n\t\tif (this.libService.isAudioEnabled() !== enabled) {\n\t\t\tthis.libService.updateStreamConfig({ audioEnabled: enabled });\n\t\t}\n\t}\n}\n\n/**\n * The **showDisconnectionDialog** directive allows to show/hide the disconnection dialog when the local participant is disconnected from the room.\n *\n * It is only available for {@link VideoconferenceComponent}.\n *\n * Default: `true`\n *\n * @example\n * <ov-videoconference [showDisconnectionDialog]=\"false\"></ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[showDisconnectionDialog]',\n\tstandalone: false\n})\nexport class ShowDisconnectionDialogDirective implements OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set showDisconnectionDialog(value: boolean) {\n\t\tthis.update(value);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tpublic elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update(true);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: boolean) {\n\t\tif (this.libService.getShowDisconnectionDialog() !== value) {\n\t\t\tthis.libService.updateGeneralConfig({ showDisconnectionDialog: value });\n\t\t}\n\t}\n}\n\n/**\n * The **recordingStreamBaseUrl** directive sets the base URL for retrieving recording streams.\n * The complete request URL is dynamically constructed by concatenating the supplied URL, the\n * internally managed recordingId, and the `/media` segment.\n *\n * The final URL format will be:\n *\n *    {recordingStreamBaseUrl}/{recordingId}/media\n *\n * Default: `\"call/api/recordings/{recordingId}/stream\"`\n *\n * Example:\n * Given a recordingStreamBaseUrl of `api/recordings`, the resulting URL for a recordingId of `12345` would be:\n *   `api/recordings/12345/media`\n *\n * It is essential that the resulting route is declared and configured on your backend, as it is\n * used for serving and accessing the recording streams.\n *\n * @example\n * <ov-videoconference [recordingStreamBaseUrl]=\"'https://myserver.com/api/recordings'\">\n * </ov-videoconference>\n */\n@Directive({\n\tselector: 'ov-videoconference[recordingStreamBaseUrl]',\n\tstandalone: false\n})\nexport class RecordingStreamBaseUrlDirective implements AfterViewInit, OnDestroy {\n\t/**\n\t * @ignore\n\t */\n\t@Input() set recordingStreamBaseUrl(url: string) {\n\t\tthis.update(url);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tconstructor(\n\t\tprivate elementRef: ElementRef,\n\t\tprivate libService: OpenViduComponentsConfigService\n\t) {}\n\n\t/**\n\t * @ignore\n\t */\n\tngAfterViewInit(): void {\n\t\tthis.update(this.recordingStreamBaseUrl);\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tngOnDestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tclear() {\n\t\tthis.update('');\n\t}\n\n\t/**\n\t * @ignore\n\t */\n\tupdate(value: string) {\n\t\tif (value) this.libService.updateGeneralConfig({ recordingStreamBaseUrl: value });\n\t}\n}\n","import { NgModule } from '@angular/core';\nimport { ActivitiesPanelBroadcastingActivityDirective, ActivitiesPanelRecordingActivityDirective } from './activities-panel.directive';\nimport {\n\tAdminDashboardRecordingsListDirective,\n\tAdminDashboardTitleDirective,\n\tAdminLoginErrorDirective,\n\tAdminLoginTitleDirective\n} from './admin.directive';\nimport {\n\tFallbackLogoDirective,\n\tLayoutRemoteParticipantsDirective,\n\tPrejoinDisplayParticipantName,\n\tToolbarBrandingLogoDirective,\n\tToolbarViewRecordingsButtonDirective,\n\tRecordingActivityReadOnlyDirective,\n\tRecordingActivityShowControlsDirective,\n\tStartStopRecordingButtonsDirective,\n\tRecordingActivityViewRecordingsButtonDirective,\n\tRecordingActivityShowRecordingsListDirective,\n\tToolbarRoomNameDirective,\n\tShowThemeSelectorDirective,\n\tE2EEKeyDirective\n} from './internals.directive';\nimport { ParticipantPanelItemMuteButtonDirective } from './participant-panel-item.directive';\nimport {\n\tStreamDisplayAudioDetectionDirective,\n\tStreamDisplayParticipantNameDirective,\n\tStreamVideoControlsDirective\n} from './stream.directive';\nimport {\n\tToolbarActivitiesPanelButtonDirective,\n\tToolbarAdditionalButtonsPossitionDirective,\n\tToolbarBackgroundEffectsButtonDirective,\n\tToolbarBroadcastingButtonDirective,\n\tToolbarCameraButtonDirective,\n\t// ToolbarCaptionsButtonDirective,\n\tToolbarChatPanelButtonDirective,\n\tToolbarDisplayLogoDirective,\n\tToolbarDisplayRoomNameDirective,\n\tToolbarFullscreenButtonDirective,\n\tToolbarLeaveButtonDirective,\n\tToolbarMicrophoneButtonDirective,\n\tToolbarParticipantsPanelButtonDirective,\n\tToolbarRecordingButtonDirective,\n\tToolbarScreenshareButtonDirective,\n\tToolbarSettingsButtonDirective\n} from './toolbar.directive';\nimport {\n\tAudioEnabledDirective,\n\t// CaptionsLangDirective,\n\t// CaptionsLangOptionsDirective,\n\tLangDirective,\n\tLangOptionsDirective,\n\tLivekitUrlDirective,\n\tMinimalDirective,\n\tParticipantNameDirective,\n\tPrejoinDirective,\n\tRecordingStreamBaseUrlDirective,\n\tShowDisconnectionDialogDirective,\n\tTokenDirective,\n\tTokenErrorDirective,\n\tVideoEnabledDirective\n} from './videoconference.directive';\n\nconst directives = [\n\tLivekitUrlDirective,\n\tTokenDirective,\n\tTokenErrorDirective,\n\tMinimalDirective,\n\tLangDirective,\n\tLangOptionsDirective,\n\t// CaptionsLangOptionsDirective,\n\t// CaptionsLangDirective,\n\tPrejoinDirective,\n\tPrejoinDisplayParticipantName,\n\tVideoEnabledDirective,\n\tRecordingActivityReadOnlyDirective,\n\tRecordingActivityShowControlsDirective,\n\tAudioEnabledDirective,\n\tShowDisconnectionDialogDirective,\n\tRecordingStreamBaseUrlDirective,\n\tToolbarCameraButtonDirective,\n\tToolbarMicrophoneButtonDirective,\n\tToolbarScreenshareButtonDirective,\n\tToolbarFullscreenButtonDirective,\n\tToolbarBackgroundEffectsButtonDirective,\n\t// ToolbarCaptionsButtonDirective,\n\tToolbarLeaveButtonDirective,\n\tToolbarRecordingButtonDirective,\n\tToolbarBroadcastingButtonDirective,\n\tToolbarParticipantsPanelButtonDirective,\n\tToolbarChatPanelButtonDirective,\n\tToolbarActivitiesPanelButtonDirective,\n\tToolbarDisplayRoomNameDirective,\n\tToolbarDisplayLogoDirective,\n\tToolbarSettingsButtonDirective,\n\tToolbarAdditionalButtonsPossitionDirective,\n\tToolbarViewRecordingsButtonDirective,\n\tStreamDisplayParticipantNameDirective,\n\tStreamDisplayAudioDetectionDirective,\n\tStreamVideoControlsDirective,\n\tFallbackLogoDirective,\n\tToolbarBrandingLogoDirective,\n\tParticipantPanelItemMuteButtonDirective,\n\tParticipantNameDirective,\n\tActivitiesPanelRecordingActivityDirective,\n\tActivitiesPanelBroadcastingActivityDirective,\n\tAdminDashboardRecordingsListDirective,\n\tAdminLoginTitleDirective,\n\tAdminLoginErrorDirective,\n\tAdminDashboardTitleDirective,\n\tLayoutRemoteParticipantsDirective,\n\tStartStopRecordingButtonsDirective,\n\tRecordingActivityViewRecordingsButtonDirective,\n\tRecordingActivityShowRecordingsListDirective,\n\tToolbarRoomNameDirective,\n\tShowThemeSelectorDirective,\n\tE2EEKeyDirective\n];\n\n@NgModule({\n\tdeclarations: [...directives],\n\texports: [...directives]\n})\nexport class ApiDirectiveModule {}\n","import { NgModule } from '@angular/core';\nimport {\n\tChatPanelDirective,\n\tLayoutDirective,\n\tPanelDirective,\n\tParticipantPanelItemElementsDirective,\n\tParticipantPanelItemDirective,\n\tParticipantsPanelDirective,\n\tStreamDirective,\n\tToolbarAdditionalButtonsDirective,\n\tToolbarDirective,\n\tToolbarAdditionalPanelButtonsDirective,\n\tAdditionalPanelsDirective,\n\tActivitiesPanelDirective,\n\tBackgroundEffectsPanelDirective\n} from './openvidu-components-angular.directive';\nimport {\n\tLayoutAdditionalElementsDirective,\n\tParticipantPanelAfterLocalParticipantDirective,\n\tParticipantPanelParticipantBadgeDirective,\n\tPreJoinDirective,\n\tLeaveButtonDirective,\n\tSettingsPanelGeneralAdditionalElementsDirective,\n\tToolbarMoreOptionsAdditionalMenuItemsDirective\n} from './internals.directive';\n\n@NgModule({\n\tdeclarations: [\n\t\tChatPanelDirective,\n\t\tLayoutDirective,\n\t\tPanelDirective,\n\t\tAdditionalPanelsDirective,\n\t\tParticipantPanelItemDirective,\n\t\tParticipantsPanelDirective,\n\t\tStreamDirective,\n\t\tToolbarDirective,\n\t\tToolbarAdditionalButtonsDirective,\n\t\tLeaveButtonDirective,\n\t\tToolbarAdditionalPanelButtonsDirective,\n\t\tParticipantPanelItemElementsDirective,\n\t\tActivitiesPanelDirective,\n\t\tPreJoinDirective,\n\t\tParticipantPanelAfterLocalParticipantDirective,\n\t\tLayoutAdditionalElementsDirective,\n\t\tParticipantPanelParticipantBadgeDirective,\n\t\tSettingsPanelGeneralAdditionalElementsDirective,\n\t\tToolbarMoreOptionsAdditionalMenuItemsDirective\n\t\t// BackgroundEffectsPanelDirective\n\t],\n\texports: [\n\t\tChatPanelDirective,\n\t\tLayoutDirective,\n\t\tPanelDirective,\n\t\tAdditionalPanelsDirective,\n\t\tParticipantPanelItemDirective,\n\t\tParticipantsPanelDirective,\n\t\tStreamDirective,\n\t\tToolbarDirective,\n\t\tToolbarAdditionalButtonsDirective,\n\t\tLeaveButtonDirective,\n\t\tToolbarAdditionalPanelButtonsDirective,\n\t\tParticipantPanelItemElementsDirective,\n\t\tActivitiesPanelDirective,\n\t\tPreJoinDirective,\n\t\tParticipantPanelAfterLocalParticipantDirective,\n\t\tLayoutAdditionalElementsDirective,\n\t\tParticipantPanelParticipantBadgeDirective,\n\t\tSettingsPanelGeneralAdditionalElementsDirective,\n\t\tToolbarMoreOptionsAdditionalMenuItemsDirective\n\t\t// BackgroundEffectsPanelDirective\n\t]\n})\nexport class OpenViduComponentsDirectiveModule {}\n","import { Component, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { DialogData } from '../../models/dialog.model';\n\n\n/**\n * @internal\n */\n\n@Component({\n    selector: 'ov-pro-feature-template',\n    template: `\n\t\t<h1 mat-dialog-title>{{ data.title }}</h1>\n\t\t<div mat-dialog-content>{{ data.description }}</div>\n\t\t<div mat-dialog-actions *ngIf=\"data.showActionButtons\">\n\t\t\t<button mat-button (click)=\"seeMore()\">\n\t\t\t\t<span>{{'PANEL.SEE_MORE' | translate}}</span>\n\t\t\t\t<mat-icon>open_in_new</mat-icon>\n\t\t\t</button>\n\t\t\t<button mat-button (click)=\"close()\">{{'PANEL.CLOSE' | translate}}</button>\n\t\t</div>\n\t`,\n    standalone: false\n})\nexport class ProFeatureDialogTemplateComponent {\n\tconstructor(public dialogRef: MatDialogRef<ProFeatureDialogTemplateComponent>, @Inject(MAT_DIALOG_DATA) public data: DialogData) {}\n\n\tclose() {\n\t\tthis.dialogRef.close();\n\t}\n\n\tseeMore() {\n\t\twindow.open('https://openvidu.io/pricing/#openvidu-pro', '_blank')?.focus();\n\t}\n}\n","import { MatBadgeModule } from '@angular/material/badge';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatGridListModule } from '@angular/material/grid-list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { NgModule } from '@angular/core';\n\n@NgModule({\n\timports: [],\n\texports: [\n\t\tMatButtonModule,\n\t\tMatCardModule,\n\t\tMatToolbarModule,\n\t\tMatIconModule,\n\t\tMatInputModule,\n\t\tMatFormFieldModule,\n\t\tMatDialogModule,\n\t\tMatTooltipModule,\n\t\tMatBadgeModule,\n\t\tMatGridListModule,\n\t\tMatSelectModule,\n\t\tMatOptionModule,\n\t\tMatProgressSpinnerModule,\n\t\tMatSliderModule,\n\t\tMatSidenavModule,\n\t\tMatSnackBarModule,\n\t\tMatMenuModule,\n\t\tMatDividerModule,\n\t\tMatListModule,\n\t\tMatExpansionModule,\n\t\tMatSlideToggleModule\n\t]\n})\nexport class AppMaterialModule {}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { DeleteDialogComponent } from './components/dialogs/delete-recording.component';\nimport { DialogTemplateComponent } from './components/dialogs/dialog.component';\nimport { RecordingDialogComponent } from './components/dialogs/recording-dialog.component';\nimport { LayoutComponent } from './components/layout/layout.component';\nimport { MediaElementComponent } from './components/media-element/media-element.component';\nimport { ChatPanelComponent } from './components/panel/chat-panel/chat-panel.component';\nimport { SessionComponent } from './components/session/session.component';\nimport { StreamComponent } from './components/stream/stream.component';\nimport { ToolbarMediaButtonsComponent } from './components/toolbar/toolbar-media-buttons/toolbar-media-buttons.component';\nimport { ToolbarPanelButtonsComponent } from './components/toolbar/toolbar-panel-buttons/toolbar-panel-buttons.component';\nimport { ToolbarComponent } from './components/toolbar/toolbar.component';\n\nimport { LinkifyPipe } from './pipes/linkify.pipe';\nimport { RemoteParticipantTracksPipe, TrackPublishedTypesPipe } from './pipes/participant.pipe';\nimport { DurationFromSecondsPipe, SearchByStringPropertyPipe, ThumbnailFromUrlPipe } from './pipes/recording.pipe';\nimport { TranslatePipe } from './pipes/translate.pipe';\n\nimport { DragDropModule } from '@angular/cdk/drag-drop';\n\nimport { AudioWaveComponent } from './components/audio-wave/audio-wave.component';\nimport { PanelComponent } from './components/panel/panel.component';\nimport { ParticipantPanelItemComponent } from './components/panel/participants-panel/participant-panel-item/participant-panel-item.component';\nimport { ParticipantsPanelComponent } from './components/panel/participants-panel/participants-panel/participants-panel.component';\nimport { PreJoinComponent } from './components/pre-join/pre-join.component';\nimport { VideoconferenceComponent } from './components/videoconference/videoconference.component';\n\nimport { AdminDashboardComponent } from './admin/admin-dashboard/admin-dashboard.component';\nimport { AdminLoginComponent } from './admin/admin-login/admin-login.component';\n// import { CaptionsComponent } from './components/captions/captions.component';\nimport { ProFeatureDialogTemplateComponent } from './components/dialogs/pro-feature-dialog.component';\nimport { ActivitiesPanelComponent } from './components/panel/activities-panel/activities-panel.component';\nimport { BroadcastingActivityComponent } from './components/panel/activities-panel/broadcasting-activity/broadcasting-activity.component';\nimport { RecordingActivityComponent } from './components/panel/activities-panel/recording-activity/recording-activity.component';\nimport { BackgroundEffectsPanelComponent } from './components/panel/background-effects-panel/background-effects-panel.component';\nimport { SettingsPanelComponent } from './components/panel/settings-panel/settings-panel.component';\nimport { AudioDevicesComponent } from './components/settings/audio-devices/audio-devices.component';\n// import { CaptionsSettingComponent } from './components/settings/captions/captions.component';\nimport { LandscapeWarningComponent } from './components/landscape-warning/landscape-warning.component';\nimport { LangSelectorComponent } from './components/settings/lang-selector/lang-selector.component';\nimport { ParticipantNameInputComponent } from './components/settings/participant-name-input/participant-name-input.component';\nimport { ThemeSelectorComponent } from './components/settings/theme-selector/theme-selector.component';\nimport { VideoDevicesComponent } from './components/settings/video-devices/video-devices.component';\nimport { VideoPosterComponent } from './components/video-poster/video-poster.component';\nimport { ApiDirectiveModule } from './directives/api/api.directive.module';\nimport { OpenViduComponentsDirectiveModule } from './directives/template/openvidu-components-angular.directive.module';\nimport { AppMaterialModule } from './openvidu-components-angular.material.module';\n\nconst publicComponents = [\n\tAdminDashboardComponent,\n\tAdminLoginComponent,\n\tVideoconferenceComponent,\n\tToolbarComponent,\n\tPanelComponent,\n\tActivitiesPanelComponent,\n\tRecordingActivityComponent,\n\tBroadcastingActivityComponent,\n\tParticipantsPanelComponent,\n\tParticipantPanelItemComponent,\n\tChatPanelComponent,\n\tStreamComponent,\n\tLayoutComponent\n];\nconst privateComponents = [\n\tPreJoinComponent,\n\tSessionComponent,\n\tBackgroundEffectsPanelComponent,\n\tSettingsPanelComponent,\n\tAudioWaveComponent,\n\tDialogTemplateComponent,\n\tProFeatureDialogTemplateComponent,\n\tRecordingDialogComponent,\n\tDeleteDialogComponent,\n\tVideoPosterComponent,\n\tMediaElementComponent,\n\tVideoDevicesComponent,\n\tAudioDevicesComponent,\n\tParticipantNameInputComponent,\n\tLangSelectorComponent,\n\tToolbarMediaButtonsComponent,\n\tToolbarPanelButtonsComponent,\n\tThemeSelectorComponent,\n\tLandscapeWarningComponent\n];\n\n@NgModule({\n\tdeclarations: [\n\t\t...publicComponents,\n\t\t...privateComponents,\n\t\tLinkifyPipe,\n\t\tRemoteParticipantTracksPipe,\n\t\tDurationFromSecondsPipe,\n\t\tSearchByStringPropertyPipe,\n\t\tThumbnailFromUrlPipe,\n\t\tTrackPublishedTypesPipe,\n\t\tTranslatePipe\n\t],\n\timports: [\n\t\tCommonModule,\n\t\tFormsModule,\n\t\tReactiveFormsModule,\n\t\tAppMaterialModule,\n\t\tOpenViduComponentsDirectiveModule,\n\t\tApiDirectiveModule,\n\t\tDragDropModule\n\t],\n\texports: [\n\t\t...publicComponents,\n\t\tRemoteParticipantTracksPipe,\n\t\tDurationFromSecondsPipe,\n\t\tTrackPublishedTypesPipe,\n\t\tTranslatePipe,\n\t\tOpenViduComponentsDirectiveModule,\n\t\tApiDirectiveModule\n\t]\n})\nexport class OpenViduComponentsUiModule {}\n","import { OverlayContainer } from '@angular/cdk/overlay';\nimport { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { EnvironmentProviders, ModuleWithProviders, NgModule, Provider } from '@angular/core';\n\nimport { CdkOverlayContainer } from './config/custom-cdk-overlay';\nimport { OpenViduComponentsConfig } from './config/openvidu-components-angular.config';\nimport { ActionService } from './services/action/action.service';\nimport { ChatService } from './services/chat/chat.service';\nimport { DeviceService } from './services/device/device.service';\nimport { DocumentService } from './services/document/document.service';\nimport { LoggerService } from './services/logger/logger.service';\nimport { OpenViduService } from './services/openvidu/openvidu.service';\nimport { PanelService } from './services/panel/panel.service';\nimport { ParticipantService } from './services/participant/participant.service';\nimport { PlatformService } from './services/platform/platform.service';\nimport { RecordingService } from './services/recording/recording.service';\nimport { StorageService } from './services/storage/storage.service';\n\nimport { OpenViduComponentsUiModule } from './openvidu-components-angular-ui.module';\nimport { BroadcastingService } from './services/broadcasting/broadcasting.service';\nimport { OpenViduComponentsConfigService } from './services/config/directive-config.service';\nimport { GlobalConfigService } from './services/config/global-config.service';\nimport { E2eeService } from './services/e2ee/e2ee.service';\nimport { ViewportService } from './services/viewport/viewport.service';\nimport { VirtualBackgroundService } from './services/virtual-background/virtual-background.service';\n\n@NgModule({\n\timports: [OpenViduComponentsUiModule],\n\texports: [OpenViduComponentsUiModule]\n})\nexport class OpenViduComponentsModule {\n\tstatic forRoot(config: OpenViduComponentsConfig): ModuleWithProviders<OpenViduComponentsModule> {\n\t\tconst providers: (Provider | EnvironmentProviders)[] = [\n\t\t\t{ provide: 'OPENVIDU_COMPONENTS_CONFIG', useValue: config },\n\t\t\tGlobalConfigService,\n\t\t\tOpenViduComponentsConfigService,\n\t\t\tActionService,\n\t\t\tBroadcastingService,\n\t\t\t// CaptionService,\n\t\t\tCdkOverlayContainer,\n\t\t\t{ provide: OverlayContainer, useExisting: CdkOverlayContainer },\n\t\t\tChatService,\n\t\t\tDeviceService,\n\t\t\tDocumentService,\n\t\t\t// LayoutService,\n\t\t\tLoggerService,\n\t\t\tOpenViduService,\n\t\t\tPanelService,\n\t\t\tParticipantService,\n\t\t\tPlatformService,\n\t\t\tRecordingService,\n\t\t\tStorageService,\n\t\t\tVirtualBackgroundService,\n\t\t\tViewportService,\n\t\t\tE2eeService,\n\t\t\tprovideHttpClient(withInterceptorsFromDi())\n\t\t];\n\n\t\treturn {\n\t\t\tngModule: OpenViduComponentsModule,\n\t\t\tproviders\n\t\t};\n\t}\n}\n","/*\n * Public API Surface of openvidu-components-angular\n */\n\n// Components\nexport * from './lib/admin/admin-dashboard/admin-dashboard.component';\nexport * from './lib/admin/admin-login/admin-login.component';\nexport * from './lib/components/landscape-warning/landscape-warning.component';\nexport * from './lib/components/layout/layout.component';\nexport * from './lib/components/panel/activities-panel/activities-panel.component';\nexport * from './lib/components/panel/activities-panel/broadcasting-activity/broadcasting-activity.component';\nexport * from './lib/components/panel/activities-panel/recording-activity/recording-activity.component';\nexport * from './lib/components/panel/chat-panel/chat-panel.component';\nexport * from './lib/components/panel/panel.component';\nexport * from './lib/components/panel/participants-panel/participant-panel-item/participant-panel-item.component';\nexport * from './lib/components/panel/participants-panel/participants-panel/participants-panel.component';\nexport * from './lib/components/stream/stream.component';\nexport * from './lib/components/toolbar/toolbar-media-buttons/toolbar-media-buttons.component';\nexport * from './lib/components/toolbar/toolbar-panel-buttons/toolbar-panel-buttons.component';\nexport * from './lib/components/toolbar/toolbar.component';\nexport * from './lib/components/videoconference/videoconference.component';\nexport * from './lib/config/openvidu-components-angular.config';\n// Directives\nexport * from './lib/directives/api/activities-panel.directive';\nexport * from './lib/directives/api/admin.directive';\nexport * from './lib/directives/api/api.directive.module';\nexport * from './lib/directives/api/internals.directive';\nexport * from './lib/directives/api/participant-panel-item.directive';\nexport * from './lib/directives/api/stream.directive';\nexport * from './lib/directives/api/toolbar.directive';\nexport * from './lib/directives/api/videoconference.directive';\n\nexport * from './lib/directives/template/internals.directive';\nexport * from './lib/directives/template/openvidu-components-angular.directive';\nexport * from './lib/directives/template/openvidu-components-angular.directive.module';\n// Models\nexport * from './lib/models/broadcasting.model';\nexport * from './lib/models/data-topic.model';\nexport * from './lib/models/device.model';\nexport * from './lib/models/lang.model';\nexport * from './lib/models/layout/layout.model';\nexport * from './lib/models/logger.model';\nexport * from './lib/models/panel.model';\nexport * from './lib/models/participant.model';\nexport * from './lib/models/recording.model';\nexport * from './lib/models/room.model';\nexport * from './lib/models/storage.model';\nexport * from './lib/models/theme.model';\nexport * from './lib/models/toolbar.model';\nexport * from './lib/models/viewport.model';\n// Pipes\nexport * from './lib/pipes/participant.pipe';\nexport * from './lib/pipes/recording.pipe';\nexport * from './lib/pipes/translate.pipe';\n// Services\nexport * from './lib/services/action/action.service';\nexport * from './lib/services/broadcasting/broadcasting.service';\nexport * from './lib/services/chat/chat.service';\nexport * from './lib/services/config/global-config.service';\nexport * from './lib/services/e2ee/e2ee.service';\nexport * from './lib/services/layout/layout.service';\nexport * from './lib/services/logger/logger.service';\nexport * from './lib/services/openvidu/openvidu.service';\nexport * from './lib/services/panel/panel.service';\nexport * from './lib/services/participant/participant.service';\nexport * from './lib/services/recording/recording.service';\nexport * from './lib/services/storage/storage.service';\nexport * from './lib/services/theme/theme.service';\nexport * from './lib/services/translate/translate.service';\nexport * from './lib/services/viewport/viewport.service';\n//Modules\nexport * from './lib/config/custom-cdk-overlay';\nexport * from './lib/openvidu-components-angular-ui.module';\nexport * from './lib/openvidu-components-angular.module';\n\nexport * from 'livekit-client';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GlobalConfigService","i1.LoggerService","en","es","de","fr","cn","hi","it","ja","nl","pt","i1.StorageService","i1.TranslateService","i2","i3.TranslatePipe","i3","i4.TranslatePipe","i1","i3.TranslateService","i1.ActionService","i2.OpenViduComponentsConfigService","i3.LoggerService","i2.RecordingService","i3.OpenViduComponentsConfigService","i4","i5","i9","i10","i11.DurationFromSecondsPipe","i11.SearchByStringPropertyPipe","i12.TranslatePipe","i1.OpenViduComponentsConfigService","i2.ActionService","i6","i7","i8","i10.TranslatePipe","i2.TranslatePipe","distinctUntilChanged","i1.PlatformService","i2.ViewportService","takeUntil","i2.PlatformService","i3.StorageService","i2.DeviceService","i4.OpenViduComponentsConfigService","i3.OpenViduService","i4.StorageService","i5.LoggerService","i6.E2eeService","map","i1.LayoutService","i2.PanelService","i3.ParticipantService","i4.GlobalConfigService","i5.OpenViduComponentsConfigService","i6.TemplateManagerService","i9.RemoteParticipantTracksPipe","i1.RecordingService","i2.ParticipantService","i3.ActionService","i4.OpenViduService","i6.OpenViduComponentsConfigService","i12","i14.TranslatePipe","i1.BroadcastingService","i11.TranslatePipe","i1.PanelService","i8.RecordingActivityComponent","i9.BroadcastingActivityComponent","BehaviorSubject","i3.PanelService","i4.ActionService","i5.TranslateService","i1.ChatService","i3.E2eeService","i4.ParticipantService","i10.LinkifyPipe","i2.TemplateManagerService","i3.TemplateManagerService","i9.TrackPublishedTypesPipe","i1.ParticipantService","i10.ParticipantPanelItemComponent","i1.CdkOverlayContainer","i2.VideoPosterComponent","i3.CdkOverlayService","i9.AudioWaveComponent","i10.MediaElementComponent","i7.TranslatePipe","i1.ViewportService","i8.TranslatePipe","i2.DocumentService","i3.ChatService","i4.PanelService","i5.ParticipantService","i6.OpenViduService","i7.DeviceService","i8.ActionService","i9.LoggerService","i10.OpenViduComponentsConfigService","i11.PlatformService","i12.RecordingService","i13.BroadcastingService","i14.TranslateService","i15.StorageService","i16.CdkOverlayService","i17.TemplateManagerService","i18","i19","i20","i21.ToolbarMoreOptionsAdditionalMenuItemsDirective","i22.FallbackLogoDirective","i23.ToolbarMediaButtonsComponent","i24.ToolbarPanelButtonsComponent","i1.OpenViduService","i2.StorageService","i2.VirtualBackgroundService","i4.LoggerService","i1.DeviceService","i5.TranslatePipe","i6.ViewportService","i11","i12.BackgroundEffectsPanelComponent","i13.MediaElementComponent","i14.VideoDevicesComponent","i15.AudioDevicesComponent","i16.ParticipantNameInputComponent","i17.LangSelectorComponent","i18.LandscapeWarningComponent","i19.TranslatePipe","i6.ChatService","i7.OpenViduComponentsConfigService","i8.PanelService","i9.RecordingService","i10.BroadcastingService","i11.TranslateService","i12.VirtualBackgroundService","i13.TemplateManagerService","i14.ViewportService","i15","i16","i1.OpenViduThemeService","i4.ViewportService","i11.VideoDevicesComponent","i12.AudioDevicesComponent","i13.ParticipantNameInputComponent","i14.LangSelectorComponent","i15.ThemeSelectorComponent","i16.TranslatePipe","i3.DeviceService","i5.ActionService","i7.TemplateManagerService","i8.OpenViduThemeService","i9.E2eeService","i13.SettingsPanelGeneralAdditionalElementsDirective","i13.ToolbarMoreOptionsAdditionalMenuItemsDirective","i14.ToolbarComponent","i15.PanelComponent","i16.ActivitiesPanelComponent","i17.ParticipantsPanelComponent","i18.ParticipantPanelItemComponent","i19.ChatPanelComponent","i20.StreamComponent","i21.LayoutComponent","i22.PreJoinComponent","i23.SessionComponent","i24.BackgroundEffectsPanelComponent","i25.SettingsPanelComponent","i26.TranslatePipe","i2.TranslateService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEG;IACS;AAAZ,CAAA,UAAY,eAAe,EAAA;AAC1B,IAAA,eAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,eAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,eAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,eAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AAChB,CAAC,EAPW,eAAe,KAAf,eAAe,GAAA,EAAA,CAAA,CAAA;IASf;AAAZ,CAAA,UAAY,mBAAmB,EAAA;AAC9B,IAAA,mBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,mBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AAC1B,CAAC,EAHW,mBAAmB,KAAnB,mBAAmB,GAAA,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}