@webex/plugin-meetings 3.3.1-next.2 → 3.3.1-next.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +7 -2
  3. package/dist/breakouts/index.js.map +1 -1
  4. package/dist/interpretation/index.js +1 -1
  5. package/dist/interpretation/siLanguage.js +1 -1
  6. package/dist/media/MediaConnectionAwaiter.js +50 -13
  7. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  8. package/dist/mediaQualityMetrics/config.js +16 -6
  9. package/dist/mediaQualityMetrics/config.js.map +1 -1
  10. package/dist/meeting/connectionStateHandler.js +67 -0
  11. package/dist/meeting/connectionStateHandler.js.map +1 -0
  12. package/dist/meeting/index.js +98 -46
  13. package/dist/meeting/index.js.map +1 -1
  14. package/dist/metrics/constants.js +2 -1
  15. package/dist/metrics/constants.js.map +1 -1
  16. package/dist/metrics/index.js +57 -0
  17. package/dist/metrics/index.js.map +1 -1
  18. package/dist/reachability/clusterReachability.js +108 -53
  19. package/dist/reachability/clusterReachability.js.map +1 -1
  20. package/dist/reachability/index.js +415 -56
  21. package/dist/reachability/index.js.map +1 -1
  22. package/dist/statsAnalyzer/index.js +81 -27
  23. package/dist/statsAnalyzer/index.js.map +1 -1
  24. package/dist/statsAnalyzer/mqaUtil.js +36 -10
  25. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  26. package/dist/types/media/MediaConnectionAwaiter.d.ts +18 -4
  27. package/dist/types/mediaQualityMetrics/config.d.ts +11 -0
  28. package/dist/types/meeting/connectionStateHandler.d.ts +30 -0
  29. package/dist/types/meeting/index.d.ts +2 -0
  30. package/dist/types/metrics/constants.d.ts +1 -0
  31. package/dist/types/metrics/index.d.ts +15 -0
  32. package/dist/types/reachability/clusterReachability.d.ts +31 -3
  33. package/dist/types/reachability/index.d.ts +93 -2
  34. package/dist/types/statsAnalyzer/index.d.ts +15 -6
  35. package/dist/types/statsAnalyzer/mqaUtil.d.ts +17 -4
  36. package/dist/webinar/index.js +1 -1
  37. package/package.json +23 -22
  38. package/src/breakouts/index.ts +7 -1
  39. package/src/media/MediaConnectionAwaiter.ts +66 -11
  40. package/src/mediaQualityMetrics/config.ts +14 -3
  41. package/src/meeting/connectionStateHandler.ts +65 -0
  42. package/src/meeting/index.ts +72 -14
  43. package/src/metrics/constants.ts +1 -0
  44. package/src/metrics/index.ts +44 -0
  45. package/src/reachability/clusterReachability.ts +86 -25
  46. package/src/reachability/index.ts +316 -27
  47. package/src/statsAnalyzer/index.ts +85 -24
  48. package/src/statsAnalyzer/mqaUtil.ts +55 -7
  49. package/test/unit/spec/breakouts/index.ts +51 -32
  50. package/test/unit/spec/media/MediaConnectionAwaiter.ts +90 -32
  51. package/test/unit/spec/meeting/connectionStateHandler.ts +102 -0
  52. package/test/unit/spec/meeting/index.js +158 -36
  53. package/test/unit/spec/metrics/index.js +126 -0
  54. package/test/unit/spec/reachability/clusterReachability.ts +116 -22
  55. package/test/unit/spec/reachability/index.ts +1153 -84
  56. package/test/unit/spec/stats-analyzer/index.js +647 -319
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_clusterReachability","Reachability","exports","default","webex","_classCallCheck2","_defineProperty2","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_gatherReachability","_asyncToGenerator2","_regenerator","mark","_callee","_yield$this$reachabil","clusters","joinCookie","results","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","performReachabilityChecks","boundedStorage","put","localStorageResult","_stringify","localStorageJoinCookie","LoggerProxy","logger","log","abrupt","t0","error","stop","gatherReachability","apply","arguments","_getReachabilityMetrics","_callee2","stats","updateStats","resultsJson","_callee2$","_context2","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","clusterType","result","udp","outcome","concat","tcp","xtls","get","JSON","parse","_values","forEach","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","length","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee3","_this","allClusterResults","_callee3$","_context3","mapValues","clusterResult","getReachabilityResults","_isAnyPublicClusterReachable","_callee4","reachabilityData","reachabilityResults","_callee4$","_context4","catch","some","_result$udp","_result$tcp","e","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee5","unreachable","protocols","_callee5$","_context5","tested","undefined","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","push","name","logUnreachableClusters","list","_ref3","_performReachabilityChecks","_callee6","clusterList","_this2","clusterReachabilityChecks","_callee6$","_context6","_promise","resolve","config","meetings","experimental","enableTcpReachability","enableTlsReachability","map","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","start","then","all","_x"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {mapValues} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachability,\n ClusterReachabilityResult,\n TransportResult,\n} from './clusterReachability';\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(): Promise<ReachabilityResults> {\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // Perform Reachability Check\n const results = await this.performReachabilityChecks(clusters);\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n LoggerProxy.logger.log(\n 'Reachability:index#gatherReachability --> Reachability checks completed'\n );\n\n return results;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_public_xtls_success: 0,\n reachability_public_xtls_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n reachability_vmn_xtls_success: 0,\n reachability_vmn_xtls_failed: 0,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n if (result.xtls && result.xtls.result !== 'untested') {\n const outcome = result.xtls.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_xtls_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#attachReachabilityData --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.experimental.enableTlsReachability === false,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<ReachabilityResults>} reachability check results\n */\n private async performReachabilityChecks(clusterList: ClusterList): Promise<ReachabilityResults> {\n const results: ReachabilityResults = {};\n\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve(results);\n }\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\n } reachability checks`\n );\n\n const clusterReachabilityChecks = Object.keys(clusterList).map((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n\n return this.clusterReachability[key].start().then((result) => {\n results[key] = result;\n results[key].isVideoMesh = cluster.isVideoMesh;\n });\n });\n\n await Promise.all(clusterReachabilityChecks);\n\n this.logUnreachableClusters();\n\n return results;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_lodash","require","_common","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_clusterReachability","_eventsScope","_constants2","_metrics","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","_inherits2","_super","webex","_this","_classCallCheck2","_assertThisInitialized2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_gatherReachability","_asyncToGenerator2","_regenerator","mark","_callee","_yield$this$reachabil","clusters","joinCookie","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","boundedStorage","put","localStorageJoinCookie","_stringify","reachabilityDefer","Defer","performReachabilityChecks","abrupt","promise","t0","LoggerProxy","logger","error","stop","gatherReachability","_getReachabilityMetrics","_callee2","stats","updateStats","resultsJson","results","_callee2$","_context2","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","clusterType","outcome","concat","get","localStorageResult","JSON","parse","_values","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee3","_this2","allClusterResults","_callee3$","_context3","mapValues","clusterResult","getReachabilityResults","_isAnyPublicClusterReachable","_callee4","reachabilityData","reachabilityResults","_callee4$","_context4","catch","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee5","unreachable","protocols","_callee5$","_context5","tested","undefined","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","name","logUnreachableClusters","list","_ref3","log","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","resolveReachabilityPromise","_this$reachabilityDef","vmnTimer","clearTimeout","publicCloudTimer","resolve","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee6","_callee6$","_context6","vmn","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","sendMetric","startTimers","_this3","setTimeout","overallTimer","emit","file","function","_storeResults","_callee7","_callee7$","_context7","storeResults","_x","resetResultCounters","_performReachabilityChecks","_callee10","clusterList","_this4","isFirstResult","_callee10$","_context10","config","meetings","experimental","enableTcpReachability","enableTlsReachability","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref4","_callee8","data","clientMediaIPs","_callee8$","_context8","_x3","clientMediaIpsUpdated","_ref5","_callee9","_callee9$","_context9","_x4","start","_x2","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n ClusterReachabilityResult,\n Events,\n ResultEventData,\n TransportResult,\n} from './clusterReachability';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(): Promise<ReachabilityResults> {\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_public_xtls_success: 0,\n reachability_public_xtls_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n reachability_vmn_xtls_success: 0,\n reachability_vmn_xtls_failed: 0,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n if (result.xtls && result.xtls.result !== 'untested') {\n const outcome = result.xtls.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_xtls_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#attachReachabilityData --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.experimental.enableTlsReachability === false,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @returns {void}\n */\n private resolveReachabilityPromise() {\n if (this.vmnTimer) {\n clearTimeout(this.vmnTimer);\n }\n if (this.publicCloudTimer) {\n clearTimeout(this.publicCloudTimer);\n }\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: 'udp' | 'tcp' | 'xtls',\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @returns {void}\n */\n protected async sendMetric() {\n const results = [];\n\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n results.push({\n ...clusterReachability.getResult(),\n isVideoMesh: clusterReachability.isVideoMesh,\n });\n });\n\n const stats = {\n vmn: {\n udp: this.getStatistics(results, 'udp', true),\n },\n public: {\n udp: this.getStatistics(results, 'udp', false),\n tcp: this.getStatistics(results, 'tcp', false),\n xtls: this.getStatistics(results, 'xtls', false),\n },\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n if (!clusterList || !Object.keys(clusterList).length) {\n return;\n }\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\n } reachability checks`\n );\n\n this.resetResultCounters();\n this.startTimers();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length;\n this.expectedResultsCount.public.xtls += cluster.xtls.length;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n clearTimeout(this.overallTimer);\n this.overallTimer = undefined;\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,KAAA,GAAAD,sBAAA,CAAAH,OAAA;AAEA,IAAAK,UAAA,GAAAL,OAAA;AAEA,IAAAM,QAAA,GAAAH,sBAAA,CAAAH,OAAA;AACA,IAAAO,oBAAA,GAAAP,OAAA;AAQA,IAAAQ,YAAA,GAAAL,sBAAA,CAAAH,OAAA;AACA,IAAAS,WAAA,GAAAN,sBAAA,CAAAH,OAAA;AACA,IAAAU,QAAA,GAAAP,sBAAA,CAAAH,OAAA;AAAiC,SAAAW,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,aAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAqB,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAV,OAAA,EAAAK,OAAA,GAAAM,MAAA,MAAAL,yBAAA,QAAAM,SAAA,OAAAF,gBAAA,CAAAV,OAAA,QAAAa,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAL,KAAA,EAAAd,SAAA,EAAAiB,SAAA,YAAAD,MAAA,GAAAF,KAAA,CAAAhB,KAAA,OAAAE,SAAA,gBAAAoB,2BAAA,CAAAf,OAAA,QAAAW,MAAA;AAAA,SAAAJ,0BAAA,eAAAS,OAAA,qBAAAF,kBAAA,oBAAAA,kBAAA,CAAAG,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAR,kBAAA,CAAAK,OAAA,8CAAApC,CAAA,sBAxBjC;AACA;AACA,GAFA,CAIA;AAqCA;AACA;AACA;AACA;;AAcA;;AAGA;;AAQA;AACA,IAAMwC,eAAe,GAAG,CAAC;AACzB,IAAMC,kBAAkB,GAAG,CAAC;AAC5B,IAAMC,eAAe,GAAG,EAAE;;AAE1B;AACA;AACA;AACA;AAHA,IAIqBC,YAAY,GAAAC,OAAA,CAAA3B,OAAA,0BAAA4B,YAAA;EAAA,IAAAC,UAAA,CAAA7B,OAAA,EAAA0B,YAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAA1B,YAAA,CAAAsB,YAAA;EAiB/B;AACF;AACA;AACA;AACA;EACE,SAAAA,aAAYK,KAAa,EAAE;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,CAAAjC,OAAA,QAAA0B,YAAA;IACzBM,KAAA,GAAAF,MAAA,CAAAR,IAAA;IAAQ,IAAAvB,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,gBAtBEG,uBAAY,CAACC,SAAS;IAAA,IAAArC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,2BAaX;MAACK,SAAS,EAAE;QAACC,GAAG,EAAE;MAAC,CAAC;MAAEC,MAAM,EAAE;QAACD,GAAG,EAAE,CAAC;QAAEE,GAAG,EAAE,CAAC;QAAEC,IAAI,EAAE;MAAC;IAAC,CAAC;IAAA,IAAA1C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,mBAChE;MAACK,SAAS,EAAE;QAACC,GAAG,EAAE;MAAC,CAAC;MAAEC,MAAM,EAAE;QAACD,GAAG,EAAE,CAAC;QAAEE,GAAG,EAAE,CAAC;QAAEC,IAAI,EAAE;MAAC;IAAC,CAAC;IASrET,KAAA,CAAKD,KAAK,GAAGA,KAAK;;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;IACIC,KAAA,CAAKU,mBAAmB,GAAG,IAAIC,gBAAmB,CAACX,KAAA,CAAKD,KAAK,CAAC;IAE9DC,KAAA,CAAKY,mBAAmB,GAAG,CAAC,CAAC;IAAC,OAAAZ,KAAA;EAChC;;EAEA;AACF;AACA;AACA;AACA;AACA;EALE,IAAAa,aAAA,CAAA7C,OAAA,EAAA0B,YAAA;IAAAoB,GAAA;IAAAC,KAAA;MAAA,IAAAC,mBAAA,OAAAC,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAMA,SAAAC,QAAA;QAAA,IAAAC,qBAAA,EAAAC,QAAA,EAAAC,UAAA;QAAA,OAAAL,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAAC,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cAAAF,QAAA,CAAAC,IAAA;cAAAD,QAAA,CAAAE,IAAA;cAAA,OAGyC,IAAI,CAAClB,mBAAmB,CAACmB,WAAW,CACvEC,aAAW,CAACC,YAAY,CAAC,IAAI,CAAChC,KAAK,CACrC,CAAC;YAAA;cAAAsB,qBAAA,GAAAK,QAAA,CAAAM,IAAA;cAFMV,QAAQ,GAAAD,qBAAA,CAARC,QAAQ;cAAEC,UAAU,GAAAF,qBAAA,CAAVE,UAAU;cAAAG,QAAA,CAAAE,IAAA;cAAA,OAKrB,IAAI,CAAC7B,KAAK,CAACkC,cAAc,CAACC,GAAG,CACjC,IAAI,CAAC9B,SAAS,EACdD,uBAAY,CAACgC,sBAAsB,EACnC,IAAAC,UAAA,CAAApE,OAAA,EAAeuD,UAAU,CAC3B,CAAC;YAAA;cAED,IAAI,CAACc,iBAAiB,GAAG,IAAIC,aAAK,CAAC,CAAC;;cAEpC;cAAAZ,QAAA,CAAAE,IAAA;cAAA,OACM,IAAI,CAACW,yBAAyB,CAACjB,QAAQ,CAAC;YAAA;cAAA,OAAAI,QAAA,CAAAc,MAAA,WAEvC,IAAI,CAACH,iBAAiB,CAACI,OAAO;YAAA;cAAAf,QAAA,CAAAC,IAAA;cAAAD,QAAA,CAAAgB,EAAA,GAAAhB,QAAA;cAErCiB,oBAAW,CAACC,MAAM,CAACC,KAAK,qDAAAnB,QAAA,CAAAgB,EAA0D,CAAC;cAAC,OAAAhB,QAAA,CAAAc,MAAA,WAE7E,CAAC,CAAC;YAAA;YAAA;cAAA,OAAAd,QAAA,CAAAoB,IAAA;UAAA;QAAA,GAAA1B,OAAA;MAAA,CAEZ;MAAA,SAAA2B,mBAAA;QAAA,OAAA/B,mBAAA,CAAAvD,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAoF,kBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAAjC,GAAA;IAAAC,KAAA;MAAA,IAAAiC,uBAAA,OAAA/B,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAMA,SAAA8B,SAAA;QAAA,IAAAC,KAAA,EAAAC,WAAA,EAAAC,WAAA,EAAAC,OAAA;QAAA,OAAAnC,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAA8B,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA5B,IAAA,GAAA4B,SAAA,CAAA3B,IAAA;YAAA;cACQsB,KAA0B,GAAG;gBACjCM,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,gCAAgC,EAAE,CAAC;gBACnCC,+BAA+B,EAAE,CAAC;gBAClCC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE,CAAC;gBAC9BC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE,CAAC;gBAC9BC,6BAA6B,EAAE,CAAC;gBAChCC,4BAA4B,EAAE;cAChC,CAAC;cAEKhB,WAAW,GAAG,SAAdA,WAAWA,CAAIiB,WAA6B,EAAEzF,MAAiC,EAAK;gBACxF,IAAIA,MAAM,CAAC2B,GAAG,IAAI3B,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAM0F,OAAO,GAAG1F,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxEuE,KAAK,iBAAAoB,MAAA,CAAiBF,WAAW,WAAAE,MAAA,CAAQD,OAAO,EAAG,IAAI,CAAC;gBAC1D;gBACA,IAAI1F,MAAM,CAAC6B,GAAG,IAAI7B,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAM0F,QAAO,GAAG1F,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxEuE,KAAK,iBAAAoB,MAAA,CAAiBF,WAAW,WAAAE,MAAA,CAAQD,QAAO,EAAG,IAAI,CAAC;gBAC1D;gBACA,IAAI1F,MAAM,CAAC8B,IAAI,IAAI9B,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,UAAU,EAAE;kBACpD,IAAM0F,SAAO,GAAG1F,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACzEuE,KAAK,iBAAAoB,MAAA,CAAiBF,WAAW,YAAAE,MAAA,CAASD,SAAO,EAAG,IAAI,CAAC;gBAC3D;cACF,CAAC;cAAAd,SAAA,CAAA5B,IAAA;cAAA4B,SAAA,CAAA3B,IAAA;cAAA,OAI2B,IAAI,CAAC7B,KAAK,CAACkC,cAAc,CAACsC,GAAG,CACrDpE,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAACqE,kBACf,CAAC;YAAA;cAHKpB,WAAW,GAAAG,SAAA,CAAAvB,IAAA;cAKXqB,OAA4B,GAAGoB,IAAI,CAACC,KAAK,CAACtB,WAAW,CAAC;cAE5D,IAAAuB,OAAA,CAAA3G,OAAA,EAAcqF,OAAO,CAAC,CAACvF,OAAO,CAAC,UAACa,MAAM,EAAK;gBACzCwE,WAAW,CAACxE,MAAM,CAACiG,WAAW,GAAG,KAAK,GAAG,QAAQ,EAAEjG,MAAM,CAAC;cAC5D,CAAC,CAAC;cAAC4E,SAAA,CAAA3B,IAAA;cAAA;YAAA;cAAA2B,SAAA,CAAA5B,IAAA;cAAA4B,SAAA,CAAAb,EAAA,GAAAa,SAAA;cAEH;cACAZ,oBAAW,CAACC,MAAM,CAACiC,IAAI,CACrB,2EAA2E,EAAAtB,SAAA,CAAAb,EAE7E,CAAC;YAAC;cAAA,OAAAa,SAAA,CAAAf,MAAA,WAGGU,KAAK;YAAA;YAAA;cAAA,OAAAK,SAAA,CAAAT,IAAA;UAAA;QAAA,GAAAG,QAAA;MAAA,CACb;MAAA,SAAA6B,uBAAA;QAAA,OAAA9B,uBAAA,CAAAvF,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAmH,sBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAAhE,GAAA;IAAAC,KAAA,EAKA,SAAAgE,sCACEC,eAAgC,EACL;MAC3B,IAAMC,MAAiC,GAAG,CAAC,CAAC;MAE5C,SAAAC,EAAA,MAAAC,eAAA,GAA2B,IAAAC,QAAA,CAAApH,OAAA,EAAegH,eAAe,CAAC,EAAAE,EAAA,GAAAC,eAAA,CAAAvH,MAAA,EAAAsH,EAAA,IAAE;QAAvD,IAAAG,kBAAA,OAAAC,eAAA,CAAAtH,OAAA,EAAAmH,eAAA,CAAAD,EAAA;UAAOpE,IAAG,GAAAuE,kBAAA;UAAEtE,KAAK,GAAAsE,kBAAA;QACpB,QAAQvE,IAAG;UACT,KAAK,QAAQ;YACX,QAAQC,KAAK;cACX,KAAK,WAAW;gBACdkE,MAAM,CAACM,SAAS,GAAG,MAAM;gBACzB;cACF,KAAK,aAAa;gBAChBN,MAAM,CAACM,SAAS,GAAG,OAAO;gBAC1B;cACF,KAAK,UAAU;gBACbN,MAAM,CAACO,QAAQ,GAAG,MAAM;gBACxB;YACJ;YACA;UACF,KAAK,uBAAuB;YAC1BP,MAAM,CAACQ,qBAAqB,GAAG1E,KAAK,CAAC2E,QAAQ,CAAC,CAAC;YAC/C;UACF;YACET,MAAM,CAACnE,IAAG,CAAC,GAAGC,KAAK;QACvB;MACF;MAEA,OAAOkE,MAAM;IACf;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAnE,GAAA;IAAAC,KAAA;MAAA,IAAA4E,uBAAA,OAAA1E,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAKA,SAAAyE,SAAA;QAAA,IAAAC,MAAA;QAAA,IAAAxC,OAAA,EAAAD,WAAA,EAAA0C,iBAAA;QAAA,OAAA5E,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAAuE,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAArE,IAAA,GAAAqE,SAAA,CAAApE,IAAA;YAAA;cAAAoE,SAAA,CAAArE,IAAA;cAAAqE,SAAA,CAAApE,IAAA;cAAA,OAK8B,IAAI,CAAC7B,KAAK,CAACkC,cAAc,CAACsC,GAAG,CACrDpE,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAACqE,kBACf,CAAC;YAAA;cAHKpB,WAAW,GAAA4C,SAAA,CAAAhE,IAAA;cAKX8D,iBAAsC,GAAGrB,IAAI,CAACC,KAAK,CAACtB,WAAW,CAAC;cAEtEC,OAAO,GAAG,IAAA4C,iBAAS,EAACH,iBAAiB,EAAE,UAACI,aAAa;gBAAA,OAAM;kBACzD5F,GAAG,EAAEuF,MAAI,CAACd,qCAAqC,CAACmB,aAAa,CAAC5F,GAAG,IAAI;oBAAC3B,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1F6B,GAAG,EAAEqF,MAAI,CAACd,qCAAqC,CAACmB,aAAa,CAAC1F,GAAG,IAAI;oBAAC7B,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1F8B,IAAI,EAAEoF,MAAI,CAACd,qCAAqC,CAC9CmB,aAAa,CAACzF,IAAI,IAAI;oBAAC9B,MAAM,EAAE;kBAAU,CAC3C;gBACF,CAAC;cAAA,CAAC,CAAC;cAACqH,SAAA,CAAApE,IAAA;cAAA;YAAA;cAAAoE,SAAA,CAAArE,IAAA;cAAAqE,SAAA,CAAAtD,EAAA,GAAAsD,SAAA;cAEJ;cACArD,oBAAW,CAACC,MAAM,CAACiC,IAAI,CACrB,2EAA2E,EAAAmB,SAAA,CAAAtD,EAE7E,CAAC;YAAC;cAAA,OAAAsD,SAAA,CAAAxD,MAAA,WAGGa,OAAO;YAAA;YAAA;cAAA,OAAA2C,SAAA,CAAAlD,IAAA;UAAA;QAAA,GAAA8C,QAAA;MAAA,CACf;MAAA,SAAAO,uBAAA;QAAA,OAAAR,uBAAA,CAAAlI,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAwI,sBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAArF,GAAA;IAAAC,KAAA;MAAA,IAAAqF,4BAAA,OAAAnF,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAMA,SAAAkF,SAAA;QAAA,IAAAd,SAAA,EAAAe,gBAAA,EAAAC,mBAAA;QAAA,OAAArF,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAAgF,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA9E,IAAA,GAAA8E,SAAA,CAAA7E,IAAA;YAAA;cACM2D,SAAS,GAAG,KAAK,EACrB;cAAAkB,SAAA,CAAA7E,IAAA;cAAA,OAC+B,IAAI,CAAC7B,KAAK,CAACkC,cAAc,CACrDsC,GAAG,CAAC,IAAI,CAACnE,SAAS,EAAED,uBAAY,CAACqE,kBAAkB,CAAC,CACpDkC,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZJ,gBAAgB,GAAAG,SAAA,CAAAzE,IAAA;cAItB,IAAIsE,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAwC,GAAG9B,IAAI,CAACC,KAAK,CAAC4B,gBAAgB,CAAC;kBAE7Ef,SAAS,GAAG,IAAAZ,OAAA,CAAA3G,OAAA,EAAcuI,mBAAmB,CAAC,CAACI,IAAI,CACjD,UAAChI,MAAM;oBAAA,IAAAiI,WAAA,EAAAC,WAAA;oBAAA,OACL,CAAClI,MAAM,CAACiG,WAAW,KAClB,EAAAgC,WAAA,GAAAjI,MAAM,CAAC2B,GAAG,cAAAsG,WAAA,uBAAVA,WAAA,CAAYjI,MAAM,MAAK,WAAW,IAAI,EAAAkI,WAAA,GAAAlI,MAAM,CAAC6B,GAAG,cAAAqG,WAAA,uBAAVA,WAAA,CAAYlI,MAAM,MAAK,WAAW,CAAC;kBAAA,CAC9E,CAAC;gBACH,CAAC,CAAC,OAAO5B,CAAC,EAAE;kBACV4F,oBAAW,CAACC,MAAM,CAACC,KAAK,gFAAAyB,MAAA,CACyDvH,CAAC,CAClF,CAAC;gBACH;cACF;cAAC,OAAA0J,SAAA,CAAAjE,MAAA,WAEM+C,SAAS;YAAA;YAAA;cAAA,OAAAkB,SAAA,CAAA3D,IAAA;UAAA;QAAA,GAAAuD,QAAA;MAAA,CACjB;MAAA,SAAAS,4BAAA;QAAA,OAAAV,4BAAA,CAAA3I,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAmJ,2BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IATE;EAAA;IAAAhG,GAAA;IAAAC,KAAA;MAAA,IAAAgG,+BAAA,OAAA9F,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAUA,SAAA6F,SAAA;QAAA,IAAAC,WAAA,EAAAX,gBAAA,EAAAC,mBAAA,EAAAW,SAAA;QAAA,OAAAhG,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAA2F,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAzF,IAAA,GAAAyF,SAAA,CAAAxF,IAAA;YAAA;cACMqF,WAAW,GAAG,KAAK,EAEvB;cAAAG,SAAA,CAAAxF,IAAA;cAAA,OAC+B,IAAI,CAAC7B,KAAK,CAACkC,cAAc,CACrDsC,GAAG,CAAC,IAAI,CAACnE,SAAS,EAAED,uBAAY,CAACqE,kBAAkB,CAAC,CACpDkC,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZJ,gBAAgB,GAAAc,SAAA,CAAApF,IAAA;cAItB,IAAIsE,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAwC,GAAG9B,IAAI,CAACC,KAAK,CAAC4B,gBAAgB,CAAC;kBAEvEY,SAAS,GAAG;oBAChB5G,GAAG,EAAE;sBAAC+G,MAAM,EAAE,KAAK;sBAAE9B,SAAS,EAAE+B;oBAAS,CAAC;oBAC1C9G,GAAG,EAAE;sBAAC6G,MAAM,EAAE,KAAK;sBAAE9B,SAAS,EAAE+B;oBAAS,CAAC;oBAC1C7G,IAAI,EAAE;sBAAC4G,MAAM,EAAE,KAAK;sBAAE9B,SAAS,EAAE+B;oBAAS;kBAC5C,CAAC;kBAED,IAAA3C,OAAA,CAAA3G,OAAA,EAAcuI,mBAAmB,CAAC,CAACzI,OAAO,CAAC,UAACa,MAAM,EAAK;oBACrD,IAAA4I,KAAA,CAAAvJ,OAAA,EAAYkJ,SAAS,CAAC,CAACpJ,OAAO,CAAC,UAAC0J,QAAQ,EAAK;sBAAA,IAAAC,gBAAA,EAAAC,iBAAA;sBAC3C,IACE,EAAAD,gBAAA,GAAA9I,MAAM,CAAC6I,QAAQ,CAAC,cAAAC,gBAAA,uBAAhBA,gBAAA,CAAkB9I,MAAM,MAAK,WAAW,IACxC,EAAA+I,iBAAA,GAAA/I,MAAM,CAAC6I,QAAQ,CAAC,cAAAE,iBAAA,uBAAhBA,iBAAA,CAAkB/I,MAAM,MAAK,aAAa,EAC1C;wBACAuI,SAAS,CAACM,QAAQ,CAAC,CAACH,MAAM,GAAG,IAAI;;wBAEjC;wBACA,IAAI1I,MAAM,CAAC6I,QAAQ,CAAC,CAAC7I,MAAM,KAAK,WAAW,EAAE;0BAC3CuI,SAAS,CAACM,QAAQ,CAAC,CAACjC,SAAS,GAAG,IAAI;wBACtC;sBACF;oBACF,CAAC,CAAC;kBACJ,CAAC,CAAC;kBAEF0B,WAAW,GAAG,IAAAtC,OAAA,CAAA3G,OAAA,EAAckJ,SAAS,CAAC,CAACS,KAAK,CAC1C,UAACH,QAAQ;oBAAA,OAAKA,QAAQ,CAACH,MAAM,IAAI,CAACG,QAAQ,CAACjC,SAAS;kBAAA,CACtD,CAAC;gBACH,CAAC,CAAC,OAAOxI,CAAC,EAAE;kBACV4F,oBAAW,CAACC,MAAM,CAACC,KAAK,gFAAAyB,MAAA,CACyDvH,CAAC,CAClF,CAAC;gBACH;cACF;cAAC,OAAAqK,SAAA,CAAA5E,MAAA,WAEMyE,WAAW;YAAA;YAAA;cAAA,OAAAG,SAAA,CAAAtE,IAAA;UAAA;QAAA,GAAAkE,QAAA;MAAA,CACnB;MAAA,SAAAY,+BAAA;QAAA,OAAAb,+BAAA,CAAAtJ,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAiK,8BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAA9G,GAAA;IAAAC,KAAA,EAMA,SAAA8G,uBAAA,EAA0E;MACxE,IAAMC,eAAe,GAAG,EAAE;MAE1B,IAAA1C,QAAA,CAAApH,OAAA,EAAe,IAAI,CAAC4C,mBAAmB,CAAC,CAAC9C,OAAO,CAAC,UAAAiK,IAAA,EAAgC;QAAA,IAAAC,KAAA,OAAA1C,eAAA,CAAAtH,OAAA,EAAA+J,IAAA;UAA9BjH,GAAG,GAAAkH,KAAA;UAAEpH,mBAAmB,GAAAoH,KAAA;QACzE,IAAMrJ,MAAM,GAAGiC,mBAAmB,CAACqH,SAAS,CAAC,CAAC;QAE9C,IAAItJ,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,aAAa,EAAE;UACvCmJ,eAAe,CAACtK,IAAI,CAAC;YAAC0K,IAAI,EAAEpH,GAAG;YAAE0G,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;QACA,IAAI7I,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,aAAa,EAAE;UACvCmJ,eAAe,CAACtK,IAAI,CAAC;YAAC0K,IAAI,EAAEpH,GAAG;YAAE0G,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;QACA,IAAI7I,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,aAAa,EAAE;UACxCmJ,eAAe,CAACtK,IAAI,CAAC;YAAC0K,IAAI,EAAEpH,GAAG;YAAE0G,QAAQ,EAAE;UAAM,CAAC,CAAC;QACrD;MACF,CAAC,CAAC;MAEF,OAAOM,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAhH,GAAA;IAAAC,KAAA,EAMA,SAAAoH,uBAAA,EAAiC;MAC/B,IAAMC,IAAI,GAAG,IAAI,CAACP,sBAAsB,CAAC,CAAC;MAE1CO,IAAI,CAACtK,OAAO,CAAC,UAAAuK,KAAA,EAAsB;QAAA,IAApBH,IAAI,GAAAG,KAAA,CAAJH,IAAI;UAAEV,QAAQ,GAAAa,KAAA,CAARb,QAAQ;QAC3B7E,oBAAW,CAACC,MAAM,CAAC0F,GAAG,kEAAAhE,MAAA,CAC6C4D,IAAI,YAAA5D,MAAA,CAASkD,QAAQ,CACxF,CAAC;MACH,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA1G,GAAA;IAAAC,KAAA,EAOA,SAAAwH,gCAAA,EAA0C;MACxC,OAAO,IAAAC,eAAO,EAAC,IAAI,CAACC,oBAAoB,CAAClI,MAAM,EAAE,IAAI,CAACmI,YAAY,CAACnI,MAAM,CAAC;IAC5E;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAO,GAAA;IAAAC,KAAA,EAKA,SAAA4H,mBAAA,EAA6B;MAC3B,OAAO,IAAAH,eAAO,EAAC,IAAI,CAACC,oBAAoB,EAAE,IAAI,CAACC,YAAY,CAAC;IAC9D;;IAEA;AACF;AACA;AACA;EAHE;IAAA5H,GAAA;IAAAC,KAAA,EAIA,SAAA6H,2BAAA,EAAqC;MAAA,IAAAC,qBAAA;MACnC,IAAI,IAAI,CAACC,QAAQ,EAAE;QACjBC,YAAY,CAAC,IAAI,CAACD,QAAQ,CAAC;MAC7B;MACA,IAAI,IAAI,CAACE,gBAAgB,EAAE;QACzBD,YAAY,CAAC,IAAI,CAACC,gBAAgB,CAAC;MACrC;MAEA,IAAI,CAACb,sBAAsB,CAAC,CAAC;MAC7B,CAAAU,qBAAA,OAAI,CAACxG,iBAAiB,cAAAwG,qBAAA,uBAAtBA,qBAAA,CAAwBI,OAAO,CAAC,CAAC;IACnC;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAnI,GAAA;IAAAC,KAAA,EAKA,SAAAmI,yBAAA,EAAmC;MACjC,IAAAvE,OAAA,CAAA3G,OAAA,EAAc,IAAI,CAAC4C,mBAAmB,CAAC,CAAC9C,OAAO,CAAC,UAAC8C,mBAAmB,EAAK;QACvEA,mBAAmB,CAACuI,KAAK,CAAC,CAAC;MAC7B,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAArI,GAAA;IAAAC,KAAA,EAQA,SAAAqI,cACE/F,OAAkE,EAClEmE,QAAgC,EAChC5C,WAAoB,EACpB;MACA,IAAMyE,MAAM,GAAGhG,OAAO,CACnBhG,MAAM,CAAC,UAACsB,MAAM;QAAA,OAAKA,MAAM,CAACiG,WAAW,KAAKA,WAAW;MAAA,EAAC,CACtDvH,MAAM,CAAC,UAACsB,MAAM;QAAA,OAAKA,MAAM,CAAC6I,QAAQ,CAAC,CAAC7I,MAAM,KAAK,WAAW;MAAA,EAAC,CAC3D2K,GAAG,CAAC,UAAC3K,MAAM;QAAA,OAAKA,MAAM,CAAC6I,QAAQ,CAAC,CAAC/B,qBAAqB;MAAA,EAAC;MAE1D,IAAI4D,MAAM,CAACzL,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO;UACL2L,GAAG,EAAE,CAAC,CAAC;UACPC,GAAG,EAAE,CAAC,CAAC;UACPC,OAAO,EAAE,CAAC;QACZ,CAAC;MACH;MAEA,OAAO;QACLF,GAAG,EAAEG,IAAI,CAACH,GAAG,CAAA9L,KAAA,CAARiM,IAAI,MAAAC,mBAAA,CAAA3L,OAAA,EAAQqL,MAAM,EAAC;QACxBG,GAAG,EAAEE,IAAI,CAACF,GAAG,CAAA/L,KAAA,CAARiM,IAAI,MAAAC,mBAAA,CAAA3L,OAAA,EAAQqL,MAAM,EAAC;QACxBI,OAAO,EAAE,IAAAG,YAAI,EAACP,MAAM;MACtB,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAvI,GAAA;IAAAC,KAAA;MAAA,IAAA8I,WAAA,OAAA5I,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAKA,SAAA2I,SAAA;QAAA,IAAAzG,OAAA,EAAAH,KAAA;QAAA,OAAAhC,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAAuI,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAArI,IAAA,GAAAqI,SAAA,CAAApI,IAAA;YAAA;cACQyB,OAAO,GAAG,EAAE;cAElB,IAAAsB,OAAA,CAAA3G,OAAA,EAAc,IAAI,CAAC4C,mBAAmB,CAAC,CAAC9C,OAAO,CAAC,UAAC8C,mBAAmB,EAAK;gBACvEyC,OAAO,CAAC7F,IAAI,CAAAE,aAAA,CAAAA,aAAA,KACPkD,mBAAmB,CAACqH,SAAS,CAAC,CAAC;kBAClCrD,WAAW,EAAEhE,mBAAmB,CAACgE;gBAAW,EAC7C,CAAC;cACJ,CAAC,CAAC;cAEI1B,KAAK,GAAG;gBACZ+G,GAAG,EAAE;kBACH3J,GAAG,EAAE,IAAI,CAAC8I,aAAa,CAAC/F,OAAO,EAAE,KAAK,EAAE,IAAI;gBAC9C,CAAC;gBACD9C,MAAM,EAAE;kBACND,GAAG,EAAE,IAAI,CAAC8I,aAAa,CAAC/F,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;kBAC9C7C,GAAG,EAAE,IAAI,CAAC4I,aAAa,CAAC/F,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;kBAC9C5C,IAAI,EAAE,IAAI,CAAC2I,aAAa,CAAC/F,OAAO,EAAE,MAAM,EAAE,KAAK;gBACjD;cACF,CAAC;cACD6G,gBAAO,CAACC,oBAAoB,CAC1BC,mBAAkB,CAACC,sBAAsB,EACzCH,gBAAO,CAACI,mBAAmB,CAACpH,KAAK,CACnC,CAAC;YAAC;YAAA;cAAA,OAAA8G,SAAA,CAAAlH,IAAA;UAAA;QAAA,GAAAgH,QAAA;MAAA,CACH;MAAA,SAAAS,WAAA;QAAA,OAAAV,WAAA,CAAApM,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA4M,UAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAAzJ,GAAA;IAAAC,KAAA,EAKA,SAAAyJ,YAAA,EAAsB;MAAA,IAAAC,MAAA;MACpB,IAAI,CAAC3B,QAAQ,GAAG4B,UAAU,CAAC,YAAM;QAC/BD,MAAI,CAAC3B,QAAQ,GAAGxB,SAAS;QACzB;QACA;QACA,IAAImD,MAAI,CAAClC,+BAA+B,CAAC,CAAC,EAAE;UAC1C5F,oBAAW,CAACC,MAAM,CAAC0F,GAAG,CACpB,gFACF,CAAC;UAEDmC,MAAI,CAAC7B,0BAA0B,CAAC,CAAC;QACnC;MACF,CAAC,EAAEpJ,kBAAkB,GAAG,IAAI,CAAC;MAE7B,IAAI,CAACwJ,gBAAgB,GAAG0B,UAAU,CAAC,YAAM;QACvCD,MAAI,CAACzB,gBAAgB,GAAG1B,SAAS;QAEjC3E,oBAAW,CAACC,MAAM,CAAC0F,GAAG,sEAAAhE,MAAA,CACiD/E,eAAe,OACtF,CAAC;;QAED;QACAkL,MAAI,CAAC7B,0BAA0B,CAAC,CAAC;MACnC,CAAC,EAAErJ,eAAe,GAAG,IAAI,CAAC;MAE1B,IAAI,CAACoL,YAAY,GAAGD,UAAU,CAAC,YAAM;QACnCD,MAAI,CAACE,YAAY,GAAGrD,SAAS;QAC7BmD,MAAI,CAACvB,wBAAwB,CAAC,CAAC;QAC/BuB,MAAI,CAACG,IAAI,CACP;UACEC,IAAI,EAAE,cAAc;UACpBC,QAAQ,EAAE;QACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;QACDL,MAAI,CAACF,UAAU,CAAC,CAAC;QAEjB5H,oBAAW,CAACC,MAAM,CAAC0F,GAAG,4EAAAhE,MAAA,CACuD7E,eAAe,OAC5F,CAAC;MACH,CAAC,EAAEA,eAAe,GAAG,IAAI,CAAC;IAC5B;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAqB,GAAA;IAAAC,KAAA;MAAA,IAAAgK,aAAA,OAAA9J,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAMA,SAAA6J,SAA2B3H,OAA4B;QAAA,OAAAnC,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAAyJ,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAvJ,IAAA,GAAAuJ,SAAA,CAAAtJ,IAAA;YAAA;cAAAsJ,SAAA,CAAAtJ,IAAA;cAAA,OAE/C,IAAI,CAAC7B,KAAK,CAACkC,cAAc,CAACC,GAAG,CACjC,IAAI,CAAC9B,SAAS,EACdD,uBAAY,CAACqE,kBAAkB,EAC/B,IAAApC,UAAA,CAAApE,OAAA,EAAeqF,OAAO,CACxB,CAAC;YAAA;YAAA;cAAA,OAAA6H,SAAA,CAAApI,IAAA;UAAA;QAAA,GAAAkI,QAAA;MAAA,CACF;MAAA,SAAAG,aAAAC,EAAA;QAAA,OAAAL,aAAA,CAAAtN,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAwN,YAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAArK,GAAA;IAAAC,KAAA,EAKA,SAAAsK,oBAAA,EAA8B;MAC5B,IAAI,CAAC5C,oBAAoB,CAACpI,SAAS,CAACC,GAAG,GAAG,CAAC;MAC3C,IAAI,CAACmI,oBAAoB,CAAClI,MAAM,CAACD,GAAG,GAAG,CAAC;MACxC,IAAI,CAACmI,oBAAoB,CAAClI,MAAM,CAACC,GAAG,GAAG,CAAC;MACxC,IAAI,CAACiI,oBAAoB,CAAClI,MAAM,CAACE,IAAI,GAAG,CAAC;MAEzC,IAAI,CAACiI,YAAY,CAACrI,SAAS,CAACC,GAAG,GAAG,CAAC;MACnC,IAAI,CAACoI,YAAY,CAACnI,MAAM,CAACD,GAAG,GAAG,CAAC;MAChC,IAAI,CAACoI,YAAY,CAACnI,MAAM,CAACC,GAAG,GAAG,CAAC;MAChC,IAAI,CAACkI,YAAY,CAACnI,MAAM,CAACE,IAAI,GAAG,CAAC;IACnC;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAK,GAAA;IAAAC,KAAA;MAAA,IAAAuK,0BAAA,OAAArK,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAKA,SAAAoK,UAAwCC,WAAwB;QAAA,IAAAC,MAAA;QAAA,IAAApI,OAAA,EAAAqI,aAAA;QAAA,OAAAxK,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAAmK,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAjK,IAAA,GAAAiK,UAAA,CAAAhK,IAAA;YAAA;cACxDyB,OAA4B,GAAG,CAAC,CAAC;cAEvC,IAAI,CAACzC,mBAAmB,GAAG,CAAC,CAAC;cAAC,MAE1B,CAAC4K,WAAW,IAAI,CAAC,IAAAjE,KAAA,CAAAvJ,OAAA,EAAYwN,WAAW,CAAC,CAAC5N,MAAM;gBAAAgO,UAAA,CAAAhK,IAAA;gBAAA;cAAA;cAAA,OAAAgK,UAAA,CAAApJ,MAAA;YAAA;cAIpDG,oBAAW,CAACC,MAAM,CAAC0F,GAAG,8DAAAhE,MAAA;cAElB;cACA,IAAI,CAACvE,KAAK,CAAC8L,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACC,qBAAqB,GAAG,MAAM,GAAG,EAAE,EAAA1H,MAAA;cAE3E;cACA,IAAI,CAACvE,KAAK,CAAC8L,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACE,qBAAqB,GAAG,MAAM,GAAG,EAAE,yBAE/E,CAAC;cAED,IAAI,CAACZ,mBAAmB,CAAC,CAAC;cAC1B,IAAI,CAACb,WAAW,CAAC,CAAC;;cAElB;cACA,IAAAjD,KAAA,CAAAvJ,OAAA,EAAYwN,WAAW,CAAC,CAAC1N,OAAO,CAAC,UAACgD,GAAG,EAAK;gBACxC,IAAMoL,OAAO,GAAGV,WAAW,CAAC1K,GAAG,CAAC;;gBAEhC;gBACA,IAAMqL,sBAAsB;gBAC1B;gBACAV,MAAI,CAAC1L,KAAK,CAAC8L,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACC,qBAAqB,IAAI,CAACE,OAAO,CAACtH,WAAW;gBAEvF,IAAI,CAACuH,sBAAsB,EAAE;kBAC3BD,OAAO,CAAC1L,GAAG,GAAG,EAAE;gBAClB;;gBAEA;gBACA,IAAM4L,sBAAsB;gBAC1B;gBACAX,MAAI,CAAC1L,KAAK,CAAC8L,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACE,qBAAqB,IAAI,CAACC,OAAO,CAACtH,WAAW;gBAEvF,IAAI,CAACwH,sBAAsB,EAAE;kBAC3BF,OAAO,CAACzL,IAAI,GAAG,EAAE;gBACnB;;gBAEA;gBACA4C,OAAO,CAACvC,GAAG,CAAC,GAAG;kBACbR,GAAG,EAAE;oBAAC3B,MAAM,EAAEuN,OAAO,CAAC5L,GAAG,CAAC1C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBAClE4C,GAAG,EAAE;oBAAC7B,MAAM,EAAEuN,OAAO,CAAC1L,GAAG,CAAC5C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBAClE6C,IAAI,EAAE;oBAAC9B,MAAM,EAAEuN,OAAO,CAACzL,IAAI,CAAC7C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBACpEgH,WAAW,EAAEsH,OAAO,CAACtH;gBACvB,CAAC;;gBAED;gBACA6G,MAAI,CAAChD,oBAAoB,CAACyD,OAAO,CAACtH,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAACtE,GAAG,IACzE4L,OAAO,CAAC5L,GAAG,CAAC1C,MAAM;gBACpB,IAAI,CAACsO,OAAO,CAACtH,WAAW,EAAE;kBACxB6G,MAAI,CAAChD,oBAAoB,CAAClI,MAAM,CAACC,GAAG,IAAI0L,OAAO,CAAC1L,GAAG,CAAC5C,MAAM;kBAC1D6N,MAAI,CAAChD,oBAAoB,CAAClI,MAAM,CAACE,IAAI,IAAIyL,OAAO,CAACzL,IAAI,CAAC7C,MAAM;gBAC9D;cACF,CAAC,CAAC;cAEI8N,aAAa,GAAG;gBACpBpL,GAAG,EAAE,IAAI;gBACTE,GAAG,EAAE,IAAI;gBACTC,IAAI,EAAE;cACR,CAAC,EAED;cAAAmL,UAAA,CAAAhK,IAAA;cAAA,OACM,IAAI,CAACuJ,YAAY,CAAC9H,OAAO,CAAC;YAAA;cAEhC;cACA,IAAAkE,KAAA,CAAAvJ,OAAA,EAAYwN,WAAW,CAAC,CAAC1N,OAAO,CAAC,UAACgD,GAAG,EAAK;gBACxC,IAAMoL,OAAO,GAAGV,WAAW,CAAC1K,GAAG,CAAC;gBAEhC2K,MAAI,CAAC7K,mBAAmB,CAACE,GAAG,CAAC,GAAG,IAAIuL,wCAAmB,CAACvL,GAAG,EAAEoL,OAAO,CAAC;gBACrET,MAAI,CAAC7K,mBAAmB,CAACE,GAAG,CAAC,CAACwL,EAAE,CAACC,2BAAM,CAACC,WAAW;kBAAA,IAAAC,KAAA,OAAAxL,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAAE,SAAAuL,SAAOC,IAAqB;oBAAA,IAAAnF,QAAA,EAAA7I,MAAA,EAAAiO,cAAA,EAAAnH,qBAAA,EAAAkD,kBAAA;oBAAA,OAAAzH,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAAqL,UAAAC,SAAA;sBAAA,kBAAAA,SAAA,CAAAnL,IAAA,GAAAmL,SAAA,CAAAlL,IAAA;wBAAA;0BACxE4F,QAAQ,GAAmDmF,IAAI,CAA/DnF,QAAQ,EAAE7I,MAAM,GAA2CgO,IAAI,CAArDhO,MAAM,EAAEiO,cAAc,GAA2BD,IAAI,CAA7CC,cAAc,EAAEnH,qBAAqB,GAAIkH,IAAI,CAA7BlH,qBAAqB;0BAE9D,IAAIiG,aAAa,CAAClE,QAAQ,CAAC,EAAE;4BAC3BiE,MAAI,CAACb,IAAI,CACP;8BACEC,IAAI,EAAE,cAAc;8BACpBC,QAAQ,EAAE;4BACZ,CAAC,EACD,mCAAmC,EACnC;8BACEtD,QAAQ,EAARA;4BACF,CACF,CAAC;4BACDkE,aAAa,CAAClE,QAAQ,CAAC,GAAG,KAAK;0BACjC;0BACAiE,MAAI,CAAC/C,YAAY,CAACwD,OAAO,CAACtH,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAAC4C,QAAQ,CAAC,IAAI,CAAC;0BAExEmB,kBAAkB,GAAG8C,MAAI,CAAC9C,kBAAkB,CAAC,CAAC;0BAEpDtF,OAAO,CAACvC,GAAG,CAAC,CAAC0G,QAAQ,CAAC,CAAC7I,MAAM,GAAGA,MAAM;0BACtC0E,OAAO,CAACvC,GAAG,CAAC,CAAC0G,QAAQ,CAAC,CAACoF,cAAc,GAAGA,cAAc;0BACtDvJ,OAAO,CAACvC,GAAG,CAAC,CAAC0G,QAAQ,CAAC,CAAC/B,qBAAqB,GAAGA,qBAAqB;0BAACqH,SAAA,CAAAlL,IAAA;0BAAA,OAE/D6J,MAAI,CAACN,YAAY,CAAC9H,OAAO,CAAC;wBAAA;0BAEhC,IAAIsF,kBAAkB,EAAE;4BACtBI,YAAY,CAAC0C,MAAI,CAACd,YAAY,CAAC;4BAC/Bc,MAAI,CAACd,YAAY,GAAGrD,SAAS;4BAC7BmE,MAAI,CAACb,IAAI,CACP;8BACEC,IAAI,EAAE,cAAc;8BACpBC,QAAQ,EAAE;4BACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;4BACDW,MAAI,CAAClB,UAAU,CAAC,CAAC;4BAEjB5H,oBAAW,CAACC,MAAM,CAAC0F,GAAG,gFAEtB,CAAC;4BACDmD,MAAI,CAAC7C,0BAA0B,CAAC,CAAC;0BACnC;wBAAC;wBAAA;0BAAA,OAAAkE,SAAA,CAAAhK,IAAA;sBAAA;oBAAA,GAAA4J,QAAA;kBAAA,CACF;kBAAA,iBAAAK,GAAA;oBAAA,OAAAN,KAAA,CAAAhP,KAAA,OAAAE,SAAA;kBAAA;gBAAA,IAAC;;gBAEF;gBACA8N,MAAI,CAAC7K,mBAAmB,CAACE,GAAG,CAAC,CAACwL,EAAE,CAC9BC,2BAAM,CAACS,qBAAqB;kBAAA,IAAAC,KAAA,OAAAhM,kBAAA,CAAAjD,OAAA,gBAAAkD,YAAA,CAAAlD,OAAA,CAAAmD,IAAA,CAC5B,SAAA+L,SAAOP,IAAoC;oBAAA,OAAAzL,YAAA,CAAAlD,OAAA,CAAAwD,IAAA,UAAA2L,UAAAC,SAAA;sBAAA,kBAAAA,SAAA,CAAAzL,IAAA,GAAAyL,SAAA,CAAAxL,IAAA;wBAAA;0BACzCyB,OAAO,CAACvC,GAAG,CAAC,CAAC6L,IAAI,CAACnF,QAAQ,CAAC,CAACoF,cAAc,GAAGD,IAAI,CAACC,cAAc;0BAACQ,SAAA,CAAAxL,IAAA;0BAAA,OAE3D6J,MAAI,CAACN,YAAY,CAAC9H,OAAO,CAAC;wBAAA;wBAAA;0BAAA,OAAA+J,SAAA,CAAAtK,IAAA;sBAAA;oBAAA,GAAAoK,QAAA;kBAAA,CACjC;kBAAA,iBAAAG,GAAA;oBAAA,OAAAJ,KAAA,CAAAxP,KAAA,OAAAE,SAAA;kBAAA;gBAAA,GACH,CAAC;gBAED8N,MAAI,CAAC7K,mBAAmB,CAACE,GAAG,CAAC,CAACwM,KAAK,CAAC,CAAC,CAAC,CAAC;cACzC,CAAC,CAAC;YAAC;YAAA;cAAA,OAAA1B,UAAA,CAAA9I,IAAA;UAAA;QAAA,GAAAyI,SAAA;MAAA,CACJ;MAAA,SAAAhJ,0BAAAgL,GAAA;QAAA,OAAAjC,0BAAA,CAAA7N,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA4E,yBAAA;IAAA;EAAA;EAAA,OAAA7C,YAAA;AAAA,EAvpBuC8N,oBAAW"}
@@ -23,6 +23,7 @@ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime
23
23
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
24
24
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
25
25
  var _lodash = require("lodash");
