livekit-client 1.12.3 → 1.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. package/dist/livekit-client.e2ee.worker.js +1 -1
  2. package/dist/livekit-client.e2ee.worker.js.map +1 -1
  3. package/dist/livekit-client.e2ee.worker.mjs +198 -107
  4. package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
  5. package/dist/livekit-client.esm.mjs +515 -192
  6. package/dist/livekit-client.esm.mjs.map +1 -1
  7. package/dist/livekit-client.umd.js +1 -1
  8. package/dist/livekit-client.umd.js.map +1 -1
  9. package/dist/src/api/SignalClient.d.ts +2 -5
  10. package/dist/src/api/SignalClient.d.ts.map +1 -1
  11. package/dist/src/connectionHelper/checks/turn.d.ts.map +1 -1
  12. package/dist/src/connectionHelper/checks/webrtc.d.ts.map +1 -1
  13. package/dist/src/connectionHelper/checks/websocket.d.ts.map +1 -1
  14. package/dist/src/e2ee/E2eeManager.d.ts +9 -3
  15. package/dist/src/e2ee/E2eeManager.d.ts.map +1 -1
  16. package/dist/src/e2ee/KeyProvider.d.ts +10 -7
  17. package/dist/src/e2ee/KeyProvider.d.ts.map +1 -1
  18. package/dist/src/e2ee/constants.d.ts +2 -0
  19. package/dist/src/e2ee/constants.d.ts.map +1 -1
  20. package/dist/src/e2ee/events.d.ts +34 -0
  21. package/dist/src/e2ee/events.d.ts.map +1 -0
  22. package/dist/src/e2ee/index.d.ts +1 -0
  23. package/dist/src/e2ee/index.d.ts.map +1 -1
  24. package/dist/src/e2ee/types.d.ts +23 -33
  25. package/dist/src/e2ee/types.d.ts.map +1 -1
  26. package/dist/src/e2ee/utils.d.ts +1 -0
  27. package/dist/src/e2ee/utils.d.ts.map +1 -1
  28. package/dist/src/e2ee/worker/FrameCryptor.d.ts +18 -13
  29. package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
  30. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts +6 -8
  31. package/dist/src/e2ee/worker/ParticipantKeyHandler.d.ts.map +1 -1
  32. package/dist/src/e2ee/worker/SifGuard.d.ts +11 -0
  33. package/dist/src/e2ee/worker/SifGuard.d.ts.map +1 -0
  34. package/dist/src/options.d.ts +5 -0
  35. package/dist/src/options.d.ts.map +1 -1
  36. package/dist/src/proto/livekit_models_pb.d.ts.map +1 -1
  37. package/dist/src/proto/livekit_rtc_pb.d.ts.map +1 -1
  38. package/dist/src/room/DeviceManager.d.ts +1 -0
  39. package/dist/src/room/DeviceManager.d.ts.map +1 -1
  40. package/dist/src/room/PCTransport.d.ts.map +1 -1
  41. package/dist/src/room/RTCEngine.d.ts.map +1 -1
  42. package/dist/src/room/Room.d.ts +1 -1
  43. package/dist/src/room/Room.d.ts.map +1 -1
  44. package/dist/src/room/defaults.d.ts.map +1 -1
  45. package/dist/src/room/participant/LocalParticipant.d.ts +1 -0
  46. package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
  47. package/dist/src/room/participant/Participant.d.ts +5 -0
  48. package/dist/src/room/participant/Participant.d.ts.map +1 -1
  49. package/dist/src/room/participant/RemoteParticipant.d.ts +0 -5
  50. package/dist/src/room/participant/RemoteParticipant.d.ts.map +1 -1
  51. package/dist/src/room/timers.d.ts +2 -2
  52. package/dist/src/room/timers.d.ts.map +1 -1
  53. package/dist/src/room/track/LocalAudioTrack.d.ts +9 -1
  54. package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
  55. package/dist/src/room/track/LocalTrack.d.ts +3 -3
  56. package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
  57. package/dist/src/room/track/LocalVideoTrack.d.ts +6 -0
  58. package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
  59. package/dist/src/room/track/RemoteAudioTrack.d.ts.map +1 -1
  60. package/dist/src/room/track/processor/types.d.ts +14 -2
  61. package/dist/src/room/track/processor/types.d.ts.map +1 -1
  62. package/dist/src/room/types.d.ts +1 -1
  63. package/dist/src/room/types.d.ts.map +1 -1
  64. package/dist/ts4.2/src/api/SignalClient.d.ts +2 -5
  65. package/dist/ts4.2/src/e2ee/E2eeManager.d.ts +9 -3
  66. package/dist/ts4.2/src/e2ee/KeyProvider.d.ts +10 -7
  67. package/dist/ts4.2/src/e2ee/constants.d.ts +2 -0
  68. package/dist/ts4.2/src/e2ee/events.d.ts +34 -0
  69. package/dist/ts4.2/src/e2ee/index.d.ts +1 -0
  70. package/dist/ts4.2/src/e2ee/types.d.ts +23 -33
  71. package/dist/ts4.2/src/e2ee/utils.d.ts +1 -0
  72. package/dist/ts4.2/src/e2ee/worker/FrameCryptor.d.ts +18 -13
  73. package/dist/ts4.2/src/e2ee/worker/ParticipantKeyHandler.d.ts +6 -8
  74. package/dist/ts4.2/src/e2ee/worker/SifGuard.d.ts +11 -0
  75. package/dist/ts4.2/src/options.d.ts +5 -0
  76. package/dist/ts4.2/src/room/DeviceManager.d.ts +1 -0
  77. package/dist/ts4.2/src/room/Room.d.ts +1 -1
  78. package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +1 -0
  79. package/dist/ts4.2/src/room/participant/Participant.d.ts +5 -0
  80. package/dist/ts4.2/src/room/participant/RemoteParticipant.d.ts +0 -5
  81. package/dist/ts4.2/src/room/timers.d.ts +2 -2
  82. package/dist/ts4.2/src/room/track/LocalAudioTrack.d.ts +9 -1
  83. package/dist/ts4.2/src/room/track/LocalTrack.d.ts +3 -3
  84. package/dist/ts4.2/src/room/track/LocalVideoTrack.d.ts +6 -0
  85. package/dist/ts4.2/src/room/track/processor/types.d.ts +14 -2
  86. package/dist/ts4.2/src/room/types.d.ts +1 -1
  87. package/package.json +15 -16
  88. package/src/api/SignalClient.ts +13 -9
  89. package/src/connectionHelper/checks/turn.ts +1 -0
  90. package/src/connectionHelper/checks/webrtc.ts +9 -7
  91. package/src/connectionHelper/checks/websocket.ts +1 -0
  92. package/src/e2ee/E2eeManager.ts +129 -76
  93. package/src/e2ee/KeyProvider.ts +31 -16
  94. package/src/e2ee/constants.ts +3 -0
  95. package/src/e2ee/events.ts +48 -0
  96. package/src/e2ee/index.ts +1 -0
  97. package/src/e2ee/types.ts +27 -41
  98. package/src/e2ee/utils.ts +9 -0
  99. package/src/e2ee/worker/FrameCryptor.ts +90 -47
  100. package/src/e2ee/worker/ParticipantKeyHandler.ts +25 -26
  101. package/src/e2ee/worker/SifGuard.ts +47 -0
  102. package/src/e2ee/worker/e2ee.worker.ts +75 -68
  103. package/src/options.ts +6 -0
  104. package/src/proto/livekit_models_pb.ts +14 -0
  105. package/src/proto/livekit_rtc_pb.ts +14 -0
  106. package/src/room/DeviceManager.ts +7 -2
  107. package/src/room/PCTransport.ts +12 -2
  108. package/src/room/RTCEngine.ts +3 -2
  109. package/src/room/Room.ts +47 -22
  110. package/src/room/defaults.ts +1 -0
  111. package/src/room/participant/LocalParticipant.ts +18 -2
  112. package/src/room/participant/Participant.ts +16 -0
  113. package/src/room/participant/RemoteParticipant.ts +0 -12
  114. package/src/room/track/LocalAudioTrack.ts +45 -0
  115. package/src/room/track/LocalTrack.ts +22 -14
  116. package/src/room/track/LocalVideoTrack.ts +39 -0
  117. package/src/room/track/RemoteAudioTrack.ts +9 -1
  118. package/src/room/track/RemoteTrackPublication.ts +2 -2
  119. package/src/room/track/facingMode.ts +1 -1
  120. package/src/room/track/processor/types.ts +18 -2
  121. package/src/room/types.ts +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"livekit-client.e2ee.worker.mjs","sources":["../node_modules/loglevel/lib/loglevel.js","../src/logger.ts","../src/e2ee/constants.ts","../src/room/errors.ts","../src/e2ee/errors.ts","../node_modules/events/events.js","../src/e2ee/types.ts","../src/room/track/options.ts","../src/e2ee/utils.ts","../src/e2ee/worker/FrameCryptor.ts","../src/e2ee/worker/ParticipantKeyHandler.ts","../src/e2ee/worker/e2ee.worker.ts"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n defaultLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = level;\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n self.setLevel(defaultLevel, false);\n clearPersistedLevel();\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","import * as log from 'loglevel';\n\nexport enum LogLevel {\n trace = 0,\n debug = 1,\n info = 2,\n warn = 3,\n error = 4,\n silent = 5,\n}\n\ntype LogLevelString = keyof typeof LogLevel;\n\ntype StructuredLogger = {\n trace: (msg: string, context?: object) => void;\n debug: (msg: string, context?: object) => void;\n info: (msg: string, context?: object) => void;\n warn: (msg: string, context?: object) => void;\n error: (msg: string, context?: object) => void;\n setDefaultLevel: (level: log.LogLevelDesc) => void;\n};\n\nconst livekitLogger = log.getLogger('livekit');\n\nlivekitLogger.setDefaultLevel(LogLevel.info);\n\nexport default livekitLogger as StructuredLogger;\n\nexport function setLogLevel(level: LogLevel | LogLevelString, loggerName?: 'livekit' | 'lk-e2ee') {\n if (loggerName) {\n log.getLogger(loggerName).setLevel(level);\n }\n for (const logger of Object.values(log.getLoggers())) {\n logger.setLevel(level);\n }\n}\n\nexport type LogExtension = (level: LogLevel, msg: string, context?: object) => void;\n\n/**\n * use this to hook into the logging function to allow sending internal livekit logs to third party services\n * if set, the browser logs will lose their stacktrace information (see https://github.com/pimterry/loglevel#writing-plugins)\n */\nexport function setLogExtension(extension: LogExtension) {\n const originalFactory = livekitLogger.methodFactory;\n\n livekitLogger.methodFactory = (methodName, configLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, configLevel, loggerName);\n\n const logLevel = LogLevel[methodName as LogLevelString];\n const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;\n\n return (msg, context?: [msg: string, context: object]) => {\n if (context) rawMethod(msg, context);\n else rawMethod(msg);\n if (needLog) {\n extension(logLevel, msg, context);\n }\n };\n };\n livekitLogger.setLevel(livekitLogger.getLevel()); // Be sure to call setLevel method in order to apply plugin\n}\n\nexport const workerLogger = log.getLogger('lk-e2ee') as StructuredLogger;\n","import type { KeyProviderOptions } from './types';\n\nexport const ENCRYPTION_ALGORITHM = 'AES-GCM';\n\n// We use a ringbuffer of keys so we can change them and still decode packets that were\n// encrypted with an old key. We use a size of 16 which corresponds to the four bits\n// in the frame trailer.\nexport const KEYRING_SIZE = 16;\n\n// How many consecutive frames can fail decrypting before a particular key gets marked as invalid\nexport const DECRYPTION_FAILURE_TOLERANCE = 10;\n\n// We copy the first bytes of the VP8 payload unencrypted.\n// For keyframes this is 10 bytes, for non-keyframes (delta) 3. See\n// https://tools.ietf.org/html/rfc6386#section-9.1\n// This allows the bridge to continue detecting keyframes (only one byte needed in the JVB)\n// and is also a bit easier for the VP8 decoder (i.e. it generates funny garbage pictures\n// instead of being unable to decode).\n// This is a bit for show and we might want to reduce to 1 unconditionally in the final version.\n//\n// For audio (where frame.type is not set) we do not encrypt the opus TOC byte:\n// https://tools.ietf.org/html/rfc6716#section-3.1\nexport const UNENCRYPTED_BYTES = {\n key: 10,\n delta: 3,\n audio: 1, // frame.type is not set on audio, so this is set manually\n empty: 0,\n} as const;\n\n/* We use a 12 byte bit IV. This is signalled in plain together with the\n packet. See https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt#parameters */\nexport const IV_LENGTH = 12;\n\n// flag set to indicate that e2ee has been setup for sender/receiver;\nexport const E2EE_FLAG = 'lk_e2ee';\n\nexport const SALT = 'LKFrameEncryptionKey';\n\nexport const KEY_PROVIDER_DEFAULTS: KeyProviderOptions = {\n sharedKey: false,\n ratchetSalt: SALT,\n ratchetWindowSize: 8,\n failureTolerance: DECRYPTION_FAILURE_TOLERANCE,\n} as const;\n","export class LivekitError extends Error {\n code: number;\n\n constructor(code: number, message?: string) {\n super(message || 'an error has occured');\n this.code = code;\n }\n}\n\nexport const enum ConnectionErrorReason {\n NotAllowed,\n ServerUnreachable,\n InternalError,\n Cancelled,\n}\n\nexport class ConnectionError extends LivekitError {\n status?: number;\n\n reason?: ConnectionErrorReason;\n\n constructor(message?: string, reason?: ConnectionErrorReason, status?: number) {\n super(1, message);\n this.status = status;\n this.reason = reason;\n }\n}\n\nexport class DeviceUnsupportedError extends LivekitError {\n constructor(message?: string) {\n super(21, message ?? 'device is unsupported');\n }\n}\n\nexport class TrackInvalidError extends LivekitError {\n constructor(message?: string) {\n super(20, message ?? 'track is invalid');\n }\n}\n\nexport class UnsupportedServer extends LivekitError {\n constructor(message?: string) {\n super(10, message ?? 'unsupported server');\n }\n}\n\nexport class UnexpectedConnectionState extends LivekitError {\n constructor(message?: string) {\n super(12, message ?? 'unexpected connection state');\n }\n}\n\nexport class NegotiationError extends LivekitError {\n constructor(message?: string) {\n super(13, message ?? 'unable to negotiate');\n }\n}\n\nexport class PublishDataError extends LivekitError {\n constructor(message?: string) {\n super(13, message ?? 'unable to publish data');\n }\n}\n\nexport enum MediaDeviceFailure {\n // user rejected permissions\n PermissionDenied = 'PermissionDenied',\n // device is not available\n NotFound = 'NotFound',\n // device is in use. On Windows, only a single tab may get access to a device at a time.\n DeviceInUse = 'DeviceInUse',\n Other = 'Other',\n}\n\nexport namespace MediaDeviceFailure {\n export function getFailure(error: any): MediaDeviceFailure | undefined {\n if (error && 'name' in error) {\n if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') {\n return MediaDeviceFailure.NotFound;\n }\n if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {\n return MediaDeviceFailure.PermissionDenied;\n }\n if (error.name === 'NotReadableError' || error.name === 'TrackStartError') {\n return MediaDeviceFailure.DeviceInUse;\n }\n return MediaDeviceFailure.Other;\n }\n }\n}\n","import { LivekitError } from '../room/errors';\n\nexport enum CryptorErrorReason {\n InvalidKey = 0,\n MissingKey = 1,\n InternalError = 2,\n}\n\nexport class CryptorError extends LivekitError {\n reason: CryptorErrorReason;\n\n constructor(message?: string, reason: CryptorErrorReason = CryptorErrorReason.InternalError) {\n super(40, message);\n this.reason = reason;\n }\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","import type Participant from '../room/participant/Participant';\nimport type { VideoCodec } from '../room/track/options';\nimport type { BaseKeyProvider } from './KeyProvider';\nimport type { CryptorError } from './errors';\n\nexport interface BaseMessage {\n kind: string;\n data?: unknown;\n}\n\nexport interface InitMessage extends BaseMessage {\n kind: 'init';\n data: {\n keyProviderOptions: KeyProviderOptions;\n };\n}\n\nexport interface SetKeyMessage extends BaseMessage {\n kind: 'setKey';\n data: {\n participantId?: string;\n key: CryptoKey;\n keyIndex?: number;\n };\n}\n\nexport interface RTPVideoMapMessage extends BaseMessage {\n kind: 'setRTPMap';\n data: {\n map: Map<number, VideoCodec>;\n };\n}\n\nexport interface EncodeMessage extends BaseMessage {\n kind: 'decode' | 'encode';\n data: {\n participantId: string;\n readableStream: ReadableStream;\n writableStream: WritableStream;\n trackId: string;\n codec?: VideoCodec;\n };\n}\n\nexport interface RemoveTransformMessage extends BaseMessage {\n kind: 'removeTransform';\n data: {\n participantId: string;\n trackId: string;\n };\n}\n\nexport interface UpdateCodecMessage extends BaseMessage {\n kind: 'updateCodec';\n data: {\n participantId: string;\n trackId: string;\n codec: VideoCodec;\n };\n}\n\nexport interface RatchetRequestMessage extends BaseMessage {\n kind: 'ratchetRequest';\n data: {\n participantId: string | undefined;\n keyIndex?: number;\n };\n}\n\nexport interface RatchetMessage extends BaseMessage {\n kind: 'ratchetKey';\n data: {\n // participantId: string | undefined;\n keyIndex?: number;\n material: CryptoKey;\n };\n}\n\nexport interface ErrorMessage extends BaseMessage {\n kind: 'error';\n data: {\n error: Error;\n };\n}\n\nexport interface EnableMessage extends BaseMessage {\n kind: 'enable';\n data: {\n // if no participant id is set it indicates publisher encryption enable/disable\n participantId?: string;\n enabled: boolean;\n };\n}\n\nexport type E2EEWorkerMessage =\n | InitMessage\n | SetKeyMessage\n | EncodeMessage\n | ErrorMessage\n | EnableMessage\n | RemoveTransformMessage\n | RTPVideoMapMessage\n | UpdateCodecMessage\n | RatchetRequestMessage\n | RatchetMessage;\n\nexport type KeySet = { material: CryptoKey; encryptionKey: CryptoKey };\n\nexport type KeyProviderOptions = {\n sharedKey: boolean;\n ratchetSalt: string;\n ratchetWindowSize: number;\n failureTolerance: number;\n};\n\nexport type KeyProviderCallbacks = {\n setKey: (keyInfo: KeyInfo) => void;\n ratchetRequest: (participantId?: string, keyIndex?: number) => void;\n /** currently only emitted for local participant */\n keyRatcheted: (material: CryptoKey, keyIndex?: number) => void;\n};\n\nexport type ParticipantKeyHandlerCallbacks = {\n keyRatcheted: (material: CryptoKey, keyIndex?: number, participantId?: string) => void;\n};\n\nexport type E2EEManagerCallbacks = {\n participantEncryptionStatusChanged: (enabled: boolean, participant?: Participant) => void;\n encryptionError: (error: Error) => void;\n};\n\nexport const EncryptionEvent = {\n ParticipantEncryptionStatusChanged: 'participantEncryptionStatusChanged',\n Error: 'encryptionError',\n} as const;\n\nexport type CryptorCallbacks = {\n cryptorError: (error: CryptorError) => void;\n};\n\nexport const CryptorEvent = {\n Error: 'cryptorError',\n} as const;\n\nexport type KeyInfo = {\n key: CryptoKey;\n participantId?: string;\n keyIndex?: number;\n};\n\nexport type E2EEOptions = {\n keyProvider: BaseKeyProvider;\n worker: Worker;\n};\n\nexport type DecodeRatchetOptions = {\n /** attempts */\n ratchetCount: number;\n /** ratcheted key to try */\n encryptionKey?: CryptoKey;\n};\n","import type { Track } from './Track';\n\nexport interface TrackPublishDefaults {\n /**\n * encoding parameters for camera track\n */\n videoEncoding?: VideoEncoding;\n\n /**\n * @experimental\n */\n backupCodec?: { codec: BackupVideoCodec; encoding: VideoEncoding } | false;\n\n /**\n * encoding parameters for screen share track\n */\n screenShareEncoding?: VideoEncoding;\n\n /**\n * codec, defaults to vp8; for svc codecs, auto enable vp8\n * as backup. (TBD)\n */\n videoCodec?: VideoCodec;\n\n /**\n * max audio bitrate, defaults to [[AudioPresets.music]]\n * @deprecated use `audioPreset` instead\n */\n audioBitrate?: number;\n\n /**\n * which audio preset should be used for publishing (audio) tracks\n * defaults to [[AudioPresets.music]]\n */\n audioPreset?: AudioPreset;\n\n /**\n * dtx (Discontinuous Transmission of audio), enabled by default for mono tracks.\n */\n dtx?: boolean;\n\n /**\n * red (Redundant Audio Data), enabled by default for mono tracks.\n */\n red?: boolean;\n\n /**\n * publish track in stereo mode (or set to false to disable). defaults determined by capture channel count.\n */\n forceStereo?: boolean;\n\n /**\n * use simulcast, defaults to true.\n * When using simulcast, LiveKit will publish up to three versions of the stream\n * at various resolutions.\n */\n simulcast?: boolean;\n\n /**\n * scalability mode for svc codecs, defaults to 'L3T3'.\n * for svc codecs, simulcast is disabled.\n */\n scalabilityMode?: ScalabilityMode;\n\n /**\n * Up to two additional simulcast layers to publish in addition to the original\n * Track.\n * When left blank, it defaults to h180, h360.\n * If a SVC codec is used (VP9 or AV1), this field has no effect.\n *\n * To publish three total layers, you would specify:\n * {\n * videoEncoding: {...}, // encoding of the primary layer\n * videoSimulcastLayers: [\n * VideoPresets.h540,\n * VideoPresets.h216,\n * ],\n * }\n */\n videoSimulcastLayers?: Array<VideoPreset>;\n\n /**\n * custom video simulcast layers for screen tracks\n * Note: the layers need to be ordered from lowest to highest quality\n */\n screenShareSimulcastLayers?: Array<VideoPreset>;\n\n /**\n * For local tracks, stop the underlying MediaStreamTrack when the track is muted (or paused)\n * on some platforms, this option is necessary to disable the microphone recording indicator.\n * Note: when this is enabled, and BT devices are connected, they will transition between\n * profiles (e.g. HFP to A2DP) and there will be an audible difference in playback.\n *\n * defaults to false\n */\n stopMicTrackOnMute?: boolean;\n}\n\n/**\n * Options when publishing tracks\n */\nexport interface TrackPublishOptions extends TrackPublishDefaults {\n /**\n * set a track name\n */\n name?: string;\n\n /**\n * Source of track, camera, microphone, or screen\n */\n source?: Track.Source;\n}\n\nexport interface CreateLocalTracksOptions {\n /**\n * audio track options, true to create with defaults. false if audio shouldn't be created\n * default true\n */\n audio?: boolean | AudioCaptureOptions;\n\n /**\n * video track options, true to create with defaults. false if video shouldn't be created\n * default true\n */\n video?: boolean | VideoCaptureOptions;\n}\n\nexport interface VideoCaptureOptions {\n /**\n * A ConstrainDOMString object specifying a device ID or an array of device\n * IDs which are acceptable and/or required.\n */\n deviceId?: ConstrainDOMString;\n\n /**\n * a facing or an array of facings which are acceptable and/or required.\n */\n facingMode?: 'user' | 'environment' | 'left' | 'right';\n\n resolution?: VideoResolution;\n}\n\nexport interface ScreenShareCaptureOptions {\n /**\n * true to capture audio shared. browser support for audio capturing in\n * screenshare is limited: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#browser_compatibility\n */\n audio?: boolean | AudioCaptureOptions;\n\n /**\n * only allows for 'true' and chrome allows for additional options to be passed in\n * https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#displaySurface\n */\n video?: true | { displaySurface?: 'window' | 'browser' | 'monitor' };\n\n /** capture resolution, defaults to full HD */\n resolution?: VideoResolution;\n\n /** a CaptureController object instance containing methods that can be used to further manipulate the capture session if included. */\n controller?: unknown; // TODO replace type with CaptureController once it lands in TypeScript\n\n /** specifies whether the browser should allow the user to select the current tab for capture */\n selfBrowserSurface?: 'include' | 'exclude';\n\n /** specifies whether the browser should display a control to allow the user to dynamically switch the shared tab during screen-sharing. */\n surfaceSwitching?: 'include' | 'exclude';\n\n /** specifies whether the browser should include the system audio among the possible audio sources offered to the user */\n systemAudio?: 'include' | 'exclude';\n\n /**\n * Experimental option to control whether the audio playing in a tab will continue to be played out of a user's\n * local speakers when the tab is captured.\n */\n suppressLocalAudioPlayback?: boolean;\n}\n\nexport interface AudioCaptureOptions {\n /**\n * specifies whether automatic gain control is preferred and/or required\n */\n autoGainControl?: ConstrainBoolean;\n\n /**\n * the channel count or range of channel counts which are acceptable and/or required\n */\n channelCount?: ConstrainULong;\n\n /**\n * A ConstrainDOMString object specifying a device ID or an array of device\n * IDs which are acceptable and/or required.\n */\n deviceId?: ConstrainDOMString;\n\n /**\n * whether or not echo cancellation is preferred and/or required\n */\n echoCancellation?: ConstrainBoolean;\n\n /**\n * the latency or range of latencies which are acceptable and/or required.\n */\n latency?: ConstrainDouble;\n\n /**\n * whether noise suppression is preferred and/or required.\n */\n noiseSuppression?: ConstrainBoolean;\n\n /**\n * the sample rate or range of sample rates which are acceptable and/or required.\n */\n sampleRate?: ConstrainULong;\n\n /**\n * sample size or range of sample sizes which are acceptable and/or required.\n */\n sampleSize?: ConstrainULong;\n}\n\nexport interface AudioOutputOptions {\n /**\n * deviceId to output audio\n *\n * Only supported on browsers where `setSinkId` is available\n */\n deviceId?: string;\n}\n\nexport interface VideoResolution {\n width: number;\n height: number;\n frameRate?: number;\n aspectRatio?: number;\n}\n\nexport interface VideoEncoding {\n maxBitrate: number;\n maxFramerate?: number;\n priority?: RTCPriorityType;\n}\n\nexport class VideoPreset {\n encoding: VideoEncoding;\n\n width: number;\n\n height: number;\n\n constructor(\n width: number,\n height: number,\n maxBitrate: number,\n maxFramerate?: number,\n priority?: RTCPriorityType,\n ) {\n this.width = width;\n this.height = height;\n this.encoding = {\n maxBitrate,\n maxFramerate,\n priority,\n };\n }\n\n get resolution(): VideoResolution {\n return {\n width: this.width,\n height: this.height,\n frameRate: this.encoding.maxFramerate,\n aspectRatio: this.width / this.height,\n };\n }\n}\n\nexport interface AudioPreset {\n maxBitrate: number;\n priority?: RTCPriorityType;\n}\n\nconst backupCodecs = ['vp8', 'h264'] as const;\n\nexport const videoCodecs = ['vp8', 'h264', 'vp9', 'av1'] as const;\n\nexport type VideoCodec = (typeof videoCodecs)[number];\n\nexport type BackupVideoCodec = (typeof backupCodecs)[number];\n\nexport function isBackupCodec(codec: string): codec is BackupVideoCodec {\n return !!backupCodecs.find((backup) => backup === codec);\n}\n\nexport function isCodecEqual(c1: string | undefined, c2: string | undefined): boolean {\n return (\n c1?.toLowerCase().replace(/audio\\/|video\\//y, '') ===\n c2?.toLowerCase().replace(/audio\\/|video\\//y, '')\n );\n}\n\n/**\n * scalability modes for svc, only supprot l3t3 now.\n */\nexport type ScalabilityMode = 'L3T3' | 'L3T3_KEY';\n\nexport namespace AudioPresets {\n export const telephone: AudioPreset = {\n maxBitrate: 12_000,\n };\n export const speech: AudioPreset = {\n maxBitrate: 20_000,\n };\n export const music: AudioPreset = {\n maxBitrate: 32_000,\n };\n export const musicStereo: AudioPreset = {\n maxBitrate: 48_000,\n };\n export const musicHighQuality: AudioPreset = {\n maxBitrate: 64_000,\n };\n export const musicHighQualityStereo: AudioPreset = {\n maxBitrate: 96_000,\n };\n}\n\n/**\n * Sane presets for video resolution/encoding\n */\nexport const VideoPresets = {\n h90: new VideoPreset(160, 90, 90_000, 20),\n h180: new VideoPreset(320, 180, 160_000, 20),\n h216: new VideoPreset(384, 216, 180_000, 20),\n h360: new VideoPreset(640, 360, 450_000, 20),\n h540: new VideoPreset(960, 540, 800_000, 25),\n h720: new VideoPreset(1280, 720, 1_700_000, 30),\n h1080: new VideoPreset(1920, 1080, 3_000_000, 30),\n h1440: new VideoPreset(2560, 1440, 5_000_000, 30),\n h2160: new VideoPreset(3840, 2160, 8_000_000, 30),\n} as const;\n\n/**\n * Four by three presets\n */\nexport const VideoPresets43 = {\n h120: new VideoPreset(160, 120, 70_000, 20),\n h180: new VideoPreset(240, 180, 125_000, 20),\n h240: new VideoPreset(320, 240, 140_000, 20),\n h360: new VideoPreset(480, 360, 225_000, 20),\n h480: new VideoPreset(640, 480, 500_000, 20),\n h540: new VideoPreset(720, 540, 600_000, 25),\n h720: new VideoPreset(960, 720, 1_300_000, 30),\n h1080: new VideoPreset(1440, 1080, 2_300_000, 30),\n h1440: new VideoPreset(1920, 1440, 3_800_000, 30),\n} as const;\n\nexport const ScreenSharePresets = {\n h360fps3: new VideoPreset(640, 360, 200_000, 3, 'medium'),\n h720fps5: new VideoPreset(1280, 720, 400_000, 5, 'medium'),\n h720fps15: new VideoPreset(1280, 720, 1_500_000, 15, 'medium'),\n h720fps30: new VideoPreset(1280, 720, 2_000_000, 30, 'medium'),\n h1080fps15: new VideoPreset(1920, 1080, 2_500_000, 15, 'medium'),\n h1080fps30: new VideoPreset(1920, 1080, 4_000_000, 30, 'medium'),\n} as const;\n","import { videoCodecs } from '../room/track/options';\nimport type { VideoCodec } from '../room/track/options';\nimport { ENCRYPTION_ALGORITHM } from './constants';\n\nexport function isE2EESupported() {\n return isInsertableStreamSupported() || isScriptTransformSupported();\n}\n\nexport function isScriptTransformSupported() {\n // @ts-ignore\n return typeof window.RTCRtpScriptTransform !== 'undefined';\n}\n\nexport function isInsertableStreamSupported() {\n return (\n typeof window.RTCRtpSender !== 'undefined' &&\n // @ts-ignore\n typeof window.RTCRtpSender.prototype.createEncodedStreams !== 'undefined'\n );\n}\n\nexport function isVideoFrame(\n frame: RTCEncodedAudioFrame | RTCEncodedVideoFrame,\n): frame is RTCEncodedVideoFrame {\n return 'type' in frame;\n}\n\nexport async function importKey(\n keyBytes: Uint8Array | ArrayBuffer,\n algorithm: string | { name: string } = { name: ENCRYPTION_ALGORITHM },\n usage: 'derive' | 'encrypt' = 'encrypt',\n) {\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey\n return crypto.subtle.importKey(\n 'raw',\n keyBytes,\n algorithm,\n false,\n usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt'],\n );\n}\n\nexport async function createKeyMaterialFromString(password: string) {\n let enc = new TextEncoder();\n\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n enc.encode(password),\n {\n name: 'PBKDF2',\n },\n false,\n ['deriveBits', 'deriveKey'],\n );\n\n return keyMaterial;\n}\n\nfunction getAlgoOptions(algorithmName: string, salt: string) {\n const textEncoder = new TextEncoder();\n const encodedSalt = textEncoder.encode(salt);\n switch (algorithmName) {\n case 'HKDF':\n return {\n name: 'HKDF',\n salt: encodedSalt,\n hash: 'SHA-256',\n info: new ArrayBuffer(128),\n };\n case 'PBKDF2': {\n return {\n name: 'PBKDF2',\n salt: encodedSalt,\n hash: 'SHA-256',\n iterations: 100000,\n };\n }\n default:\n throw new Error(`algorithm ${algorithmName} is currently unsupported`);\n }\n}\n\n/**\n * Derives a set of keys from the master key.\n * See https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.1\n */\nexport async function deriveKeys(material: CryptoKey, salt: string) {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#HKDF\n // https://developer.mozilla.org/en-US/docs/Web/API/HkdfParams\n const encryptionKey = await crypto.subtle.deriveKey(\n algorithmOptions,\n material,\n {\n name: ENCRYPTION_ALGORITHM,\n length: 128,\n },\n false,\n ['encrypt', 'decrypt'],\n );\n\n return { material, encryptionKey };\n}\n\nexport function createE2EEKey(): Uint8Array {\n return window.crypto.getRandomValues(new Uint8Array(32));\n}\n\nexport function mimeTypeToVideoCodecString(mimeType: string) {\n const codec = mimeType.split('/')[1].toLowerCase() as VideoCodec;\n if (!videoCodecs.includes(codec)) {\n throw Error(`Video codec not supported: ${codec}`);\n }\n return codec;\n}\n\n/**\n * Ratchets a key. See\n * https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1\n */\nexport async function ratchet(material: CryptoKey, salt: string): Promise<ArrayBuffer> {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits\n return crypto.subtle.deriveBits(algorithmOptions, material, 256);\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n// TODO code inspired by https://github.com/webrtc/samples/blob/gh-pages/src/content/insertable-streams/endtoend-encryption/js/worker.js\nimport { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { workerLogger } from '../../logger';\nimport type { VideoCodec } from '../../room/track/options';\nimport { ENCRYPTION_ALGORITHM, IV_LENGTH, UNENCRYPTED_BYTES } from '../constants';\nimport { CryptorError, CryptorErrorReason } from '../errors';\nimport {\n CryptorCallbacks,\n CryptorEvent,\n DecodeRatchetOptions,\n KeyProviderOptions,\n KeySet,\n} from '../types';\nimport { deriveKeys, isVideoFrame } from '../utils';\nimport type { ParticipantKeyHandler } from './ParticipantKeyHandler';\n\nexport interface FrameCryptorConstructor {\n new (opts?: unknown): BaseFrameCryptor;\n}\n\nexport interface TransformerInfo {\n readable: ReadableStream;\n writable: WritableStream;\n transformer: TransformStream;\n abortController: AbortController;\n}\n\nexport class BaseFrameCryptor extends (EventEmitter as new () => TypedEventEmitter<CryptorCallbacks>) {\n encodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ): Promise<any> {\n throw Error('not implemented for subclass');\n }\n\n decodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ): Promise<any> {\n throw Error('not implemented for subclass');\n }\n}\n\n/**\n * Cryptor is responsible for en-/decrypting media frames.\n * Each Cryptor instance is responsible for en-/decrypting a single mediaStreamTrack.\n */\nexport class FrameCryptor extends BaseFrameCryptor {\n private sendCounts: Map<number, number>;\n\n private participantId: string | undefined;\n\n private trackId: string | undefined;\n\n private keys: ParticipantKeyHandler;\n\n private videoCodec?: VideoCodec;\n\n private rtpMap: Map<number, VideoCodec>;\n\n private keyProviderOptions: KeyProviderOptions;\n\n /**\n * used for detecting server injected unencrypted frames\n */\n private unencryptedFrameByteTrailer: Uint8Array;\n\n constructor(opts: {\n keys: ParticipantKeyHandler;\n participantId: string;\n keyProviderOptions: KeyProviderOptions;\n unencryptedFrameBytes?: Uint8Array;\n }) {\n super();\n this.sendCounts = new Map();\n this.keys = opts.keys;\n this.participantId = opts.participantId;\n this.rtpMap = new Map();\n this.keyProviderOptions = opts.keyProviderOptions;\n this.unencryptedFrameByteTrailer =\n opts.unencryptedFrameBytes ?? new TextEncoder().encode('LKROCKS');\n }\n\n /**\n * Assign a different participant to the cryptor.\n * useful for transceiver re-use\n * @param id\n * @param keys\n */\n setParticipant(id: string, keys: ParticipantKeyHandler) {\n this.participantId = id;\n this.keys = keys;\n }\n\n unsetParticipant() {\n this.participantId = undefined;\n }\n\n getParticipantId() {\n return this.participantId;\n }\n\n getTrackId() {\n return this.trackId;\n }\n\n /**\n * Update the video codec used by the mediaStreamTrack\n * @param codec\n */\n setVideoCodec(codec: VideoCodec) {\n this.videoCodec = codec;\n }\n\n /**\n * rtp payload type map used for figuring out codec of payload type when encoding\n * @param map\n */\n setRtpMap(map: Map<number, VideoCodec>) {\n this.rtpMap = map;\n }\n\n setupTransform(\n operation: 'encode' | 'decode',\n readable: ReadableStream,\n writable: WritableStream,\n trackId: string,\n codec?: VideoCodec,\n ) {\n if (codec) {\n console.info('setting codec on cryptor to', codec);\n this.videoCodec = codec;\n }\n const transformFn = operation === 'encode' ? this.encodeFunction : this.decodeFunction;\n const transformStream = new TransformStream({\n transform: transformFn.bind(this),\n });\n\n readable\n .pipeThrough(transformStream)\n .pipeTo(writable)\n .catch((e) => {\n console.error(e);\n this.emit('cryptorError', e instanceof CryptorError ? e : new CryptorError(e.message));\n });\n this.trackId = trackId;\n }\n\n /**\n * Function that will be injected in a stream and will encrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n *\n * The VP8 payload descriptor described in\n * https://tools.ietf.org/html/rfc7741#section-4.2\n * is part of the RTP packet and not part of the frame and is not controllable by us.\n * This is fine as the SFU keeps having access to it for routing.\n *\n * The encrypted frame is formed as follows:\n * 1) Find unencrypted byte length, depending on the codec, frame type and kind.\n * 2) Form the GCM IV for the frame as described above.\n * 3) Encrypt the rest of the frame using AES-GCM.\n * 4) Allocate space for the encrypted frame.\n * 5) Copy the unencrypted bytes to the start of the encrypted frame.\n * 6) Append the ciphertext to the encrypted frame.\n * 7) Append the IV.\n * 8) Append a single byte for the key identifier.\n * 9) Enqueue the encrypted frame for sending.\n */\n async encodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ) {\n if (\n !this.keys.isEnabled() ||\n // skip for encryption for empty dtx frames\n encodedFrame.data.byteLength === 0\n ) {\n return controller.enqueue(encodedFrame);\n }\n\n const { encryptionKey } = this.keys.getKeySet();\n const keyIndex = this.keys.getCurrentKeyIndex();\n\n if (encryptionKey) {\n const iv = this.makeIV(\n encodedFrame.getMetadata().synchronizationSource ?? -1,\n encodedFrame.timestamp,\n );\n\n // Thіs is not encrypted and contains the VP8 payload descriptor or the Opus TOC byte.\n const frameHeader = new Uint8Array(\n encodedFrame.data,\n 0,\n this.getUnencryptedBytes(encodedFrame),\n );\n\n // Frame trailer contains the R|IV_LENGTH and key index\n const frameTrailer = new Uint8Array(2);\n\n frameTrailer[0] = IV_LENGTH;\n frameTrailer[1] = keyIndex;\n\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n try {\n const cipherText = await crypto.subtle.encrypt(\n {\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),\n },\n encryptionKey,\n new Uint8Array(encodedFrame.data, this.getUnencryptedBytes(encodedFrame)),\n );\n\n const newData = new ArrayBuffer(\n frameHeader.byteLength + cipherText.byteLength + iv.byteLength + frameTrailer.byteLength,\n );\n const newUint8 = new Uint8Array(newData);\n\n newUint8.set(frameHeader); // copy first bytes.\n newUint8.set(new Uint8Array(cipherText), frameHeader.byteLength); // add ciphertext.\n newUint8.set(new Uint8Array(iv), frameHeader.byteLength + cipherText.byteLength); // append IV.\n newUint8.set(frameTrailer, frameHeader.byteLength + cipherText.byteLength + iv.byteLength); // append frame trailer.\n\n encodedFrame.data = newData;\n\n return controller.enqueue(encodedFrame);\n } catch (e: any) {\n // TODO: surface this to the app.\n workerLogger.error(e);\n }\n } else {\n this.emit(\n CryptorEvent.Error,\n new CryptorError(`encryption key missing for encoding`, CryptorErrorReason.MissingKey),\n );\n }\n }\n\n /**\n * Function that will be injected in a stream and will decrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n */\n async decodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ) {\n if (\n !this.keys.isEnabled() ||\n // skip for decryption for empty dtx frames\n encodedFrame.data.byteLength === 0 ||\n // skip decryption if frame is server injected\n isFrameServerInjected(encodedFrame.data, this.unencryptedFrameByteTrailer)\n ) {\n return controller.enqueue(encodedFrame);\n }\n const data = new Uint8Array(encodedFrame.data);\n const keyIndex = data[encodedFrame.data.byteLength - 1];\n\n if (this.keys.getKeySet(keyIndex) && this.keys.hasValidKey) {\n try {\n const decodedFrame = await this.decryptFrame(encodedFrame, keyIndex);\n this.keys.decryptionSuccess();\n if (decodedFrame) {\n return controller.enqueue(decodedFrame);\n }\n } catch (error) {\n if (error instanceof CryptorError && error.reason === CryptorErrorReason.InvalidKey) {\n if (this.keys.hasValidKey) {\n workerLogger.warn('invalid key');\n this.emit(\n CryptorEvent.Error,\n new CryptorError(\n `invalid key for participant ${this.participantId}`,\n CryptorErrorReason.InvalidKey,\n ),\n );\n this.keys.decryptionFailure();\n }\n } else {\n workerLogger.warn('decoding frame failed', { error });\n }\n }\n }\n\n return controller.enqueue(encodedFrame);\n }\n\n /**\n * Function that will decrypt the given encoded frame. If the decryption fails, it will\n * ratchet the key for up to RATCHET_WINDOW_SIZE times.\n */\n async decryptFrame(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n keyIndex: number,\n initialMaterial: KeySet | undefined = undefined,\n ratchetOpts: DecodeRatchetOptions = { ratchetCount: 0 },\n ): Promise<RTCEncodedVideoFrame | RTCEncodedAudioFrame | undefined> {\n const keySet = this.keys.getKeySet(keyIndex);\n\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n\n try {\n const frameHeader = new Uint8Array(\n encodedFrame.data,\n 0,\n this.getUnencryptedBytes(encodedFrame),\n );\n const frameTrailer = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - 2, 2);\n\n const ivLength = frameTrailer[0];\n const iv = new Uint8Array(\n encodedFrame.data,\n encodedFrame.data.byteLength - ivLength - frameTrailer.byteLength,\n ivLength,\n );\n\n const cipherTextStart = frameHeader.byteLength;\n const cipherTextLength =\n encodedFrame.data.byteLength -\n (frameHeader.byteLength + ivLength + frameTrailer.byteLength);\n\n const plainText = await crypto.subtle.decrypt(\n {\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),\n },\n ratchetOpts.encryptionKey ?? keySet.encryptionKey,\n new Uint8Array(encodedFrame.data, cipherTextStart, cipherTextLength),\n );\n\n const newData = new ArrayBuffer(frameHeader.byteLength + plainText.byteLength);\n const newUint8 = new Uint8Array(newData);\n\n newUint8.set(new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength));\n newUint8.set(new Uint8Array(plainText), frameHeader.byteLength);\n\n encodedFrame.data = newData;\n\n return encodedFrame;\n } catch (error: any) {\n if (this.keyProviderOptions.ratchetWindowSize > 0) {\n if (ratchetOpts.ratchetCount < this.keyProviderOptions.ratchetWindowSize) {\n workerLogger.debug(\n `ratcheting key attempt ${ratchetOpts.ratchetCount} of ${\n this.keyProviderOptions.ratchetWindowSize\n }, for kind ${encodedFrame instanceof RTCEncodedAudioFrame ? 'audio' : 'video'}`,\n );\n\n let ratchetedKeySet: KeySet | undefined;\n if (keySet === this.keys.getKeySet(keyIndex)) {\n // only ratchet if the currently set key is still the same as the one used to decrypt this frame\n // if not, it might be that a different frame has already ratcheted and we try with that one first\n const newMaterial = await this.keys.ratchetKey(keyIndex, false);\n\n ratchetedKeySet = await deriveKeys(newMaterial, this.keyProviderOptions.ratchetSalt);\n }\n\n const frame = await this.decryptFrame(encodedFrame, keyIndex, initialMaterial || keySet, {\n ratchetCount: ratchetOpts.ratchetCount + 1,\n encryptionKey: ratchetedKeySet?.encryptionKey,\n });\n if (frame && ratchetedKeySet) {\n this.keys.setKeySet(ratchetedKeySet, keyIndex, true);\n // decryption was successful, set the new key index to reflect the ratcheted key set\n this.keys.setCurrentKeyIndex(keyIndex);\n }\n return frame;\n } else {\n /**\n * Since the key it is first send and only afterwards actually used for encrypting, there were\n * situations when the decrypting failed due to the fact that the received frame was not encrypted\n * yet and ratcheting, of course, did not solve the problem. So if we fail RATCHET_WINDOW_SIZE times,\n * we come back to the initial key.\n */\n if (initialMaterial) {\n workerLogger.debug('resetting to initial material');\n this.keys.setKeyFromMaterial(initialMaterial.material, keyIndex);\n }\n\n workerLogger.warn('maximum ratchet attempts exceeded, resetting key');\n this.emit(\n CryptorEvent.Error,\n new CryptorError(\n `valid key missing for participant ${this.participantId}`,\n CryptorErrorReason.MissingKey,\n ),\n );\n }\n } else {\n throw new CryptorError(\n 'Decryption failed, most likely because of an invalid key',\n CryptorErrorReason.InvalidKey,\n );\n }\n }\n }\n\n /**\n * Construct the IV used for AES-GCM and sent (in plain) with the packet similar to\n * https://tools.ietf.org/html/rfc7714#section-8.1\n * It concatenates\n * - the 32 bit synchronization source (SSRC) given on the encoded frame,\n * - the 32 bit rtp timestamp given on the encoded frame,\n * - a send counter that is specific to the SSRC. Starts at a random number.\n * The send counter is essentially the pictureId but we currently have to implement this ourselves.\n * There is no XOR with a salt. Note that this IV leaks the SSRC to the receiver but since this is\n * randomly generated and SFUs may not rewrite this is considered acceptable.\n * The SSRC is used to allow demultiplexing multiple streams with the same key, as described in\n * https://tools.ietf.org/html/rfc3711#section-4.1.1\n * The RTP timestamp is 32 bits and advances by the codec clock rate (90khz for video, 48khz for\n * opus audio) every second. For video it rolls over roughly every 13 hours.\n * The send counter will advance at the frame rate (30fps for video, 50fps for 20ms opus audio)\n * every second. It will take a long time to roll over.\n *\n * See also https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams\n */\n private makeIV(synchronizationSource: number, timestamp: number) {\n const iv = new ArrayBuffer(IV_LENGTH);\n const ivView = new DataView(iv);\n\n // having to keep our own send count (similar to a picture id) is not ideal.\n if (!this.sendCounts.has(synchronizationSource)) {\n // Initialize with a random offset, similar to the RTP sequence number.\n this.sendCounts.set(synchronizationSource, Math.floor(Math.random() * 0xffff));\n }\n\n const sendCount = this.sendCounts.get(synchronizationSource) ?? 0;\n\n ivView.setUint32(0, synchronizationSource);\n ivView.setUint32(4, timestamp);\n ivView.setUint32(8, timestamp - (sendCount % 0xffff));\n\n this.sendCounts.set(synchronizationSource, sendCount + 1);\n\n return iv;\n }\n\n getUnencryptedBytes(frame: RTCEncodedVideoFrame | RTCEncodedAudioFrame): number {\n if (isVideoFrame(frame)) {\n let detectedCodec = this.getVideoCodec(frame) ?? this.videoCodec;\n\n if (detectedCodec === 'av1' || detectedCodec === 'vp9') {\n throw new Error(`${detectedCodec} is not yet supported for end to end encryption`);\n }\n\n if (detectedCodec === 'vp8') {\n return UNENCRYPTED_BYTES[frame.type];\n }\n\n const data = new Uint8Array(frame.data);\n try {\n const naluIndices = findNALUIndices(data);\n\n // if the detected codec is undefined we test whether it _looks_ like a h264 frame as a best guess\n const isH264 =\n detectedCodec === 'h264' ||\n naluIndices.some((naluIndex) =>\n [NALUType.SLICE_IDR, NALUType.SLICE_NON_IDR].includes(parseNALUType(data[naluIndex])),\n );\n\n if (isH264) {\n for (const index of naluIndices) {\n let type = parseNALUType(data[index]);\n switch (type) {\n case NALUType.SLICE_IDR:\n case NALUType.SLICE_NON_IDR:\n return index + 2;\n default:\n break;\n }\n }\n throw new TypeError('Could not find NALU');\n }\n } catch (e) {\n // no op, we just continue and fallback to vp8\n }\n\n return UNENCRYPTED_BYTES[frame.type];\n } else {\n return UNENCRYPTED_BYTES.audio;\n }\n }\n\n /**\n * inspects frame payloadtype if available and maps it to the codec specified in rtpMap\n */\n getVideoCodec(frame: RTCEncodedVideoFrame): VideoCodec | undefined {\n if (this.rtpMap.size === 0) {\n return undefined;\n }\n // @ts-expect-error payloadType is not yet part of the typescript definition and currently not supported in Safari\n const payloadType = frame.getMetadata().payloadType;\n const codec = payloadType ? this.rtpMap.get(payloadType) : undefined;\n return codec;\n }\n}\n\n/**\n * Slice the NALUs present in the supplied buffer, assuming it is already byte-aligned\n * code adapted from https://github.com/medooze/h264-frame-parser/blob/main/lib/NalUnits.ts to return indices only\n */\nexport function findNALUIndices(stream: Uint8Array): number[] {\n const result: number[] = [];\n let start = 0,\n pos = 0,\n searchLength = stream.length - 2;\n while (pos < searchLength) {\n // skip until end of current NALU\n while (\n pos < searchLength &&\n !(stream[pos] === 0 && stream[pos + 1] === 0 && stream[pos + 2] === 1)\n )\n pos++;\n if (pos >= searchLength) pos = stream.length;\n // remove trailing zeros from current NALU\n let end = pos;\n while (end > start && stream[end - 1] === 0) end--;\n // save current NALU\n if (start === 0) {\n if (end !== start) throw TypeError('byte stream contains leading data');\n } else {\n result.push(start);\n }\n // begin new NALU\n start = pos = pos + 3;\n }\n return result;\n}\n\nexport function parseNALUType(startByte: number): NALUType {\n return startByte & kNaluTypeMask;\n}\n\nconst kNaluTypeMask = 0x1f;\n\nexport enum NALUType {\n /** Coded slice of a non-IDR picture */\n SLICE_NON_IDR = 1,\n /** Coded slice data partition A */\n SLICE_PARTITION_A = 2,\n /** Coded slice data partition B */\n SLICE_PARTITION_B = 3,\n /** Coded slice data partition C */\n SLICE_PARTITION_C = 4,\n /** Coded slice of an IDR picture */\n SLICE_IDR = 5,\n /** Supplemental enhancement information */\n SEI = 6,\n /** Sequence parameter set */\n SPS = 7,\n /** Picture parameter set */\n PPS = 8,\n /** Access unit delimiter */\n AUD = 9,\n /** End of sequence */\n END_SEQ = 10,\n /** End of stream */\n END_STREAM = 11,\n /** Filler data */\n FILLER_DATA = 12,\n /** Sequence parameter set extension */\n SPS_EXT = 13,\n /** Prefix NAL unit */\n PREFIX_NALU = 14,\n /** Subset sequence parameter set */\n SUBSET_SPS = 15,\n /** Depth parameter set */\n DPS = 16,\n\n // 17, 18 reserved\n\n /** Coded slice of an auxiliary coded picture without partitioning */\n SLICE_AUX = 19,\n /** Coded slice extension */\n SLICE_EXT = 20,\n /** Coded slice extension for a depth view component or a 3D-AVC texture view component */\n SLICE_LAYER_EXT = 21,\n\n // 22, 23 reserved\n}\n\n/**\n * we use a magic frame trailer to detect whether a frame is injected\n * by the livekit server and thus to be treated as unencrypted\n * @internal\n */\nexport function isFrameServerInjected(frameData: ArrayBuffer, trailerBytes: Uint8Array): boolean {\n const frameTrailer = new Uint8Array(\n frameData.slice(frameData.byteLength - trailerBytes.byteLength),\n );\n return trailerBytes.every((value, index) => value === frameTrailer[index]);\n}\n","import { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { workerLogger } from '../../logger';\nimport { KEYRING_SIZE } from '../constants';\nimport type { KeyProviderOptions, KeySet, ParticipantKeyHandlerCallbacks } from '../types';\nimport { deriveKeys, importKey, ratchet } from '../utils';\n\n// TODO ParticipantKeyHandlers currently don't get destroyed on participant disconnect\n// we could do this by having a separate worker message on participant disconnected.\n\n/**\n * ParticipantKeyHandler is responsible for providing a cryptor instance with the\n * en-/decryption key of a participant. It assumes that all tracks of a specific participant\n * are encrypted with the same key.\n * Additionally it exposes a method to ratchet a key which can be used by the cryptor either automatically\n * if decryption fails or can be triggered manually on both sender and receiver side.\n *\n */\nexport class ParticipantKeyHandler extends (EventEmitter as new () => TypedEventEmitter<ParticipantKeyHandlerCallbacks>) {\n private currentKeyIndex: number;\n\n private cryptoKeyRing: Array<KeySet>;\n\n private enabled: boolean;\n\n private keyProviderOptions: KeyProviderOptions;\n\n private ratchetPromiseMap: Map<number, Promise<CryptoKey>>;\n\n private participantId: string | undefined;\n\n private decryptionFailureCount = 0;\n\n private _hasValidKey: boolean = true;\n\n get hasValidKey() {\n return this._hasValidKey;\n }\n\n constructor(\n participantId: string | undefined,\n isEnabled: boolean,\n keyProviderOptions: KeyProviderOptions,\n ) {\n super();\n this.currentKeyIndex = 0;\n this.cryptoKeyRing = new Array(KEYRING_SIZE);\n this.enabled = isEnabled;\n this.keyProviderOptions = keyProviderOptions;\n this.ratchetPromiseMap = new Map();\n this.participantId = participantId;\n this.resetKeyStatus();\n }\n\n setEnabled(enabled: boolean) {\n this.enabled = enabled;\n }\n\n decryptionFailure() {\n if (this.keyProviderOptions.failureTolerance < 0) {\n return;\n }\n this.decryptionFailureCount += 1;\n\n if (this.decryptionFailureCount > this.keyProviderOptions.failureTolerance) {\n this._hasValidKey = false;\n }\n }\n\n decryptionSuccess() {\n this.resetKeyStatus();\n }\n\n /**\n * Call this after user initiated ratchet or a new key has been set in order to make sure to mark potentially\n * invalid keys as valid again\n */\n resetKeyStatus() {\n this.decryptionFailureCount = 0;\n this._hasValidKey = true;\n }\n\n /**\n * Ratchets the current key (or the one at keyIndex if provided) and\n * returns the ratcheted material\n * if `setKey` is true (default), it will also set the ratcheted key directly on the crypto key ring\n * @param keyIndex\n * @param setKey\n */\n ratchetKey(keyIndex?: number, setKey = true): Promise<CryptoKey> {\n const currentKeyIndex = (keyIndex ??= this.getCurrentKeyIndex());\n\n const existingPromise = this.ratchetPromiseMap.get(currentKeyIndex);\n if (typeof existingPromise !== 'undefined') {\n return existingPromise;\n }\n const ratchetPromise = new Promise<CryptoKey>(async (resolve, reject) => {\n try {\n const currentMaterial = this.getKeySet(currentKeyIndex).material;\n const newMaterial = await importKey(\n await ratchet(currentMaterial, this.keyProviderOptions.ratchetSalt),\n currentMaterial.algorithm.name,\n 'derive',\n );\n\n if (setKey) {\n this.setKeyFromMaterial(newMaterial, currentKeyIndex, true);\n }\n this.emit('keyRatcheted', newMaterial, keyIndex, this.participantId);\n resolve(newMaterial);\n } catch (e) {\n reject(e);\n } finally {\n this.ratchetPromiseMap.delete(currentKeyIndex);\n }\n });\n this.ratchetPromiseMap.set(currentKeyIndex, ratchetPromise);\n return ratchetPromise;\n }\n\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffer\n * together with the material\n * also resets the valid key property and updates the currentKeyIndex\n */\n async setKey(material: CryptoKey, keyIndex = 0) {\n await this.setKeyFromMaterial(material, keyIndex);\n this.resetKeyStatus();\n }\n\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffer\n * together with the material\n * also updates the currentKeyIndex\n */\n async setKeyFromMaterial(material: CryptoKey, keyIndex = 0, emitRatchetEvent = false) {\n workerLogger.debug('setting new key');\n if (keyIndex >= 0) {\n this.currentKeyIndex = keyIndex % this.cryptoKeyRing.length;\n }\n const keySet = await deriveKeys(material, this.keyProviderOptions.ratchetSalt);\n this.setKeySet(keySet, this.currentKeyIndex, emitRatchetEvent);\n }\n\n async setKeySet(keySet: KeySet, keyIndex: number, emitRatchetEvent = false) {\n this.cryptoKeyRing[keyIndex % this.cryptoKeyRing.length] = keySet;\n if (emitRatchetEvent) {\n this.emit('keyRatcheted', keySet.material, keyIndex, this.participantId);\n }\n }\n\n async setCurrentKeyIndex(index: number) {\n this.currentKeyIndex = index % this.cryptoKeyRing.length;\n this.resetKeyStatus();\n }\n\n isEnabled() {\n return this.enabled;\n }\n\n getCurrentKeyIndex() {\n return this.currentKeyIndex;\n }\n\n /**\n * returns currently used KeySet or the one at `keyIndex` if provided\n * @param keyIndex\n * @returns\n */\n getKeySet(keyIndex?: number) {\n return this.cryptoKeyRing[keyIndex ?? this.currentKeyIndex];\n }\n}\n","import { workerLogger } from '../../logger';\nimport { KEY_PROVIDER_DEFAULTS } from '../constants';\nimport { CryptorErrorReason } from '../errors';\nimport type {\n E2EEWorkerMessage,\n EnableMessage,\n ErrorMessage,\n KeyProviderOptions,\n RatchetMessage,\n RatchetRequestMessage,\n} from '../types';\nimport { FrameCryptor } from './FrameCryptor';\nimport { ParticipantKeyHandler } from './ParticipantKeyHandler';\n\nconst participantCryptors: FrameCryptor[] = [];\nconst participantKeys: Map<string, ParticipantKeyHandler> = new Map();\n\nlet publishCryptors: FrameCryptor[] = [];\nlet publisherKeys: ParticipantKeyHandler;\n\nlet isEncryptionEnabled: boolean = false;\n\nlet useSharedKey: boolean = false;\n\nlet sharedKey: CryptoKey | undefined;\n\nlet keyProviderOptions: KeyProviderOptions = KEY_PROVIDER_DEFAULTS;\n\nworkerLogger.setDefaultLevel('info');\n\nonmessage = (ev) => {\n const { kind, data }: E2EEWorkerMessage = ev.data;\n\n switch (kind) {\n case 'init':\n workerLogger.info('worker initialized');\n keyProviderOptions = data.keyProviderOptions;\n useSharedKey = !!data.keyProviderOptions.sharedKey;\n // acknowledge init successful\n const enableMsg: EnableMessage = {\n kind: 'enable',\n data: { enabled: isEncryptionEnabled },\n };\n publisherKeys = new ParticipantKeyHandler(undefined, isEncryptionEnabled, keyProviderOptions);\n publisherKeys.on('keyRatcheted', emitRatchetedKeys);\n postMessage(enableMsg);\n break;\n case 'enable':\n setEncryptionEnabled(data.enabled, data.participantId);\n workerLogger.info('updated e2ee enabled status');\n // acknowledge enable call successful\n postMessage(ev.data);\n break;\n case 'decode':\n let cryptor = getTrackCryptor(data.participantId, data.trackId);\n cryptor.setupTransform(\n kind,\n data.readableStream,\n data.writableStream,\n data.trackId,\n data.codec,\n );\n break;\n case 'encode':\n let pubCryptor = getPublisherCryptor(data.trackId);\n pubCryptor.setupTransform(\n kind,\n data.readableStream,\n data.writableStream,\n data.trackId,\n data.codec,\n );\n break;\n case 'setKey':\n if (useSharedKey) {\n workerLogger.debug('set shared key');\n setSharedKey(data.key, data.keyIndex);\n } else if (data.participantId) {\n getParticipantKeyHandler(data.participantId).setKey(data.key, data.keyIndex);\n } else {\n workerLogger.error('no participant Id was provided and shared key usage is disabled');\n }\n break;\n case 'removeTransform':\n unsetCryptorParticipant(data.trackId);\n break;\n case 'updateCodec':\n getTrackCryptor(data.participantId, data.trackId).setVideoCodec(data.codec);\n break;\n case 'setRTPMap':\n publishCryptors.forEach((cr) => {\n cr.setRtpMap(data.map);\n });\n break;\n case 'ratchetRequest':\n handleRatchetRequest(data);\n default:\n break;\n }\n};\n\nasync function handleRatchetRequest(data: RatchetRequestMessage['data']) {\n const keyHandler = getParticipantKeyHandler(data.participantId);\n await keyHandler.ratchetKey(data.keyIndex);\n keyHandler.resetKeyStatus();\n}\n\nfunction getTrackCryptor(participantId: string, trackId: string) {\n let cryptor = participantCryptors.find((c) => c.getTrackId() === trackId);\n if (!cryptor) {\n workerLogger.info('creating new cryptor for', { participantId });\n if (!keyProviderOptions) {\n throw Error('Missing keyProvider options');\n }\n cryptor = new FrameCryptor({\n participantId,\n keys: getParticipantKeyHandler(participantId),\n keyProviderOptions,\n });\n\n setupCryptorErrorEvents(cryptor);\n participantCryptors.push(cryptor);\n } else if (participantId !== cryptor.getParticipantId()) {\n // assign new participant id to track cryptor and pass in correct key handler\n cryptor.setParticipant(participantId, getParticipantKeyHandler(participantId));\n }\n if (sharedKey) {\n }\n return cryptor;\n}\n\nfunction getParticipantKeyHandler(participantId?: string) {\n if (!participantId) {\n return publisherKeys!;\n }\n let keys = participantKeys.get(participantId);\n if (!keys) {\n keys = new ParticipantKeyHandler(participantId, true, keyProviderOptions);\n if (sharedKey) {\n keys.setKey(sharedKey);\n }\n participantKeys.set(participantId, keys);\n }\n return keys;\n}\n\nfunction unsetCryptorParticipant(trackId: string) {\n participantCryptors.find((c) => c.getTrackId() === trackId)?.unsetParticipant();\n}\n\nfunction getPublisherCryptor(trackId: string) {\n let publishCryptor = publishCryptors.find((cryptor) => cryptor.getTrackId() === trackId);\n if (!publishCryptor) {\n if (!keyProviderOptions) {\n throw new TypeError('Missing keyProvider options');\n }\n publishCryptor = new FrameCryptor({\n keys: publisherKeys!,\n participantId: 'publisher',\n keyProviderOptions,\n });\n setupCryptorErrorEvents(publishCryptor);\n publishCryptors.push(publishCryptor);\n }\n return publishCryptor;\n}\n\nfunction setEncryptionEnabled(enable: boolean, participantId?: string) {\n if (!participantId) {\n isEncryptionEnabled = enable;\n publisherKeys.setEnabled(enable);\n } else {\n getParticipantKeyHandler(participantId).setEnabled(enable);\n }\n}\n\nfunction setSharedKey(key: CryptoKey, index?: number) {\n workerLogger.debug('setting shared key');\n sharedKey = key;\n publisherKeys?.setKey(key, index);\n for (const [, keyHandler] of participantKeys) {\n keyHandler.setKey(key, index);\n }\n}\n\nfunction setupCryptorErrorEvents(cryptor: FrameCryptor) {\n cryptor.on('cryptorError', (error) => {\n const msg: ErrorMessage = {\n kind: 'error',\n data: { error: new Error(`${CryptorErrorReason[error.reason]}: ${error.message}`) },\n };\n postMessage(msg);\n });\n}\n\nfunction emitRatchetedKeys(material: CryptoKey, keyIndex?: number) {\n const msg: RatchetMessage = {\n kind: `ratchetKey`,\n data: {\n // participantId,\n keyIndex,\n material,\n },\n };\n postMessage(msg);\n}\n\n// Operations using RTCRtpScriptTransform.\n// @ts-ignore\nif (self.RTCTransformEvent) {\n workerLogger.debug('setup transform event');\n // @ts-ignore\n self.onrtctransform = (event) => {\n const transformer = event.transformer;\n workerLogger.debug('transformer', transformer);\n transformer.handled = true;\n const { kind, participantId, trackId, codec } = transformer.options;\n const cryptor =\n kind === 'encode' ? getPublisherCryptor(trackId) : getTrackCryptor(participantId, trackId);\n workerLogger.debug('transform', { codec });\n cryptor.setupTransform(kind, transformer.readable, transformer.writable, trackId, codec);\n };\n}\n"],"names":["root","definition","module","exports","log","this","noop","undefinedType","isIE","window","navigator","test","userAgent","logMethods","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","trace","realMethod","undefined","replaceLoggingMethods","level","loggerName","i","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","Logger","name","defaultLevel","factory","self","currentLevel","storageKey","persistLevelIfPossible","levelNum","levelName","toUpperCase","localStorage","ignore","document","cookie","encodeURIComponent","getPersistedLevel","storedLevel","location","indexOf","exec","slice","levels","clearPersistedLevel","removeItem","getLevel","setLevel","persist","SILENT","setDefaultLevel","resetLevel","enableAll","TRACE","disableAll","initialLevel","defaultLogger","_loggersByName","getLogger","TypeError","logger","_log","noConflict","getLoggers","LogLevel","livekitLogger","info","workerLogger","ENCRYPTION_ALGORITHM","KEYRING_SIZE","DECRYPTION_FAILURE_TOLERANCE","UNENCRYPTED_BYTES","key","delta","audio","empty","IV_LENGTH","SALT","KEY_PROVIDER_DEFAULTS","sharedKey","ratchetSalt","ratchetWindowSize","failureTolerance","LivekitError","Error","constructor","code","message","MediaDeviceFailure","getFailure","error","NotFound","PermissionDenied","DeviceInUse","Other","CryptorErrorReason","CryptorError","reason","InternalError","R","Reflect","ReflectApply","target","receiver","args","ReflectOwnKeys","ownKeys","Object","getOwnPropertySymbols","getOwnPropertyNames","concat","ProcessEmitWarning","warning","warn","NumberIsNaN","Number","isNaN","value","EventEmitter","init","eventsModule","once","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","defineProperty","enumerable","get","set","arg","RangeError","getPrototypeOf","create","setMaxListeners","n","_getMaxListeners","that","getMaxListeners","emit","type","push","doError","events","er","err","context","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","newListener","unshift","warned","w","String","emitter","count","addListener","on","prependListener","onceWrapper","fired","removeListener","wrapFn","_onceWrap","state","wrapped","prependOnceListener","list","position","originalListener","shift","spliceOne","off","removeAllListeners","keys","_listeners","unwrap","evlistener","unwrapListeners","rawListeners","listenerCount","eventNames","arr","copy","Array","index","pop","ret","Promise","resolve","reject","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","addEventListener","wrapListener","removeEventListener","CryptorEvent","AudioPresets","telephone","maxBitrate","speech","music","musicStereo","musicHighQuality","musicHighQualityStereo","isVideoFrame","frame","importKey","keyBytes","algorithm","usage","crypto","subtle","getAlgoOptions","algorithmName","salt","textEncoder","TextEncoder","encodedSalt","encode","hash","ArrayBuffer","iterations","deriveKeys","material","algorithmOptions","encryptionKey","deriveKey","ratchet","deriveBits","BaseFrameCryptor","encodeFunction","encodedFrame","controller","decodeFunction","FrameCryptor","opts","sendCounts","Map","participantId","rtpMap","keyProviderOptions","unencryptedFrameByteTrailer","_a","unencryptedFrameBytes","setParticipant","id","unsetParticipant","getParticipantId","getTrackId","trackId","setVideoCodec","codec","videoCodec","setRtpMap","map","setupTransform","operation","readable","writable","transformFn","transformStream","TransformStream","transform","pipeThrough","pipeTo","catch","isEnabled","data","byteLength","enqueue","getKeySet","keyIndex","getCurrentKeyIndex","iv","makeIV","getMetadata","synchronizationSource","timestamp","frameHeader","Uint8Array","getUnencryptedBytes","frameTrailer","cipherText","encrypt","additionalData","newData","newUint8","MissingKey","isFrameServerInjected","hasValidKey","decodedFrame","decryptFrame","decryptionSuccess","InvalidKey","decryptionFailure","initialMaterial","ratchetOpts","ratchetCount","keySet","ivLength","cipherTextStart","cipherTextLength","plainText","decrypt","RTCEncodedAudioFrame","ratchetedKeySet","newMaterial","ratchetKey","setKeySet","setCurrentKeyIndex","setKeyFromMaterial","ivView","DataView","has","Math","floor","random","sendCount","setUint32","detectedCodec","getVideoCodec","naluIndices","findNALUIndices","isH264","some","naluIndex","NALUType","SLICE_IDR","SLICE_NON_IDR","includes","parseNALUType","size","payloadType","stream","result","start","pos","searchLength","end","startByte","kNaluTypeMask","frameData","trailerBytes","every","ParticipantKeyHandler","_hasValidKey","decryptionFailureCount","currentKeyIndex","cryptoKeyRing","enabled","ratchetPromiseMap","resetKeyStatus","setEnabled","setKey","existingPromise","ratchetPromise","__awaiter","currentMaterial","delete","emitRatchetEvent","participantCryptors","participantKeys","publishCryptors","publisherKeys","isEncryptionEnabled","useSharedKey","onmessage","ev","kind","enableMsg","emitRatchetedKeys","postMessage","setEncryptionEnabled","cryptor","getTrackCryptor","readableStream","writableStream","pubCryptor","getPublisherCryptor","setSharedKey","getParticipantKeyHandler","unsetCryptorParticipant","forEach","cr","handleRatchetRequest","keyHandler","find","c","setupCryptorErrorEvents","publishCryptor","enable","msg","RTCTransformEvent","onrtctransform","event","transformer","handled","options"],"mappings":"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","x_google_ignoreList":[0,5]}
1
+ {"version":3,"file":"livekit-client.e2ee.worker.mjs","sources":["../node_modules/loglevel/lib/loglevel.js","../src/logger.ts","../src/e2ee/constants.ts","../src/room/errors.ts","../src/e2ee/errors.ts","../src/e2ee/events.ts","../node_modules/events/events.js","../src/room/track/options.ts","../src/e2ee/utils.ts","../src/e2ee/worker/SifGuard.ts","../src/e2ee/worker/FrameCryptor.ts","../src/e2ee/worker/ParticipantKeyHandler.ts","../src/e2ee/worker/e2ee.worker.ts"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n defaultLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = level;\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n self.setLevel(defaultLevel, false);\n clearPersistedLevel();\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","import * as log from 'loglevel';\n\nexport enum LogLevel {\n trace = 0,\n debug = 1,\n info = 2,\n warn = 3,\n error = 4,\n silent = 5,\n}\n\ntype LogLevelString = keyof typeof LogLevel;\n\ntype StructuredLogger = {\n trace: (msg: string, context?: object) => void;\n debug: (msg: string, context?: object) => void;\n info: (msg: string, context?: object) => void;\n warn: (msg: string, context?: object) => void;\n error: (msg: string, context?: object) => void;\n setDefaultLevel: (level: log.LogLevelDesc) => void;\n};\n\nconst livekitLogger = log.getLogger('livekit');\n\nlivekitLogger.setDefaultLevel(LogLevel.info);\n\nexport default livekitLogger as StructuredLogger;\n\nexport function setLogLevel(level: LogLevel | LogLevelString, loggerName?: 'livekit' | 'lk-e2ee') {\n if (loggerName) {\n log.getLogger(loggerName).setLevel(level);\n }\n for (const logger of Object.values(log.getLoggers())) {\n logger.setLevel(level);\n }\n}\n\nexport type LogExtension = (level: LogLevel, msg: string, context?: object) => void;\n\n/**\n * use this to hook into the logging function to allow sending internal livekit logs to third party services\n * if set, the browser logs will lose their stacktrace information (see https://github.com/pimterry/loglevel#writing-plugins)\n */\nexport function setLogExtension(extension: LogExtension) {\n const originalFactory = livekitLogger.methodFactory;\n\n livekitLogger.methodFactory = (methodName, configLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, configLevel, loggerName);\n\n const logLevel = LogLevel[methodName as LogLevelString];\n const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;\n\n return (msg, context?: [msg: string, context: object]) => {\n if (context) rawMethod(msg, context);\n else rawMethod(msg);\n if (needLog) {\n extension(logLevel, msg, context);\n }\n };\n };\n livekitLogger.setLevel(livekitLogger.getLevel()); // Be sure to call setLevel method in order to apply plugin\n}\n\nexport const workerLogger = log.getLogger('lk-e2ee') as StructuredLogger;\n","import type { KeyProviderOptions } from './types';\n\nexport const ENCRYPTION_ALGORITHM = 'AES-GCM';\n\n// We use a ringbuffer of keys so we can change them and still decode packets that were\n// encrypted with an old key. We use a size of 16 which corresponds to the four bits\n// in the frame trailer.\nexport const KEYRING_SIZE = 16;\n\n// How many consecutive frames can fail decrypting before a particular key gets marked as invalid\nexport const DECRYPTION_FAILURE_TOLERANCE = 10;\n\n// We copy the first bytes of the VP8 payload unencrypted.\n// For keyframes this is 10 bytes, for non-keyframes (delta) 3. See\n// https://tools.ietf.org/html/rfc6386#section-9.1\n// This allows the bridge to continue detecting keyframes (only one byte needed in the JVB)\n// and is also a bit easier for the VP8 decoder (i.e. it generates funny garbage pictures\n// instead of being unable to decode).\n// This is a bit for show and we might want to reduce to 1 unconditionally in the final version.\n//\n// For audio (where frame.type is not set) we do not encrypt the opus TOC byte:\n// https://tools.ietf.org/html/rfc6716#section-3.1\nexport const UNENCRYPTED_BYTES = {\n key: 10,\n delta: 3,\n audio: 1, // frame.type is not set on audio, so this is set manually\n empty: 0,\n} as const;\n\n/* We use a 12 byte bit IV. This is signalled in plain together with the\n packet. See https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt#parameters */\nexport const IV_LENGTH = 12;\n\n// flag set to indicate that e2ee has been setup for sender/receiver;\nexport const E2EE_FLAG = 'lk_e2ee';\n\nexport const SALT = 'LKFrameEncryptionKey';\n\nexport const KEY_PROVIDER_DEFAULTS: KeyProviderOptions = {\n sharedKey: false,\n ratchetSalt: SALT,\n ratchetWindowSize: 8,\n failureTolerance: DECRYPTION_FAILURE_TOLERANCE,\n} as const;\n\nexport const MAX_SIF_COUNT = 100;\nexport const MAX_SIF_DURATION = 2000;\n","export class LivekitError extends Error {\n code: number;\n\n constructor(code: number, message?: string) {\n super(message || 'an error has occured');\n this.code = code;\n }\n}\n\nexport const enum ConnectionErrorReason {\n NotAllowed,\n ServerUnreachable,\n InternalError,\n Cancelled,\n}\n\nexport class ConnectionError extends LivekitError {\n status?: number;\n\n reason?: ConnectionErrorReason;\n\n constructor(message?: string, reason?: ConnectionErrorReason, status?: number) {\n super(1, message);\n this.status = status;\n this.reason = reason;\n }\n}\n\nexport class DeviceUnsupportedError extends LivekitError {\n constructor(message?: string) {\n super(21, message ?? 'device is unsupported');\n }\n}\n\nexport class TrackInvalidError extends LivekitError {\n constructor(message?: string) {\n super(20, message ?? 'track is invalid');\n }\n}\n\nexport class UnsupportedServer extends LivekitError {\n constructor(message?: string) {\n super(10, message ?? 'unsupported server');\n }\n}\n\nexport class UnexpectedConnectionState extends LivekitError {\n constructor(message?: string) {\n super(12, message ?? 'unexpected connection state');\n }\n}\n\nexport class NegotiationError extends LivekitError {\n constructor(message?: string) {\n super(13, message ?? 'unable to negotiate');\n }\n}\n\nexport class PublishDataError extends LivekitError {\n constructor(message?: string) {\n super(13, message ?? 'unable to publish data');\n }\n}\n\nexport enum MediaDeviceFailure {\n // user rejected permissions\n PermissionDenied = 'PermissionDenied',\n // device is not available\n NotFound = 'NotFound',\n // device is in use. On Windows, only a single tab may get access to a device at a time.\n DeviceInUse = 'DeviceInUse',\n Other = 'Other',\n}\n\nexport namespace MediaDeviceFailure {\n export function getFailure(error: any): MediaDeviceFailure | undefined {\n if (error && 'name' in error) {\n if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') {\n return MediaDeviceFailure.NotFound;\n }\n if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {\n return MediaDeviceFailure.PermissionDenied;\n }\n if (error.name === 'NotReadableError' || error.name === 'TrackStartError') {\n return MediaDeviceFailure.DeviceInUse;\n }\n return MediaDeviceFailure.Other;\n }\n }\n}\n","import { LivekitError } from '../room/errors';\n\nexport enum CryptorErrorReason {\n InvalidKey = 0,\n MissingKey = 1,\n InternalError = 2,\n}\n\nexport class CryptorError extends LivekitError {\n reason: CryptorErrorReason;\n\n constructor(message?: string, reason: CryptorErrorReason = CryptorErrorReason.InternalError) {\n super(40, message);\n this.reason = reason;\n }\n}\n","import type Participant from '../room/participant/Participant';\nimport type { CryptorError } from './errors';\nimport type { KeyInfo } from './types';\n\nexport enum KeyProviderEvent {\n SetKey = 'setKey',\n RatchetRequest = 'ratchetRequest',\n KeyRatcheted = 'keyRatcheted',\n}\n\nexport type KeyProviderCallbacks = {\n [KeyProviderEvent.SetKey]: (keyInfo: KeyInfo) => void;\n [KeyProviderEvent.RatchetRequest]: (participantIdentity?: string, keyIndex?: number) => void;\n [KeyProviderEvent.KeyRatcheted]: (material: CryptoKey, keyIndex?: number) => void;\n};\n\nexport enum KeyHandlerEvent {\n KeyRatcheted = 'keyRatcheted',\n}\n\nexport type ParticipantKeyHandlerCallbacks = {\n [KeyHandlerEvent.KeyRatcheted]: (\n material: CryptoKey,\n participantIdentity: string,\n keyIndex?: number,\n ) => void;\n};\n\nexport enum EncryptionEvent {\n ParticipantEncryptionStatusChanged = 'participantEncryptionStatusChanged',\n EncryptionError = 'encryptionError',\n}\n\nexport type E2EEManagerCallbacks = {\n [EncryptionEvent.ParticipantEncryptionStatusChanged]: (\n enabled: boolean,\n participant: Participant,\n ) => void;\n [EncryptionEvent.EncryptionError]: (error: Error) => void;\n};\n\nexport type CryptorCallbacks = {\n [CryptorEvent.Error]: (error: CryptorError) => void;\n};\n\nexport enum CryptorEvent {\n Error = 'cryptorError',\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","import type { Track } from './Track';\n\nexport interface TrackPublishDefaults {\n /**\n * encoding parameters for camera track\n */\n videoEncoding?: VideoEncoding;\n\n /**\n * @experimental\n */\n backupCodec?: { codec: BackupVideoCodec; encoding: VideoEncoding } | false;\n\n /**\n * encoding parameters for screen share track\n */\n screenShareEncoding?: VideoEncoding;\n\n /**\n * codec, defaults to vp8; for svc codecs, auto enable vp8\n * as backup. (TBD)\n */\n videoCodec?: VideoCodec;\n\n /**\n * max audio bitrate, defaults to [[AudioPresets.music]]\n * @deprecated use `audioPreset` instead\n */\n audioBitrate?: number;\n\n /**\n * which audio preset should be used for publishing (audio) tracks\n * defaults to [[AudioPresets.music]]\n */\n audioPreset?: AudioPreset;\n\n /**\n * dtx (Discontinuous Transmission of audio), enabled by default for mono tracks.\n */\n dtx?: boolean;\n\n /**\n * red (Redundant Audio Data), enabled by default for mono tracks.\n */\n red?: boolean;\n\n /**\n * publish track in stereo mode (or set to false to disable). defaults determined by capture channel count.\n */\n forceStereo?: boolean;\n\n /**\n * use simulcast, defaults to true.\n * When using simulcast, LiveKit will publish up to three versions of the stream\n * at various resolutions.\n */\n simulcast?: boolean;\n\n /**\n * scalability mode for svc codecs, defaults to 'L3T3'.\n * for svc codecs, simulcast is disabled.\n */\n scalabilityMode?: ScalabilityMode;\n\n /**\n * Up to two additional simulcast layers to publish in addition to the original\n * Track.\n * When left blank, it defaults to h180, h360.\n * If a SVC codec is used (VP9 or AV1), this field has no effect.\n *\n * To publish three total layers, you would specify:\n * {\n * videoEncoding: {...}, // encoding of the primary layer\n * videoSimulcastLayers: [\n * VideoPresets.h540,\n * VideoPresets.h216,\n * ],\n * }\n */\n videoSimulcastLayers?: Array<VideoPreset>;\n\n /**\n * custom video simulcast layers for screen tracks\n * Note: the layers need to be ordered from lowest to highest quality\n */\n screenShareSimulcastLayers?: Array<VideoPreset>;\n\n /**\n * For local tracks, stop the underlying MediaStreamTrack when the track is muted (or paused)\n * on some platforms, this option is necessary to disable the microphone recording indicator.\n * Note: when this is enabled, and BT devices are connected, they will transition between\n * profiles (e.g. HFP to A2DP) and there will be an audible difference in playback.\n *\n * defaults to false\n */\n stopMicTrackOnMute?: boolean;\n}\n\n/**\n * Options when publishing tracks\n */\nexport interface TrackPublishOptions extends TrackPublishDefaults {\n /**\n * set a track name\n */\n name?: string;\n\n /**\n * Source of track, camera, microphone, or screen\n */\n source?: Track.Source;\n}\n\nexport interface CreateLocalTracksOptions {\n /**\n * audio track options, true to create with defaults. false if audio shouldn't be created\n * default true\n */\n audio?: boolean | AudioCaptureOptions;\n\n /**\n * video track options, true to create with defaults. false if video shouldn't be created\n * default true\n */\n video?: boolean | VideoCaptureOptions;\n}\n\nexport interface VideoCaptureOptions {\n /**\n * A ConstrainDOMString object specifying a device ID or an array of device\n * IDs which are acceptable and/or required.\n */\n deviceId?: ConstrainDOMString;\n\n /**\n * a facing or an array of facings which are acceptable and/or required.\n */\n facingMode?: 'user' | 'environment' | 'left' | 'right';\n\n resolution?: VideoResolution;\n}\n\nexport interface ScreenShareCaptureOptions {\n /**\n * true to capture audio shared. browser support for audio capturing in\n * screenshare is limited: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#browser_compatibility\n */\n audio?: boolean | AudioCaptureOptions;\n\n /**\n * only allows for 'true' and chrome allows for additional options to be passed in\n * https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#displaySurface\n */\n video?: true | { displaySurface?: 'window' | 'browser' | 'monitor' };\n\n /** capture resolution, defaults to full HD */\n resolution?: VideoResolution;\n\n /** a CaptureController object instance containing methods that can be used to further manipulate the capture session if included. */\n controller?: unknown; // TODO replace type with CaptureController once it lands in TypeScript\n\n /** specifies whether the browser should allow the user to select the current tab for capture */\n selfBrowserSurface?: 'include' | 'exclude';\n\n /** specifies whether the browser should display a control to allow the user to dynamically switch the shared tab during screen-sharing. */\n surfaceSwitching?: 'include' | 'exclude';\n\n /** specifies whether the browser should include the system audio among the possible audio sources offered to the user */\n systemAudio?: 'include' | 'exclude';\n\n /**\n * Experimental option to control whether the audio playing in a tab will continue to be played out of a user's\n * local speakers when the tab is captured.\n */\n suppressLocalAudioPlayback?: boolean;\n}\n\nexport interface AudioCaptureOptions {\n /**\n * specifies whether automatic gain control is preferred and/or required\n */\n autoGainControl?: ConstrainBoolean;\n\n /**\n * the channel count or range of channel counts which are acceptable and/or required\n */\n channelCount?: ConstrainULong;\n\n /**\n * A ConstrainDOMString object specifying a device ID or an array of device\n * IDs which are acceptable and/or required.\n */\n deviceId?: ConstrainDOMString;\n\n /**\n * whether or not echo cancellation is preferred and/or required\n */\n echoCancellation?: ConstrainBoolean;\n\n /**\n * the latency or range of latencies which are acceptable and/or required.\n */\n latency?: ConstrainDouble;\n\n /**\n * whether noise suppression is preferred and/or required.\n */\n noiseSuppression?: ConstrainBoolean;\n\n /**\n * the sample rate or range of sample rates which are acceptable and/or required.\n */\n sampleRate?: ConstrainULong;\n\n /**\n * sample size or range of sample sizes which are acceptable and/or required.\n */\n sampleSize?: ConstrainULong;\n}\n\nexport interface AudioOutputOptions {\n /**\n * deviceId to output audio\n *\n * Only supported on browsers where `setSinkId` is available\n */\n deviceId?: string;\n}\n\nexport interface VideoResolution {\n width: number;\n height: number;\n frameRate?: number;\n aspectRatio?: number;\n}\n\nexport interface VideoEncoding {\n maxBitrate: number;\n maxFramerate?: number;\n priority?: RTCPriorityType;\n}\n\nexport class VideoPreset {\n encoding: VideoEncoding;\n\n width: number;\n\n height: number;\n\n constructor(\n width: number,\n height: number,\n maxBitrate: number,\n maxFramerate?: number,\n priority?: RTCPriorityType,\n ) {\n this.width = width;\n this.height = height;\n this.encoding = {\n maxBitrate,\n maxFramerate,\n priority,\n };\n }\n\n get resolution(): VideoResolution {\n return {\n width: this.width,\n height: this.height,\n frameRate: this.encoding.maxFramerate,\n aspectRatio: this.width / this.height,\n };\n }\n}\n\nexport interface AudioPreset {\n maxBitrate: number;\n priority?: RTCPriorityType;\n}\n\nconst backupCodecs = ['vp8', 'h264'] as const;\n\nexport const videoCodecs = ['vp8', 'h264', 'vp9', 'av1'] as const;\n\nexport type VideoCodec = (typeof videoCodecs)[number];\n\nexport type BackupVideoCodec = (typeof backupCodecs)[number];\n\nexport function isBackupCodec(codec: string): codec is BackupVideoCodec {\n return !!backupCodecs.find((backup) => backup === codec);\n}\n\nexport function isCodecEqual(c1: string | undefined, c2: string | undefined): boolean {\n return (\n c1?.toLowerCase().replace(/audio\\/|video\\//y, '') ===\n c2?.toLowerCase().replace(/audio\\/|video\\//y, '')\n );\n}\n\n/**\n * scalability modes for svc, only supprot l3t3 now.\n */\nexport type ScalabilityMode = 'L3T3' | 'L3T3_KEY';\n\nexport namespace AudioPresets {\n export const telephone: AudioPreset = {\n maxBitrate: 12_000,\n };\n export const speech: AudioPreset = {\n maxBitrate: 20_000,\n };\n export const music: AudioPreset = {\n maxBitrate: 32_000,\n };\n export const musicStereo: AudioPreset = {\n maxBitrate: 48_000,\n };\n export const musicHighQuality: AudioPreset = {\n maxBitrate: 64_000,\n };\n export const musicHighQualityStereo: AudioPreset = {\n maxBitrate: 96_000,\n };\n}\n\n/**\n * Sane presets for video resolution/encoding\n */\nexport const VideoPresets = {\n h90: new VideoPreset(160, 90, 90_000, 20),\n h180: new VideoPreset(320, 180, 160_000, 20),\n h216: new VideoPreset(384, 216, 180_000, 20),\n h360: new VideoPreset(640, 360, 450_000, 20),\n h540: new VideoPreset(960, 540, 800_000, 25),\n h720: new VideoPreset(1280, 720, 1_700_000, 30),\n h1080: new VideoPreset(1920, 1080, 3_000_000, 30),\n h1440: new VideoPreset(2560, 1440, 5_000_000, 30),\n h2160: new VideoPreset(3840, 2160, 8_000_000, 30),\n} as const;\n\n/**\n * Four by three presets\n */\nexport const VideoPresets43 = {\n h120: new VideoPreset(160, 120, 70_000, 20),\n h180: new VideoPreset(240, 180, 125_000, 20),\n h240: new VideoPreset(320, 240, 140_000, 20),\n h360: new VideoPreset(480, 360, 225_000, 20),\n h480: new VideoPreset(640, 480, 500_000, 20),\n h540: new VideoPreset(720, 540, 600_000, 25),\n h720: new VideoPreset(960, 720, 1_300_000, 30),\n h1080: new VideoPreset(1440, 1080, 2_300_000, 30),\n h1440: new VideoPreset(1920, 1440, 3_800_000, 30),\n} as const;\n\nexport const ScreenSharePresets = {\n h360fps3: new VideoPreset(640, 360, 200_000, 3, 'medium'),\n h720fps5: new VideoPreset(1280, 720, 400_000, 5, 'medium'),\n h720fps15: new VideoPreset(1280, 720, 1_500_000, 15, 'medium'),\n h720fps30: new VideoPreset(1280, 720, 2_000_000, 30, 'medium'),\n h1080fps15: new VideoPreset(1920, 1080, 2_500_000, 15, 'medium'),\n h1080fps30: new VideoPreset(1920, 1080, 4_000_000, 30, 'medium'),\n} as const;\n","import { videoCodecs } from '../room/track/options';\nimport type { VideoCodec } from '../room/track/options';\nimport { ENCRYPTION_ALGORITHM } from './constants';\n\nexport function isE2EESupported() {\n return isInsertableStreamSupported() || isScriptTransformSupported();\n}\n\nexport function isScriptTransformSupported() {\n // @ts-ignore\n return typeof window.RTCRtpScriptTransform !== 'undefined';\n}\n\nexport function isInsertableStreamSupported() {\n return (\n typeof window.RTCRtpSender !== 'undefined' &&\n // @ts-ignore\n typeof window.RTCRtpSender.prototype.createEncodedStreams !== 'undefined'\n );\n}\n\nexport function isVideoFrame(\n frame: RTCEncodedAudioFrame | RTCEncodedVideoFrame,\n): frame is RTCEncodedVideoFrame {\n return 'type' in frame;\n}\n\nexport async function importKey(\n keyBytes: Uint8Array | ArrayBuffer,\n algorithm: string | { name: string } = { name: ENCRYPTION_ALGORITHM },\n usage: 'derive' | 'encrypt' = 'encrypt',\n) {\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey\n return crypto.subtle.importKey(\n 'raw',\n keyBytes,\n algorithm,\n false,\n usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt'],\n );\n}\n\nexport async function createKeyMaterialFromString(password: string) {\n let enc = new TextEncoder();\n\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n enc.encode(password),\n {\n name: 'PBKDF2',\n },\n false,\n ['deriveBits', 'deriveKey'],\n );\n\n return keyMaterial;\n}\n\nexport async function createKeyMaterialFromBuffer(cryptoBuffer: ArrayBuffer) {\n const keyMaterial = await crypto.subtle.importKey('raw', cryptoBuffer, 'HKDF', false, [\n 'deriveBits',\n 'deriveKey',\n ]);\n\n return keyMaterial;\n}\n\nfunction getAlgoOptions(algorithmName: string, salt: string) {\n const textEncoder = new TextEncoder();\n const encodedSalt = textEncoder.encode(salt);\n switch (algorithmName) {\n case 'HKDF':\n return {\n name: 'HKDF',\n salt: encodedSalt,\n hash: 'SHA-256',\n info: new ArrayBuffer(128),\n };\n case 'PBKDF2': {\n return {\n name: 'PBKDF2',\n salt: encodedSalt,\n hash: 'SHA-256',\n iterations: 100000,\n };\n }\n default:\n throw new Error(`algorithm ${algorithmName} is currently unsupported`);\n }\n}\n\n/**\n * Derives a set of keys from the master key.\n * See https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.1\n */\nexport async function deriveKeys(material: CryptoKey, salt: string) {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#HKDF\n // https://developer.mozilla.org/en-US/docs/Web/API/HkdfParams\n const encryptionKey = await crypto.subtle.deriveKey(\n algorithmOptions,\n material,\n {\n name: ENCRYPTION_ALGORITHM,\n length: 128,\n },\n false,\n ['encrypt', 'decrypt'],\n );\n\n return { material, encryptionKey };\n}\n\nexport function createE2EEKey(): Uint8Array {\n return window.crypto.getRandomValues(new Uint8Array(32));\n}\n\nexport function mimeTypeToVideoCodecString(mimeType: string) {\n const codec = mimeType.split('/')[1].toLowerCase() as VideoCodec;\n if (!videoCodecs.includes(codec)) {\n throw Error(`Video codec not supported: ${codec}`);\n }\n return codec;\n}\n\n/**\n * Ratchets a key. See\n * https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1\n */\nexport async function ratchet(material: CryptoKey, salt: string): Promise<ArrayBuffer> {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits\n return crypto.subtle.deriveBits(algorithmOptions, material, 256);\n}\n","import { MAX_SIF_COUNT, MAX_SIF_DURATION } from '../constants';\n\nexport class SifGuard {\n private consecutiveSifCount = 0;\n\n private sifSequenceStartedAt: number | undefined;\n\n private lastSifReceivedAt: number = 0;\n\n private userFramesSinceSif: number = 0;\n\n recordSif() {\n this.consecutiveSifCount += 1;\n this.sifSequenceStartedAt ??= Date.now();\n this.lastSifReceivedAt = Date.now();\n }\n\n recordUserFrame() {\n if (this.sifSequenceStartedAt === undefined) {\n return;\n } else {\n this.userFramesSinceSif += 1;\n }\n if (\n // reset if we received more user frames than SIFs\n this.userFramesSinceSif > this.consecutiveSifCount ||\n // also reset if we got a new user frame and the latest SIF frame hasn't been updated in a while\n Date.now() - this.lastSifReceivedAt > MAX_SIF_DURATION\n ) {\n this.reset();\n }\n }\n\n isSifAllowed() {\n return (\n this.consecutiveSifCount < MAX_SIF_COUNT &&\n (this.sifSequenceStartedAt === undefined ||\n Date.now() - this.sifSequenceStartedAt < MAX_SIF_DURATION)\n );\n }\n\n reset() {\n this.userFramesSinceSif = 0;\n this.consecutiveSifCount = 0;\n this.sifSequenceStartedAt = undefined;\n }\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n// TODO code inspired by https://github.com/webrtc/samples/blob/gh-pages/src/content/insertable-streams/endtoend-encryption/js/worker.js\nimport { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { workerLogger } from '../../logger';\nimport type { VideoCodec } from '../../room/track/options';\nimport { ENCRYPTION_ALGORITHM, IV_LENGTH, UNENCRYPTED_BYTES } from '../constants';\nimport { CryptorError, CryptorErrorReason } from '../errors';\nimport { CryptorCallbacks, CryptorEvent } from '../events';\nimport type { DecodeRatchetOptions, KeyProviderOptions, KeySet } from '../types';\nimport { deriveKeys, isVideoFrame } from '../utils';\nimport type { ParticipantKeyHandler } from './ParticipantKeyHandler';\nimport { SifGuard } from './SifGuard';\n\nexport const encryptionEnabledMap: Map<string, boolean> = new Map();\n\nexport interface FrameCryptorConstructor {\n new (opts?: unknown): BaseFrameCryptor;\n}\n\nexport interface TransformerInfo {\n readable: ReadableStream;\n writable: WritableStream;\n transformer: TransformStream;\n abortController: AbortController;\n}\n\nexport class BaseFrameCryptor extends (EventEmitter as new () => TypedEventEmitter<CryptorCallbacks>) {\n protected encodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ): Promise<any> {\n throw Error('not implemented for subclass');\n }\n\n protected decodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ): Promise<any> {\n throw Error('not implemented for subclass');\n }\n}\n\n/**\n * Cryptor is responsible for en-/decrypting media frames.\n * Each Cryptor instance is responsible for en-/decrypting a single mediaStreamTrack.\n */\nexport class FrameCryptor extends BaseFrameCryptor {\n private sendCounts: Map<number, number>;\n\n private participantIdentity: string | undefined;\n\n private trackId: string | undefined;\n\n private keys: ParticipantKeyHandler;\n\n private videoCodec?: VideoCodec;\n\n private rtpMap: Map<number, VideoCodec>;\n\n private keyProviderOptions: KeyProviderOptions;\n\n /**\n * used for detecting server injected unencrypted frames\n */\n private sifTrailer: Uint8Array;\n\n private sifGuard: SifGuard;\n\n constructor(opts: {\n keys: ParticipantKeyHandler;\n participantIdentity: string;\n keyProviderOptions: KeyProviderOptions;\n sifTrailer?: Uint8Array;\n }) {\n super();\n this.sendCounts = new Map();\n this.keys = opts.keys;\n this.participantIdentity = opts.participantIdentity;\n this.rtpMap = new Map();\n this.keyProviderOptions = opts.keyProviderOptions;\n this.sifTrailer = opts.sifTrailer ?? Uint8Array.from([]);\n this.sifGuard = new SifGuard();\n }\n\n /**\n * Assign a different participant to the cryptor.\n * useful for transceiver re-use\n * @param id\n * @param keys\n */\n setParticipant(id: string, keys: ParticipantKeyHandler) {\n this.participantIdentity = id;\n this.keys = keys;\n this.sifGuard.reset();\n }\n\n unsetParticipant() {\n this.participantIdentity = undefined;\n }\n\n isEnabled() {\n if (this.participantIdentity) {\n return encryptionEnabledMap.get(this.participantIdentity);\n } else {\n return undefined;\n }\n }\n\n getParticipantIdentity() {\n return this.participantIdentity;\n }\n\n getTrackId() {\n return this.trackId;\n }\n\n /**\n * Update the video codec used by the mediaStreamTrack\n * @param codec\n */\n setVideoCodec(codec: VideoCodec) {\n this.videoCodec = codec;\n }\n\n /**\n * rtp payload type map used for figuring out codec of payload type when encoding\n * @param map\n */\n setRtpMap(map: Map<number, VideoCodec>) {\n this.rtpMap = map;\n }\n\n setupTransform(\n operation: 'encode' | 'decode',\n readable: ReadableStream,\n writable: WritableStream,\n trackId: string,\n codec?: VideoCodec,\n ) {\n if (codec) {\n workerLogger.info('setting codec on cryptor to', { codec });\n this.videoCodec = codec;\n }\n\n const transformFn = operation === 'encode' ? this.encodeFunction : this.decodeFunction;\n const transformStream = new TransformStream({\n transform: transformFn.bind(this),\n });\n\n readable\n .pipeThrough(transformStream)\n .pipeTo(writable)\n .catch((e) => {\n workerLogger.warn(e);\n this.emit(CryptorEvent.Error, e instanceof CryptorError ? e : new CryptorError(e.message));\n });\n this.trackId = trackId;\n }\n\n setSifTrailer(trailer: Uint8Array) {\n this.sifTrailer = trailer;\n }\n\n /**\n * Function that will be injected in a stream and will encrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n *\n * The VP8 payload descriptor described in\n * https://tools.ietf.org/html/rfc7741#section-4.2\n * is part of the RTP packet and not part of the frame and is not controllable by us.\n * This is fine as the SFU keeps having access to it for routing.\n *\n * The encrypted frame is formed as follows:\n * 1) Find unencrypted byte length, depending on the codec, frame type and kind.\n * 2) Form the GCM IV for the frame as described above.\n * 3) Encrypt the rest of the frame using AES-GCM.\n * 4) Allocate space for the encrypted frame.\n * 5) Copy the unencrypted bytes to the start of the encrypted frame.\n * 6) Append the ciphertext to the encrypted frame.\n * 7) Append the IV.\n * 8) Append a single byte for the key identifier.\n * 9) Enqueue the encrypted frame for sending.\n */\n protected async encodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ) {\n if (\n !this.isEnabled() ||\n // skip for encryption for empty dtx frames\n encodedFrame.data.byteLength === 0\n ) {\n return controller.enqueue(encodedFrame);\n }\n const keySet = this.keys.getKeySet();\n if (!keySet) {\n throw new TypeError(\n `key set not found for ${\n this.participantIdentity\n } at index ${this.keys.getCurrentKeyIndex()}`,\n );\n }\n const { encryptionKey } = keySet;\n const keyIndex = this.keys.getCurrentKeyIndex();\n\n if (encryptionKey) {\n const iv = this.makeIV(\n encodedFrame.getMetadata().synchronizationSource ?? -1,\n encodedFrame.timestamp,\n );\n\n // Thіs is not encrypted and contains the VP8 payload descriptor or the Opus TOC byte.\n const frameHeader = new Uint8Array(\n encodedFrame.data,\n 0,\n this.getUnencryptedBytes(encodedFrame),\n );\n\n // Frame trailer contains the R|IV_LENGTH and key index\n const frameTrailer = new Uint8Array(2);\n\n frameTrailer[0] = IV_LENGTH;\n frameTrailer[1] = keyIndex;\n\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n try {\n const cipherText = await crypto.subtle.encrypt(\n {\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),\n },\n encryptionKey,\n new Uint8Array(encodedFrame.data, this.getUnencryptedBytes(encodedFrame)),\n );\n\n const newData = new ArrayBuffer(\n frameHeader.byteLength + cipherText.byteLength + iv.byteLength + frameTrailer.byteLength,\n );\n const newUint8 = new Uint8Array(newData);\n\n newUint8.set(frameHeader); // copy first bytes.\n newUint8.set(new Uint8Array(cipherText), frameHeader.byteLength); // add ciphertext.\n newUint8.set(new Uint8Array(iv), frameHeader.byteLength + cipherText.byteLength); // append IV.\n newUint8.set(frameTrailer, frameHeader.byteLength + cipherText.byteLength + iv.byteLength); // append frame trailer.\n\n encodedFrame.data = newData;\n\n return controller.enqueue(encodedFrame);\n } catch (e: any) {\n // TODO: surface this to the app.\n workerLogger.error(e);\n }\n } else {\n this.emit(\n CryptorEvent.Error,\n new CryptorError(`encryption key missing for encoding`, CryptorErrorReason.MissingKey),\n );\n }\n }\n\n /**\n * Function that will be injected in a stream and will decrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n */\n protected async decodeFunction(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n controller: TransformStreamDefaultController,\n ) {\n if (\n !this.isEnabled() ||\n // skip for decryption for empty dtx frames\n encodedFrame.data.byteLength === 0\n ) {\n this.sifGuard.recordUserFrame();\n return controller.enqueue(encodedFrame);\n }\n\n if (isFrameServerInjected(encodedFrame.data, this.sifTrailer)) {\n this.sifGuard.recordSif();\n\n if (this.sifGuard.isSifAllowed()) {\n return controller.enqueue(encodedFrame);\n } else {\n workerLogger.warn('SIF limit reached, dropping frame');\n return;\n }\n } else {\n this.sifGuard.recordUserFrame();\n }\n const data = new Uint8Array(encodedFrame.data);\n const keyIndex = data[encodedFrame.data.byteLength - 1];\n\n if (this.keys.getKeySet(keyIndex) && this.keys.hasValidKey) {\n try {\n const decodedFrame = await this.decryptFrame(encodedFrame, keyIndex);\n this.keys.decryptionSuccess();\n if (decodedFrame) {\n return controller.enqueue(decodedFrame);\n }\n } catch (error) {\n if (error instanceof CryptorError && error.reason === CryptorErrorReason.InvalidKey) {\n if (this.keys.hasValidKey) {\n this.emit(\n CryptorEvent.Error,\n new CryptorError(\n `invalid key for participant ${this.participantIdentity}`,\n CryptorErrorReason.InvalidKey,\n ),\n );\n this.keys.decryptionFailure();\n }\n } else {\n workerLogger.warn('decoding frame failed', { error });\n }\n }\n } else if (!this.keys.getKeySet(keyIndex) && this.keys.hasValidKey) {\n // emit an error in case the key index is out of bounds but the key handler thinks we still have a valid key\n workerLogger.warn('skipping decryption due to missing key at index');\n this.emit(\n CryptorEvent.Error,\n new CryptorError(\n `missing key at index for participant ${this.participantIdentity}`,\n CryptorErrorReason.MissingKey,\n ),\n );\n }\n }\n\n /**\n * Function that will decrypt the given encoded frame. If the decryption fails, it will\n * ratchet the key for up to RATCHET_WINDOW_SIZE times.\n */\n private async decryptFrame(\n encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n keyIndex: number,\n initialMaterial: KeySet | undefined = undefined,\n ratchetOpts: DecodeRatchetOptions = { ratchetCount: 0 },\n ): Promise<RTCEncodedVideoFrame | RTCEncodedAudioFrame | undefined> {\n const keySet = this.keys.getKeySet(keyIndex);\n if (!ratchetOpts.encryptionKey && !keySet) {\n throw new TypeError(`no encryption key found for decryption of ${this.participantIdentity}`);\n }\n\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n\n try {\n const frameHeader = new Uint8Array(\n encodedFrame.data,\n 0,\n this.getUnencryptedBytes(encodedFrame),\n );\n const frameTrailer = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - 2, 2);\n\n const ivLength = frameTrailer[0];\n const iv = new Uint8Array(\n encodedFrame.data,\n encodedFrame.data.byteLength - ivLength - frameTrailer.byteLength,\n ivLength,\n );\n\n const cipherTextStart = frameHeader.byteLength;\n const cipherTextLength =\n encodedFrame.data.byteLength -\n (frameHeader.byteLength + ivLength + frameTrailer.byteLength);\n\n const plainText = await crypto.subtle.decrypt(\n {\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),\n },\n ratchetOpts.encryptionKey ?? keySet!.encryptionKey,\n new Uint8Array(encodedFrame.data, cipherTextStart, cipherTextLength),\n );\n\n const newData = new ArrayBuffer(frameHeader.byteLength + plainText.byteLength);\n const newUint8 = new Uint8Array(newData);\n\n newUint8.set(new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength));\n newUint8.set(new Uint8Array(plainText), frameHeader.byteLength);\n\n encodedFrame.data = newData;\n\n return encodedFrame;\n } catch (error: any) {\n if (this.keyProviderOptions.ratchetWindowSize > 0) {\n if (ratchetOpts.ratchetCount < this.keyProviderOptions.ratchetWindowSize) {\n workerLogger.debug(\n `ratcheting key attempt ${ratchetOpts.ratchetCount} of ${\n this.keyProviderOptions.ratchetWindowSize\n }, for kind ${encodedFrame instanceof RTCEncodedAudioFrame ? 'audio' : 'video'}`,\n );\n\n let ratchetedKeySet: KeySet | undefined;\n if (keySet === this.keys.getKeySet(keyIndex)) {\n // only ratchet if the currently set key is still the same as the one used to decrypt this frame\n // if not, it might be that a different frame has already ratcheted and we try with that one first\n const newMaterial = await this.keys.ratchetKey(keyIndex, false);\n\n ratchetedKeySet = await deriveKeys(newMaterial, this.keyProviderOptions.ratchetSalt);\n }\n\n const frame = await this.decryptFrame(encodedFrame, keyIndex, initialMaterial || keySet, {\n ratchetCount: ratchetOpts.ratchetCount + 1,\n encryptionKey: ratchetedKeySet?.encryptionKey,\n });\n if (frame && ratchetedKeySet) {\n this.keys.setKeySet(ratchetedKeySet, keyIndex, true);\n // decryption was successful, set the new key index to reflect the ratcheted key set\n this.keys.setCurrentKeyIndex(keyIndex);\n }\n return frame;\n } else {\n /**\n * Since the key it is first send and only afterwards actually used for encrypting, there were\n * situations when the decrypting failed due to the fact that the received frame was not encrypted\n * yet and ratcheting, of course, did not solve the problem. So if we fail RATCHET_WINDOW_SIZE times,\n * we come back to the initial key.\n */\n if (initialMaterial) {\n workerLogger.debug('resetting to initial material');\n this.keys.setKeyFromMaterial(initialMaterial.material, keyIndex);\n }\n\n workerLogger.warn('maximum ratchet attempts exceeded');\n throw new CryptorError(\n `valid key missing for participant ${this.participantIdentity}`,\n CryptorErrorReason.InvalidKey,\n );\n }\n } else {\n throw new CryptorError(\n 'Decryption failed, most likely because of an invalid key',\n CryptorErrorReason.InvalidKey,\n );\n }\n }\n }\n\n /**\n * Construct the IV used for AES-GCM and sent (in plain) with the packet similar to\n * https://tools.ietf.org/html/rfc7714#section-8.1\n * It concatenates\n * - the 32 bit synchronization source (SSRC) given on the encoded frame,\n * - the 32 bit rtp timestamp given on the encoded frame,\n * - a send counter that is specific to the SSRC. Starts at a random number.\n * The send counter is essentially the pictureId but we currently have to implement this ourselves.\n * There is no XOR with a salt. Note that this IV leaks the SSRC to the receiver but since this is\n * randomly generated and SFUs may not rewrite this is considered acceptable.\n * The SSRC is used to allow demultiplexing multiple streams with the same key, as described in\n * https://tools.ietf.org/html/rfc3711#section-4.1.1\n * The RTP timestamp is 32 bits and advances by the codec clock rate (90khz for video, 48khz for\n * opus audio) every second. For video it rolls over roughly every 13 hours.\n * The send counter will advance at the frame rate (30fps for video, 50fps for 20ms opus audio)\n * every second. It will take a long time to roll over.\n *\n * See also https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams\n */\n private makeIV(synchronizationSource: number, timestamp: number) {\n const iv = new ArrayBuffer(IV_LENGTH);\n const ivView = new DataView(iv);\n\n // having to keep our own send count (similar to a picture id) is not ideal.\n if (!this.sendCounts.has(synchronizationSource)) {\n // Initialize with a random offset, similar to the RTP sequence number.\n this.sendCounts.set(synchronizationSource, Math.floor(Math.random() * 0xffff));\n }\n\n const sendCount = this.sendCounts.get(synchronizationSource) ?? 0;\n\n ivView.setUint32(0, synchronizationSource);\n ivView.setUint32(4, timestamp);\n ivView.setUint32(8, timestamp - (sendCount % 0xffff));\n\n this.sendCounts.set(synchronizationSource, sendCount + 1);\n\n return iv;\n }\n\n private getUnencryptedBytes(frame: RTCEncodedVideoFrame | RTCEncodedAudioFrame): number {\n if (isVideoFrame(frame)) {\n let detectedCodec = this.getVideoCodec(frame) ?? this.videoCodec;\n\n if (detectedCodec === 'av1' || detectedCodec === 'vp9') {\n throw new Error(`${detectedCodec} is not yet supported for end to end encryption`);\n }\n\n if (detectedCodec === 'vp8') {\n return UNENCRYPTED_BYTES[frame.type];\n }\n\n const data = new Uint8Array(frame.data);\n try {\n const naluIndices = findNALUIndices(data);\n\n // if the detected codec is undefined we test whether it _looks_ like a h264 frame as a best guess\n const isH264 =\n detectedCodec === 'h264' ||\n naluIndices.some((naluIndex) =>\n [NALUType.SLICE_IDR, NALUType.SLICE_NON_IDR].includes(parseNALUType(data[naluIndex])),\n );\n\n if (isH264) {\n for (const index of naluIndices) {\n let type = parseNALUType(data[index]);\n switch (type) {\n case NALUType.SLICE_IDR:\n case NALUType.SLICE_NON_IDR:\n return index + 2;\n default:\n break;\n }\n }\n throw new TypeError('Could not find NALU');\n }\n } catch (e) {\n // no op, we just continue and fallback to vp8\n }\n\n return UNENCRYPTED_BYTES[frame.type];\n } else {\n return UNENCRYPTED_BYTES.audio;\n }\n }\n\n /**\n * inspects frame payloadtype if available and maps it to the codec specified in rtpMap\n */\n private getVideoCodec(frame: RTCEncodedVideoFrame): VideoCodec | undefined {\n if (this.rtpMap.size === 0) {\n return undefined;\n }\n // @ts-expect-error payloadType is not yet part of the typescript definition and currently not supported in Safari\n const payloadType = frame.getMetadata().payloadType;\n const codec = payloadType ? this.rtpMap.get(payloadType) : undefined;\n return codec;\n }\n}\n\n/**\n * Slice the NALUs present in the supplied buffer, assuming it is already byte-aligned\n * code adapted from https://github.com/medooze/h264-frame-parser/blob/main/lib/NalUnits.ts to return indices only\n */\nexport function findNALUIndices(stream: Uint8Array): number[] {\n const result: number[] = [];\n let start = 0,\n pos = 0,\n searchLength = stream.length - 2;\n while (pos < searchLength) {\n // skip until end of current NALU\n while (\n pos < searchLength &&\n !(stream[pos] === 0 && stream[pos + 1] === 0 && stream[pos + 2] === 1)\n )\n pos++;\n if (pos >= searchLength) pos = stream.length;\n // remove trailing zeros from current NALU\n let end = pos;\n while (end > start && stream[end - 1] === 0) end--;\n // save current NALU\n if (start === 0) {\n if (end !== start) throw TypeError('byte stream contains leading data');\n } else {\n result.push(start);\n }\n // begin new NALU\n start = pos = pos + 3;\n }\n return result;\n}\n\nexport function parseNALUType(startByte: number): NALUType {\n return startByte & kNaluTypeMask;\n}\n\nconst kNaluTypeMask = 0x1f;\n\nexport enum NALUType {\n /** Coded slice of a non-IDR picture */\n SLICE_NON_IDR = 1,\n /** Coded slice data partition A */\n SLICE_PARTITION_A = 2,\n /** Coded slice data partition B */\n SLICE_PARTITION_B = 3,\n /** Coded slice data partition C */\n SLICE_PARTITION_C = 4,\n /** Coded slice of an IDR picture */\n SLICE_IDR = 5,\n /** Supplemental enhancement information */\n SEI = 6,\n /** Sequence parameter set */\n SPS = 7,\n /** Picture parameter set */\n PPS = 8,\n /** Access unit delimiter */\n AUD = 9,\n /** End of sequence */\n END_SEQ = 10,\n /** End of stream */\n END_STREAM = 11,\n /** Filler data */\n FILLER_DATA = 12,\n /** Sequence parameter set extension */\n SPS_EXT = 13,\n /** Prefix NAL unit */\n PREFIX_NALU = 14,\n /** Subset sequence parameter set */\n SUBSET_SPS = 15,\n /** Depth parameter set */\n DPS = 16,\n\n // 17, 18 reserved\n\n /** Coded slice of an auxiliary coded picture without partitioning */\n SLICE_AUX = 19,\n /** Coded slice extension */\n SLICE_EXT = 20,\n /** Coded slice extension for a depth view component or a 3D-AVC texture view component */\n SLICE_LAYER_EXT = 21,\n\n // 22, 23 reserved\n}\n\n/**\n * we use a magic frame trailer to detect whether a frame is injected\n * by the livekit server and thus to be treated as unencrypted\n * @internal\n */\nexport function isFrameServerInjected(frameData: ArrayBuffer, trailerBytes: Uint8Array): boolean {\n if (trailerBytes.byteLength === 0) {\n return false;\n }\n const frameTrailer = new Uint8Array(\n frameData.slice(frameData.byteLength - trailerBytes.byteLength),\n );\n return trailerBytes.every((value, index) => value === frameTrailer[index]);\n}\n","import { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { workerLogger } from '../../logger';\nimport { KEYRING_SIZE } from '../constants';\nimport { KeyHandlerEvent, type ParticipantKeyHandlerCallbacks } from '../events';\nimport type { KeyProviderOptions, KeySet } from '../types';\nimport { deriveKeys, importKey, ratchet } from '../utils';\n\n// TODO ParticipantKeyHandlers currently don't get destroyed on participant disconnect\n// we could do this by having a separate worker message on participant disconnected.\n\n/**\n * ParticipantKeyHandler is responsible for providing a cryptor instance with the\n * en-/decryption key of a participant. It assumes that all tracks of a specific participant\n * are encrypted with the same key.\n * Additionally it exposes a method to ratchet a key which can be used by the cryptor either automatically\n * if decryption fails or can be triggered manually on both sender and receiver side.\n *\n */\nexport class ParticipantKeyHandler extends (EventEmitter as new () => TypedEventEmitter<ParticipantKeyHandlerCallbacks>) {\n private currentKeyIndex: number;\n\n private cryptoKeyRing: Array<KeySet | undefined>;\n\n private keyProviderOptions: KeyProviderOptions;\n\n private ratchetPromiseMap: Map<number, Promise<CryptoKey>>;\n\n private participantIdentity: string;\n\n private decryptionFailureCount = 0;\n\n private _hasValidKey: boolean = true;\n\n get hasValidKey() {\n return this._hasValidKey;\n }\n\n constructor(participantIdentity: string, keyProviderOptions: KeyProviderOptions) {\n super();\n this.currentKeyIndex = 0;\n this.cryptoKeyRing = new Array(KEYRING_SIZE).fill(undefined);\n this.keyProviderOptions = keyProviderOptions;\n this.ratchetPromiseMap = new Map();\n this.participantIdentity = participantIdentity;\n this.resetKeyStatus();\n }\n\n decryptionFailure() {\n if (this.keyProviderOptions.failureTolerance < 0) {\n return;\n }\n this.decryptionFailureCount += 1;\n\n if (this.decryptionFailureCount > this.keyProviderOptions.failureTolerance) {\n workerLogger.warn(`key for ${this.participantIdentity} is being marked as invalid`);\n this._hasValidKey = false;\n }\n }\n\n decryptionSuccess() {\n this.resetKeyStatus();\n }\n\n /**\n * Call this after user initiated ratchet or a new key has been set in order to make sure to mark potentially\n * invalid keys as valid again\n */\n resetKeyStatus() {\n this.decryptionFailureCount = 0;\n this._hasValidKey = true;\n }\n\n /**\n * Ratchets the current key (or the one at keyIndex if provided) and\n * returns the ratcheted material\n * if `setKey` is true (default), it will also set the ratcheted key directly on the crypto key ring\n * @param keyIndex\n * @param setKey\n */\n ratchetKey(keyIndex?: number, setKey = true): Promise<CryptoKey> {\n const currentKeyIndex = keyIndex ?? this.getCurrentKeyIndex();\n\n const existingPromise = this.ratchetPromiseMap.get(currentKeyIndex);\n if (typeof existingPromise !== 'undefined') {\n return existingPromise;\n }\n const ratchetPromise = new Promise<CryptoKey>(async (resolve, reject) => {\n try {\n const keySet = this.getKeySet(currentKeyIndex);\n if (!keySet) {\n throw new TypeError(\n `Cannot ratchet key without a valid keyset of participant ${this.participantIdentity}`,\n );\n }\n const currentMaterial = keySet.material;\n const newMaterial = await importKey(\n await ratchet(currentMaterial, this.keyProviderOptions.ratchetSalt),\n currentMaterial.algorithm.name,\n 'derive',\n );\n\n if (setKey) {\n this.setKeyFromMaterial(newMaterial, currentKeyIndex, true);\n this.emit(\n KeyHandlerEvent.KeyRatcheted,\n newMaterial,\n this.participantIdentity,\n currentKeyIndex,\n );\n }\n resolve(newMaterial);\n } catch (e) {\n reject(e);\n } finally {\n this.ratchetPromiseMap.delete(currentKeyIndex);\n }\n });\n this.ratchetPromiseMap.set(currentKeyIndex, ratchetPromise);\n return ratchetPromise;\n }\n\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffer\n * together with the material\n * also resets the valid key property and updates the currentKeyIndex\n */\n async setKey(material: CryptoKey, keyIndex = 0) {\n await this.setKeyFromMaterial(material, keyIndex);\n this.resetKeyStatus();\n }\n\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffer\n * together with the material\n * also updates the currentKeyIndex\n */\n async setKeyFromMaterial(material: CryptoKey, keyIndex = 0, emitRatchetEvent = false) {\n workerLogger.debug('setting new key');\n if (keyIndex >= 0) {\n this.currentKeyIndex = keyIndex % this.cryptoKeyRing.length;\n }\n const keySet = await deriveKeys(material, this.keyProviderOptions.ratchetSalt);\n this.setKeySet(keySet, this.currentKeyIndex, emitRatchetEvent);\n }\n\n setKeySet(keySet: KeySet, keyIndex: number, emitRatchetEvent = false) {\n this.cryptoKeyRing[keyIndex % this.cryptoKeyRing.length] = keySet;\n\n if (emitRatchetEvent) {\n this.emit(KeyHandlerEvent.KeyRatcheted, keySet.material, this.participantIdentity, keyIndex);\n }\n }\n\n async setCurrentKeyIndex(index: number) {\n this.currentKeyIndex = index % this.cryptoKeyRing.length;\n this.resetKeyStatus();\n }\n\n getCurrentKeyIndex() {\n return this.currentKeyIndex;\n }\n\n /**\n * returns currently used KeySet or the one at `keyIndex` if provided\n * @param keyIndex\n * @returns\n */\n getKeySet(keyIndex?: number) {\n return this.cryptoKeyRing[keyIndex ?? this.currentKeyIndex];\n }\n}\n","import { workerLogger } from '../../logger';\nimport { KEY_PROVIDER_DEFAULTS } from '../constants';\nimport { CryptorErrorReason } from '../errors';\nimport { CryptorEvent, KeyHandlerEvent } from '../events';\nimport type {\n E2EEWorkerMessage,\n ErrorMessage,\n InitAck,\n KeyProviderOptions,\n RatchetMessage,\n RatchetRequestMessage,\n} from '../types';\nimport { FrameCryptor, encryptionEnabledMap } from './FrameCryptor';\nimport { ParticipantKeyHandler } from './ParticipantKeyHandler';\n\nconst participantCryptors: FrameCryptor[] = [];\nconst participantKeys: Map<string, ParticipantKeyHandler> = new Map();\nlet sharedKeyHandler: ParticipantKeyHandler | undefined;\n\nlet isEncryptionEnabled: boolean = false;\n\nlet useSharedKey: boolean = false;\n\nlet sharedKey: CryptoKey | undefined;\n\nlet sifTrailer: Uint8Array | undefined;\n\nlet keyProviderOptions: KeyProviderOptions = KEY_PROVIDER_DEFAULTS;\n\nworkerLogger.setDefaultLevel('info');\n\nonmessage = (ev) => {\n const { kind, data }: E2EEWorkerMessage = ev.data;\n\n switch (kind) {\n case 'init':\n workerLogger.info('worker initialized');\n keyProviderOptions = data.keyProviderOptions;\n useSharedKey = !!data.keyProviderOptions.sharedKey;\n // acknowledge init successful\n const ackMsg: InitAck = {\n kind: 'initAck',\n data: { enabled: isEncryptionEnabled },\n };\n postMessage(ackMsg);\n break;\n case 'enable':\n setEncryptionEnabled(data.enabled, data.participantIdentity);\n workerLogger.info('updated e2ee enabled status');\n // acknowledge enable call successful\n postMessage(ev.data);\n break;\n case 'decode':\n let cryptor = getTrackCryptor(data.participantIdentity, data.trackId);\n cryptor.setupTransform(\n kind,\n data.readableStream,\n data.writableStream,\n data.trackId,\n data.codec,\n );\n break;\n case 'encode':\n let pubCryptor = getTrackCryptor(data.participantIdentity, data.trackId);\n pubCryptor.setupTransform(\n kind,\n data.readableStream,\n data.writableStream,\n data.trackId,\n data.codec,\n );\n break;\n case 'setKey':\n if (useSharedKey) {\n workerLogger.warn('set shared key');\n setSharedKey(data.key, data.keyIndex);\n } else if (data.participantIdentity) {\n workerLogger.warn(`set participant sender key ${data.participantIdentity}`);\n getParticipantKeyHandler(data.participantIdentity).setKey(data.key, data.keyIndex);\n } else {\n workerLogger.error('no participant Id was provided and shared key usage is disabled');\n }\n break;\n case 'removeTransform':\n unsetCryptorParticipant(data.trackId);\n break;\n case 'updateCodec':\n getTrackCryptor(data.participantIdentity, data.trackId).setVideoCodec(data.codec);\n break;\n case 'setRTPMap':\n // this is only used for the local participant\n participantCryptors.forEach((cr) => {\n if (cr.getParticipantIdentity() === data.participantIdentity) {\n cr.setRtpMap(data.map);\n }\n });\n break;\n case 'ratchetRequest':\n handleRatchetRequest(data);\n break;\n case 'setSifTrailer':\n handleSifTrailer(data.trailer);\n break;\n default:\n break;\n }\n};\n\nasync function handleRatchetRequest(data: RatchetRequestMessage['data']) {\n if (useSharedKey) {\n const keyHandler = getSharedKeyHandler();\n await keyHandler.ratchetKey(data.keyIndex);\n keyHandler.resetKeyStatus();\n } else if (data.participantIdentity) {\n const keyHandler = getParticipantKeyHandler(data.participantIdentity);\n await keyHandler.ratchetKey(data.keyIndex);\n keyHandler.resetKeyStatus();\n } else {\n workerLogger.error(\n 'no participant Id was provided for ratchet request and shared key usage is disabled',\n );\n }\n}\n\nfunction getTrackCryptor(participantIdentity: string, trackId: string) {\n let cryptor = participantCryptors.find((c) => c.getTrackId() === trackId);\n if (!cryptor) {\n workerLogger.info('creating new cryptor for', { participantIdentity });\n if (!keyProviderOptions) {\n throw Error('Missing keyProvider options');\n }\n cryptor = new FrameCryptor({\n participantIdentity,\n keys: getParticipantKeyHandler(participantIdentity),\n keyProviderOptions,\n sifTrailer,\n });\n\n setupCryptorErrorEvents(cryptor);\n participantCryptors.push(cryptor);\n } else if (participantIdentity !== cryptor.getParticipantIdentity()) {\n // assign new participant id to track cryptor and pass in correct key handler\n cryptor.setParticipant(participantIdentity, getParticipantKeyHandler(participantIdentity));\n }\n if (sharedKey) {\n }\n return cryptor;\n}\n\nfunction getParticipantKeyHandler(participantIdentity: string) {\n if (useSharedKey) {\n return getSharedKeyHandler();\n }\n let keys = participantKeys.get(participantIdentity);\n if (!keys) {\n keys = new ParticipantKeyHandler(participantIdentity, keyProviderOptions);\n if (sharedKey) {\n keys.setKey(sharedKey);\n }\n keys.on(KeyHandlerEvent.KeyRatcheted, emitRatchetedKeys);\n participantKeys.set(participantIdentity, keys);\n }\n return keys;\n}\n\nfunction getSharedKeyHandler() {\n if (!sharedKeyHandler) {\n sharedKeyHandler = new ParticipantKeyHandler('shared-key', keyProviderOptions);\n }\n return sharedKeyHandler;\n}\n\nfunction unsetCryptorParticipant(trackId: string) {\n participantCryptors.find((c) => c.getTrackId() === trackId)?.unsetParticipant();\n}\n\nfunction setEncryptionEnabled(enable: boolean, participantIdentity: string) {\n encryptionEnabledMap.set(participantIdentity, enable);\n}\n\nfunction setSharedKey(key: CryptoKey, index?: number) {\n workerLogger.debug('setting shared key');\n sharedKey = key;\n getSharedKeyHandler().setKey(key, index);\n}\n\nfunction setupCryptorErrorEvents(cryptor: FrameCryptor) {\n cryptor.on(CryptorEvent.Error, (error) => {\n const msg: ErrorMessage = {\n kind: 'error',\n data: { error: new Error(`${CryptorErrorReason[error.reason]}: ${error.message}`) },\n };\n postMessage(msg);\n });\n}\n\nfunction emitRatchetedKeys(material: CryptoKey, participantIdentity: string, keyIndex?: number) {\n const msg: RatchetMessage = {\n kind: `ratchetKey`,\n data: {\n participantIdentity,\n keyIndex,\n material,\n },\n };\n postMessage(msg);\n}\n\nfunction handleSifTrailer(trailer: Uint8Array) {\n sifTrailer = trailer;\n participantCryptors.forEach((c) => {\n c.setSifTrailer(trailer);\n });\n}\n\n// Operations using RTCRtpScriptTransform.\n// @ts-ignore\nif (self.RTCTransformEvent) {\n workerLogger.debug('setup transform event');\n // @ts-ignore\n self.onrtctransform = (event) => {\n const transformer = event.transformer;\n workerLogger.debug('transformer', transformer);\n transformer.handled = true;\n const { kind, participantIdentity, trackId, codec } = transformer.options;\n const cryptor = getTrackCryptor(participantIdentity, trackId);\n workerLogger.debug('transform', { codec });\n cryptor.setupTransform(kind, transformer.readable, transformer.writable, trackId, codec);\n };\n}\n"],"names":["root","definition","module","exports","log","this","noop","undefinedType","isIE","window","navigator","test","userAgent","logMethods","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","trace","realMethod","undefined","replaceLoggingMethods","level","loggerName","i","length","methodFactory","debug","enableLoggingWhenConsoleArrives","defaultMethodFactory","Logger","name","defaultLevel","factory","self","currentLevel","storageKey","persistLevelIfPossible","levelNum","levelName","toUpperCase","localStorage","ignore","document","cookie","encodeURIComponent","getPersistedLevel","storedLevel","location","indexOf","exec","slice","levels","clearPersistedLevel","removeItem","getLevel","setLevel","persist","SILENT","setDefaultLevel","resetLevel","enableAll","TRACE","disableAll","initialLevel","defaultLogger","_loggersByName","getLogger","TypeError","logger","_log","noConflict","getLoggers","LogLevel","livekitLogger","info","workerLogger","ENCRYPTION_ALGORITHM","KEYRING_SIZE","DECRYPTION_FAILURE_TOLERANCE","UNENCRYPTED_BYTES","key","delta","audio","empty","IV_LENGTH","SALT","KEY_PROVIDER_DEFAULTS","sharedKey","ratchetSalt","ratchetWindowSize","failureTolerance","MAX_SIF_COUNT","MAX_SIF_DURATION","LivekitError","Error","constructor","code","message","MediaDeviceFailure","getFailure","error","NotFound","PermissionDenied","DeviceInUse","Other","CryptorErrorReason","CryptorError","reason","InternalError","KeyProviderEvent","KeyHandlerEvent","EncryptionEvent","CryptorEvent","R","Reflect","ReflectApply","target","receiver","args","ReflectOwnKeys","ownKeys","Object","getOwnPropertySymbols","getOwnPropertyNames","concat","ProcessEmitWarning","warning","warn","NumberIsNaN","Number","isNaN","value","EventEmitter","init","eventsModule","once","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","defineProperty","enumerable","get","set","arg","RangeError","getPrototypeOf","create","setMaxListeners","n","_getMaxListeners","that","getMaxListeners","emit","type","push","doError","events","er","err","context","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","newListener","unshift","warned","w","String","emitter","count","addListener","on","prependListener","onceWrapper","fired","removeListener","wrapFn","_onceWrap","state","wrapped","prependOnceListener","list","position","originalListener","shift","spliceOne","off","removeAllListeners","keys","_listeners","unwrap","evlistener","unwrapListeners","rawListeners","listenerCount","eventNames","arr","copy","Array","index","pop","ret","Promise","resolve","reject","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","addEventListener","wrapListener","removeEventListener","AudioPresets","telephone","maxBitrate","speech","music","musicStereo","musicHighQuality","musicHighQualityStereo","isVideoFrame","frame","importKey","keyBytes","algorithm","usage","crypto","subtle","getAlgoOptions","algorithmName","salt","textEncoder","TextEncoder","encodedSalt","encode","hash","ArrayBuffer","iterations","deriveKeys","material","algorithmOptions","encryptionKey","deriveKey","ratchet","deriveBits","SifGuard","consecutiveSifCount","lastSifReceivedAt","userFramesSinceSif","recordSif","_a","sifSequenceStartedAt","Date","now","recordUserFrame","reset","isSifAllowed","encryptionEnabledMap","Map","BaseFrameCryptor","encodeFunction","encodedFrame","controller","decodeFunction","FrameCryptor","opts","sendCounts","participantIdentity","rtpMap","keyProviderOptions","sifTrailer","Uint8Array","from","sifGuard","setParticipant","id","unsetParticipant","isEnabled","getParticipantIdentity","getTrackId","trackId","setVideoCodec","codec","videoCodec","setRtpMap","map","setupTransform","operation","readable","writable","transformFn","transformStream","TransformStream","transform","pipeThrough","pipeTo","catch","setSifTrailer","trailer","data","byteLength","enqueue","keySet","getKeySet","getCurrentKeyIndex","keyIndex","iv","makeIV","getMetadata","synchronizationSource","timestamp","frameHeader","getUnencryptedBytes","frameTrailer","cipherText","encrypt","additionalData","newData","newUint8","MissingKey","isFrameServerInjected","hasValidKey","decodedFrame","decryptFrame","decryptionSuccess","InvalidKey","decryptionFailure","initialMaterial","ratchetOpts","ratchetCount","ivLength","cipherTextStart","cipherTextLength","plainText","decrypt","RTCEncodedAudioFrame","ratchetedKeySet","newMaterial","ratchetKey","setKeySet","setCurrentKeyIndex","setKeyFromMaterial","ivView","DataView","has","Math","floor","random","sendCount","setUint32","detectedCodec","getVideoCodec","naluIndices","findNALUIndices","isH264","some","naluIndex","NALUType","SLICE_IDR","SLICE_NON_IDR","includes","parseNALUType","size","payloadType","stream","result","start","pos","searchLength","end","startByte","kNaluTypeMask","frameData","trailerBytes","every","ParticipantKeyHandler","_hasValidKey","decryptionFailureCount","currentKeyIndex","cryptoKeyRing","fill","ratchetPromiseMap","resetKeyStatus","setKey","existingPromise","ratchetPromise","__awaiter","currentMaterial","KeyRatcheted","delete","emitRatchetEvent","participantCryptors","participantKeys","sharedKeyHandler","isEncryptionEnabled","useSharedKey","onmessage","ev","kind","ackMsg","enabled","postMessage","setEncryptionEnabled","cryptor","getTrackCryptor","readableStream","writableStream","pubCryptor","setSharedKey","getParticipantKeyHandler","unsetCryptorParticipant","forEach","cr","handleRatchetRequest","handleSifTrailer","keyHandler","getSharedKeyHandler","find","c","setupCryptorErrorEvents","emitRatchetedKeys","enable","msg","RTCTransformEvent","onrtctransform","event","transformer","handled","options"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMC,CAAUA,UAAAA,IAAI,EAAEC,UAAU,EAAE;;IAIlB,IAAkCC,MAAM,CAACC,OAAO,EAAE;AACrDD,MAAAA,MAAA,CAAAC,OAAA,GAAiBF,UAAU,EAAE,CAAA;AACrC,KAAK,MAAM;AACHD,MAAAA,IAAI,CAACI,GAAG,GAAGH,UAAU,EAAE,CAAA;AAC1B,KAAA;AACL,GAAC,EAACI,cAAI,EAAE,YAAY;;AAGpB;AACI,IAAA,IAAIC,IAAI,GAAG,YAAW,EAAE,CAAA;IACxB,IAAIC,aAAa,GAAG,WAAW,CAAA;IAC/B,IAAIC,IAAI,GAAI,OAAOC,MAAM,KAAKF,aAAa,IAAM,OAAOE,MAAM,CAACC,SAAS,KAAKH,aAAc,IACvF,iBAAiB,CAACI,IAAI,CAACF,MAAM,CAACC,SAAS,CAACE,SAAS,CACpD,CAAA;AAED,IAAA,IAAIC,UAAU,GAAG,CACb,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,CACV,CAAA;;AAEL;AACI,IAAA,SAASC,UAAUA,CAACC,GAAG,EAAEC,UAAU,EAAE;AACjC,MAAA,IAAIC,MAAM,GAAGF,GAAG,CAACC,UAAU,CAAC,CAAA;AAC5B,MAAA,IAAI,OAAOC,MAAM,CAACC,IAAI,KAAK,UAAU,EAAE;AACnC,QAAA,OAAOD,MAAM,CAACC,IAAI,CAACH,GAAG,CAAC,CAAA;AACnC,OAAS,MAAM;QACH,IAAI;UACA,OAAOI,QAAQ,CAACC,SAAS,CAACF,IAAI,CAACG,IAAI,CAACJ,MAAM,EAAEF,GAAG,CAAC,CAAA;SACnD,CAAC,OAAOO,CAAC,EAAE;AACxB;AACgB,UAAA,OAAO,YAAW;AACd,YAAA,OAAOH,QAAQ,CAACC,SAAS,CAACG,KAAK,CAACA,KAAK,CAACN,MAAM,EAAE,CAACF,GAAG,EAAES,SAAS,CAAC,CAAC,CAAA;WAClE,CAAA;AACJ,SAAA;AACJ,OAAA;AACJ,KAAA;;AAEL;IACI,SAASC,UAAUA,GAAG;MAClB,IAAIC,OAAO,CAACtB,GAAG,EAAE;AACb,QAAA,IAAIsB,OAAO,CAACtB,GAAG,CAACmB,KAAK,EAAE;UACnBG,OAAO,CAACtB,GAAG,CAACmB,KAAK,CAACG,OAAO,EAAEF,SAAS,CAAC,CAAA;AACrD,SAAa,MAAM;AACnB;AACgBL,UAAAA,QAAQ,CAACC,SAAS,CAACG,KAAK,CAACA,KAAK,CAACG,OAAO,CAACtB,GAAG,EAAE,CAACsB,OAAO,EAAEF,SAAS,CAAC,CAAC,CAAA;AACpE,SAAA;AACJ,OAAA;MACD,IAAIE,OAAO,CAACC,KAAK,EAAED,OAAO,CAACC,KAAK,EAAE,CAAA;AACrC,KAAA;;AAEL;AACA;IACI,SAASC,UAAUA,CAACZ,UAAU,EAAE;MAC5B,IAAIA,UAAU,KAAK,OAAO,EAAE;AACxBA,QAAAA,UAAU,GAAG,KAAK,CAAA;AACrB,OAAA;AAED,MAAA,IAAI,OAAOU,OAAO,KAAKnB,aAAa,EAAE;QAClC,OAAO,KAAK,CAAC;AACzB,OAAS,MAAM,IAAIS,UAAU,KAAK,OAAO,IAAIR,IAAI,EAAE;AACvC,QAAA,OAAOiB,UAAU,CAAA;OACpB,MAAM,IAAIC,OAAO,CAACV,UAAU,CAAC,KAAKa,SAAS,EAAE;AAC1C,QAAA,OAAOf,UAAU,CAACY,OAAO,EAAEV,UAAU,CAAC,CAAA;AAClD,OAAS,MAAM,IAAIU,OAAO,CAACtB,GAAG,KAAKyB,SAAS,EAAE;AAClC,QAAA,OAAOf,UAAU,CAACY,OAAO,EAAE,KAAK,CAAC,CAAA;AAC7C,OAAS,MAAM;AACH,QAAA,OAAOpB,IAAI,CAAA;AACd,OAAA;AACJ,KAAA;;AAEL;;AAEI,IAAA,SAASwB,qBAAqBA,CAACC,KAAK,EAAEC,UAAU,EAAE;AACtD;AACQ,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGpB,UAAU,CAACqB,MAAM,EAAED,CAAC,EAAE,EAAE;AACxC,QAAA,IAAIjB,UAAU,GAAGH,UAAU,CAACoB,CAAC,CAAC,CAAA;AAC9B,QAAA,IAAI,CAACjB,UAAU,CAAC,GAAIiB,CAAC,GAAGF,KAAK,GACzBzB,IAAI,GACJ,IAAI,CAAC6B,aAAa,CAACnB,UAAU,EAAEe,KAAK,EAAEC,UAAU,CAAC,CAAA;AACxD,OAAA;;AAET;AACQ,MAAA,IAAI,CAAC5B,GAAG,GAAG,IAAI,CAACgC,KAAK,CAAA;AACxB,KAAA;;AAEL;AACA;AACI,IAAA,SAASC,+BAA+BA,CAACrB,UAAU,EAAEe,KAAK,EAAEC,UAAU,EAAE;AACpE,MAAA,OAAO,YAAY;AACf,QAAA,IAAI,OAAON,OAAO,KAAKnB,aAAa,EAAE;UAClCuB,qBAAqB,CAACT,IAAI,CAAC,IAAI,EAAEU,KAAK,EAAEC,UAAU,CAAC,CAAA;UACnD,IAAI,CAAChB,UAAU,CAAC,CAACO,KAAK,CAAC,IAAI,EAAEC,SAAS,CAAC,CAAA;AAC1C,SAAA;OACJ,CAAA;AACJ,KAAA;;AAEL;AACA;AACI,IAAA,SAASc,oBAAoBA,CAACtB,UAAU,EAAEe,KAAK,EAAEC,UAAU,EAAE;AACjE;AACQ,MAAA,OAAOJ,UAAU,CAACZ,UAAU,CAAC,IACtBqB,+BAA+B,CAACd,KAAK,CAAC,IAAI,EAAEC,SAAS,CAAC,CAAA;AAChE,KAAA;AAED,IAAA,SAASe,MAAMA,CAACC,IAAI,EAAEC,YAAY,EAAEC,OAAO,EAAE;MAC3C,IAAIC,IAAI,GAAG,IAAI,CAAA;AACf,MAAA,IAAIC,YAAY,CAAA;AAChBH,MAAAA,YAAY,GAAGA,YAAY,IAAI,IAAI,GAAG,MAAM,GAAGA,YAAY,CAAA;MAE3D,IAAII,UAAU,GAAG,UAAU,CAAA;AAC3B,MAAA,IAAI,OAAOL,IAAI,KAAK,QAAQ,EAAE;QAC5BK,UAAU,IAAI,GAAG,GAAGL,IAAI,CAAA;AAChC,OAAO,MAAM,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;AACnCK,QAAAA,UAAU,GAAGhB,SAAS,CAAA;AACvB,OAAA;MAED,SAASiB,sBAAsBA,CAACC,QAAQ,EAAE;AACtC,QAAA,IAAIC,SAAS,GAAG,CAACnC,UAAU,CAACkC,QAAQ,CAAC,IAAI,QAAQ,EAAEE,WAAW,EAAE,CAAA;AAEhE,QAAA,IAAI,OAAOxC,MAAM,KAAKF,aAAa,IAAI,CAACsC,UAAU,EAAE,OAAA;;AAE9D;QACU,IAAI;AACApC,UAAAA,MAAM,CAACyC,YAAY,CAACL,UAAU,CAAC,GAAGG,SAAS,CAAA;AAC3C,UAAA,OAAA;AACd,SAAW,CAAC,OAAOG,MAAM,EAAE,EAAE;;AAE7B;QACU,IAAI;AACA1C,UAAAA,MAAM,CAAC2C,QAAQ,CAACC,MAAM,GACpBC,kBAAkB,CAACT,UAAU,CAAC,GAAG,GAAG,GAAGG,SAAS,GAAG,GAAG,CAAA;AACtE,SAAW,CAAC,OAAOG,MAAM,EAAE,EAAE;AACtB,OAAA;MAED,SAASI,iBAAiBA,GAAG;AACzB,QAAA,IAAIC,WAAW,CAAA;AAEf,QAAA,IAAI,OAAO/C,MAAM,KAAKF,aAAa,IAAI,CAACsC,UAAU,EAAE,OAAA;QAEpD,IAAI;AACAW,UAAAA,WAAW,GAAG/C,MAAM,CAACyC,YAAY,CAACL,UAAU,CAAC,CAAA;AAC3D,SAAW,CAAC,OAAOM,MAAM,EAAE,EAAE;;AAE7B;AACU,QAAA,IAAI,OAAOK,WAAW,KAAKjD,aAAa,EAAE;UACtC,IAAI;AACA,YAAA,IAAI8C,MAAM,GAAG5C,MAAM,CAAC2C,QAAQ,CAACC,MAAM,CAAA;AACnC,YAAA,IAAII,QAAQ,GAAGJ,MAAM,CAACK,OAAO,CACzBJ,kBAAkB,CAACT,UAAU,CAAC,GAAG,GAAG,CAAC,CAAA;AACzC,YAAA,IAAIY,QAAQ,KAAK,CAAC,CAAC,EAAE;AACjBD,cAAAA,WAAW,GAAG,UAAU,CAACG,IAAI,CAACN,MAAM,CAACO,KAAK,CAACH,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3D,aAAA;AACnB,WAAe,CAAC,OAAON,MAAM,EAAE,EAAE;AACtB,SAAA;;AAEX;QACU,IAAIR,IAAI,CAACkB,MAAM,CAACL,WAAW,CAAC,KAAK3B,SAAS,EAAE;AACxC2B,UAAAA,WAAW,GAAG3B,SAAS,CAAA;AAC1B,SAAA;AAED,QAAA,OAAO2B,WAAW,CAAA;AACrB,OAAA;MAED,SAASM,mBAAmBA,GAAG;AAC3B,QAAA,IAAI,OAAOrD,MAAM,KAAKF,aAAa,IAAI,CAACsC,UAAU,EAAE,OAAA;;AAE9D;QACU,IAAI;AACApC,UAAAA,MAAM,CAACyC,YAAY,CAACa,UAAU,CAAClB,UAAU,CAAC,CAAA;AAC1C,UAAA,OAAA;AACd,SAAW,CAAC,OAAOM,MAAM,EAAE,EAAE;;AAE7B;QACU,IAAI;UACA1C,MAAM,CAAC2C,QAAQ,CAACC,MAAM,GACpBC,kBAAkB,CAACT,UAAU,CAAC,GAAG,0CAA0C,CAAA;AAC3F,SAAW,CAAC,OAAOM,MAAM,EAAE,EAAE;AACtB,OAAA;;AAEP;AACA;AACA;AACA;AACA;;MAEMR,IAAI,CAACH,IAAI,GAAGA,IAAI,CAAA;MAEhBG,IAAI,CAACkB,MAAM,GAAG;AAAE,QAAA,OAAO,EAAE,CAAC;AAAE,QAAA,OAAO,EAAE,CAAC;AAAE,QAAA,MAAM,EAAE,CAAC;AAAE,QAAA,MAAM,EAAE,CAAC;AACxD,QAAA,OAAO,EAAE,CAAC;AAAE,QAAA,QAAQ,EAAE,CAAA;OAAE,CAAA;AAE5BlB,MAAAA,IAAI,CAACR,aAAa,GAAGO,OAAO,IAAIJ,oBAAoB,CAAA;MAEpDK,IAAI,CAACqB,QAAQ,GAAG,YAAY;AACxB,QAAA,OAAOpB,YAAY,CAAA;OACtB,CAAA;AAEDD,MAAAA,IAAI,CAACsB,QAAQ,GAAG,UAAUlC,KAAK,EAAEmC,OAAO,EAAE;AACtC,QAAA,IAAI,OAAOnC,KAAK,KAAK,QAAQ,IAAIY,IAAI,CAACkB,MAAM,CAAC9B,KAAK,CAACkB,WAAW,EAAE,CAAC,KAAKpB,SAAS,EAAE;UAC7EE,KAAK,GAAGY,IAAI,CAACkB,MAAM,CAAC9B,KAAK,CAACkB,WAAW,EAAE,CAAC,CAAA;AAC3C,SAAA;AACD,QAAA,IAAI,OAAOlB,KAAK,KAAK,QAAQ,IAAIA,KAAK,IAAI,CAAC,IAAIA,KAAK,IAAIY,IAAI,CAACkB,MAAM,CAACM,MAAM,EAAE;AACxEvB,UAAAA,YAAY,GAAGb,KAAK,CAAA;UACpB,IAAImC,OAAO,KAAK,KAAK,EAAE;AAAA;YACnBpB,sBAAsB,CAACf,KAAK,CAAC,CAAA;AAChC,WAAA;UACDD,qBAAqB,CAACT,IAAI,CAACsB,IAAI,EAAEZ,KAAK,EAAES,IAAI,CAAC,CAAA;AAC7C,UAAA,IAAI,OAAOd,OAAO,KAAKnB,aAAa,IAAIwB,KAAK,GAAGY,IAAI,CAACkB,MAAM,CAACM,MAAM,EAAE;AAChE,YAAA,OAAO,kCAAkC,CAAA;AAC5C,WAAA;AACf,SAAW,MAAM;UACH,MAAM,4CAA4C,GAAGpC,KAAK,CAAA;AAC7D,SAAA;OACJ,CAAA;AAEDY,MAAAA,IAAI,CAACyB,eAAe,GAAG,UAAUrC,KAAK,EAAE;AACpCU,QAAAA,YAAY,GAAGV,KAAK,CAAA;AACpB,QAAA,IAAI,CAACwB,iBAAiB,EAAE,EAAE;AACtBZ,UAAAA,IAAI,CAACsB,QAAQ,CAAClC,KAAK,EAAE,KAAK,CAAC,CAAA;AAC9B,SAAA;OACJ,CAAA;MAEDY,IAAI,CAAC0B,UAAU,GAAG,YAAY;AAC1B1B,QAAAA,IAAI,CAACsB,QAAQ,CAACxB,YAAY,EAAE,KAAK,CAAC,CAAA;AAClCqB,QAAAA,mBAAmB,EAAE,CAAA;OACxB,CAAA;AAEDnB,MAAAA,IAAI,CAAC2B,SAAS,GAAG,UAASJ,OAAO,EAAE;QAC/BvB,IAAI,CAACsB,QAAQ,CAACtB,IAAI,CAACkB,MAAM,CAACU,KAAK,EAAEL,OAAO,CAAC,CAAA;OAC5C,CAAA;AAEDvB,MAAAA,IAAI,CAAC6B,UAAU,GAAG,UAASN,OAAO,EAAE;QAChCvB,IAAI,CAACsB,QAAQ,CAACtB,IAAI,CAACkB,MAAM,CAACM,MAAM,EAAED,OAAO,CAAC,CAAA;OAC7C,CAAA;;AAEP;AACM,MAAA,IAAIO,YAAY,GAAGlB,iBAAiB,EAAE,CAAA;MACtC,IAAIkB,YAAY,IAAI,IAAI,EAAE;AACtBA,QAAAA,YAAY,GAAGhC,YAAY,CAAA;AAC9B,OAAA;AACDE,MAAAA,IAAI,CAACsB,QAAQ,CAACQ,YAAY,EAAE,KAAK,CAAC,CAAA;AACnC,KAAA;;AAEL;AACA;AACA;AACA;AACA;;AAEI,IAAA,IAAIC,aAAa,GAAG,IAAInC,MAAM,EAAE,CAAA;IAEhC,IAAIoC,cAAc,GAAG,EAAE,CAAA;AACvBD,IAAAA,aAAa,CAACE,SAAS,GAAG,SAASA,SAASA,CAACpC,IAAI,EAAE;AAC/C,MAAA,IAAK,OAAOA,IAAI,KAAK,QAAQ,IAAI,OAAOA,IAAI,KAAK,QAAQ,IAAKA,IAAI,KAAK,EAAE,EAAE;AACzE,QAAA,MAAM,IAAIqC,SAAS,CAAC,gDAAgD,CAAC,CAAA;AACtE,OAAA;AAED,MAAA,IAAIC,MAAM,GAAGH,cAAc,CAACnC,IAAI,CAAC,CAAA;MACjC,IAAI,CAACsC,MAAM,EAAE;QACXA,MAAM,GAAGH,cAAc,CAACnC,IAAI,CAAC,GAAG,IAAID,MAAM,CACxCC,IAAI,EAAEkC,aAAa,CAACV,QAAQ,EAAE,EAAEU,aAAa,CAACvC,aAAa,CAAC,CAAA;AAC/D,OAAA;AACD,MAAA,OAAO2C,MAAM,CAAA;KAChB,CAAA;;AAEL;IACI,IAAIC,IAAI,GAAI,OAAOtE,MAAM,KAAKF,aAAa,GAAIE,MAAM,CAACL,GAAG,GAAGyB,SAAS,CAAA;IACrE6C,aAAa,CAACM,UAAU,GAAG,YAAW;MAClC,IAAI,OAAOvE,MAAM,KAAKF,aAAa,IAC5BE,MAAM,CAACL,GAAG,KAAKsE,aAAa,EAAE;QACjCjE,MAAM,CAACL,GAAG,GAAG2E,IAAI,CAAA;AACpB,OAAA;AAED,MAAA,OAAOL,aAAa,CAAA;KACvB,CAAA;AAEDA,IAAAA,aAAa,CAACO,UAAU,GAAG,SAASA,UAAUA,GAAG;AAC7C,MAAA,OAAON,cAAc,CAAA;KACxB,CAAA;;AAEL;AACID,IAAAA,aAAa,CAAC,SAAS,CAAC,GAAGA,aAAa,CAAA;AAExC,IAAA,OAAOA,aAAa,CAAA;AACxB,GAAC,CAAC,CAAA;;;;ACtSF,IAAYQ,QAOX,CAAA;AAPD,CAAA,UAAYA,QAAQ,EAAA;EAClBA,QAAA,CAAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS,CAAA;EACTA,QAAA,CAAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS,CAAA;EACTA,QAAA,CAAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ,CAAA;EACRA,QAAA,CAAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ,CAAA;EACRA,QAAA,CAAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS,CAAA;EACTA,QAAA,CAAAA,QAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAU,CAAA;AACZ,CAAC,EAPWA,QAAQ,KAARA,QAAQ,GAOnB,EAAA,CAAA,CAAA,CAAA;AAaD,MAAMC,aAAa,GAAG/E,yBAAa,CAAC,SAAS,CAAC,CAAA;AAE9C+E,aAAa,CAACf,eAAe,CAACc,QAAQ,CAACE,IAAI,CAAC,CAAA;;AAuCrC,MAAMC,YAAY,GAAGjF,yBAAa,CAAC,SAAS,CAAqB;;AC7DjE,MAAMkF,oBAAoB,GAAG,SAAS,CAAA;AAE7C;AACA;AACA;AACO,MAAMC,YAAY,GAAG,EAAE,CAAA;AAE9B;AACO,MAAMC,4BAA4B,GAAG,EAAE,CAAA;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,iBAAiB,GAAG;AAC/BC,EAAAA,GAAG,EAAE,EAAE;AACPC,EAAAA,KAAK,EAAE,CAAC;AACRC,EAAAA,KAAK,EAAE,CAAC;AACRC,EAAAA,KAAK,EAAE,CAAA;CACC,CAAA;AAEV;AACgG;AACzF,MAAMC,SAAS,GAAG,EAAE,CAAA;AAKpB,MAAMC,IAAI,GAAG,sBAAsB,CAAA;AAEnC,MAAMC,qBAAqB,GAAuB;AACvDC,EAAAA,SAAS,EAAE,KAAK;AAChBC,EAAAA,WAAW,EAAEH,IAAI;AACjBI,EAAAA,iBAAiB,EAAE,CAAC;AACpBC,EAAAA,gBAAgB,EAAEZ,4BAAAA;CACV,CAAA;AAEH,MAAMa,aAAa,GAAG,GAAG,CAAA;AACzB,MAAMC,gBAAgB,GAAG,IAAI;;AC9C9B,MAAOC,YAAa,SAAQC,KAAK,CAAA;AAGrCC,EAAAA,WAAYA,CAAAC,IAAY,EAAEC,OAAgB,EAAA;AACxC,IAAA,KAAK,CAACA,OAAO,IAAI,sBAAsB,CAAC,CAAA;IACxC,IAAI,CAACD,IAAI,GAAGA,IAAI,CAAA;AAClB,GAAA;AACD,CAAA;AAyDD,IAAYE,kBAQX,CAAA;AARD,CAAA,UAAYA,kBAAkB,EAAA;AAC5B;AACAA,EAAAA,kBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC,CAAA;AACrC;AACAA,EAAAA,kBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB;AACAA,EAAAA,kBAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3BA,EAAAA,kBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACjB,CAAC,EARWA,kBAAkB,KAAlBA,kBAAkB,GAQ7B,EAAA,CAAA,CAAA,CAAA;AAED,CAAA,UAAiBA,kBAAkB,EAAA;EACjC,SAAgBC,UAAUA,CAACC,KAAU,EAAA;AACnC,IAAA,IAAIA,KAAK,IAAI,MAAM,IAAIA,KAAK,EAAE;MAC5B,IAAIA,KAAK,CAACtE,IAAI,KAAK,eAAe,IAAIsE,KAAK,CAACtE,IAAI,KAAK,sBAAsB,EAAE;QAC3E,OAAOoE,kBAAkB,CAACG,QAAQ,CAAA;AACnC,OAAA;MACD,IAAID,KAAK,CAACtE,IAAI,KAAK,iBAAiB,IAAIsE,KAAK,CAACtE,IAAI,KAAK,uBAAuB,EAAE;QAC9E,OAAOoE,kBAAkB,CAACI,gBAAgB,CAAA;AAC3C,OAAA;MACD,IAAIF,KAAK,CAACtE,IAAI,KAAK,kBAAkB,IAAIsE,KAAK,CAACtE,IAAI,KAAK,iBAAiB,EAAE;QACzE,OAAOoE,kBAAkB,CAACK,WAAW,CAAA;AACtC,OAAA;MACD,OAAOL,kBAAkB,CAACM,KAAK,CAAA;AAChC,KAAA;AACH,GAAA;EAbgBN,kBAAA,CAAAC,UAAU,aAazB,CAAA;AACH,CAAC,EAfgBD,kBAAkB,KAAlBA,kBAAkB,GAelC,EAAA,CAAA,CAAA;;ACvFD,IAAYO,kBAIX,CAAA;AAJD,CAAA,UAAYA,kBAAkB,EAAA;EAC5BA,kBAAA,CAAAA,kBAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAc,CAAA;EACdA,kBAAA,CAAAA,kBAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAc,CAAA;EACdA,kBAAA,CAAAA,kBAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAiB,CAAA;AACnB,CAAC,EAJWA,kBAAkB,KAAlBA,kBAAkB,GAI7B,EAAA,CAAA,CAAA,CAAA;AAEK,MAAOC,YAAa,SAAQb,YAAY,CAAA;EAG5CE,WAAAA,CAAYE,OAAgB,EAA+D;AAAA,IAAA,IAA7DU,MAA6B,GAAA7F,SAAA,CAAAU,MAAA,GAAAV,CAAAA,IAAAA,SAAA,CAAAK,CAAAA,CAAAA,KAAAA,SAAA,GAAAL,SAAA,CAAA2F,CAAAA,CAAAA,GAAAA,kBAAkB,CAACG,aAAa,CAAA;AACzF,IAAA,KAAK,CAAC,EAAE,EAAEX,OAAO,CAAC,CAAA;IAClB,IAAI,CAACU,MAAM,GAAGA,MAAM,CAAA;AACtB,GAAA;AACD;;ACXD,IAAYE,gBAIX,CAAA;AAJD,CAAA,UAAYA,gBAAgB,EAAA;AAC1BA,EAAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjBA,EAAAA,gBAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC,CAAA;AACjCA,EAAAA,gBAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC/B,CAAC,EAJWA,gBAAgB,KAAhBA,gBAAgB,GAI3B,EAAA,CAAA,CAAA,CAAA;AAQD,IAAYC,eAEX,CAAA;AAFD,CAAA,UAAYA,eAAe,EAAA;AACzBA,EAAAA,eAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC/B,CAAC,EAFWA,eAAe,KAAfA,eAAe,GAE1B,EAAA,CAAA,CAAA,CAAA;AAUD,IAAYC,eAGX,CAAA;AAHD,CAAA,UAAYA,eAAe,EAAA;AACzBA,EAAAA,eAAA,CAAA,oCAAA,CAAA,GAAA,oCAAyE,CAAA;AACzEA,EAAAA,eAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC,CAAA;AACrC,CAAC,EAHWA,eAAe,KAAfA,eAAe,GAG1B,EAAA,CAAA,CAAA,CAAA;AAcD,IAAYC,YAEX,CAAA;AAFD,CAAA,UAAYA,YAAY,EAAA;AACtBA,EAAAA,YAAA,CAAA,OAAA,CAAA,GAAA,cAAsB,CAAA;AACxB,CAAC,EAFWA,YAAY,KAAZA,YAAY,GAEvB,EAAA,CAAA,CAAA;;;;ACxBD,IAAIC,CAAC,GAAG,OAAOC,OAAO,KAAK,QAAQ,GAAGA,OAAO,GAAG,IAAI,CAAA;AACpD,IAAIC,YAAY,GAAGF,CAAC,IAAI,OAAOA,CAAC,CAACpG,KAAK,KAAK,UAAU,GACjDoG,CAAC,CAACpG,KAAK,GACP,SAASsG,YAAYA,CAACC,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAE;AAC9C,EAAA,OAAO7G,QAAQ,CAACC,SAAS,CAACG,KAAK,CAACF,IAAI,CAACyG,MAAM,EAAEC,QAAQ,EAAEC,IAAI,CAAC,CAAA;AAC7D,CAAA,CAAA;AAEH,IAAIC,cAAc,CAAA;AAClB,IAAIN,CAAC,IAAI,OAAOA,CAAC,CAACO,OAAO,KAAK,UAAU,EAAE;EACxCD,cAAc,GAAGN,CAAC,CAACO,OAAO,CAAA;AAC5B,CAAC,MAAM,IAAIC,MAAM,CAACC,qBAAqB,EAAE;AACvCH,EAAAA,cAAc,GAAG,SAASA,cAAcA,CAACH,MAAM,EAAE;AAC/C,IAAA,OAAOK,MAAM,CAACE,mBAAmB,CAACP,MAAM,CAAC,CACtCQ,MAAM,CAACH,MAAM,CAACC,qBAAqB,CAACN,MAAM,CAAC,CAAC,CAAA;GAChD,CAAA;AACH,CAAC,MAAM;AACLG,EAAAA,cAAc,GAAG,SAASA,cAAcA,CAACH,MAAM,EAAE;AAC/C,IAAA,OAAOK,MAAM,CAACE,mBAAmB,CAACP,MAAM,CAAC,CAAA;GAC1C,CAAA;AACH,CAAA;AAEA,SAASS,kBAAkBA,CAACC,OAAO,EAAE;EACnC,IAAI9G,OAAO,IAAIA,OAAO,CAAC+G,IAAI,EAAE/G,OAAO,CAAC+G,IAAI,CAACD,OAAO,CAAC,CAAA;AACpD,CAAA;AAEA,IAAIE,WAAW,GAAGC,MAAM,CAACC,KAAK,IAAI,SAASF,WAAWA,CAACG,KAAK,EAAE;EAC5D,OAAOA,KAAK,KAAKA,KAAK,CAAA;AACxB,CAAC,CAAA;AAED,SAASC,YAAYA,GAAG;AACtBA,EAAAA,YAAY,CAACC,IAAI,CAAC1H,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAA;AACA2H,MAAc,CAAA7I,OAAA,GAAG2I,YAAY,CAAA;AACVE,MAAA,CAAA7I,OAAA,CAAA8I,IAAA,GAAGA,KAAI;;AAE1B;AACAH,YAAY,CAACA,YAAY,GAAGA,YAAY,CAAA;AAExCA,YAAY,CAAC1H,SAAS,CAAC8H,OAAO,GAAGrH,SAAS,CAAA;AAC1CiH,YAAY,CAAC1H,SAAS,CAAC+H,YAAY,GAAG,CAAC,CAAA;AACvCL,YAAY,CAAC1H,SAAS,CAACgI,aAAa,GAAGvH,SAAS,CAAA;;AAEhD;AACA;AACA,IAAIwH,mBAAmB,GAAG,EAAE,CAAA;AAE5B,SAASC,aAAaA,CAACC,QAAQ,EAAE;AAC/B,EAAA,IAAI,OAAOA,QAAQ,KAAK,UAAU,EAAE;AAClC,IAAA,MAAM,IAAI1E,SAAS,CAAC,kEAAkE,GAAG,OAAO0E,QAAQ,CAAC,CAAA;AAC1G,GAAA;AACH,CAAA;AAEApB,MAAM,CAACqB,cAAc,CAACV,YAAY,EAAE,qBAAqB,EAAE;AACzDW,EAAAA,UAAU,EAAE,IAAI;EAChBC,GAAG,EAAE,YAAW;AACd,IAAA,OAAOL,mBAAmB,CAAA;GAC3B;AACDM,EAAAA,GAAG,EAAE,UAASC,GAAG,EAAE;AACjB,IAAA,IAAI,OAAOA,GAAG,KAAK,QAAQ,IAAIA,GAAG,GAAG,CAAC,IAAIlB,WAAW,CAACkB,GAAG,CAAC,EAAE;MAC1D,MAAM,IAAIC,UAAU,CAAC,iGAAiG,GAAGD,GAAG,GAAG,GAAG,CAAC,CAAA;AACpI,KAAA;AACDP,IAAAA,mBAAmB,GAAGO,GAAG,CAAA;AAC1B,GAAA;AACH,CAAC,CAAC,CAAA;AAEFd,YAAY,CAACC,IAAI,GAAG,YAAW;AAE7B,EAAA,IAAI,IAAI,CAACG,OAAO,KAAKrH,SAAS,IAC1B,IAAI,CAACqH,OAAO,KAAKf,MAAM,CAAC2B,cAAc,CAAC,IAAI,CAAC,CAACZ,OAAO,EAAE;IACxD,IAAI,CAACA,OAAO,GAAGf,MAAM,CAAC4B,MAAM,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAACZ,YAAY,GAAG,CAAC,CAAA;AACtB,GAAA;AAED,EAAA,IAAI,CAACC,aAAa,GAAG,IAAI,CAACA,aAAa,IAAIvH,SAAS,CAAA;AACtD,CAAC,CAAA;;AAED;AACA;AACAiH,YAAY,CAAC1H,SAAS,CAAC4I,eAAe,GAAG,SAASA,eAAeA,CAACC,CAAC,EAAE;AACnE,EAAA,IAAI,OAAOA,CAAC,KAAK,QAAQ,IAAIA,CAAC,GAAG,CAAC,IAAIvB,WAAW,CAACuB,CAAC,CAAC,EAAE;IACpD,MAAM,IAAIJ,UAAU,CAAC,+EAA+E,GAAGI,CAAC,GAAG,GAAG,CAAC,CAAA;AAChH,GAAA;EACD,IAAI,CAACb,aAAa,GAAGa,CAAC,CAAA;AACtB,EAAA,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,SAASC,gBAAgBA,CAACC,IAAI,EAAE;EAC9B,IAAIA,IAAI,CAACf,aAAa,KAAKvH,SAAS,EAClC,OAAOiH,YAAY,CAACO,mBAAmB,CAAA;EACzC,OAAOc,IAAI,CAACf,aAAa,CAAA;AAC3B,CAAA;AAEAN,YAAY,CAAC1H,SAAS,CAACgJ,eAAe,GAAG,SAASA,eAAeA,GAAG;EAClE,OAAOF,gBAAgB,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC,CAAA;AAEDpB,YAAY,CAAC1H,SAAS,CAACiJ,IAAI,GAAG,SAASA,IAAIA,CAACC,IAAI,EAAE;EAChD,IAAItC,IAAI,GAAG,EAAE,CAAA;EACb,KAAK,IAAI/F,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGT,SAAS,CAACU,MAAM,EAAED,CAAC,EAAE,EAAE+F,IAAI,CAACuC,IAAI,CAAC/I,SAAS,CAACS,CAAC,CAAC,CAAC,CAAA;AAClE,EAAA,IAAIuI,OAAO,GAAIF,IAAI,KAAK,OAAQ,CAAA;AAEhC,EAAA,IAAIG,MAAM,GAAG,IAAI,CAACvB,OAAO,CAAA;EACzB,IAAIuB,MAAM,KAAK5I,SAAS,EACtB2I,OAAO,GAAIA,OAAO,IAAIC,MAAM,CAAC3D,KAAK,KAAKjF,SAAU,CAAC,KAC/C,IAAI,CAAC2I,OAAO,EACf,OAAO,KAAK,CAAA;;AAEhB;AACE,EAAA,IAAIA,OAAO,EAAE;AACX,IAAA,IAAIE,EAAE,CAAA;IACN,IAAI1C,IAAI,CAAC9F,MAAM,GAAG,CAAC,EACjBwI,EAAE,GAAG1C,IAAI,CAAC,CAAC,CAAC,CAAA;IACd,IAAI0C,EAAE,YAAYlE,KAAK,EAAE;AAC7B;AACA;MACM,MAAMkE,EAAE,CAAC;AACV,KAAA;AACL;AACI,IAAA,IAAIC,GAAG,GAAG,IAAInE,KAAK,CAAC,kBAAkB,IAAIkE,EAAE,GAAG,IAAI,GAAGA,EAAE,CAAC/D,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAA;IAC7EgE,GAAG,CAACC,OAAO,GAAGF,EAAE,CAAA;IAChB,MAAMC,GAAG,CAAC;AACX,GAAA;;AAED,EAAA,IAAIE,OAAO,GAAGJ,MAAM,CAACH,IAAI,CAAC,CAAA;AAE1B,EAAA,IAAIO,OAAO,KAAKhJ,SAAS,EACvB,OAAO,KAAK,CAAA;AAEd,EAAA,IAAI,OAAOgJ,OAAO,KAAK,UAAU,EAAE;AACjChD,IAAAA,YAAY,CAACgD,OAAO,EAAE,IAAI,EAAE7C,IAAI,CAAC,CAAA;AACrC,GAAG,MAAM;AACL,IAAA,IAAI8C,GAAG,GAAGD,OAAO,CAAC3I,MAAM,CAAA;AACxB,IAAA,IAAI6I,SAAS,GAAGC,UAAU,CAACH,OAAO,EAAEC,GAAG,CAAC,CAAA;IACxC,KAAK,IAAI7I,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6I,GAAG,EAAE,EAAE7I,CAAC,EAC1B4F,YAAY,CAACkD,SAAS,CAAC9I,CAAC,CAAC,EAAE,IAAI,EAAE+F,IAAI,CAAC,CAAA;AACzC,GAAA;AAED,EAAA,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,SAASiD,YAAYA,CAACnD,MAAM,EAAEwC,IAAI,EAAEf,QAAQ,EAAE2B,OAAO,EAAE;AACrD,EAAA,IAAIC,CAAC,CAAA;AACL,EAAA,IAAIV,MAAM,CAAA;AACV,EAAA,IAAIW,QAAQ,CAAA;EAEZ9B,aAAa,CAACC,QAAQ,CAAC,CAAA;EAEvBkB,MAAM,GAAG3C,MAAM,CAACoB,OAAO,CAAA;EACvB,IAAIuB,MAAM,KAAK5I,SAAS,EAAE;IACxB4I,MAAM,GAAG3C,MAAM,CAACoB,OAAO,GAAGf,MAAM,CAAC4B,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7CjC,MAAM,CAACqB,YAAY,GAAG,CAAC,CAAA;AAC3B,GAAG,MAAM;AACT;AACA;AACI,IAAA,IAAIsB,MAAM,CAACY,WAAW,KAAKxJ,SAAS,EAAE;AACpCiG,MAAAA,MAAM,CAACuC,IAAI,CAAC,aAAa,EAAEC,IAAI,EACnBf,QAAQ,CAACA,QAAQ,GAAGA,QAAQ,CAACA,QAAQ,GAAGA,QAAQ,CAAC,CAAA;;AAEnE;AACA;MACMkB,MAAM,GAAG3C,MAAM,CAACoB,OAAO,CAAA;AACxB,KAAA;AACDkC,IAAAA,QAAQ,GAAGX,MAAM,CAACH,IAAI,CAAC,CAAA;AACxB,GAAA;EAED,IAAIc,QAAQ,KAAKvJ,SAAS,EAAE;AAC9B;AACIuJ,IAAAA,QAAQ,GAAGX,MAAM,CAACH,IAAI,CAAC,GAAGf,QAAQ,CAAA;IAClC,EAAEzB,MAAM,CAACqB,YAAY,CAAA;AACzB,GAAG,MAAM;AACL,IAAA,IAAI,OAAOiC,QAAQ,KAAK,UAAU,EAAE;AACxC;AACMA,MAAAA,QAAQ,GAAGX,MAAM,CAACH,IAAI,CAAC,GACrBY,OAAO,GAAG,CAAC3B,QAAQ,EAAE6B,QAAQ,CAAC,GAAG,CAACA,QAAQ,EAAE7B,QAAQ,CAAC,CAAA;AAC7D;KACK,MAAM,IAAI2B,OAAO,EAAE;AAClBE,MAAAA,QAAQ,CAACE,OAAO,CAAC/B,QAAQ,CAAC,CAAA;AAChC,KAAK,MAAM;AACL6B,MAAAA,QAAQ,CAACb,IAAI,CAAChB,QAAQ,CAAC,CAAA;AACxB,KAAA;;AAEL;AACI4B,IAAAA,CAAC,GAAGjB,gBAAgB,CAACpC,MAAM,CAAC,CAAA;AAC5B,IAAA,IAAIqD,CAAC,GAAG,CAAC,IAAIC,QAAQ,CAAClJ,MAAM,GAAGiJ,CAAC,IAAI,CAACC,QAAQ,CAACG,MAAM,EAAE;MACpDH,QAAQ,CAACG,MAAM,GAAG,IAAI,CAAA;AAC5B;AACA;MACM,IAAIC,CAAC,GAAG,IAAIhF,KAAK,CAAC,8CAA8C,GAC5C4E,QAAQ,CAAClJ,MAAM,GAAG,GAAG,GAAGuJ,MAAM,CAACnB,IAAI,CAAC,GAAG,aAAa,GACpD,0CAA0C,GAC1C,gBAAgB,CAAC,CAAA;MACrCkB,CAAC,CAAChJ,IAAI,GAAG,6BAA6B,CAAA;MACtCgJ,CAAC,CAACE,OAAO,GAAG5D,MAAM,CAAA;MAClB0D,CAAC,CAAClB,IAAI,GAAGA,IAAI,CAAA;AACbkB,MAAAA,CAAC,CAACG,KAAK,GAAGP,QAAQ,CAAClJ,MAAM,CAAA;MACzBqG,kBAAkB,CAACiD,CAAC,CAAC,CAAA;AACtB,KAAA;AACF,GAAA;AAED,EAAA,OAAO1D,MAAM,CAAA;AACf,CAAA;AAEAgB,YAAY,CAAC1H,SAAS,CAACwK,WAAW,GAAG,SAASA,WAAWA,CAACtB,IAAI,EAAEf,QAAQ,EAAE;EACxE,OAAO0B,YAAY,CAAC,IAAI,EAAEX,IAAI,EAAEf,QAAQ,EAAE,KAAK,CAAC,CAAA;AAClD,CAAC,CAAA;AAEDT,YAAY,CAAC1H,SAAS,CAACyK,EAAE,GAAG/C,YAAY,CAAC1H,SAAS,CAACwK,WAAW,CAAA;AAE9D9C,YAAY,CAAC1H,SAAS,CAAC0K,eAAe,GAClC,SAASA,eAAeA,CAACxB,IAAI,EAAEf,QAAQ,EAAE;EACvC,OAAO0B,YAAY,CAAC,IAAI,EAAEX,IAAI,EAAEf,QAAQ,EAAE,IAAI,CAAC,CAAA;AACrD,CAAK,CAAA;AAEL,SAASwC,WAAWA,GAAG;AACrB,EAAA,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;AACf,IAAA,IAAI,CAAClE,MAAM,CAACmE,cAAc,CAAC,IAAI,CAAC3B,IAAI,EAAE,IAAI,CAAC4B,MAAM,CAAC,CAAA;IAClD,IAAI,CAACF,KAAK,GAAG,IAAI,CAAA;AACjB,IAAA,IAAIxK,SAAS,CAACU,MAAM,KAAK,CAAC,EACxB,OAAO,IAAI,CAACqH,QAAQ,CAAClI,IAAI,CAAC,IAAI,CAACyG,MAAM,CAAC,CAAA;IACxC,OAAO,IAAI,CAACyB,QAAQ,CAAChI,KAAK,CAAC,IAAI,CAACuG,MAAM,EAAEtG,SAAS,CAAC,CAAA;AACnD,GAAA;AACH,CAAA;AAEA,SAAS2K,SAASA,CAACrE,MAAM,EAAEwC,IAAI,EAAEf,QAAQ,EAAE;AACzC,EAAA,IAAI6C,KAAK,GAAG;AAAEJ,IAAAA,KAAK,EAAE,KAAK;AAAEE,IAAAA,MAAM,EAAErK,SAAS;AAAEiG,IAAAA,MAAM,EAAEA,MAAM;AAAEwC,IAAAA,IAAI,EAAEA,IAAI;AAAEf,IAAAA,QAAQ,EAAEA,QAAAA;GAAU,CAAA;AAC/F,EAAA,IAAI8C,OAAO,GAAGN,WAAW,CAAC7K,IAAI,CAACkL,KAAK,CAAC,CAAA;EACrCC,OAAO,CAAC9C,QAAQ,GAAGA,QAAQ,CAAA;EAC3B6C,KAAK,CAACF,MAAM,GAAGG,OAAO,CAAA;AACtB,EAAA,OAAOA,OAAO,CAAA;AAChB,CAAA;AAEAvD,YAAY,CAAC1H,SAAS,CAAC6H,IAAI,GAAG,SAASA,IAAIA,CAACqB,IAAI,EAAEf,QAAQ,EAAE;EAC1DD,aAAa,CAACC,QAAQ,CAAC,CAAA;AACvB,EAAA,IAAI,CAACsC,EAAE,CAACvB,IAAI,EAAE6B,SAAS,CAAC,IAAI,EAAE7B,IAAI,EAAEf,QAAQ,CAAC,CAAC,CAAA;AAC9C,EAAA,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAEDT,YAAY,CAAC1H,SAAS,CAACkL,mBAAmB,GACtC,SAASA,mBAAmBA,CAAChC,IAAI,EAAEf,QAAQ,EAAE;EAC3CD,aAAa,CAACC,QAAQ,CAAC,CAAA;AACvB,EAAA,IAAI,CAACuC,eAAe,CAACxB,IAAI,EAAE6B,SAAS,CAAC,IAAI,EAAE7B,IAAI,EAAEf,QAAQ,CAAC,CAAC,CAAA;AAC3D,EAAA,OAAO,IAAI,CAAA;AACjB,CAAK,CAAA;;AAEL;AACAT,YAAY,CAAC1H,SAAS,CAAC6K,cAAc,GACjC,SAASA,cAAcA,CAAC3B,IAAI,EAAEf,QAAQ,EAAE;EACtC,IAAIgD,IAAI,EAAE9B,MAAM,EAAE+B,QAAQ,EAAEvK,CAAC,EAAEwK,gBAAgB,CAAA;EAE/CnD,aAAa,CAACC,QAAQ,CAAC,CAAA;EAEvBkB,MAAM,GAAG,IAAI,CAACvB,OAAO,CAAA;AACrB,EAAA,IAAIuB,MAAM,KAAK5I,SAAS,EACtB,OAAO,IAAI,CAAA;AAEb0K,EAAAA,IAAI,GAAG9B,MAAM,CAACH,IAAI,CAAC,CAAA;AACnB,EAAA,IAAIiC,IAAI,KAAK1K,SAAS,EACpB,OAAO,IAAI,CAAA;EAEb,IAAI0K,IAAI,KAAKhD,QAAQ,IAAIgD,IAAI,CAAChD,QAAQ,KAAKA,QAAQ,EAAE;AACnD,IAAA,IAAI,EAAE,IAAI,CAACJ,YAAY,KAAK,CAAC,EAC3B,IAAI,CAACD,OAAO,GAAGf,MAAM,CAAC4B,MAAM,CAAC,IAAI,CAAC,CAAC,KAChC;MACH,OAAOU,MAAM,CAACH,IAAI,CAAC,CAAA;AACnB,MAAA,IAAIG,MAAM,CAACwB,cAAc,EACvB,IAAI,CAAC5B,IAAI,CAAC,gBAAgB,EAAEC,IAAI,EAAEiC,IAAI,CAAChD,QAAQ,IAAIA,QAAQ,CAAC,CAAA;AAC/D,KAAA;AACT,GAAO,MAAM,IAAI,OAAOgD,IAAI,KAAK,UAAU,EAAE;IACrCC,QAAQ,GAAG,CAAC,CAAC,CAAA;AAEb,IAAA,KAAKvK,CAAC,GAAGsK,IAAI,CAACrK,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;AACrC,MAAA,IAAIsK,IAAI,CAACtK,CAAC,CAAC,KAAKsH,QAAQ,IAAIgD,IAAI,CAACtK,CAAC,CAAC,CAACsH,QAAQ,KAAKA,QAAQ,EAAE;AACzDkD,QAAAA,gBAAgB,GAAGF,IAAI,CAACtK,CAAC,CAAC,CAACsH,QAAQ,CAAA;AACnCiD,QAAAA,QAAQ,GAAGvK,CAAC,CAAA;AACZ,QAAA,MAAA;AACD,OAAA;AACF,KAAA;AAED,IAAA,IAAIuK,QAAQ,GAAG,CAAC,EACd,OAAO,IAAI,CAAA;IAEb,IAAIA,QAAQ,KAAK,CAAC,EAChBD,IAAI,CAACG,KAAK,EAAE,CAAC,KACV;AACHC,MAAAA,SAAS,CAACJ,IAAI,EAAEC,QAAQ,CAAC,CAAA;AAC1B,KAAA;AAED,IAAA,IAAID,IAAI,CAACrK,MAAM,KAAK,CAAC,EACnBuI,MAAM,CAACH,IAAI,CAAC,GAAGiC,IAAI,CAAC,CAAC,CAAC,CAAA;AAExB,IAAA,IAAI9B,MAAM,CAACwB,cAAc,KAAKpK,SAAS,EACrC,IAAI,CAACwI,IAAI,CAAC,gBAAgB,EAAEC,IAAI,EAAEmC,gBAAgB,IAAIlD,QAAQ,CAAC,CAAA;AAClE,GAAA;AAED,EAAA,OAAO,IAAI,CAAA;AACjB,CAAK,CAAA;AAELT,YAAY,CAAC1H,SAAS,CAACwL,GAAG,GAAG9D,YAAY,CAAC1H,SAAS,CAAC6K,cAAc,CAAA;AAElEnD,YAAY,CAAC1H,SAAS,CAACyL,kBAAkB,GACrC,SAASA,kBAAkBA,CAACvC,IAAI,EAAE;AAChC,EAAA,IAAIS,SAAS,EAAEN,MAAM,EAAExI,CAAC,CAAA;EAExBwI,MAAM,GAAG,IAAI,CAACvB,OAAO,CAAA;AACrB,EAAA,IAAIuB,MAAM,KAAK5I,SAAS,EACtB,OAAO,IAAI,CAAA;;AAEnB;AACM,EAAA,IAAI4I,MAAM,CAACwB,cAAc,KAAKpK,SAAS,EAAE;AACvC,IAAA,IAAIL,SAAS,CAACU,MAAM,KAAK,CAAC,EAAE;MAC1B,IAAI,CAACgH,OAAO,GAAGf,MAAM,CAAC4B,MAAM,CAAC,IAAI,CAAC,CAAA;MAClC,IAAI,CAACZ,YAAY,GAAG,CAAC,CAAA;KACtB,MAAM,IAAIsB,MAAM,CAACH,IAAI,CAAC,KAAKzI,SAAS,EAAE;MACrC,IAAI,EAAE,IAAI,CAACsH,YAAY,KAAK,CAAC,EAC3B,IAAI,CAACD,OAAO,GAAGf,MAAM,CAAC4B,MAAM,CAAC,IAAI,CAAC,CAAC,KAEnC,OAAOU,MAAM,CAACH,IAAI,CAAC,CAAA;AACtB,KAAA;AACD,IAAA,OAAO,IAAI,CAAA;AACZ,GAAA;;AAEP;AACM,EAAA,IAAI9I,SAAS,CAACU,MAAM,KAAK,CAAC,EAAE;AAC1B,IAAA,IAAI4K,IAAI,GAAG3E,MAAM,CAAC2E,IAAI,CAACrC,MAAM,CAAC,CAAA;AAC9B,IAAA,IAAI/E,GAAG,CAAA;AACP,IAAA,KAAKzD,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG6K,IAAI,CAAC5K,MAAM,EAAE,EAAED,CAAC,EAAE;AAChCyD,MAAAA,GAAG,GAAGoH,IAAI,CAAC7K,CAAC,CAAC,CAAA;MACb,IAAIyD,GAAG,KAAK,gBAAgB,EAAE,SAAA;AAC9B,MAAA,IAAI,CAACmH,kBAAkB,CAACnH,GAAG,CAAC,CAAA;AAC7B,KAAA;AACD,IAAA,IAAI,CAACmH,kBAAkB,CAAC,gBAAgB,CAAC,CAAA;IACzC,IAAI,CAAC3D,OAAO,GAAGf,MAAM,CAAC4B,MAAM,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAACZ,YAAY,GAAG,CAAC,CAAA;AACrB,IAAA,OAAO,IAAI,CAAA;AACZ,GAAA;AAED4B,EAAAA,SAAS,GAAGN,MAAM,CAACH,IAAI,CAAC,CAAA;AAExB,EAAA,IAAI,OAAOS,SAAS,KAAK,UAAU,EAAE;AACnC,IAAA,IAAI,CAACkB,cAAc,CAAC3B,IAAI,EAAES,SAAS,CAAC,CAAA;AAC5C,GAAO,MAAM,IAAIA,SAAS,KAAKlJ,SAAS,EAAE;AAC1C;AACQ,IAAA,KAAKI,CAAC,GAAG8I,SAAS,CAAC7I,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;MAC1C,IAAI,CAACgK,cAAc,CAAC3B,IAAI,EAAES,SAAS,CAAC9I,CAAC,CAAC,CAAC,CAAA;AACxC,KAAA;AACF,GAAA;AAED,EAAA,OAAO,IAAI,CAAA;AACjB,CAAK,CAAA;AAEL,SAAS8K,UAAUA,CAACjF,MAAM,EAAEwC,IAAI,EAAE0C,MAAM,EAAE;AACxC,EAAA,IAAIvC,MAAM,GAAG3C,MAAM,CAACoB,OAAO,CAAA;AAE3B,EAAA,IAAIuB,MAAM,KAAK5I,SAAS,EACtB,OAAO,EAAE,CAAA;AAEX,EAAA,IAAIoL,UAAU,GAAGxC,MAAM,CAACH,IAAI,CAAC,CAAA;AAC7B,EAAA,IAAI2C,UAAU,KAAKpL,SAAS,EAC1B,OAAO,EAAE,CAAA;AAEX,EAAA,IAAI,OAAOoL,UAAU,KAAK,UAAU,EAClC,OAAOD,MAAM,GAAG,CAACC,UAAU,CAAC1D,QAAQ,IAAI0D,UAAU,CAAC,GAAG,CAACA,UAAU,CAAC,CAAA;AAEpE,EAAA,OAAOD,MAAM,GACXE,eAAe,CAACD,UAAU,CAAC,GAAGjC,UAAU,CAACiC,UAAU,EAAEA,UAAU,CAAC/K,MAAM,CAAC,CAAA;AAC3E,CAAA;AAEA4G,YAAY,CAAC1H,SAAS,CAAC2J,SAAS,GAAG,SAASA,SAASA,CAACT,IAAI,EAAE;AAC1D,EAAA,OAAOyC,UAAU,CAAC,IAAI,EAAEzC,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,CAAC,CAAA;AAEDxB,YAAY,CAAC1H,SAAS,CAAC+L,YAAY,GAAG,SAASA,YAAYA,CAAC7C,IAAI,EAAE;AAChE,EAAA,OAAOyC,UAAU,CAAC,IAAI,EAAEzC,IAAI,EAAE,KAAK,CAAC,CAAA;AACtC,CAAC,CAAA;AAEDxB,YAAY,CAACsE,aAAa,GAAG,UAAS1B,OAAO,EAAEpB,IAAI,EAAE;AACnD,EAAA,IAAI,OAAOoB,OAAO,CAAC0B,aAAa,KAAK,UAAU,EAAE;AAC/C,IAAA,OAAO1B,OAAO,CAAC0B,aAAa,CAAC9C,IAAI,CAAC,CAAA;AACtC,GAAG,MAAM;AACL,IAAA,OAAO8C,aAAa,CAAC/L,IAAI,CAACqK,OAAO,EAAEpB,IAAI,CAAC,CAAA;AACzC,GAAA;AACH,CAAC,CAAA;AAEDxB,YAAY,CAAC1H,SAAS,CAACgM,aAAa,GAAGA,aAAa,CAAA;AACpD,SAASA,aAAaA,CAAC9C,IAAI,EAAE;AAC3B,EAAA,IAAIG,MAAM,GAAG,IAAI,CAACvB,OAAO,CAAA;EAEzB,IAAIuB,MAAM,KAAK5I,SAAS,EAAE;AACxB,IAAA,IAAIoL,UAAU,GAAGxC,MAAM,CAACH,IAAI,CAAC,CAAA;AAE7B,IAAA,IAAI,OAAO2C,UAAU,KAAK,UAAU,EAAE;AACpC,MAAA,OAAO,CAAC,CAAA;AACd,KAAK,MAAM,IAAIA,UAAU,KAAKpL,SAAS,EAAE;MACnC,OAAOoL,UAAU,CAAC/K,MAAM,CAAA;AACzB,KAAA;AACF,GAAA;AAED,EAAA,OAAO,CAAC,CAAA;AACV,CAAA;AAEA4G,YAAY,CAAC1H,SAAS,CAACiM,UAAU,GAAG,SAASA,UAAUA,GAAG;AACxD,EAAA,OAAO,IAAI,CAAClE,YAAY,GAAG,CAAC,GAAGlB,cAAc,CAAC,IAAI,CAACiB,OAAO,CAAC,GAAG,EAAE,CAAA;AAClE,CAAC,CAAA;AAED,SAAS8B,UAAUA,CAACsC,GAAG,EAAErD,CAAC,EAAE;AAC1B,EAAA,IAAIsD,IAAI,GAAG,IAAIC,KAAK,CAACvD,CAAC,CAAC,CAAA;EACvB,KAAK,IAAIhI,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgI,CAAC,EAAE,EAAEhI,CAAC,EACxBsL,IAAI,CAACtL,CAAC,CAAC,GAAGqL,GAAG,CAACrL,CAAC,CAAC,CAAA;AAClB,EAAA,OAAOsL,IAAI,CAAA;AACb,CAAA;AAEA,SAASZ,SAASA,CAACJ,IAAI,EAAEkB,KAAK,EAAE;EAC9B,OAAOA,KAAK,GAAG,CAAC,GAAGlB,IAAI,CAACrK,MAAM,EAAEuL,KAAK,EAAE,EACrClB,IAAI,CAACkB,KAAK,CAAC,GAAGlB,IAAI,CAACkB,KAAK,GAAG,CAAC,CAAC,CAAA;EAC/BlB,IAAI,CAACmB,GAAG,EAAE,CAAA;AACZ,CAAA;AAEA,SAASR,eAAeA,CAACI,GAAG,EAAE;EAC5B,IAAIK,GAAG,GAAG,IAAIH,KAAK,CAACF,GAAG,CAACpL,MAAM,CAAC,CAAA;AAC/B,EAAA,KAAK,IAAID,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG0L,GAAG,CAACzL,MAAM,EAAE,EAAED,CAAC,EAAE;AACnC0L,IAAAA,GAAG,CAAC1L,CAAC,CAAC,GAAGqL,GAAG,CAACrL,CAAC,CAAC,CAACsH,QAAQ,IAAI+D,GAAG,CAACrL,CAAC,CAAC,CAAA;AACnC,GAAA;AACD,EAAA,OAAO0L,GAAG,CAAA;AACZ,CAAA;AAEA,SAAS1E,IAAIA,CAACyC,OAAO,EAAElJ,IAAI,EAAE;AAC3B,EAAA,OAAO,IAAIoL,OAAO,CAAC,UAAUC,OAAO,EAAEC,MAAM,EAAE;IAC5C,SAASC,aAAaA,CAACpD,GAAG,EAAE;AAC1Be,MAAAA,OAAO,CAACO,cAAc,CAACzJ,IAAI,EAAEwL,QAAQ,CAAC,CAAA;MACtCF,MAAM,CAACnD,GAAG,CAAC,CAAA;AACZ,KAAA;IAED,SAASqD,QAAQA,GAAG;AAClB,MAAA,IAAI,OAAOtC,OAAO,CAACO,cAAc,KAAK,UAAU,EAAE;AAChDP,QAAAA,OAAO,CAACO,cAAc,CAAC,OAAO,EAAE8B,aAAa,CAAC,CAAA;AAC/C,OAAA;MACDF,OAAO,CAAC,EAAE,CAACjK,KAAK,CAACvC,IAAI,CAACG,SAAS,CAAC,CAAC,CAAA;AACvC,KAAA;AAEIyM,IAAAA,8BAA8B,CAACvC,OAAO,EAAElJ,IAAI,EAAEwL,QAAQ,EAAE;AAAE/E,MAAAA,IAAI,EAAE,IAAA;AAAI,KAAE,CAAC,CAAA;IACvE,IAAIzG,IAAI,KAAK,OAAO,EAAE;AACpB0L,MAAAA,6BAA6B,CAACxC,OAAO,EAAEqC,aAAa,EAAE;AAAE9E,QAAAA,IAAI,EAAE,IAAA;AAAM,OAAA,CAAC,CAAA;AACtE,KAAA;AACL,GAAG,CAAC,CAAA;AACJ,CAAA;AAEA,SAASiF,6BAA6BA,CAACxC,OAAO,EAAEb,OAAO,EAAEsD,KAAK,EAAE;AAC9D,EAAA,IAAI,OAAOzC,OAAO,CAACG,EAAE,KAAK,UAAU,EAAE;IACpCoC,8BAA8B,CAACvC,OAAO,EAAE,OAAO,EAAEb,OAAO,EAAEsD,KAAK,CAAC,CAAA;AACjE,GAAA;AACH,CAAA;AAEA,SAASF,8BAA8BA,CAACvC,OAAO,EAAElJ,IAAI,EAAE+G,QAAQ,EAAE4E,KAAK,EAAE;AACtE,EAAA,IAAI,OAAOzC,OAAO,CAACG,EAAE,KAAK,UAAU,EAAE;IACpC,IAAIsC,KAAK,CAAClF,IAAI,EAAE;AACdyC,MAAAA,OAAO,CAACzC,IAAI,CAACzG,IAAI,EAAE+G,QAAQ,CAAC,CAAA;AAClC,KAAK,MAAM;AACLmC,MAAAA,OAAO,CAACG,EAAE,CAACrJ,IAAI,EAAE+G,QAAQ,CAAC,CAAA;AAC3B,KAAA;GACF,MAAM,IAAI,OAAOmC,OAAO,CAAC0C,gBAAgB,KAAK,UAAU,EAAE;AAC7D;AACA;IACI1C,OAAO,CAAC0C,gBAAgB,CAAC5L,IAAI,EAAE,SAAS6L,YAAYA,CAACzE,GAAG,EAAE;AAC9D;AACA;MACM,IAAIuE,KAAK,CAAClF,IAAI,EAAE;AACdyC,QAAAA,OAAO,CAAC4C,mBAAmB,CAAC9L,IAAI,EAAE6L,YAAY,CAAC,CAAA;AAChD,OAAA;MACD9E,QAAQ,CAACK,GAAG,CAAC,CAAA;AACnB,KAAK,CAAC,CAAA;AACN,GAAG,MAAM;AACL,IAAA,MAAM,IAAI/E,SAAS,CAAC,qEAAqE,GAAG,OAAO6G,OAAO,CAAC,CAAA;AAC5G,GAAA;AACH,CAAA;;;AChMM,IAAW6C,YAAY,CAAA;AAA7B,CAAA,UAAiBA,YAAY,EAAA;EACdA,YAAA,CAAAC,SAAS,GAAgB;AACpCC,IAAAA,UAAU,EAAE,KAAA;GACb,CAAA;EACYF,YAAA,CAAAG,MAAM,GAAgB;AACjCD,IAAAA,UAAU,EAAE,KAAA;GACb,CAAA;EACYF,YAAA,CAAAI,KAAK,GAAgB;AAChCF,IAAAA,UAAU,EAAE,KAAA;GACb,CAAA;EACYF,YAAA,CAAAK,WAAW,GAAgB;AACtCH,IAAAA,UAAU,EAAE,KAAA;GACb,CAAA;EACYF,YAAA,CAAAM,gBAAgB,GAAgB;AAC3CJ,IAAAA,UAAU,EAAE,KAAA;GACb,CAAA;EACYF,YAAA,CAAAO,sBAAsB,GAAgB;AACjDL,IAAAA,UAAU,EAAE,KAAA;GACb,CAAA;AACH,CAAC,EAnBgBF,YAAY,KAAZA,YAAY,GAmB5B,EAAA,CAAA,CAAA;;AC9SK,SAAUQ,YAAYA,CAC1BC,KAAkD,EAAA;EAElD,OAAO,MAAM,IAAIA,KAAK,CAAA;AACxB,CAAA;AAEsB,SAAAC,SAASA,CAC7BC,QAAkC,EAEK;EAAA,IADvCC,SAAA,GAAA3N,SAAA,CAAAU,MAAA,GAAAV,CAAAA,IAAAA,SAAA,CAAAK,CAAAA,CAAAA,KAAAA,SAAA,GAAAL,SAAA,CAAuC,CAAA,CAAA,GAAA;AAAEgB,IAAAA,IAAI,EAAE8C,oBAAAA;GAAsB,CAAA;AAAA,EAAA,IACrE8J,4EAA8B,SAAS,CAAA;;AAEvC;AACA,IAAA,OAAOC,MAAM,CAACC,MAAM,CAACL,SAAS,CAC5B,KAAK,EACLC,QAAQ,EACRC,SAAS,EACT,KAAK,EACLC,KAAK,KAAK,QAAQ,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAC1E,CAAA;AACH,GAAC,CAAA,CAAA;AAAA,CAAA;AA2BD,SAASG,cAAcA,CAACC,aAAqB,EAAEC,IAAY,EAAA;AACzD,EAAA,MAAMC,WAAW,GAAG,IAAIC,WAAW,EAAE,CAAA;AACrC,EAAA,MAAMC,WAAW,GAAGF,WAAW,CAACG,MAAM,CAACJ,IAAI,CAAC,CAAA;AAC5C,EAAA,QAAQD,aAAa;AACnB,IAAA,KAAK,MAAM;MACT,OAAO;AACLhN,QAAAA,IAAI,EAAE,MAAM;AACZiN,QAAAA,IAAI,EAAEG,WAAW;AACjBE,QAAAA,IAAI,EAAE,SAAS;AACf1K,QAAAA,IAAI,EAAE,IAAI2K,WAAW,CAAC,GAAG,CAAA;OAC1B,CAAA;AACH,IAAA,KAAK,QAAQ;AAAE,MAAA;QACb,OAAO;AACLvN,UAAAA,IAAI,EAAE,QAAQ;AACdiN,UAAAA,IAAI,EAAEG,WAAW;AACjBE,UAAAA,IAAI,EAAE,SAAS;AACfE,UAAAA,UAAU,EAAE,MAAA;SACb,CAAA;AACF,OAAA;AACD,IAAA;AACE,MAAA,MAAM,IAAIxJ,KAAK,CAAA,YAAA,CAAA8B,MAAA,CAAckH,aAAa,8BAA2B,CAAC,CAAA;AACzE,GAAA;AACH,CAAA;AAEA;;;AAGG;AACmB,SAAAS,UAAUA,CAACC,QAAmB,EAAET,IAAY,EAAA;;IAChE,MAAMU,gBAAgB,GAAGZ,cAAc,CAACW,QAAQ,CAACf,SAAS,CAAC3M,IAAI,EAAEiN,IAAI,CAAC,CAAA;AAEtE;AACA;AACA,IAAA,MAAMW,aAAa,GAAG,MAAMf,MAAM,CAACC,MAAM,CAACe,SAAS,CACjDF,gBAAgB,EAChBD,QAAQ,EACR;AACE1N,MAAAA,IAAI,EAAE8C,oBAAoB;AAC1BpD,MAAAA,MAAM,EAAE,GAAA;KACT,EACD,KAAK,EACL,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAA;IAED,OAAO;MAAEgO,QAAQ;AAAEE,MAAAA,aAAAA;KAAe,CAAA;AACpC,GAAC,CAAA,CAAA;AAAA,CAAA;AAcD;;;AAGG;AACmB,SAAAE,OAAOA,CAACJ,QAAmB,EAAET,IAAY,EAAA;;IAC7D,MAAMU,gBAAgB,GAAGZ,cAAc,CAACW,QAAQ,CAACf,SAAS,CAAC3M,IAAI,EAAEiN,IAAI,CAAC,CAAA;AAEtE;IACA,OAAOJ,MAAM,CAACC,MAAM,CAACiB,UAAU,CAACJ,gBAAgB,EAAED,QAAQ,EAAE,GAAG,CAAC,CAAA;AAClE,GAAC,CAAA,CAAA;AAAA;;MCrIYM,QAAQ,CAAA;AAArB/J,EAAAA,WAAAA,GAAA;IACU,IAAmB,CAAAgK,mBAAA,GAAG,CAAC,CAAA;IAIvB,IAAiB,CAAAC,iBAAA,GAAW,CAAC,CAAA;IAE7B,IAAkB,CAAAC,kBAAA,GAAW,CAAC,CAAA;AAqCxC,GAAA;AAnCEC,EAAAA,SAASA,GAAA;;IACP,IAAI,CAACH,mBAAmB,IAAI,CAAC,CAAA;IAC7B,CAAAI,EAAA,GAAA,IAAI,CAACC,oBAAoB,MAAA,IAAA,IAAAD,EAAA,KAAA,KAAA,CAAA,GAAAA,EAAA,GAAzB,IAAI,CAACC,oBAAoB,GAAKC,IAAI,CAACC,GAAG,EAAG,CAAA;AACzC,IAAA,IAAI,CAACN,iBAAiB,GAAGK,IAAI,CAACC,GAAG,EAAE,CAAA;AACrC,GAAA;AAEAC,EAAAA,eAAeA,GAAA;AACb,IAAA,IAAI,IAAI,CAACH,oBAAoB,KAAKjP,SAAS,EAAE;AAC3C,MAAA,OAAA;AACD,KAAA,MAAM;MACL,IAAI,CAAC8O,kBAAkB,IAAI,CAAC,CAAA;AAC7B,KAAA;AACD,IAAA;AACE;AACA,IAAA,IAAI,CAACA,kBAAkB,GAAG,IAAI,CAACF,mBAAmB;AAClD;IACAM,IAAI,CAACC,GAAG,EAAE,GAAG,IAAI,CAACN,iBAAiB,GAAGpK,gBAAgB,EACtD;MACA,IAAI,CAAC4K,KAAK,EAAE,CAAA;AACb,KAAA;AACH,GAAA;AAEAC,EAAAA,YAAYA,GAAA;IACV,OACE,IAAI,CAACV,mBAAmB,GAAGpK,aAAa,KACvC,IAAI,CAACyK,oBAAoB,KAAKjP,SAAS,IACtCkP,IAAI,CAACC,GAAG,EAAE,GAAG,IAAI,CAACF,oBAAoB,GAAGxK,gBAAgB,CAAC,CAAA;AAEhE,GAAA;AAEA4K,EAAAA,KAAKA,GAAA;IACH,IAAI,CAACP,kBAAkB,GAAG,CAAC,CAAA;IAC3B,IAAI,CAACF,mBAAmB,GAAG,CAAC,CAAA;IAC5B,IAAI,CAACK,oBAAoB,GAAGjP,SAAS,CAAA;AACvC,GAAA;AACD;;AChCM,MAAMuP,oBAAoB,GAAyB,IAAIC,GAAG,EAAE,CAAA;AAa7D,MAAOC,gBAAiB,SAASxI,0BAA8D,CAAA;AACzFyI,EAAAA,cAAcA,CACtBC,YAAyD,EACzDC,UAA4C,EAAA;IAE5C,MAAMjL,KAAK,CAAC,8BAA8B,CAAC,CAAA;AAC7C,GAAA;AAEUkL,EAAAA,cAAcA,CACtBF,YAAyD,EACzDC,UAA4C,EAAA;IAE5C,MAAMjL,KAAK,CAAC,8BAA8B,CAAC,CAAA;AAC7C,GAAA;AACD,CAAA;AAED;;;AAGG;AACG,MAAOmL,YAAa,SAAQL,gBAAgB,CAAA;EAsBhD7K,WAAAA,CAAYmL,IAKX,EAAA;;AACC,IAAA,KAAK,EAAE,CAAA;AACP,IAAA,IAAI,CAACC,UAAU,GAAG,IAAIR,GAAG,EAAE,CAAA;AAC3B,IAAA,IAAI,CAACvE,IAAI,GAAG8E,IAAI,CAAC9E,IAAI,CAAA;AACrB,IAAA,IAAI,CAACgF,mBAAmB,GAAGF,IAAI,CAACE,mBAAmB,CAAA;AACnD,IAAA,IAAI,CAACC,MAAM,GAAG,IAAIV,GAAG,EAAE,CAAA;AACvB,IAAA,IAAI,CAACW,kBAAkB,GAAGJ,IAAI,CAACI,kBAAkB,CAAA;IACjD,IAAI,CAACC,UAAU,GAAG,CAAApB,EAAA,GAAAe,IAAI,CAACK,UAAU,MAAI,IAAA,IAAApB,EAAA,KAAA,KAAA,CAAA,GAAAA,EAAA,GAAAqB,UAAU,CAACC,IAAI,CAAC,EAAE,CAAC,CAAA;AACxD,IAAA,IAAI,CAACC,QAAQ,GAAG,IAAI5B,QAAQ,EAAE,CAAA;AAChC,GAAA;AAEA;;;;;AAKG;AACH6B,EAAAA,cAAcA,CAACC,EAAU,EAAExF,IAA2B,EAAA;IACpD,IAAI,CAACgF,mBAAmB,GAAGQ,EAAE,CAAA;IAC7B,IAAI,CAACxF,IAAI,GAAGA,IAAI,CAAA;AAChB,IAAA,IAAI,CAACsF,QAAQ,CAAClB,KAAK,EAAE,CAAA;AACvB,GAAA;AAEAqB,EAAAA,gBAAgBA,GAAA;IACd,IAAI,CAACT,mBAAmB,GAAGjQ,SAAS,CAAA;AACtC,GAAA;AAEA2Q,EAAAA,SAASA,GAAA;IACP,IAAI,IAAI,CAACV,mBAAmB,EAAE;AAC5B,MAAA,OAAOV,oBAAoB,CAAC1H,GAAG,CAAC,IAAI,CAACoI,mBAAmB,CAAC,CAAA;AAC1D,KAAA,MAAM;AACL,MAAA,OAAOjQ,SAAS,CAAA;AACjB,KAAA;AACH,GAAA;AAEA4Q,EAAAA,sBAAsBA,GAAA;IACpB,OAAO,IAAI,CAACX,mBAAmB,CAAA;AACjC,GAAA;AAEAY,EAAAA,UAAUA,GAAA;IACR,OAAO,IAAI,CAACC,OAAO,CAAA;AACrB,GAAA;AAEA;;;AAGG;EACHC,aAAaA,CAACC,KAAiB,EAAA;IAC7B,IAAI,CAACC,UAAU,GAAGD,KAAK,CAAA;AACzB,GAAA;AAEA;;;AAGG;EACHE,SAASA,CAACC,GAA4B,EAAA;IACpC,IAAI,CAACjB,MAAM,GAAGiB,GAAG,CAAA;AACnB,GAAA;EAEAC,cAAcA,CACZC,SAA8B,EAC9BC,QAAwB,EACxBC,QAAwB,EACxBT,OAAe,EACfE,KAAkB,EAAA;AAElB,IAAA,IAAIA,KAAK,EAAE;AACTxN,MAAAA,YAAY,CAACD,IAAI,CAAC,6BAA6B,EAAE;AAAEyN,QAAAA,KAAAA;AAAO,OAAA,CAAC,CAAA;MAC3D,IAAI,CAACC,UAAU,GAAGD,KAAK,CAAA;AACxB,KAAA;AAED,IAAA,MAAMQ,WAAW,GAAGH,SAAS,KAAK,QAAQ,GAAG,IAAI,CAAC3B,cAAc,GAAG,IAAI,CAACG,cAAc,CAAA;AACtF,IAAA,MAAM4B,eAAe,GAAG,IAAIC,eAAe,CAAC;AAC1CC,MAAAA,SAAS,EAAEH,WAAW,CAACnS,IAAI,CAAC,IAAI,CAAA;AACjC,KAAA,CAAC,CAAA;AAEFiS,IAAAA,QAAQ,CACLM,WAAW,CAACH,eAAe,CAAC,CAC5BI,MAAM,CAACN,QAAQ,CAAC,CAChBO,KAAK,CAAErS,CAAC,IAAI;AACX+D,MAAAA,YAAY,CAACoD,IAAI,CAACnH,CAAC,CAAC,CAAA;MACpB,IAAI,CAAC+I,IAAI,CAAC3C,YAAY,CAAClB,KAAK,EAAElF,CAAC,YAAY8F,YAAY,GAAG9F,CAAC,GAAG,IAAI8F,YAAY,CAAC9F,CAAC,CAACqF,OAAO,CAAC,CAAC,CAAA;AAC5F,KAAC,CAAC,CAAA;IACJ,IAAI,CAACgM,OAAO,GAAGA,OAAO,CAAA;AACxB,GAAA;EAEAiB,aAAaA,CAACC,OAAmB,EAAA;IAC/B,IAAI,CAAC5B,UAAU,GAAG4B,OAAO,CAAA;AAC3B,GAAA;AAEA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACatC,EAAAA,cAAcA,CAC5BC,YAAyD,EACzDC,UAA4C,EAAA;;;AAE5C,MAAA,IACE,CAAC,IAAI,CAACe,SAAS,EAAE;AACjB;AACAhB,MAAAA,YAAY,CAACsC,IAAI,CAACC,UAAU,KAAK,CAAC,EAClC;AACA,QAAA,OAAOtC,UAAU,CAACuC,OAAO,CAACxC,YAAY,CAAC,CAAA;AACxC,OAAA;MACD,MAAMyC,MAAM,GAAG,IAAI,CAACnH,IAAI,CAACoH,SAAS,EAAE,CAAA;MACpC,IAAI,CAACD,MAAM,EAAE;AACX,QAAA,MAAM,IAAIpP,SAAS,CAAA,wBAAA,CAAAyD,MAAA,CAEf,IAAI,CAACwJ,mBACP,EAAA,YAAA,CAAA,CAAAxJ,MAAA,CAAa,IAAI,CAACwE,IAAI,CAACqH,kBAAkB,EAAE,CAAE,CAC9C,CAAA;AACF,OAAA;MACD,MAAM;AAAE/D,QAAAA,aAAAA;AAAe,OAAA,GAAG6D,MAAM,CAAA;MAChC,MAAMG,QAAQ,GAAG,IAAI,CAACtH,IAAI,CAACqH,kBAAkB,EAAE,CAAA;AAE/C,MAAA,IAAI/D,aAAa,EAAE;AACjB,QAAA,MAAMiE,EAAE,GAAG,IAAI,CAACC,MAAM,CACpB,CAAAzD,EAAA,GAAAW,YAAY,CAAC+C,WAAW,EAAE,CAACC,qBAAqB,mCAAI,CAAC,CAAC,EACtDhD,YAAY,CAACiD,SAAS,CACvB,CAAA;AAED;AACA,QAAA,MAAMC,WAAW,GAAG,IAAIxC,UAAU,CAChCV,YAAY,CAACsC,IAAI,EACjB,CAAC,EACD,IAAI,CAACa,mBAAmB,CAACnD,YAAY,CAAC,CACvC,CAAA;AAED;AACA,QAAA,MAAMoD,YAAY,GAAG,IAAI1C,UAAU,CAAC,CAAC,CAAC,CAAA;AAEtC0C,QAAAA,YAAY,CAAC,CAAC,CAAC,GAAG9O,SAAS,CAAA;AAC3B8O,QAAAA,YAAY,CAAC,CAAC,CAAC,GAAGR,QAAQ,CAAA;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;QACA,IAAI;UACF,MAAMS,UAAU,GAAG,MAAMxF,MAAM,CAACC,MAAM,CAACwF,OAAO,CAC5C;AACEtS,YAAAA,IAAI,EAAE8C,oBAAoB;YAC1B+O,EAAE;AACFU,YAAAA,cAAc,EAAE,IAAI7C,UAAU,CAACV,YAAY,CAACsC,IAAI,EAAE,CAAC,EAAEY,WAAW,CAACX,UAAU,CAAA;AAC5E,WAAA,EACD3D,aAAa,EACb,IAAI8B,UAAU,CAACV,YAAY,CAACsC,IAAI,EAAE,IAAI,CAACa,mBAAmB,CAACnD,YAAY,CAAC,CAAC,CAC1E,CAAA;UAED,MAAMwD,OAAO,GAAG,IAAIjF,WAAW,CAC7B2E,WAAW,CAACX,UAAU,GAAGc,UAAU,CAACd,UAAU,GAAGM,EAAE,CAACN,UAAU,GAAGa,YAAY,CAACb,UAAU,CACzF,CAAA;AACD,UAAA,MAAMkB,QAAQ,GAAG,IAAI/C,UAAU,CAAC8C,OAAO,CAAC,CAAA;AAExCC,UAAAA,QAAQ,CAACtL,GAAG,CAAC+K,WAAW,CAAC,CAAC;AAC1BO,UAAAA,QAAQ,CAACtL,GAAG,CAAC,IAAIuI,UAAU,CAAC2C,UAAU,CAAC,EAAEH,WAAW,CAACX,UAAU,CAAC,CAAC;AACjEkB,UAAAA,QAAQ,CAACtL,GAAG,CAAC,IAAIuI,UAAU,CAACmC,EAAE,CAAC,EAAEK,WAAW,CAACX,UAAU,GAAGc,UAAU,CAACd,UAAU,CAAC,CAAC;AACjFkB,UAAAA,QAAQ,CAACtL,GAAG,CAACiL,YAAY,EAAEF,WAAW,CAACX,UAAU,GAAGc,UAAU,CAACd,UAAU,GAAGM,EAAE,CAACN,UAAU,CAAC,CAAC;UAE3FvC,YAAY,CAACsC,IAAI,GAAGkB,OAAO,CAAA;AAE3B,UAAA,OAAOvD,UAAU,CAACuC,OAAO,CAACxC,YAAY,CAAC,CAAA;SACxC,CAAC,OAAOlQ,CAAM,EAAE;AACf;AACA+D,UAAAA,YAAY,CAACyB,KAAK,CAACxF,CAAC,CAAC,CAAA;AACtB,SAAA;AACF,OAAA,MAAM;AACL,QAAA,IAAI,CAAC+I,IAAI,CACP3C,YAAY,CAAClB,KAAK,EAClB,IAAIY,YAAY,CAAwCD,qCAAAA,EAAAA,kBAAkB,CAAC+N,UAAU,CAAC,CACvF,CAAA;AACF,OAAA;;AACF,GAAA;AAED;;;;;AAKG;AACaxD,EAAAA,cAAcA,CAC5BF,YAAyD,EACzDC,UAA4C,EAAA;;AAE5C,MAAA,IACE,CAAC,IAAI,CAACe,SAAS,EAAE;AACjB;AACAhB,MAAAA,YAAY,CAACsC,IAAI,CAACC,UAAU,KAAK,CAAC,EAClC;AACA,QAAA,IAAI,CAAC3B,QAAQ,CAACnB,eAAe,EAAE,CAAA;AAC/B,QAAA,OAAOQ,UAAU,CAACuC,OAAO,CAACxC,YAAY,CAAC,CAAA;AACxC,OAAA;MAED,IAAI2D,qBAAqB,CAAC3D,YAAY,CAACsC,IAAI,EAAE,IAAI,CAAC7B,UAAU,CAAC,EAAE;AAC7D,QAAA,IAAI,CAACG,QAAQ,CAACxB,SAAS,EAAE,CAAA;AAEzB,QAAA,IAAI,IAAI,CAACwB,QAAQ,CAACjB,YAAY,EAAE,EAAE;AAChC,UAAA,OAAOM,UAAU,CAACuC,OAAO,CAACxC,YAAY,CAAC,CAAA;AACxC,SAAA,MAAM;AACLnM,UAAAA,YAAY,CAACoD,IAAI,CAAC,mCAAmC,CAAC,CAAA;AACtD,UAAA,OAAA;AACD,SAAA;AACF,OAAA,MAAM;AACL,QAAA,IAAI,CAAC2J,QAAQ,CAACnB,eAAe,EAAE,CAAA;AAChC,OAAA;MACD,MAAM6C,IAAI,GAAG,IAAI5B,UAAU,CAACV,YAAY,CAACsC,IAAI,CAAC,CAAA;MAC9C,MAAMM,QAAQ,GAAGN,IAAI,CAACtC,YAAY,CAACsC,IAAI,CAACC,UAAU,GAAG,CAAC,CAAC,CAAA;AAEvD,MAAA,IAAI,IAAI,CAACjH,IAAI,CAACoH,SAAS,CAACE,QAAQ,CAAC,IAAI,IAAI,CAACtH,IAAI,CAACsI,WAAW,EAAE;QAC1D,IAAI;UACF,MAAMC,YAAY,GAAG,MAAM,IAAI,CAACC,YAAY,CAAC9D,YAAY,EAAE4C,QAAQ,CAAC,CAAA;AACpE,UAAA,IAAI,CAACtH,IAAI,CAACyI,iBAAiB,EAAE,CAAA;AAC7B,UAAA,IAAIF,YAAY,EAAE;AAChB,YAAA,OAAO5D,UAAU,CAACuC,OAAO,CAACqB,YAAY,CAAC,CAAA;AACxC,WAAA;SACF,CAAC,OAAOvO,KAAK,EAAE;UACd,IAAIA,KAAK,YAAYM,YAAY,IAAIN,KAAK,CAACO,MAAM,KAAKF,kBAAkB,CAACqO,UAAU,EAAE;AACnF,YAAA,IAAI,IAAI,CAAC1I,IAAI,CAACsI,WAAW,EAAE;cACzB,IAAI,CAAC/K,IAAI,CACP3C,YAAY,CAAClB,KAAK,EAClB,IAAIY,YAAY,CAAA,8BAAA,CAAAkB,MAAA,CACiB,IAAI,CAACwJ,mBAAmB,CAAA,EACvD3K,kBAAkB,CAACqO,UAAU,CAC9B,CACF,CAAA;AACD,cAAA,IAAI,CAAC1I,IAAI,CAAC2I,iBAAiB,EAAE,CAAA;AAC9B,aAAA;AACF,WAAA,MAAM;AACLpQ,YAAAA,YAAY,CAACoD,IAAI,CAAC,uBAAuB,EAAE;AAAE3B,cAAAA,KAAAA;AAAO,aAAA,CAAC,CAAA;AACtD,WAAA;AACF,SAAA;AACF,OAAA,MAAM,IAAI,CAAC,IAAI,CAACgG,IAAI,CAACoH,SAAS,CAACE,QAAQ,CAAC,IAAI,IAAI,CAACtH,IAAI,CAACsI,WAAW,EAAE;AAClE;AACA/P,QAAAA,YAAY,CAACoD,IAAI,CAAC,iDAAiD,CAAC,CAAA;QACpE,IAAI,CAAC4B,IAAI,CACP3C,YAAY,CAAClB,KAAK,EAClB,IAAIY,YAAY,CAAA,uCAAA,CAAAkB,MAAA,CAC0B,IAAI,CAACwJ,mBAAmB,CAAA,EAChE3K,kBAAkB,CAAC+N,UAAU,CAC9B,CACF,CAAA;AACF,OAAA;AACH,KAAC,CAAA,CAAA;AAAA,GAAA;AAED;;;AAGG;AACWI,EAAAA,YAAYA,CACxB9D,YAAyD,EACzD4C,QAAgB,EAEuC;AAAA,IAAA,IADvDsB,eAAA,GAAAlU,SAAA,CAAAU,MAAA,GAAA,CAAA,IAAAV,SAAA,CAAA,CAAA,CAAA,KAAAK,SAAA,GAAAL,SAAA,CAAA,CAAA,CAAA,GAAsCK,SAAS,CAAA;IAAA,IAC/C8T,WAAoC,GAAAnU,SAAA,CAAAU,MAAA,GAAAV,CAAAA,IAAAA,SAAA,CAAAK,CAAAA,CAAAA,KAAAA,SAAA,GAAAL,SAAA,CAAA,CAAA,CAAA,GAAA;AAAEoU,MAAAA,YAAY,EAAE,CAAA;KAAG,CAAA;;;MAEvD,MAAM3B,MAAM,GAAG,IAAI,CAACnH,IAAI,CAACoH,SAAS,CAACE,QAAQ,CAAC,CAAA;AAC5C,MAAA,IAAI,CAACuB,WAAW,CAACvF,aAAa,IAAI,CAAC6D,MAAM,EAAE;QACzC,MAAM,IAAIpP,SAAS,CAAAyD,4CAAAA,CAAAA,MAAA,CAA8C,IAAI,CAACwJ,mBAAmB,CAAE,CAAC,CAAA;AAC7F,OAAA;AAED;AACA;AACA;AACA;AACA;AACA;AACA;MAEA,IAAI;AACF,QAAA,MAAM4C,WAAW,GAAG,IAAIxC,UAAU,CAChCV,YAAY,CAACsC,IAAI,EACjB,CAAC,EACD,IAAI,CAACa,mBAAmB,CAACnD,YAAY,CAAC,CACvC,CAAA;AACD,QAAA,MAAMoD,YAAY,GAAG,IAAI1C,UAAU,CAACV,YAAY,CAACsC,IAAI,EAAEtC,YAAY,CAACsC,IAAI,CAACC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AAE3F,QAAA,MAAM8B,QAAQ,GAAGjB,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,MAAMP,EAAE,GAAG,IAAInC,UAAU,CACvBV,YAAY,CAACsC,IAAI,EACjBtC,YAAY,CAACsC,IAAI,CAACC,UAAU,GAAG8B,QAAQ,GAAGjB,YAAY,CAACb,UAAU,EACjE8B,QAAQ,CACT,CAAA;AAED,QAAA,MAAMC,eAAe,GAAGpB,WAAW,CAACX,UAAU,CAAA;AAC9C,QAAA,MAAMgC,gBAAgB,GACpBvE,YAAY,CAACsC,IAAI,CAACC,UAAU,IAC3BW,WAAW,CAACX,UAAU,GAAG8B,QAAQ,GAAGjB,YAAY,CAACb,UAAU,CAAC,CAAA;QAE/D,MAAMiC,SAAS,GAAG,MAAM3G,MAAM,CAACC,MAAM,CAAC2G,OAAO,CAC3C;AACEzT,UAAAA,IAAI,EAAE8C,oBAAoB;UAC1B+O,EAAE;AACFU,UAAAA,cAAc,EAAE,IAAI7C,UAAU,CAACV,YAAY,CAACsC,IAAI,EAAE,CAAC,EAAEY,WAAW,CAACX,UAAU,CAAA;SAC5E,EACD,CAAAlD,EAAA,GAAA8E,WAAW,CAACvF,aAAa,mCAAI6D,MAAO,CAAC7D,aAAa,EAClD,IAAI8B,UAAU,CAACV,YAAY,CAACsC,IAAI,EAAEgC,eAAe,EAAEC,gBAAgB,CAAC,CACrE,CAAA;AAED,QAAA,MAAMf,OAAO,GAAG,IAAIjF,WAAW,CAAC2E,WAAW,CAACX,UAAU,GAAGiC,SAAS,CAACjC,UAAU,CAAC,CAAA;AAC9E,QAAA,MAAMkB,QAAQ,GAAG,IAAI/C,UAAU,CAAC8C,OAAO,CAAC,CAAA;AAExCC,QAAAA,QAAQ,CAACtL,GAAG,CAAC,IAAIuI,UAAU,CAACV,YAAY,CAACsC,IAAI,EAAE,CAAC,EAAEY,WAAW,CAACX,UAAU,CAAC,CAAC,CAAA;AAC1EkB,QAAAA,QAAQ,CAACtL,GAAG,CAAC,IAAIuI,UAAU,CAAC8D,SAAS,CAAC,EAAEtB,WAAW,CAACX,UAAU,CAAC,CAAA;QAE/DvC,YAAY,CAACsC,IAAI,GAAGkB,OAAO,CAAA;AAE3B,QAAA,OAAOxD,YAAY,CAAA;OACpB,CAAC,OAAO1K,KAAU,EAAE;AACnB,QAAA,IAAI,IAAI,CAACkL,kBAAkB,CAAC7L,iBAAiB,GAAG,CAAC,EAAE;UACjD,IAAIwP,WAAW,CAACC,YAAY,GAAG,IAAI,CAAC5D,kBAAkB,CAAC7L,iBAAiB,EAAE;YACxEd,YAAY,CAACjD,KAAK,CAAA,yBAAA,CAAAkG,MAAA,CACUqN,WAAW,CAACC,YAAY,EAAA,MAAA,CAAA,CAAAtN,MAAA,CAChD,IAAI,CAAC0J,kBAAkB,CAAC7L,iBAC1B,EAAA,aAAA,CAAA,CAAAmC,MAAA,CAAckJ,YAAY,YAAY0E,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAE,CACjF,CAAA;AAED,YAAA,IAAIC,eAAmC,CAAA;YACvC,IAAIlC,MAAM,KAAK,IAAI,CAACnH,IAAI,CAACoH,SAAS,CAACE,QAAQ,CAAC,EAAE;AAC5C;AACA;AACA,cAAA,MAAMgC,WAAW,GAAG,MAAM,IAAI,CAACtJ,IAAI,CAACuJ,UAAU,CAACjC,QAAQ,EAAE,KAAK,CAAC,CAAA;cAE/D+B,eAAe,GAAG,MAAMlG,UAAU,CAACmG,WAAW,EAAE,IAAI,CAACpE,kBAAkB,CAAC9L,WAAW,CAAC,CAAA;AACrF,aAAA;AAED,YAAA,MAAM8I,KAAK,GAAG,MAAM,IAAI,CAACsG,YAAY,CAAC9D,YAAY,EAAE4C,QAAQ,EAAEsB,eAAe,IAAIzB,MAAM,EAAE;AACvF2B,cAAAA,YAAY,EAAED,WAAW,CAACC,YAAY,GAAG,CAAC;AAC1CxF,cAAAA,aAAa,EAAE+F,eAAe,KAAA,IAAA,IAAfA,eAAe,KAAf,KAAA,CAAA,GAAA,KAAA,CAAA,GAAAA,eAAe,CAAE/F,aAAAA;AACjC,aAAA,CAAC,CAAA;YACF,IAAIpB,KAAK,IAAImH,eAAe,EAAE;cAC5B,IAAI,CAACrJ,IAAI,CAACwJ,SAAS,CAACH,eAAe,EAAE/B,QAAQ,EAAE,IAAI,CAAC,CAAA;AACpD;AACA,cAAA,IAAI,CAACtH,IAAI,CAACyJ,kBAAkB,CAACnC,QAAQ,CAAC,CAAA;AACvC,aAAA;AACD,YAAA,OAAOpF,KAAK,CAAA;AACb,WAAA,MAAM;AACL;;;;;AAKG;AACH,YAAA,IAAI0G,eAAe,EAAE;AACnBrQ,cAAAA,YAAY,CAACjD,KAAK,CAAC,+BAA+B,CAAC,CAAA;cACnD,IAAI,CAAC0K,IAAI,CAAC0J,kBAAkB,CAACd,eAAe,CAACxF,QAAQ,EAAEkE,QAAQ,CAAC,CAAA;AACjE,aAAA;AAED/O,YAAAA,YAAY,CAACoD,IAAI,CAAC,mCAAmC,CAAC,CAAA;AACtD,YAAA,MAAM,IAAIrB,YAAY,CAAAkB,oCAAAA,CAAAA,MAAA,CACiB,IAAI,CAACwJ,mBAAmB,CAC7D3K,EAAAA,kBAAkB,CAACqO,UAAU,CAC9B,CAAA;AACF,WAAA;AACF,SAAA,MAAM;UACL,MAAM,IAAIpO,YAAY,CACpB,0DAA0D,EAC1DD,kBAAkB,CAACqO,UAAU,CAC9B,CAAA;AACF,SAAA;AACF,OAAA;;AACF,GAAA;AAED;;;;;;;;;;;;;;;;;;AAkBG;AACKlB,EAAAA,MAAMA,CAACE,qBAA6B,EAAEC,SAAiB,EAAA;;AAC7D,IAAA,MAAMJ,EAAE,GAAG,IAAItE,WAAW,CAACjK,SAAS,CAAC,CAAA;AACrC,IAAA,MAAM2Q,MAAM,GAAG,IAAIC,QAAQ,CAACrC,EAAE,CAAC,CAAA;AAE/B;IACA,IAAI,CAAC,IAAI,CAACxC,UAAU,CAAC8E,GAAG,CAACnC,qBAAqB,CAAC,EAAE;AAC/C;AACA,MAAA,IAAI,CAAC3C,UAAU,CAAClI,GAAG,CAAC6K,qBAAqB,EAAEoC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAA;AAC/E,KAAA;IAED,MAAMC,SAAS,GAAG,CAAAlG,EAAA,GAAA,IAAI,CAACgB,UAAU,CAACnI,GAAG,CAAC8K,qBAAqB,CAAC,MAAA,IAAA,IAAA3D,EAAA,KAAA,KAAA,CAAA,GAAAA,EAAA,GAAI,CAAC,CAAA;AAEjE4F,IAAAA,MAAM,CAACO,SAAS,CAAC,CAAC,EAAExC,qBAAqB,CAAC,CAAA;AAC1CiC,IAAAA,MAAM,CAACO,SAAS,CAAC,CAAC,EAAEvC,SAAS,CAAC,CAAA;IAC9BgC,MAAM,CAACO,SAAS,CAAC,CAAC,EAAEvC,SAAS,GAAIsC,SAAS,GAAG,MAAO,CAAC,CAAA;IAErD,IAAI,CAAClF,UAAU,CAAClI,GAAG,CAAC6K,qBAAqB,EAAEuC,SAAS,GAAG,CAAC,CAAC,CAAA;AAEzD,IAAA,OAAO1C,EAAE,CAAA;AACX,GAAA;EAEQM,mBAAmBA,CAAC3F,KAAkD,EAAA;;AAC5E,IAAA,IAAID,YAAY,CAACC,KAAK,CAAC,EAAE;MACvB,IAAIiI,aAAa,GAAG,CAAApG,EAAA,GAAA,IAAI,CAACqG,aAAa,CAAClI,KAAK,CAAC,MAAA,IAAA,IAAA6B,EAAA,KAAA,KAAA,CAAA,GAAAA,EAAA,GAAI,IAAI,CAACiC,UAAU,CAAA;AAEhE,MAAA,IAAImE,aAAa,KAAK,KAAK,IAAIA,aAAa,KAAK,KAAK,EAAE;AACtD,QAAA,MAAM,IAAIzQ,KAAK,CAAA,EAAA,CAAA8B,MAAA,CAAI2O,aAAa,oDAAiD,CAAC,CAAA;AACnF,OAAA;MAED,IAAIA,aAAa,KAAK,KAAK,EAAE;AAC3B,QAAA,OAAOxR,iBAAiB,CAACuJ,KAAK,CAAC1E,IAAI,CAAC,CAAA;AACrC,OAAA;MAED,MAAMwJ,IAAI,GAAG,IAAI5B,UAAU,CAAClD,KAAK,CAAC8E,IAAI,CAAC,CAAA;MACvC,IAAI;AACF,QAAA,MAAMqD,WAAW,GAAGC,eAAe,CAACtD,IAAI,CAAC,CAAA;AAEzC;AACA,QAAA,MAAMuD,MAAM,GACVJ,aAAa,KAAK,MAAM,IACxBE,WAAW,CAACG,IAAI,CAAEC,SAAS,IACzB,CAACC,QAAQ,CAACC,SAAS,EAAED,QAAQ,CAACE,aAAa,CAAC,CAACC,QAAQ,CAACC,aAAa,CAAC9D,IAAI,CAACyD,SAAS,CAAC,CAAC,CAAC,CACtF,CAAA;AAEH,QAAA,IAAIF,MAAM,EAAE;AACV,UAAA,KAAK,MAAM5J,KAAK,IAAI0J,WAAW,EAAE;YAC/B,IAAI7M,IAAI,GAAGsN,aAAa,CAAC9D,IAAI,CAACrG,KAAK,CAAC,CAAC,CAAA;AACrC,YAAA,QAAQnD,IAAI;cACV,KAAKkN,QAAQ,CAACC,SAAS,CAAA;cACvB,KAAKD,QAAQ,CAACE,aAAa;gBACzB,OAAOjK,KAAK,GAAG,CAAC,CAAA;AAClB,cAAA;AACE,gBAAA,MAAA;AACH,aAAA;AACF,WAAA;AACD,UAAA,MAAM,IAAI5I,SAAS,CAAC,qBAAqB,CAAC,CAAA;AAC3C,SAAA;OACF,CAAC,OAAOvD,CAAC,EAAE;AACV;AAAA,OAAA;AAGF,MAAA,OAAOmE,iBAAiB,CAACuJ,KAAK,CAAC1E,IAAI,CAAC,CAAA;AACrC,KAAA,MAAM;MACL,OAAO7E,iBAAiB,CAACG,KAAK,CAAA;AAC/B,KAAA;AACH,GAAA;AAEA;;AAEG;EACKsR,aAAaA,CAAClI,KAA2B,EAAA;AAC/C,IAAA,IAAI,IAAI,CAAC+C,MAAM,CAAC8F,IAAI,KAAK,CAAC,EAAE;AAC1B,MAAA,OAAOhW,SAAS,CAAA;AACjB,KAAA;AACD;IACA,MAAMiW,WAAW,GAAG9I,KAAK,CAACuF,WAAW,EAAE,CAACuD,WAAW,CAAA;AACnD,IAAA,MAAMjF,KAAK,GAAGiF,WAAW,GAAG,IAAI,CAAC/F,MAAM,CAACrI,GAAG,CAACoO,WAAW,CAAC,GAAGjW,SAAS,CAAA;AACpE,IAAA,OAAOgR,KAAK,CAAA;AACd,GAAA;AACD,CAAA;AAED;;;AAGG;AACG,SAAUuE,eAAeA,CAACW,MAAkB,EAAA;EAChD,MAAMC,MAAM,GAAa,EAAE,CAAA;EAC3B,IAAIC,KAAK,GAAG,CAAC;AACXC,IAAAA,GAAG,GAAG,CAAC;AACPC,IAAAA,YAAY,GAAGJ,MAAM,CAAC7V,MAAM,GAAG,CAAC,CAAA;EAClC,OAAOgW,GAAG,GAAGC,YAAY,EAAE;AACzB;AACA,IAAA,OACED,GAAG,GAAGC,YAAY,IAClB,EAAEJ,MAAM,CAACG,GAAG,CAAC,KAAK,CAAC,IAAIH,MAAM,CAACG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAIH,MAAM,CAACG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAEtEA,GAAG,EAAE,CAAA;IACP,IAAIA,GAAG,IAAIC,YAAY,EAAED,GAAG,GAAGH,MAAM,CAAC7V,MAAM,CAAA;AAC5C;IACA,IAAIkW,GAAG,GAAGF,GAAG,CAAA;AACb,IAAA,OAAOE,GAAG,GAAGH,KAAK,IAAIF,MAAM,CAACK,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,EAAEA,GAAG,EAAE,CAAA;AAClD;IACA,IAAIH,KAAK,KAAK,CAAC,EAAE;MACf,IAAIG,GAAG,KAAKH,KAAK,EAAE,MAAMpT,SAAS,CAAC,mCAAmC,CAAC,CAAA;AACxE,KAAA,MAAM;AACLmT,MAAAA,MAAM,CAACzN,IAAI,CAAC0N,KAAK,CAAC,CAAA;AACnB,KAAA;AACD;AACAA,IAAAA,KAAK,GAAGC,GAAG,GAAGA,GAAG,GAAG,CAAC,CAAA;AACtB,GAAA;AACD,EAAA,OAAOF,MAAM,CAAA;AACf,CAAA;AAEM,SAAUJ,aAAaA,CAACS,SAAiB,EAAA;EAC7C,OAAOA,SAAS,GAAGC,aAAa,CAAA;AAClC,CAAA;AAEA,MAAMA,aAAa,GAAG,IAAI,CAAA;AAE1B,IAAYd,QA4CX,CAAA;AA5CD,CAAA,UAAYA,QAAQ,EAAA;AAClB;EACAA,QAAA,CAAAA,QAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAiB,CAAA;AACjB;EACAA,QAAA,CAAAA,QAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAqB,CAAA;AACrB;EACAA,QAAA,CAAAA,QAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAqB,CAAA;AACrB;EACAA,QAAA,CAAAA,QAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAqB,CAAA;AACrB;EACAA,QAAA,CAAAA,QAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAa,CAAA;AACb;EACAA,QAAA,CAAAA,QAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAO,CAAA;AACP;EACAA,QAAA,CAAAA,QAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAO,CAAA;AACP;EACAA,QAAA,CAAAA,QAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAO,CAAA;AACP;EACAA,QAAA,CAAAA,QAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAO,CAAA;AACP;EACAA,QAAA,CAAAA,QAAA,CAAA,SAAA,CAAA,GAAA,EAAA,CAAA,GAAA,SAAY,CAAA;AACZ;EACAA,QAAA,CAAAA,QAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAe,CAAA;AACf;EACAA,QAAA,CAAAA,QAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB,CAAA;AAChB;EACAA,QAAA,CAAAA,QAAA,CAAA,SAAA,CAAA,GAAA,EAAA,CAAA,GAAA,SAAY,CAAA;AACZ;EACAA,QAAA,CAAAA,QAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB,CAAA;AAChB;EACAA,QAAA,CAAAA,QAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAe,CAAA;AACf;EACAA,QAAA,CAAAA,QAAA,CAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAA,KAAQ,CAAA;AAER;AAEA;EACAA,QAAA,CAAAA,QAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAc,CAAA;AACd;EACAA,QAAA,CAAAA,QAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAc,CAAA;AACd;EACAA,QAAA,CAAAA,QAAA,CAAA,iBAAA,CAAA,GAAA,EAAA,CAAA,GAAA,iBAAoB,CAAA;AAEpB;AACF,CAAC,EA5CWA,QAAQ,KAARA,QAAQ,GA4CnB,EAAA,CAAA,CAAA,CAAA;AAED;;;;AAIG;AACa,SAAArC,qBAAqBA,CAACoD,SAAsB,EAAEC,YAAwB,EAAA;AACpF,EAAA,IAAIA,YAAY,CAACzE,UAAU,KAAK,CAAC,EAAE;AACjC,IAAA,OAAO,KAAK,CAAA;AACb,GAAA;AACD,EAAA,MAAMa,YAAY,GAAG,IAAI1C,UAAU,CACjCqG,SAAS,CAAC3U,KAAK,CAAC2U,SAAS,CAACxE,UAAU,GAAGyE,YAAY,CAACzE,UAAU,CAAC,CAChE,CAAA;AACD,EAAA,OAAOyE,YAAY,CAACC,KAAK,CAAC,CAAC5P,KAAK,EAAE4E,KAAK,KAAK5E,KAAK,KAAK+L,YAAY,CAACnH,KAAK,CAAC,CAAC,CAAA;AAC5E;;ACtoBA;AACA;AAEA;;;;;;;AAOG;AACG,MAAOiL,qBAAsB,SAAS5P,0BAA4E,CAAA;EAetH,IAAIsM,WAAWA,GAAA;IACb,OAAO,IAAI,CAACuD,YAAY,CAAA;AAC1B,GAAA;AAEAlS,EAAAA,WAAYA,CAAAqL,mBAA2B,EAAEE,kBAAsC,EAAA;AAC7E,IAAA,KAAK,EAAE,CAAA;IATD,IAAsB,CAAA4G,sBAAA,GAAG,CAAC,CAAA;IAE1B,IAAY,CAAAD,YAAA,GAAY,IAAI,CAAA;IAQlC,IAAI,CAACE,eAAe,GAAG,CAAC,CAAA;AACxB,IAAA,IAAI,CAACC,aAAa,GAAG,IAAItL,KAAK,CAACjI,YAAY,CAAC,CAACwT,IAAI,CAAClX,SAAS,CAAC,CAAA;IAC5D,IAAI,CAACmQ,kBAAkB,GAAGA,kBAAkB,CAAA;AAC5C,IAAA,IAAI,CAACgH,iBAAiB,GAAG,IAAI3H,GAAG,EAAE,CAAA;IAClC,IAAI,CAACS,mBAAmB,GAAGA,mBAAmB,CAAA;IAC9C,IAAI,CAACmH,cAAc,EAAE,CAAA;AACvB,GAAA;AAEAxD,EAAAA,iBAAiBA,GAAA;AACf,IAAA,IAAI,IAAI,CAACzD,kBAAkB,CAAC5L,gBAAgB,GAAG,CAAC,EAAE;AAChD,MAAA,OAAA;AACD,KAAA;IACD,IAAI,CAACwS,sBAAsB,IAAI,CAAC,CAAA;IAEhC,IAAI,IAAI,CAACA,sBAAsB,GAAG,IAAI,CAAC5G,kBAAkB,CAAC5L,gBAAgB,EAAE;MAC1Ef,YAAY,CAACoD,IAAI,CAAAH,UAAAA,CAAAA,MAAA,CAAY,IAAI,CAACwJ,mBAAmB,EAAA,6BAAA,CAA6B,CAAC,CAAA;MACnF,IAAI,CAAC6G,YAAY,GAAG,KAAK,CAAA;AAC1B,KAAA;AACH,GAAA;AAEApD,EAAAA,iBAAiBA,GAAA;IACf,IAAI,CAAC0D,cAAc,EAAE,CAAA;AACvB,GAAA;AAEA;;;AAGG;AACHA,EAAAA,cAAcA,GAAA;IACZ,IAAI,CAACL,sBAAsB,GAAG,CAAC,CAAA;IAC/B,IAAI,CAACD,YAAY,GAAG,IAAI,CAAA;AAC1B,GAAA;AAEA;;;;;;AAMG;EACHtC,UAAUA,CAACjC,QAAiB,EAAe;AAAA,IAAA,IAAb8E,MAAM,GAAA1X,SAAA,CAAAU,MAAA,GAAA,CAAA,IAAAV,SAAA,CAAA,CAAA,CAAA,KAAAK,SAAA,GAAAL,SAAA,CAAA,CAAA,CAAA,GAAG,IAAI,CAAA;AACzC,IAAA,MAAMqX,eAAe,GAAGzE,QAAQ,KAAA,IAAA,IAARA,QAAQ,KAAA,KAAA,CAAA,GAARA,QAAQ,GAAI,IAAI,CAACD,kBAAkB,EAAE,CAAA;IAE7D,MAAMgF,eAAe,GAAG,IAAI,CAACH,iBAAiB,CAACtP,GAAG,CAACmP,eAAe,CAAC,CAAA;AACnE,IAAA,IAAI,OAAOM,eAAe,KAAK,WAAW,EAAE;AAC1C,MAAA,OAAOA,eAAe,CAAA;AACvB,KAAA;IACD,MAAMC,cAAc,GAAG,IAAIxL,OAAO,CAAY,CAAOC,OAAO,EAAEC,MAAM,KAAIuL,SAAA,CAAA,IAAA,EAAA,KAAA,CAAA,EAAA,KAAA,CAAA,EAAA,aAAA;MACtE,IAAI;AACF,QAAA,MAAMpF,MAAM,GAAG,IAAI,CAACC,SAAS,CAAC2E,eAAe,CAAC,CAAA;QAC9C,IAAI,CAAC5E,MAAM,EAAE;UACX,MAAM,IAAIpP,SAAS,CAAAyD,2DAAAA,CAAAA,MAAA,CAC2C,IAAI,CAACwJ,mBAAmB,CAAE,CACvF,CAAA;AACF,SAAA;AACD,QAAA,MAAMwH,eAAe,GAAGrF,MAAM,CAAC/D,QAAQ,CAAA;QACvC,MAAMkG,WAAW,GAAG,MAAMnH,SAAS,CACjC,MAAMqB,OAAO,CAACgJ,eAAe,EAAE,IAAI,CAACtH,kBAAkB,CAAC9L,WAAW,CAAC,EACnEoT,eAAe,CAACnK,SAAS,CAAC3M,IAAI,EAC9B,QAAQ,CACT,CAAA;AAED,QAAA,IAAI0W,MAAM,EAAE;UACV,IAAI,CAAC1C,kBAAkB,CAACJ,WAAW,EAAEyC,eAAe,EAAE,IAAI,CAAC,CAAA;AAC3D,UAAA,IAAI,CAACxO,IAAI,CACP7C,eAAe,CAAC+R,YAAY,EAC5BnD,WAAW,EACX,IAAI,CAACtE,mBAAmB,EACxB+G,eAAe,CAChB,CAAA;AACF,SAAA;QACDhL,OAAO,CAACuI,WAAW,CAAC,CAAA;OACrB,CAAC,OAAO9U,CAAC,EAAE;QACVwM,MAAM,CAACxM,CAAC,CAAC,CAAA;AACV,OAAA,SAAS;AACR,QAAA,IAAI,CAAC0X,iBAAiB,CAACQ,MAAM,CAACX,eAAe,CAAC,CAAA;AAC/C,OAAA;AACH,KAAC,CAAA,CAAC,CAAA;IACF,IAAI,CAACG,iBAAiB,CAACrP,GAAG,CAACkP,eAAe,EAAEO,cAAc,CAAC,CAAA;AAC3D,IAAA,OAAOA,cAAc,CAAA;AACvB,GAAA;AAEA;;;;;AAKG;EACGF,MAAMA,CAAChJ,QAAmB,EAAc;AAAA,IAAA,IAAZkE,QAAQ,GAAA5S,SAAA,CAAAU,MAAA,GAAA,CAAA,IAAAV,SAAA,CAAA,CAAA,CAAA,KAAAK,SAAA,GAAAL,SAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA;;AAC5C,MAAA,MAAM,IAAI,CAACgV,kBAAkB,CAACtG,QAAQ,EAAEkE,QAAQ,CAAC,CAAA;MACjD,IAAI,CAAC6E,cAAc,EAAE,CAAA;AACvB,KAAC,CAAA,CAAA;AAAA,GAAA;AAED;;;;;AAKG;EACGzC,kBAAkBA,CAACtG,QAAmB,EAAwC;AAAA,IAAA,IAAtCkE,QAAQ,GAAA5S,SAAA,CAAAU,MAAA,GAAA,CAAA,IAAAV,SAAA,CAAA,CAAA,CAAA,KAAAK,SAAA,GAAAL,SAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA;AAAA,IAAA,IAAEiY,gBAAgB,GAAAjY,SAAA,CAAAU,MAAA,GAAA,CAAA,IAAAV,SAAA,CAAA,CAAA,CAAA,KAAAK,SAAA,GAAAL,SAAA,CAAA,CAAA,CAAA,GAAG,KAAK,CAAA;;AAClF6D,MAAAA,YAAY,CAACjD,KAAK,CAAC,iBAAiB,CAAC,CAAA;MACrC,IAAIgS,QAAQ,IAAI,CAAC,EAAE;QACjB,IAAI,CAACyE,eAAe,GAAGzE,QAAQ,GAAG,IAAI,CAAC0E,aAAa,CAAC5W,MAAM,CAAA;AAC5D,OAAA;AACD,MAAA,MAAM+R,MAAM,GAAG,MAAMhE,UAAU,CAACC,QAAQ,EAAE,IAAI,CAAC8B,kBAAkB,CAAC9L,WAAW,CAAC,CAAA;MAC9E,IAAI,CAACoQ,SAAS,CAACrC,MAAM,EAAE,IAAI,CAAC4E,eAAe,EAAEY,gBAAgB,CAAC,CAAA;AAChE,KAAC,CAAA,CAAA;AAAA,GAAA;AAEDnD,EAAAA,SAASA,CAACrC,MAAc,EAAEG,QAAgB,EAA0B;AAAA,IAAA,IAAxBqF,gBAAgB,GAAAjY,SAAA,CAAAU,MAAA,GAAA,CAAA,IAAAV,SAAA,CAAA,CAAA,CAAA,KAAAK,SAAA,GAAAL,SAAA,CAAA,CAAA,CAAA,GAAG,KAAK,CAAA;AAClE,IAAA,IAAI,CAACsX,aAAa,CAAC1E,QAAQ,GAAG,IAAI,CAAC0E,aAAa,CAAC5W,MAAM,CAAC,GAAG+R,MAAM,CAAA;AAEjE,IAAA,IAAIwF,gBAAgB,EAAE;AACpB,MAAA,IAAI,CAACpP,IAAI,CAAC7C,eAAe,CAAC+R,YAAY,EAAEtF,MAAM,CAAC/D,QAAQ,EAAE,IAAI,CAAC4B,mBAAmB,EAAEsC,QAAQ,CAAC,CAAA;AAC7F,KAAA;AACH,GAAA;EAEMmC,kBAAkBA,CAAC9I,KAAa,EAAA;;MACpC,IAAI,CAACoL,eAAe,GAAGpL,KAAK,GAAG,IAAI,CAACqL,aAAa,CAAC5W,MAAM,CAAA;MACxD,IAAI,CAAC+W,cAAc,EAAE,CAAA;AACvB,KAAC,CAAA,CAAA;AAAA,GAAA;AAED9E,EAAAA,kBAAkBA,GAAA;IAChB,OAAO,IAAI,CAAC0E,eAAe,CAAA;AAC7B,GAAA;AAEA;;;;AAIG;EACH3E,SAASA,CAACE,QAAiB,EAAA;AACzB,IAAA,OAAO,IAAI,CAAC0E,aAAa,CAAC1E,QAAQ,KAAR,IAAA,IAAAA,QAAQ,KAAR,KAAA,CAAA,GAAAA,QAAQ,GAAI,IAAI,CAACyE,eAAe,CAAC,CAAA;AAC7D,GAAA;AACD;;AC9JD,MAAMa,mBAAmB,GAAmB,EAAE,CAAA;AAC9C,MAAMC,eAAe,GAAuC,IAAItI,GAAG,EAAE,CAAA;AACrE,IAAIuI,gBAAmD,CAAA;AAEvD,IAAIC,mBAAmB,GAAY,KAAK,CAAA;AAExC,IAAIC,YAAY,GAAY,KAAK,CAAA;AAEjC,IAAI7T,SAAgC,CAAA;AAEpC,IAAIgM,UAAkC,CAAA;AAEtC,IAAID,kBAAkB,GAAuBhM,qBAAqB,CAAA;AAElEX,YAAY,CAACjB,eAAe,CAAC,MAAM,CAAC,CAAA;AAEpC2V,SAAS,GAAIC,EAAE,IAAI;EACjB,MAAM;IAAEC,IAAI;AAAEnG,IAAAA,IAAAA;GAAM,GAAsBkG,EAAE,CAAClG,IAAI,CAAA;AAEjD,EAAA,QAAQmG,IAAI;AACV,IAAA,KAAK,MAAM;AACT5U,MAAAA,YAAY,CAACD,IAAI,CAAC,oBAAoB,CAAC,CAAA;MACvC4M,kBAAkB,GAAG8B,IAAI,CAAC9B,kBAAkB,CAAA;AAC5C8H,MAAAA,YAAY,GAAG,CAAC,CAAChG,IAAI,CAAC9B,kBAAkB,CAAC/L,SAAS,CAAA;AAClD;AACA,MAAA,MAAMiU,MAAM,GAAY;AACtBD,QAAAA,IAAI,EAAE,SAAS;AACfnG,QAAAA,IAAI,EAAE;AAAEqG,UAAAA,OAAO,EAAEN,mBAAAA;AAAqB,SAAA;OACvC,CAAA;MACDO,WAAW,CAACF,MAAM,CAAC,CAAA;AACnB,MAAA,MAAA;AACF,IAAA,KAAK,QAAQ;MACXG,oBAAoB,CAACvG,IAAI,CAACqG,OAAO,EAAErG,IAAI,CAAChC,mBAAmB,CAAC,CAAA;AAC5DzM,MAAAA,YAAY,CAACD,IAAI,CAAC,6BAA6B,CAAC,CAAA;AAChD;AACAgV,MAAAA,WAAW,CAACJ,EAAE,CAAClG,IAAI,CAAC,CAAA;AACpB,MAAA,MAAA;AACF,IAAA,KAAK,QAAQ;MACX,IAAIwG,OAAO,GAAGC,eAAe,CAACzG,IAAI,CAAChC,mBAAmB,EAAEgC,IAAI,CAACnB,OAAO,CAAC,CAAA;MACrE2H,OAAO,CAACrH,cAAc,CACpBgH,IAAI,EACJnG,IAAI,CAAC0G,cAAc,EACnB1G,IAAI,CAAC2G,cAAc,EACnB3G,IAAI,CAACnB,OAAO,EACZmB,IAAI,CAACjB,KAAK,CACX,CAAA;AACD,MAAA,MAAA;AACF,IAAA,KAAK,QAAQ;MACX,IAAI6H,UAAU,GAAGH,eAAe,CAACzG,IAAI,CAAChC,mBAAmB,EAAEgC,IAAI,CAACnB,OAAO,CAAC,CAAA;MACxE+H,UAAU,CAACzH,cAAc,CACvBgH,IAAI,EACJnG,IAAI,CAAC0G,cAAc,EACnB1G,IAAI,CAAC2G,cAAc,EACnB3G,IAAI,CAACnB,OAAO,EACZmB,IAAI,CAACjB,KAAK,CACX,CAAA;AACD,MAAA,MAAA;AACF,IAAA,KAAK,QAAQ;AACX,MAAA,IAAIiH,YAAY,EAAE;AAChBzU,QAAAA,YAAY,CAACoD,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACnCkS,YAAY,CAAC7G,IAAI,CAACpO,GAAG,EAAEoO,IAAI,CAACM,QAAQ,CAAC,CAAA;AACtC,OAAA,MAAM,IAAIN,IAAI,CAAChC,mBAAmB,EAAE;QACnCzM,YAAY,CAACoD,IAAI,CAAAH,6BAAAA,CAAAA,MAAA,CAA+BwL,IAAI,CAAChC,mBAAmB,CAAE,CAAC,CAAA;AAC3E8I,QAAAA,wBAAwB,CAAC9G,IAAI,CAAChC,mBAAmB,CAAC,CAACoH,MAAM,CAACpF,IAAI,CAACpO,GAAG,EAAEoO,IAAI,CAACM,QAAQ,CAAC,CAAA;AACnF,OAAA,MAAM;AACL/O,QAAAA,YAAY,CAACyB,KAAK,CAAC,iEAAiE,CAAC,CAAA;AACtF,OAAA;AACD,MAAA,MAAA;AACF,IAAA,KAAK,iBAAiB;AACpB+T,MAAAA,uBAAuB,CAAC/G,IAAI,CAACnB,OAAO,CAAC,CAAA;AACrC,MAAA,MAAA;AACF,IAAA,KAAK,aAAa;AAChB4H,MAAAA,eAAe,CAACzG,IAAI,CAAChC,mBAAmB,EAAEgC,IAAI,CAACnB,OAAO,CAAC,CAACC,aAAa,CAACkB,IAAI,CAACjB,KAAK,CAAC,CAAA;AACjF,MAAA,MAAA;AACF,IAAA,KAAK,WAAW;AACd;AACA6G,MAAAA,mBAAmB,CAACoB,OAAO,CAAEC,EAAE,IAAI;QACjC,IAAIA,EAAE,CAACtI,sBAAsB,EAAE,KAAKqB,IAAI,CAAChC,mBAAmB,EAAE;AAC5DiJ,UAAAA,EAAE,CAAChI,SAAS,CAACe,IAAI,CAACd,GAAG,CAAC,CAAA;AACvB,SAAA;AACH,OAAC,CAAC,CAAA;AACF,MAAA,MAAA;AACF,IAAA,KAAK,gBAAgB;MACnBgI,oBAAoB,CAAClH,IAAI,CAAC,CAAA;AAC1B,MAAA,MAAA;AACF,IAAA,KAAK,eAAe;AAClBmH,MAAAA,gBAAgB,CAACnH,IAAI,CAACD,OAAO,CAAC,CAAA;AAC9B,MAAA,MAAA;AAGH,GAAA;AACH,CAAC,CAAA;AAED,SAAemH,oBAAoBA,CAAClH,IAAmC,EAAA;;AACrE,IAAA,IAAIgG,YAAY,EAAE;AAChB,MAAA,MAAMoB,UAAU,GAAGC,mBAAmB,EAAE,CAAA;AACxC,MAAA,MAAMD,UAAU,CAAC7E,UAAU,CAACvC,IAAI,CAACM,QAAQ,CAAC,CAAA;MAC1C8G,UAAU,CAACjC,cAAc,EAAE,CAAA;AAC5B,KAAA,MAAM,IAAInF,IAAI,CAAChC,mBAAmB,EAAE;AACnC,MAAA,MAAMoJ,UAAU,GAAGN,wBAAwB,CAAC9G,IAAI,CAAChC,mBAAmB,CAAC,CAAA;AACrE,MAAA,MAAMoJ,UAAU,CAAC7E,UAAU,CAACvC,IAAI,CAACM,QAAQ,CAAC,CAAA;MAC1C8G,UAAU,CAACjC,cAAc,EAAE,CAAA;AAC5B,KAAA,MAAM;AACL5T,MAAAA,YAAY,CAACyB,KAAK,CAChB,qFAAqF,CACtF,CAAA;AACF,KAAA;AACH,GAAC,CAAA,CAAA;AAAA,CAAA;AAED,SAASyT,eAAeA,CAACzI,mBAA2B,EAAEa,OAAe,EAAA;AACnE,EAAA,IAAI2H,OAAO,GAAGZ,mBAAmB,CAAC0B,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC3I,UAAU,EAAE,KAAKC,OAAO,CAAC,CAAA;EACzE,IAAI,CAAC2H,OAAO,EAAE;AACZjV,IAAAA,YAAY,CAACD,IAAI,CAAC,0BAA0B,EAAE;AAAE0M,MAAAA,mBAAAA;AAAqB,KAAA,CAAC,CAAA;IACtE,IAAI,CAACE,kBAAkB,EAAE;MACvB,MAAMxL,KAAK,CAAC,6BAA6B,CAAC,CAAA;AAC3C,KAAA;IACD8T,OAAO,GAAG,IAAI3I,YAAY,CAAC;MACzBG,mBAAmB;AACnBhF,MAAAA,IAAI,EAAE8N,wBAAwB,CAAC9I,mBAAmB,CAAC;MACnDE,kBAAkB;AAClBC,MAAAA,UAAAA;AACD,KAAA,CAAC,CAAA;IAEFqJ,uBAAuB,CAAChB,OAAO,CAAC,CAAA;AAChCZ,IAAAA,mBAAmB,CAACnP,IAAI,CAAC+P,OAAO,CAAC,CAAA;GAClC,MAAM,IAAIxI,mBAAmB,KAAKwI,OAAO,CAAC7H,sBAAsB,EAAE,EAAE;AACnE;IACA6H,OAAO,CAACjI,cAAc,CAACP,mBAAmB,EAAE8I,wBAAwB,CAAC9I,mBAAmB,CAAC,CAAC,CAAA;AAC3F,GAAA;AAGD,EAAA,OAAOwI,OAAO,CAAA;AAChB,CAAA;AAEA,SAASM,wBAAwBA,CAAC9I,mBAA2B,EAAA;AAC3D,EAAA,IAAIgI,YAAY,EAAE;IAChB,OAAOqB,mBAAmB,EAAE,CAAA;AAC7B,GAAA;AACD,EAAA,IAAIrO,IAAI,GAAG6M,eAAe,CAACjQ,GAAG,CAACoI,mBAAmB,CAAC,CAAA;EACnD,IAAI,CAAChF,IAAI,EAAE;AACTA,IAAAA,IAAI,GAAG,IAAI4L,qBAAqB,CAAC5G,mBAAmB,EAAEE,kBAAkB,CAAC,CAAA;AACzE,IAAA,IAAI/L,SAAS,EAAE;AACb6G,MAAAA,IAAI,CAACoM,MAAM,CAACjT,SAAS,CAAC,CAAA;AACvB,KAAA;IACD6G,IAAI,CAACjB,EAAE,CAACrE,eAAe,CAAC+R,YAAY,EAAEgC,iBAAiB,CAAC,CAAA;AACxD5B,IAAAA,eAAe,CAAChQ,GAAG,CAACmI,mBAAmB,EAAEhF,IAAI,CAAC,CAAA;AAC/C,GAAA;AACD,EAAA,OAAOA,IAAI,CAAA;AACb,CAAA;AAEA,SAASqO,mBAAmBA,GAAA;EAC1B,IAAI,CAACvB,gBAAgB,EAAE;AACrBA,IAAAA,gBAAgB,GAAG,IAAIlB,qBAAqB,CAAC,YAAY,EAAE1G,kBAAkB,CAAC,CAAA;AAC/E,GAAA;AACD,EAAA,OAAO4H,gBAAgB,CAAA;AACzB,CAAA;AAEA,SAASiB,uBAAuBA,CAAClI,OAAe,EAAA;;AAC9C,EAAA,CAAA9B,EAAA,GAAA6I,mBAAmB,CAAC0B,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC3I,UAAU,EAAE,KAAKC,OAAO,CAAC,MAAE,IAAA,IAAA9B,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAAA,EAAA,CAAA0B,gBAAgB,EAAE,CAAA;AACjF,CAAA;AAEA,SAAS8H,oBAAoBA,CAACmB,MAAe,EAAE1J,mBAA2B,EAAA;AACxEV,EAAAA,oBAAoB,CAACzH,GAAG,CAACmI,mBAAmB,EAAE0J,MAAM,CAAC,CAAA;AACvD,CAAA;AAEA,SAASb,YAAYA,CAACjV,GAAc,EAAE+H,KAAc,EAAA;AAClDpI,EAAAA,YAAY,CAACjD,KAAK,CAAC,oBAAoB,CAAC,CAAA;AACxC6D,EAAAA,SAAS,GAAGP,GAAG,CAAA;EACfyV,mBAAmB,EAAE,CAACjC,MAAM,CAACxT,GAAG,EAAE+H,KAAK,CAAC,CAAA;AAC1C,CAAA;AAEA,SAAS6N,uBAAuBA,CAAChB,OAAqB,EAAA;EACpDA,OAAO,CAACzO,EAAE,CAACnE,YAAY,CAAClB,KAAK,EAAGM,KAAK,IAAI;AACvC,IAAA,MAAM2U,GAAG,GAAiB;AACxBxB,MAAAA,IAAI,EAAE,OAAO;AACbnG,MAAAA,IAAI,EAAE;AAAEhN,QAAAA,KAAK,EAAE,IAAIN,KAAK,IAAA8B,MAAA,CAAInB,kBAAkB,CAACL,KAAK,CAACO,MAAM,CAAC,EAAAiB,IAAAA,CAAAA,CAAAA,MAAA,CAAKxB,KAAK,CAACH,OAAO,CAAE,CAAA;AAAG,OAAA;KACpF,CAAA;IACDyT,WAAW,CAACqB,GAAG,CAAC,CAAA;AAClB,GAAC,CAAC,CAAA;AACJ,CAAA;AAEA,SAASF,iBAAiBA,CAACrL,QAAmB,EAAE4B,mBAA2B,EAAEsC,QAAiB,EAAA;AAC5F,EAAA,MAAMqH,GAAG,GAAmB;AAC1BxB,IAAAA,IAAI,EAAc,YAAA;AAClBnG,IAAAA,IAAI,EAAE;MACJhC,mBAAmB;MACnBsC,QAAQ;AACRlE,MAAAA,QAAAA;AACD,KAAA;GACF,CAAA;EACDkK,WAAW,CAACqB,GAAG,CAAC,CAAA;AAClB,CAAA;AAEA,SAASR,gBAAgBA,CAACpH,OAAmB,EAAA;AAC3C5B,EAAAA,UAAU,GAAG4B,OAAO,CAAA;AACpB6F,EAAAA,mBAAmB,CAACoB,OAAO,CAAEO,CAAC,IAAI;AAChCA,IAAAA,CAAC,CAACzH,aAAa,CAACC,OAAO,CAAC,CAAA;AAC1B,GAAC,CAAC,CAAA;AACJ,CAAA;AAEA;AACA;AACA,IAAIlR,IAAI,CAAC+Y,iBAAiB,EAAE;AAC1BrW,EAAAA,YAAY,CAACjD,KAAK,CAAC,uBAAuB,CAAC,CAAA;AAC3C;AACAO,EAAAA,IAAI,CAACgZ,cAAc,GAAIC,KAAK,IAAI;AAC9B,IAAA,MAAMC,WAAW,GAAGD,KAAK,CAACC,WAAW,CAAA;AACrCxW,IAAAA,YAAY,CAACjD,KAAK,CAAC,aAAa,EAAEyZ,WAAW,CAAC,CAAA;IAC9CA,WAAW,CAACC,OAAO,GAAG,IAAI,CAAA;IAC1B,MAAM;MAAE7B,IAAI;MAAEnI,mBAAmB;MAAEa,OAAO;AAAEE,MAAAA,KAAAA;KAAO,GAAGgJ,WAAW,CAACE,OAAO,CAAA;AACzE,IAAA,MAAMzB,OAAO,GAAGC,eAAe,CAACzI,mBAAmB,EAAEa,OAAO,CAAC,CAAA;AAC7DtN,IAAAA,YAAY,CAACjD,KAAK,CAAC,WAAW,EAAE;AAAEyQ,MAAAA,KAAAA;AAAO,KAAA,CAAC,CAAA;AAC1CyH,IAAAA,OAAO,CAACrH,cAAc,CAACgH,IAAI,EAAE4B,WAAW,CAAC1I,QAAQ,EAAE0I,WAAW,CAACzI,QAAQ,EAAET,OAAO,EAAEE,KAAK,CAAC,CAAA;GACzF,CAAA;AACF","x_google_ignoreList":[0,6]}