26
+ var _webCapabilities = require("@webex/web-capabilities");
26
27
  var _internalMediaCore = require("@webex/internal-media-core");
27
28
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
28
29
  var _constants = require("../constants");
@@ -33,7 +34,7 @@ var _mqaUtil = require("./mqaUtil");
33
34
  function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
34
35
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
35
36
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
36
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /* eslint-disable prefer-destructuring */
37
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
37
38
  var EVENTS = exports.EVENTS = {
38
39
  MEDIA_QUALITY: 'MEDIA_QUALITY',
39
40
  LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',
@@ -69,18 +70,25 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
69
70
  * Creates a new instance of StatsAnalyzer
70
71
  * @constructor
71
72
  * @public
72
- * @param {Object} config SDK Configuration Object
73
- * @param {Function} receiveSlotCallback Callback used to access receive slots.
74
- * @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
75
- * @param {Object} statsResults Default properties for stats
73
+ * @param {Object} config - SDK Configuration Object
74
+ * @param {Function} receiveSlotCallback - Callback used to access receive slots.
75
+ * @param {Object} networkQualityMonitor - Class for assessing network characteristics (jitter, packetLoss, latency)
76
+ * @param {Object} statsResults - Default properties for stats
77
+ * @param {boolean | undefined} isMultistream - Param indicating if the media connection is multistream or not
76
78
  */
77
- function StatsAnalyzer(config) {
79
+ function StatsAnalyzer(_ref) {
78
80
  var _this;
79
- var receiveSlotCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
80
- return undefined;
81
- };
82
- var networkQualityMonitor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
83
- var statsResults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _global.default;
81
+ var config = _ref.config,
82
+ _ref$receiveSlotCallb = _ref.receiveSlotCallback,
83
+ receiveSlotCallback = _ref$receiveSlotCallb === void 0 ? function () {
84
+ return undefined;
85
+ } : _ref$receiveSlotCallb,
86
+ _ref$networkQualityMo = _ref.networkQualityMonitor,
87
+ networkQualityMonitor = _ref$networkQualityMo === void 0 ? {} : _ref$networkQualityMo,
88
+ _ref$statsResults = _ref.statsResults,
89
+ statsResults = _ref$statsResults === void 0 ? _global.default : _ref$statsResults,
90
+ _ref$isMultistream = _ref.isMultistream,
91
+ isMultistream = _ref$isMultistream === void 0 ? false : _ref$isMultistream;
84
92
  (0, _classCallCheck2.default)(this, StatsAnalyzer);
85
93
  _this = _super.call(this);
86
94
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "config", void 0);
@@ -99,7 +107,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
99
107
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "successfulCandidatePair", void 0);
100
108
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "localIpAddress", void 0);
101
109
  // Returns the local IP address for diagnostics. this is the local IP of the interface used for the current media connection a host can have many local Ip Addresses
110
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "shareVideoEncoderImplementation", void 0);
102
111
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "receiveSlotCallback", void 0);
112
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isMultistream", void 0);
103
113
  /**
104
114
  * emits started/stopped events for local/remote media by checking
105
115
  * if given values are increasing or not. The previousValue, currentValue
@@ -251,6 +261,7 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
251
261
  _this.receiveSlotCallback = receiveSlotCallback;
252
262
  _this.successfulCandidatePair = {};
253
263
  _this.localIpAddress = '';
264
+ _this.isMultistream = isMultistream;
254
265
  return _this;
255
266
  }
256
267
 
@@ -333,56 +344,64 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
333
344
  audioSender: audioSender,
334
345
  statsResults: this.statsResults,
335
346
  lastMqaDataSent: this.lastMqaDataSent,
336
- baseMediaType: 'audio-send'
347
+ baseMediaType: 'audio-send',
348
+ isMultistream: this.isMultistream
337
349
  });
338
350
  newMqa.audioTransmit.push(audioSender);
339
351
  (0, _mqaUtil.getAudioSenderMqa)({
340
352
  audioSender: audioShareSender,
341
353
  statsResults: this.statsResults,
342
354
  lastMqaDataSent: this.lastMqaDataSent,
343
- baseMediaType: 'audio-share-send'
355
+ baseMediaType: 'audio-share-send',
356
+ isMultistream: this.isMultistream
344
357
  });
345
358
  newMqa.audioTransmit.push(audioShareSender);
346
359
  (0, _mqaUtil.getAudioReceiverMqa)({
347
360
  audioReceiver: audioReceiver,
348
361
  statsResults: this.statsResults,
349
362
  lastMqaDataSent: this.lastMqaDataSent,
350
- baseMediaType: 'audio-recv'
363
+ baseMediaType: 'audio-recv',
364
+ isMultistream: this.isMultistream
351
365
  });
352
366
  newMqa.audioReceive.push(audioReceiver);
353
367
  (0, _mqaUtil.getAudioReceiverMqa)({
354
368
  audioReceiver: audioShareReceiver,
355
369
  statsResults: this.statsResults,
356
370
  lastMqaDataSent: this.lastMqaDataSent,
357
- baseMediaType: 'audio-share-recv'
371
+ baseMediaType: 'audio-share-recv',
372
+ isMultistream: this.isMultistream
358
373
  });
359
374
  newMqa.audioReceive.push(audioShareReceiver);
360
375
  (0, _mqaUtil.getVideoSenderMqa)({
361
376
  videoSender: videoSender,
362
377
  statsResults: this.statsResults,
363
378
  lastMqaDataSent: this.lastMqaDataSent,
364
- baseMediaType: 'video-send'
379
+ baseMediaType: 'video-send',
380
+ isMultistream: this.isMultistream
365
381
  });
366
382
  newMqa.videoTransmit.push(videoSender);
367
383
  (0, _mqaUtil.getVideoSenderMqa)({
368
384
  videoSender: videoShareSender,
369
385
  statsResults: this.statsResults,
370
386
  lastMqaDataSent: this.lastMqaDataSent,
371
- baseMediaType: 'video-share-send'
387
+ baseMediaType: 'video-share-send',
388
+ isMultistream: this.isMultistream
372
389
  });
373
390
  newMqa.videoTransmit.push(videoShareSender);
374
391
  (0, _mqaUtil.getVideoReceiverMqa)({
375
392
  videoReceiver: videoReceiver,
376
393
  statsResults: this.statsResults,
377
394
  lastMqaDataSent: this.lastMqaDataSent,
378
- baseMediaType: 'video-recv'
395
+ baseMediaType: 'video-recv',
396
+ isMultistream: this.isMultistream
379
397
  });
380
398
  newMqa.videoReceive.push(videoReceiver);
381
399
  (0, _mqaUtil.getVideoReceiverMqa)({
382
400
  videoReceiver: videoShareReceiver,
383
401
  statsResults: this.statsResults,
384
402
  lastMqaDataSent: this.lastMqaDataSent,
385
- baseMediaType: 'video-share-recv'
403
+ baseMediaType: 'video-share-recv',
404
+ isMultistream: this.isMultistream
386
405
  });
387
406
  newMqa.videoReceive.push(videoShareReceiver);
388
407
 
@@ -396,7 +415,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
396
415
  lastMqaDataSent: _this3.lastMqaDataSent,
397
416
  mediaType: mediaType
398
417
  });
399
- newMqa.audioTransmit[0].streams.push(audioSenderStream);
418
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.SEND_DIRECTION)) {
419
+ newMqa.audioTransmit[0].streams.push(audioSenderStream);
420
+ }
400
421
  _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
401
422
  } else if (mediaType.startsWith('audio-share-send')) {
402
423
  var _audioSenderStream = (0, _lodash.cloneDeep)(_config.emptyAudioTransmitStream);
@@ -406,7 +427,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
406
427
  lastMqaDataSent: _this3.lastMqaDataSent,
407
428
  mediaType: mediaType
408
429
  });
409
- newMqa.audioTransmit[1].streams.push(_audioSenderStream);
430
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.SEND_DIRECTION)) {
431
+ newMqa.audioTransmit[1].streams.push(_audioSenderStream);
432
+ }
410
433
  _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
411
434
  } else if (mediaType.startsWith('audio-recv')) {
412
435
  var audioReceiverStream = (0, _lodash.cloneDeep)(_config.emptyAudioReceiveStream);
@@ -416,7 +439,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
416
439
  lastMqaDataSent: _this3.lastMqaDataSent,
417
440
  mediaType: mediaType
418
441
  });
419
- newMqa.audioReceive[0].streams.push(audioReceiverStream);
442
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.RECEIVE_DIRECTION)) {
443
+ newMqa.audioReceive[0].streams.push(audioReceiverStream);
444
+ }
420
445
  _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
421
446
  } else if (mediaType.startsWith('audio-share-recv')) {
422
447
  var _audioReceiverStream = (0, _lodash.cloneDeep)(_config.emptyAudioReceiveStream);
@@ -426,7 +451,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
426
451
  lastMqaDataSent: _this3.lastMqaDataSent,
427
452
  mediaType: mediaType
428
453
  });
429
- newMqa.audioReceive[1].streams.push(_audioReceiverStream);
454
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.RECEIVE_DIRECTION)) {
455
+ newMqa.audioReceive[1].streams.push(_audioReceiverStream);
456
+ }
430
457
  _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
431
458
  } else if (mediaType.startsWith('video-send-layer')) {
432
459
  // We only want the stream-specific stats we get with video-send-layer-0, video-send-layer-1, etc.
@@ -437,7 +464,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
437
464
  lastMqaDataSent: _this3.lastMqaDataSent,
438
465
  mediaType: mediaType
439
466
  });
440
- newMqa.videoTransmit[0].streams.push(videoSenderStream);
467
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.SEND_DIRECTION)) {
468
+ newMqa.videoTransmit[0].streams.push(videoSenderStream);
469
+ }
441
470
  _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
442
471
  } else if (mediaType.startsWith('video-share-send')) {
443
472
  var _videoSenderStream = (0, _lodash.cloneDeep)(_config.emptyVideoTransmitStream);
@@ -447,7 +476,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
447
476
  lastMqaDataSent: _this3.lastMqaDataSent,
448
477
  mediaType: mediaType
449
478
  });
450
- newMqa.videoTransmit[1].streams.push(_videoSenderStream);
479
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.SEND_DIRECTION)) {
480
+ newMqa.videoTransmit[1].streams.push(_videoSenderStream);
481
+ }
451
482
  _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
452
483
  } else if (mediaType.startsWith('video-recv')) {
453
484
  var videoReceiverStream = (0, _lodash.cloneDeep)(_config.emptyVideoReceiveStream);
@@ -457,7 +488,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
457
488
  lastMqaDataSent: _this3.lastMqaDataSent,
458
489
  mediaType: mediaType
459
490
  });
460
- newMqa.videoReceive[0].streams.push(videoReceiverStream);
491
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.RECEIVE_DIRECTION)) {
492
+ newMqa.videoReceive[0].streams.push(videoReceiverStream);
493
+ }
461
494
  _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
462
495
  } else if (mediaType.startsWith('video-share-recv')) {
463
496
  var _videoReceiverStream = (0, _lodash.cloneDeep)(_config.emptyVideoReceiveStream);
@@ -467,11 +500,14 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
467
500
  lastMqaDataSent: _this3.lastMqaDataSent,
468
501
  mediaType: mediaType
469
502
  });
470
- newMqa.videoReceive[1].streams.push(_videoReceiverStream);
503
+ if ((0, _mqaUtil.isStreamRequested)(_this3.statsResults, mediaType, _constants.STATS.RECEIVE_DIRECTION)) {
504
+ newMqa.videoReceive[1].streams.push(_videoReceiverStream);
505
+ }
471
506
  _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
472
507
  }
473
508
  });
474
509
  newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress;
510
+ newMqa.intervalMetadata.cpuInfo.numberOfCores = _webCapabilities.CpuInfo.getNumLogicalCores() || 1;
475
511
 
476
512
  // Adding peripheral information
477
513
  newMqa.intervalMetadata.peripherals.push({
@@ -494,6 +530,12 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
494
530
  });
495
531
  }
496
532
  newMqa.networkType = this.statsResults.connectionType.local.networkType;
533
+ newMqa.intervalMetadata.screenWidth = window.screen.width;
534
+ newMqa.intervalMetadata.screenHeight = window.screen.height;
535
+ newMqa.intervalMetadata.screenResolution = Math.round(window.screen.width * window.screen.height / 256);
536
+ newMqa.intervalMetadata.appWindowWidth = window.innerWidth;
537
+ newMqa.intervalMetadata.appWindowHeight = window.innerHeight;
538
+ newMqa.intervalMetadata.appWindowSize = Math.round(window.innerWidth * window.innerHeight / 256);
497
539
  this.mqaSentCount += 1;
498
540
  newMqa.intervalNumber = this.mqaSentCount;
499
541
  this.resetStatsResults();
@@ -674,6 +716,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
674
716
  _this6.statsResults[newType].direction = statsItem.currentDirection;
675
717
  _this6.statsResults[newType].trackLabel = statsItem.localTrackLabel;
676
718
  _this6.statsResults[newType].csi = statsItem.csi;
719
+ } else if (type === 'video-share-send' && result.type === 'outbound-rtp') {
720
+ _this6.shareVideoEncoderImplementation = result.encoderImplementation;
721
+ _this6.parseGetStatsResult(result, type, isSender);
677
722
  } else {
678
723
  _this6.parseGetStatsResult(result, type, isSender);
679
724
  }
@@ -923,6 +968,9 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
923
968
  this.statsResults[mediaType][sendrecvType].totalRtxBytesSent = result.retransmittedBytesSent;
924
969
  this.statsResults[mediaType][sendrecvType].totalBytesSent = result.bytesSent;
925
970
  this.statsResults[mediaType][sendrecvType].headerBytesSent = result.headerBytesSent;
971
+ this.statsResults[mediaType][sendrecvType].retransmittedBytesSent = result.retransmittedBytesSent;
972
+ this.statsResults[mediaType][sendrecvType].isRequested = result.isRequested;
973
+ this.statsResults[mediaType][sendrecvType].lastRequestedUpdateTimestamp = result.lastRequestedUpdateTimestamp;
926
974
  this.statsResults[mediaType][sendrecvType].requestedBitrate = result.requestedBitrate;
927
975
  this.statsResults[mediaType][sendrecvType].requestedFrameSize = result.requestedFrameSize;
928
976
  }
@@ -978,6 +1026,10 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
978
1026
  }
979
1027
  }
980
1028
  }
1029
+ if (mediaType.startsWith('video-recv')) {
1030
+ this.statsResults[mediaType][sendrecvType].isActiveSpeaker = result.isActiveSpeaker;
1031
+ this.statsResults[mediaType][sendrecvType].lastActiveSpeakerTimestamp = result.lastActiveSpeakerUpdateTimestamp;
1032
+ }
981
1033
 
982
1034
  // Check the over all packet Lost ratio
983
1035
  this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = currentPacketsLost > 0 ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost) : 0;
@@ -1024,6 +1076,8 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
1024
1076
  this.statsResults[mediaType][sendrecvType].totalSamplesReceived = result.totalSamplesReceived || 0;
1025
1077
  this.statsResults[mediaType][sendrecvType].totalSamplesDecoded = result.totalSamplesDecoded || 0;
1026
1078
  this.statsResults[mediaType][sendrecvType].concealedSamples = result.concealedSamples || 0;
1079
+ this.statsResults[mediaType][sendrecvType].isRequested = result.isRequested;
1080
+ this.statsResults[mediaType][sendrecvType].lastRequestedUpdateTimestamp = result.lastRequestedUpdateTimestamp;
1027
1081
  }
1028
1082
  }
1029
1083
  }, {