UNPKG

@mertushka/node-datachannel

Version:

WebRTC For Node.js and Electron. libdatachannel node bindings.

1 lines 33.8 kB
{"version":3,"file":"RTCPeerConnection.cjs","sources":["../../../src/polyfill/RTCPeerConnection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SelectedCandidateInfo } from '../lib/types';\nimport { PeerConnection } from '../lib/index';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport * as exceptions from './Exception';\nimport RTCCertificate from './RTCCertificate';\n\n// extend RTCConfiguration with peerIdentity\ninterface RTCConfiguration extends globalThis.RTCConfiguration {\n peerIdentity?: string;\n peerConnection?: PeerConnection;\n}\n\nexport default class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {\n static async generateCertificate(): Promise<RTCCertificate> {\n throw new DOMException('Not implemented');\n }\n\n #peerConnection: PeerConnection;\n #localOffer: ReturnType<typeof createDeferredPromise>;\n #localAnswer: ReturnType<typeof createDeferredPromise>;\n #dataChannels: Set<globalThis.RTCDataChannel>;\n #dataChannelsClosed = 0;\n #config: globalThis.RTCConfiguration;\n #canTrickleIceCandidates: boolean | null = null;\n #sctp: globalThis.RTCSctpTransport;\n #announceNegotiation = false;\n\n #localCandidates: globalThis.RTCIceCandidate[] = [];\n #remoteCandidates: globalThis.RTCIceCandidate[] = [];\n\n // events\n onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'] = null;\n // For ondatachannel we need to define type manually\n ondatachannel: ((this: globalThis.RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;\n onicecandidate: globalThis.RTCPeerConnection['onicecandidate'] = null;\n onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'] = null;\n oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'] = null;\n onicegatheringstatechange: globalThis.RTCPeerConnection['onicegatheringstatechange'] = null;\n onnegotiationneeded: globalThis.RTCPeerConnection['onnegotiationneeded'] = null;\n onsignalingstatechange: globalThis.RTCPeerConnection['onsignalingstatechange'] = null;\n ontrack: globalThis.RTCPeerConnection['ontrack'] = null;\n\n private _checkConfiguration(config: globalThis.RTCConfiguration): void {\n if (config && config.iceServers === undefined) config.iceServers = [];\n if (config && config.iceTransportPolicy === undefined) config.iceTransportPolicy = 'all';\n\n if (config?.iceServers === null) throw new TypeError('IceServers cannot be null');\n\n // Check for all the properties of iceServers\n if (Array.isArray(config?.iceServers)) {\n for (let i = 0; i < config.iceServers.length; i++) {\n if (config.iceServers[i] === null) throw new TypeError('IceServers cannot be null');\n if (config.iceServers[i] === undefined)\n throw new TypeError('IceServers cannot be undefined');\n if (Object.keys(config.iceServers[i]).length === 0)\n throw new TypeError('IceServers cannot be empty');\n\n // If iceServers is string convert to array\n if (typeof config.iceServers[i].urls === 'string')\n config.iceServers[i].urls = [config.iceServers[i].urls as string];\n\n // urls can not be empty\n if ((config.iceServers[i].urls as string[])?.some((url) => url == ''))\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n\n // urls should be valid URLs and match the protocols \"stun:|turn:|turns:\"\n if (\n (config.iceServers[i].urls as string[])?.some((url) => {\n try {\n const parsedURL = new URL(url);\n\n return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);\n } catch (error) {\n return true;\n }\n })\n )\n throw new exceptions.SyntaxError('IceServers urls wrong format');\n\n // If this is a turn server check for username and credential\n if ((config.iceServers[i].urls as string[])?.some((url) => url.startsWith('turn'))) {\n if (!config.iceServers[i].username)\n throw new exceptions.InvalidAccessError('IceServers username cannot be null');\n if (!config.iceServers[i].credential)\n throw new exceptions.InvalidAccessError('IceServers username cannot be undefined');\n }\n\n // length of urls can not be 0\n if (config.iceServers[i].urls?.length === 0)\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n }\n }\n\n if (\n config &&\n config.iceTransportPolicy &&\n config.iceTransportPolicy !== 'all' &&\n config.iceTransportPolicy !== 'relay'\n )\n throw new TypeError('IceTransportPolicy must be either \"all\" or \"relay\"');\n }\n\n setConfiguration(config: globalThis.RTCConfiguration): void {\n this._checkConfiguration(config);\n this.#config = config;\n }\n\n constructor(config: RTCConfiguration = { iceServers: [], iceTransportPolicy: 'all' }) {\n super();\n\n this._checkConfiguration(config);\n this.#config = config;\n this.#localOffer = createDeferredPromise();\n this.#localAnswer = createDeferredPromise();\n this.#dataChannels = new Set();\n this.#canTrickleIceCandidates = null;\n\n try {\n const peerIdentity = (config as any)?.peerIdentity ?? `peer-${getRandomString(7)}`;\n this.#peerConnection =\n config?.peerConnection ??\n new PeerConnection(peerIdentity, {\n ...config,\n iceServers:\n config?.iceServers\n ?.map((server) => {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n return urls.map((url) => {\n if (server.username && server.credential) {\n const [protocol, rest] = url.split(/:(.*)/);\n return `${protocol}:${server.username}:${server.credential}@${rest}`;\n }\n return url;\n });\n })\n .flat() ?? [],\n });\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n throw new exceptions.SyntaxError(error.message);\n }\n\n // forward peerConnection events\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n\n this.#peerConnection.onIceStateChange(() => {\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n this.#peerConnection.onSignalingStateChange(() => {\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n this.#peerConnection.onDataChannel((channel) => {\n const dc = new RTCDataChannel(channel);\n this.#dataChannels.add(dc);\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel: dc }));\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, sdpMid) => {\n if (sdpMid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${sdpMid}`));\n return;\n }\n\n this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));\n this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (e) => {\n this.onconnectionstatechange?.(e);\n });\n this.addEventListener('signalingstatechange', (e) => {\n this.onsignalingstatechange?.(e);\n });\n this.addEventListener('iceconnectionstatechange', (e) => {\n this.oniceconnectionstatechange?.(e);\n });\n this.addEventListener('icegatheringstatechange', (e) => {\n this.onicegatheringstatechange?.(e);\n });\n this.addEventListener('datachannel', (e) => {\n this.ondatachannel?.(e as RTCDataChannelEvent);\n });\n this.addEventListener('icecandidate', (e) => {\n this.onicecandidate?.(e as globalThis.RTCPeerConnectionIceEvent);\n });\n this.addEventListener('track', (e) => {\n this.ontrack?.(e as RTCTrackEvent);\n });\n this.addEventListener('negotiationneeded', (e) => {\n this.#announceNegotiation = true;\n this.onnegotiationneeded?.(e);\n });\n\n this.#sctp = new RTCSctpTransport({\n pc: this,\n });\n }\n\n // Extra FUnctions\n get ext_maxDataChannelId(): number {\n return this.#peerConnection.maxDataChannelId();\n }\n\n get ext_maxMessageSize(): number {\n return this.#peerConnection.maxMessageSize();\n }\n\n get ext_localCandidates(): globalThis.RTCIceCandidate[] {\n return this.#localCandidates;\n }\n\n get ext_remoteCandidates(): globalThis.RTCIceCandidate[] {\n return this.#remoteCandidates;\n }\n\n selectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null {\n return this.#peerConnection.getSelectedCandidatePair();\n }\n\n get canTrickleIceCandidates(): boolean | null {\n return this.#canTrickleIceCandidates;\n }\n\n get connectionState(): globalThis.RTCPeerConnectionState {\n return this.#peerConnection.state();\n }\n\n get iceConnectionState(): globalThis.RTCIceConnectionState {\n let state = this.#peerConnection.iceState();\n // libdatachannel uses 'completed' instead of 'connected'\n // see /webrtc/getstats.html\n if (state == 'completed') state = 'connected';\n return state;\n }\n\n get iceGatheringState(): globalThis.RTCIceGatheringState {\n return this.#peerConnection.gatheringState();\n }\n\n get currentLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get currentRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get localDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get remoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get sctp(): globalThis.RTCSctpTransport {\n return this.#sctp;\n }\n\n get signalingState(): globalThis.RTCSignalingState {\n return this.#peerConnection.signalingState();\n }\n\n async addIceCandidate(candidate?: globalThis.RTCIceCandidateInit | null): Promise<void> {\n if (!candidate || !candidate.candidate) {\n return;\n }\n\n if (candidate.sdpMid == null && candidate.sdpMLineIndex == null) {\n throw new TypeError('Either sdpMid or sdpMLineIndex must be set');\n }\n\n if (candidate.sdpMid && ['audio', 'video'].includes(candidate.sdpMid.toLowerCase())) {\n throw new exceptions.OperationError(`sdpMid '${candidate.sdpMid}' is not supported`);\n }\n\n // We don't care about sdpMLineIndex, just for test\n if (!candidate.sdpMid && candidate.sdpMLineIndex > 1) {\n throw new exceptions.OperationError('This is only for test case.');\n }\n\n try {\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? '0');\n this.#remoteCandidates.push(\n new RTCIceCandidate({\n candidate: candidate.candidate,\n sdpMid: candidate.sdpMid ?? '0',\n }),\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n\n // Check error Message if contains specific message\n if (error.message.includes('remote candidate without remote description'))\n throw new exceptions.InvalidStateError(error.message);\n if (error.message.includes('Invalid candidate format'))\n throw new exceptions.OperationError(error.message);\n\n throw new exceptions.NotFoundError(error.message);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTrack(_track, ..._streams): globalThis.RTCRtpSender {\n throw new DOMException('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTransceiver(_trackOrKind, _init): globalThis.RTCRtpTransceiver {\n throw new DOMException('Not implemented');\n }\n\n close(): void {\n for (const dc of this.#dataChannels) {\n if (dc.readyState !== 'closed' && dc.readyState !== 'closing') {\n // @ts-expect-error i-hate-ts\n dc._forceCloseAbruptly();\n }\n }\n\n this.#peerConnection.close();\n }\n\n createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localAnswer;\n }\n\n createDataChannel(label: string, opts: globalThis.RTCDataChannelInit = {}): RTCDataChannel {\n const channel = this.#peerConnection.createDataChannel(label, opts);\n const dataChannel = new RTCDataChannel(channel, opts);\n\n // ensure we can close all channels when shutting down\n this.#dataChannels.add(dataChannel);\n dataChannel.addEventListener('close', () => {\n this.#dataChannels.delete(dataChannel);\n this.#dataChannelsClosed++;\n });\n\n if (this.#announceNegotiation == null) {\n this.#announceNegotiation = false;\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n\n return dataChannel;\n }\n\n createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localOffer;\n }\n\n getConfiguration(): globalThis.RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): globalThis.RTCRtpReceiver[] {\n throw new DOMException('Not implemented');\n }\n\n getSenders(): globalThis.RTCRtpSender[] {\n throw new DOMException('Not implemented');\n }\n\n getStats(): Promise<globalThis.RTCStatsReport> | any {\n return new Promise((resolve) => {\n const report = new Map();\n const cp = this.#peerConnection?.getSelectedCandidatePair();\n const bytesSent = this.#peerConnection?.bytesSent();\n const bytesReceived = this.#peerConnection?.bytesReceived();\n const rtt = this.#peerConnection?.rtt();\n\n if (!cp) {\n return resolve(report);\n }\n\n const localIdRs = getRandomString(8);\n const localId = 'RTCIceCandidate_' + localIdRs;\n report.set(localId, {\n id: localId,\n type: 'local-candidate',\n timestamp: Date.now(),\n candidateType: cp.local.type,\n ip: cp.local.address,\n port: cp.local.port,\n });\n\n const remoteIdRs = getRandomString(8);\n const remoteId = 'RTCIceCandidate_' + remoteIdRs;\n report.set(remoteId, {\n id: remoteId,\n type: 'remote-candidate',\n timestamp: Date.now(),\n candidateType: cp.remote.type,\n ip: cp.remote.address,\n port: cp.remote.port,\n });\n\n const candidateId = 'RTCIceCandidatePair_' + localIdRs + '_' + remoteIdRs;\n report.set(candidateId, {\n id: candidateId,\n type: 'candidate-pair',\n timestamp: Date.now(),\n localCandidateId: localId,\n remoteCandidateId: remoteId,\n state: 'succeeded',\n nominated: true,\n writable: true,\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n totalRoundTripTime: rtt,\n currentRoundTripTime: rtt,\n });\n\n const transportId = 'RTCTransport_0_1';\n report.set(transportId, {\n id: transportId,\n timestamp: Date.now(),\n type: 'transport',\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n dtlsState: 'connected',\n selectedCandidatePairId: candidateId,\n selectedCandidatePairChanges: 1,\n });\n\n // peer-connection'\n report.set('P', {\n id: 'P',\n type: 'peer-connection',\n timestamp: Date.now(),\n dataChannelsOpened: this.#dataChannels.size,\n dataChannelsClosed: this.#dataChannelsClosed,\n });\n\n return resolve(report);\n });\n }\n\n getTransceivers(): globalThis.RTCRtpTransceiver[] {\n return []; // throw new DOMException('Not implemented');\n }\n\n removeTrack(): void {\n throw new DOMException('Not implemented');\n }\n\n restartIce(): Promise<void> {\n throw new DOMException('Not implemented');\n }\n\n async setLocalDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description?.type !== 'offer') {\n // any other type causes libdatachannel to throw\n return;\n }\n\n this.#peerConnection.setLocalDescription(description?.type as any);\n }\n\n async setRemoteDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new DOMException('Remote SDP must be set');\n }\n\n this.#peerConnection.setRemoteDescription(description.sdp, description.type as any);\n }\n}\n\nfunction createDeferredPromise(): any {\n let resolve: any, reject: any;\n\n const promise = new Promise(function (_resolve, _reject) {\n resolve = _resolve;\n reject = _reject;\n });\n\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise;\n}\n\nfunction getRandomString(length: number): string {\n return Math.random()\n .toString(36)\n .substring(2, 2 + length);\n}\n"],"names":["PeerConnection","exceptions.NotFoundError","exceptions.SyntaxError","RTCDataChannel","RTCDataChannelEvent","RTCSessionDescription","RTCIceCandidate","RTCPeerConnectionIceEvent","RTCSctpTransport","exceptions.InvalidAccessError","exceptions.OperationError","exceptions.InvalidStateError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,eAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,iBAAA;AAiBA,MAAqB,0BAA0B,WAAA,CAAoD;AAAA,EA+FjG,WAAA,CAAY,SAA2B,EAAE,UAAA,EAAY,EAAC,EAAG,kBAAA,EAAoB,OAAM,EAAG;AACpF,IAAA,KAAA,EAAM;AA3FR,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,YAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,mBAAA,EAAsB,CAAA,CAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,wBAAA,EAA2C,IAAA,CAAA;AAC3C,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,oBAAA,EAAuB,KAAA,CAAA;AAEvB,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAiD,EAAC,CAAA;AAClD,IAAA,YAAA,CAAA,IAAA,EAAA,iBAAA,EAAkD,EAAC,CAAA;AAGnD;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,yBAAA,EAAmF,IAAA,CAAA;AAEnF;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiE,IAAA,CAAA;AACjE,IAAA,aAAA,CAAA,IAAA,EAAA,qBAAA,EAA2E,IAAA,CAAA;AAC3E,IAAA,aAAA,CAAA,IAAA,EAAA,4BAAA,EAAyF,IAAA,CAAA;AACzF,IAAA,aAAA,CAAA,IAAA,EAAA,2BAAA,EAAuF,IAAA,CAAA;AACvF,IAAA,aAAA,CAAA,IAAA,EAAA,qBAAA,EAA2E,IAAA,CAAA;AAC3E,IAAA,aAAA,CAAA,IAAA,EAAA,wBAAA,EAAiF,IAAA,CAAA;AACjF,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAmD,IAAA,CAAA;AAsEjD,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,MAAA,CAAA;AACf,IAAA,YAAA,CAAA,IAAA,EAAK,aAAc,qBAAA,EAAsB,CAAA;AACzC,IAAA,YAAA,CAAA,IAAA,EAAK,cAAe,qBAAA,EAAsB,CAAA;AAC1C,IAAA,YAAA,CAAA,IAAA,EAAK,aAAA,sBAAoB,GAAA,EAAI,CAAA;AAC7B,IAAA,YAAA,CAAA,IAAA,EAAK,wBAAA,EAA2B,IAAA,CAAA;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,eAAgB,MAAA,EAAgB,YAAA,IAAgB,CAAA,KAAA,EAAQ,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAA;AAChF,MAAA,YAAA,CAAA,IAAA,EAAK,eAAA,EACH,MAAA,EAAQ,cAAA,IACR,IAAIA,qBAAe,YAAA,EAAc;AAAA,QAC/B,GAAG,MAAA;AAAA,QACH,UAAA,EACE,MAAA,EAAQ,UAAA,EACJ,GAAA,CAAI,CAAC,MAAA,KAAW;AAChB,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,IAAA,GAAO,CAAC,MAAA,CAAO,IAAI,CAAA;AAEpE,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,YAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,UAAA,EAAY;AACxC,cAAA,MAAM,CAAC,QAAA,EAAU,IAAI,CAAA,GAAI,GAAA,CAAI,MAAM,OAAO,CAAA;AAC1C,cAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA;AAEpE,YAAA,OAAO,GAAA;AAAA,WACR,CAAA;AAAA,SACF,CAAA,CACA,IAAA,EAAK,IAAK;AAAC,OACjB,CAAA,CAAA;AAAA,aACI,KAAA,EAAO;AACd,MAAA,IAAI,CAAC,SAAS,CAAC,KAAA,CAAM,SAAS,MAAM,IAAIC,uBAAW,CAAc,eAAe,CAAA;AAChF,MAAA,MAAM,IAAIC,qBAAW,CAAY,KAAA,CAAM,OAAO,CAAA;AAAA;AAIhD,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,cAAc,MAAM;AACvC,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AAAA,KACtD,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,iBAAiB,MAAM;AAC1C,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAAA,KACzD,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,uBAAuB,MAAM;AAChD,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,KACrD,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,uBAAuB,MAAM;AAChD,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAAA,KACxD,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,aAAA,CAAc,CAAC,OAAA,KAAY;AAC9C,MAAA,MAAM,EAAA,GAAK,IAAIC,sBAAA,CAAe,OAAO,CAAA;AACrC,MAAA,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,IAAI,EAAE,CAAA;AACzB,MAAA,IAAA,CAAK,aAAA,CAAc,IAAIC,0BAAA,CAAoB,aAAA,EAAe,EAAE,OAAA,EAAS,EAAA,EAAI,CAAC,CAAA;AAAA,KAC3E,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,kBAAA,CAAmB,CAAC,GAAA,EAAK,IAAA,KAAS;AACrD,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAY,QAAQ,IAAIC,6BAAA,CAAsB,EAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA;AAGnE,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,YAAA,CAAA,IAAA,EAAK,YAAA,CAAA,CAAa,QAAQ,IAAIA,6BAAA,CAAsB,EAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA;AACpE,KACD,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,gBAAA,CAAiB,CAAC,SAAA,EAAW,MAAA,KAAW;AAC3D,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,YAAA,CAAA,IAAA,EAAK,cAAa,MAAA,CAAO,IAAI,MAAM,CAAA,yBAAA,EAA4B,MAAM,EAAE,CAAC,CAAA;AACxE,QAAA;AAAA;AAGF,MAAA,YAAA,CAAA,IAAA,EAAK,gBAAA,CAAA,CAAiB,KAAK,IAAIC,uBAAA,CAAgB,EAAE,SAAA,EAAW,MAAA,EAAQ,CAAC,CAAA;AACrE,MAAA,IAAA,CAAK,aAAA,CAAc,IAAIC,gCAAA,CAA0B,IAAID,uBAAA,CAAgB,EAAE,SAAA,EAAW,MAAA,EAAQ,CAAC,CAAC,CAAA;AAAA,KAC7F,CAAA;AAGD,IAAA,IAAA,CAAK,gBAAA,CAAiB,uBAAA,EAAyB,CAAC,CAAA,KAAM;AACpD,MAAA,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,sBAAA,EAAwB,CAAC,CAAA,KAAM;AACnD,MAAA,IAAA,CAAK,yBAAyB,CAAC,CAAA;AAAA,KAChC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,0BAAA,EAA4B,CAAC,CAAA,KAAM;AACvD,MAAA,IAAA,CAAK,6BAA6B,CAAC,CAAA;AAAA,KACpC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,yBAAA,EAA2B,CAAC,CAAA,KAAM;AACtD,MAAA,IAAA,CAAK,4BAA4B,CAAC,CAAA;AAAA,KACnC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,aAAA,EAAe,CAAC,CAAA,KAAM;AAC1C,MAAA,IAAA,CAAK,gBAAgB,CAAwB,CAAA;AAAA,KAC9C,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,cAAA,EAAgB,CAAC,CAAA,KAAM;AAC3C,MAAA,IAAA,CAAK,iBAAiB,CAAyC,CAAA;AAAA,KAChE,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACpC,MAAA,IAAA,CAAK,UAAU,CAAkB,CAAA;AAAA,KAClC,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,mBAAA,EAAqB,CAAC,CAAA,KAAM;AAChD,MAAA,YAAA,CAAA,IAAA,EAAK,oBAAA,EAAuB,IAAA,CAAA;AAC5B,MAAA,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAAA,KAC7B,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,KAAA,EAAQ,IAAIE,wBAAA,CAAiB;AAAA,MAChC,EAAA,EAAI;AAAA,KACL,CAAA,CAAA;AAAA;AACH,EA3MA,aAAa,mBAAA,GAA+C;AAC1D,IAAA,MAAM,IAAI,aAAa,iBAAiB,CAAA;AAAA;AAC1C,EA2BQ,oBAAoB,MAAA,EAA2C;AACrE,IAAA,IAAI,UAAU,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,aAAa,EAAC;AACpE,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,kBAAA,KAAuB,MAAA,SAAkB,kBAAA,GAAqB,KAAA;AAEnF,IAAA,IAAI,QAAQ,UAAA,KAAe,IAAA,EAAM,MAAM,IAAI,UAAU,2BAA2B,CAAA;AAGhF,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA,EAAG;AACrC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AACjD,QAAA,IAAI,MAAA,CAAO,WAAW,CAAC,CAAA,KAAM,MAAM,MAAM,IAAI,UAAU,2BAA2B,CAAA;AAClF,QAAA,IAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,KAAM,MAAA;AAC3B,UAAA,MAAM,IAAI,UAAU,gCAAgC,CAAA;AACtD,QAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,WAAW,CAAC,CAAC,EAAE,MAAA,KAAW,CAAA;AAC/C,UAAA,MAAM,IAAI,UAAU,4BAA4B,CAAA;AAGlD,QAAA,IAAI,OAAO,MAAA,CAAO,UAAA,CAAW,CAAC,EAAE,IAAA,KAAS,QAAA;AACvC,UAAA,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,IAAA,GAAO,CAAC,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,IAAc,CAAA;AAGlE,QAAA,IAAK,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,MAAmB,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,IAAO,EAAE,CAAA;AAClE,UAAA,MAAM,IAAIN,qBAAW,CAAY,iCAAiC,CAAA;AAGpE,QAAA,IACG,OAAO,UAAA,CAAW,CAAC,EAAE,IAAA,EAAmB,IAAA,CAAK,CAAC,GAAA,KAAQ;AACrD,UAAA,IAAI;AACF,YAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,GAAG,CAAA;AAE7B,YAAA,OAAO,CAAC,wBAAA,CAAyB,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,mBACjD,KAAA,EAAO;AACd,YAAA,OAAO,IAAA;AAAA;AACT,SACD,CAAA;AAED,UAAA,MAAM,IAAIA,qBAAW,CAAY,8BAA8B,CAAA;AAGjE,QAAA,IAAK,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,IAAA,EAAmB,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AAClF,UAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA;AACxB,YAAA,MAAM,IAAIO,4BAAW,CAAmB,oCAAoC,CAAA;AAC9E,UAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,UAAA;AACxB,YAAA,MAAM,IAAIA,4BAAW,CAAmB,yCAAyC,CAAA;AAAA;AAIrF,QAAA,IAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA,CAAE,MAAM,MAAA,KAAW,CAAA;AACxC,UAAA,MAAM,IAAIP,qBAAW,CAAY,iCAAiC,CAAA;AAAA;AACtE;AAGF,IAAA,IACE,UACA,MAAA,CAAO,kBAAA,IACP,OAAO,kBAAA,KAAuB,KAAA,IAC9B,OAAO,kBAAA,KAAuB,OAAA;AAE9B,MAAA,MAAM,IAAI,UAAU,oDAAoD,CAAA;AAAA;AAC5E,EAEA,iBAAiB,MAAA,EAA2C;AAC1D,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAK,OAAA,EAAU,MAAA,CAAA;AAAA;AACjB;AAAA,EAkHA,IAAI,oBAAA,GAA+B;AACjC,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,iBAAgB,gBAAA,EAAiB;AAAA;AAC/C,EAEA,IAAI,kBAAA,GAA6B;AAC/B,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,iBAAgB,cAAA,EAAe;AAAA;AAC7C,EAEA,IAAI,mBAAA,GAAoD;AACtD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,gBAAA,CAAA;AAAA;AACd,EAEA,IAAI,oBAAA,GAAqD;AACvD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,iBAAA,CAAA;AAAA;AACd,EAEA,qBAAA,GAGS;AACP,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,iBAAgB,wBAAA,EAAyB;AAAA;AACvD,EAEA,IAAI,uBAAA,GAA0C;AAC5C,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,wBAAA,CAAA;AAAA;AACd,EAEA,IAAI,eAAA,GAAqD;AACvD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,iBAAgB,KAAA,EAAM;AAAA;AACpC,EAEA,IAAI,kBAAA,GAAuD;AACzD,IAAA,IAAI,KAAA,GAAQ,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,QAAA,EAAS;AAG1C,IAAA,IAAI,KAAA,IAAS,aAAa,KAAA,GAAQ,WAAA;AAClC,IAAA,OAAO,KAAA;AAAA;AACT,EAEA,IAAI,iBAAA,GAAqD;AACvD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,iBAAgB,cAAA,EAAe;AAAA;AAC7C,EAEA,IAAI,uBAAA,GAA4D;AAC9D,IAAA,OAAO,IAAIG,6BAAA,CAAsB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,kBAAyB,CAAA;AAAA;AACjF,EAEA,IAAI,wBAAA,GAA6D;AAC/D,IAAA,OAAO,IAAIA,6BAAA,CAAsB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,mBAA0B,CAAA;AAAA;AAClF,EAEA,IAAI,gBAAA,GAAqD;AACvD,IAAA,OAAO,IAAIA,6BAAA,CAAsB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,kBAAyB,CAAA;AAAA;AACjF,EAEA,IAAI,uBAAA,GAA4D;AAC9D,IAAA,OAAO,IAAIA,6BAAA,CAAsB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,kBAAyB,CAAA;AAAA;AACjF,EAEA,IAAI,wBAAA,GAA6D;AAC/D,IAAA,OAAO,IAAIA,6BAAA,CAAsB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,mBAA0B,CAAA;AAAA;AAClF,EAEA,IAAI,iBAAA,GAAsD;AACxD,IAAA,OAAO,IAAIA,6BAAA,CAAsB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,mBAA0B,CAAA;AAAA;AAClF,EAEA,IAAI,IAAA,GAAoC;AACtC,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,KAAA,CAAA;AAAA;AACd,EAEA,IAAI,cAAA,GAA+C;AACjD,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,iBAAgB,cAAA,EAAe;AAAA;AAC7C,EAEA,MAAM,gBAAgB,SAAA,EAAkE;AACtF,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,SAAA,EAAW;AACtC,MAAA;AAAA;AAGF,IAAA,IAAI,SAAA,CAAU,MAAA,IAAU,IAAA,IAAQ,SAAA,CAAU,iBAAiB,IAAA,EAAM;AAC/D,MAAA,MAAM,IAAI,UAAU,4CAA4C,CAAA;AAAA;AAGlE,IAAA,IAAI,SAAA,CAAU,MAAA,IAAU,CAAC,OAAA,EAAS,OAAO,CAAA,CAAE,QAAA,CAAS,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG;AACnF,MAAA,MAAM,IAAIK,wBAAW,CAAe,CAAA,QAAA,EAAW,SAAA,CAAU,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAAA;AAIrF,IAAA,IAAI,CAAC,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU,gBAAgB,CAAA,EAAG;AACpD,MAAA,MAAM,IAAIA,wBAAW,CAAe,6BAA6B,CAAA;AAAA;AAGnE,IAAA,IAAI;AACF,MAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,kBAAA,CAAmB,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,UAAU,GAAG,CAAA;AACpF,MAAA,YAAA,CAAA,IAAA,EAAK,iBAAA,CAAA,CAAkB,IAAA;AAAA,QACrB,IAAIJ,uBAAA,CAAgB;AAAA,UAClB,WAAW,SAAA,CAAU,SAAA;AAAA,UACrB,MAAA,EAAQ,UAAU,MAAA,IAAU;AAAA,SAC7B;AAAA,OACH;AAAA,aACO,KAAA,EAAO;AACd,MAAA,IAAI,CAAC,SAAS,CAAC,KAAA,CAAM,SAAS,MAAM,IAAIL,uBAAW,CAAc,eAAe,CAAA;AAGhF,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,6CAA6C,CAAA;AACtE,QAAA,MAAM,IAAIU,2BAAW,CAAkB,KAAA,CAAM,OAAO,CAAA;AACtD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,0BAA0B,CAAA;AACnD,QAAA,MAAM,IAAID,wBAAW,CAAe,KAAA,CAAM,OAAO,CAAA;AAEnD,MAAA,MAAM,IAAIT,uBAAW,CAAc,KAAA,CAAM,OAAO,CAAA;AAAA;AAClD;AACF;AAAA,EAGA,QAAA,CAAS,WAAW,QAAA,EAAmC;AACrD,IAAA,MAAM,IAAI,aAAa,iBAAiB,CAAA;AAAA;AAC1C;AAAA,EAGA,cAAA,CAAe,cAAc,KAAA,EAAqC;AAChE,IAAA,MAAM,IAAI,aAAa,iBAAiB,CAAA;AAAA;AAC1C,EAEA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,EAAA,IAAM,mBAAK,aAAA,CAAA,EAAe;AACnC,MAAA,IAAI,EAAA,CAAG,UAAA,KAAe,QAAA,IAAY,EAAA,CAAG,eAAe,SAAA,EAAW;AAE7D,QAAA,EAAA,CAAG,mBAAA,EAAoB;AAAA;AACzB;AAGF,IAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,KAAA,EAAM;AAAA;AAC7B,EAEA,YAAA,GAAoE;AAClE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,YAAA,CAAA;AAAA;AACd,EAEA,iBAAA,CAAkB,KAAA,EAAe,IAAA,GAAsC,EAAC,EAAmB;AACzF,IAAA,MAAM,OAAA,GAAU,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAClE,IAAA,MAAM,WAAA,GAAc,IAAIE,sBAAA,CAAe,OAAA,EAAS,IAAI,CAAA;AAGpD,IAAA,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,IAAI,WAAW,CAAA;AAClC,IAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,MAAM;AAC1C,MAAA,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,CAAc,OAAO,WAAW,CAAA;AACrC,MAAA,gBAAA,CAAA,IAAA,EAAK,mBAAA,CAAA,CAAL,CAAA,EAAA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,YAAA,CAAA,IAAA,EAAK,yBAAwB,IAAA,EAAM;AACrC,MAAA,YAAA,CAAA,IAAA,EAAK,oBAAA,EAAuB,KAAA,CAAA;AAC5B,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA;AAGnD,IAAA,OAAO,WAAA;AAAA;AACT,EAEA,WAAA,GAAmE;AACjE,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA;AAAA;AACd,EAEA,gBAAA,GAAgD;AAC9C,IAAA,OAAO,YAAA,CAAA,IAAA,EAAK,OAAA,CAAA;AAAA;AACd,EAEA,YAAA,GAA4C;AAC1C,IAAA,MAAM,IAAI,aAAa,iBAAiB,CAAA;AAAA;AAC1C,EAEA,UAAA,GAAwC;AACtC,IAAA,MAAM,IAAI,aAAa,iBAAiB,CAAA;AAAA;AAC1C,EAEA,QAAA,GAAqD;AACnD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAI;AACvB,MAAA,MAAM,EAAA,GAAK,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,EAAiB,wBAAA,EAAyB;AAC1D,MAAA,MAAM,SAAA,GAAY,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,EAAiB,SAAA,EAAU;AAClD,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,EAAiB,aAAA,EAAc;AAC1D,MAAA,MAAM,GAAA,GAAM,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,EAAiB,GAAA,EAAI;AAEtC,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,OAAO,QAAQ,MAAM,CAAA;AAAA;AAGvB,MAAA,MAAM,SAAA,GAAY,gBAAgB,CAAC,CAAA;AACnC,MAAA,MAAM,UAAU,kBAAA,GAAqB,SAAA;AACrC,MAAA,MAAA,CAAO,IAAI,OAAA,EAAS;AAAA,QAClB,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,iBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,aAAA,EAAe,GAAG,KAAA,CAAM,IAAA;AAAA,QACxB,EAAA,EAAI,GAAG,KAAA,CAAM,OAAA;AAAA,QACb,IAAA,EAAM,GAAG,KAAA,CAAM;AAAA,OAChB,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,gBAAgB,CAAC,CAAA;AACpC,MAAA,MAAM,WAAW,kBAAA,GAAqB,UAAA;AACtC,MAAA,MAAA,CAAO,IAAI,QAAA,EAAU;AAAA,QACnB,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,kBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,aAAA,EAAe,GAAG,MAAA,CAAO,IAAA;AAAA,QACzB,EAAA,EAAI,GAAG,MAAA,CAAO,OAAA;AAAA,QACd,IAAA,EAAM,GAAG,MAAA,CAAO;AAAA,OACjB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,sBAAA,GAAyB,SAAA,GAAY,GAAA,GAAM,UAAA;AAC/D,MAAA,MAAA,CAAO,IAAI,WAAA,EAAa;AAAA,QACtB,EAAA,EAAI,WAAA;AAAA,QACJ,IAAA,EAAM,gBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,gBAAA,EAAkB,OAAA;AAAA,QAClB,iBAAA,EAAmB,QAAA;AAAA,QACnB,KAAA,EAAO,WAAA;AAAA,QACP,SAAA,EAAW,IAAA;AAAA,QACX,QAAA,EAAU,IAAA;AAAA,QACV,SAAA;AAAA,QACA,aAAA;AAAA,QACA,kBAAA,EAAoB,GAAA;AAAA,QACpB,oBAAA,EAAsB;AAAA,OACvB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,kBAAA;AACpB,MAAA,MAAA,CAAO,IAAI,WAAA,EAAa;AAAA,QACtB,EAAA,EAAI,WAAA;AAAA,QACJ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,IAAA,EAAM,WAAA;AAAA,QACN,SAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAA,EAAW,WAAA;AAAA,QACX,uBAAA,EAAyB,WAAA;AAAA,QACzB,4BAAA,EAA8B;AAAA,OAC/B,CAAA;AAGD,MAAA,MAAA,CAAO,IAAI,GAAA,EAAK;AAAA,QACd,EAAA,EAAI,GAAA;AAAA,QACJ,IAAA,EAAM,iBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,kBAAA,EAAoB,mBAAK,aAAA,CAAA,CAAc,IAAA;AAAA,QACvC,oBAAoB,YAAA,CAAA,IAAA,EAAK,mBAAA;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO,QAAQ,MAAM,CAAA;AAAA,KACtB,CAAA;AAAA;AACH,EAEA,eAAA,GAAkD;AAChD,IAAA,OAAO,EAAC;AAAA;AACV,EAEA,WAAA,GAAoB;AAClB,IAAA,MAAM,IAAI,aAAa,iBAAiB,CAAA;AAAA;AAC1C,EAEA,UAAA,GAA4B;AAC1B,IAAA,MAAM,IAAI,aAAa,iBAAiB,CAAA;AAAA;AAC1C,EAEA,MAAM,oBAAoB,WAAA,EAAkE;AAC1F,IAAA,IAAI,WAAA,EAAa,SAAS,OAAA,EAAS;AAEjC,MAAA;AAAA;AAGF,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,mBAAA,CAAoB,WAAA,EAAa,IAAW,CAAA;AAAA;AACnE,EAEA,MAAM,qBAAqB,WAAA,EAAkE;AAC3F,IAAA,IAAI,WAAA,CAAY,OAAO,IAAA,EAAM;AAC3B,MAAA,MAAM,IAAI,aAAa,wBAAwB,CAAA;AAAA;AAGjD,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAgB,oBAAA,CAAqB,WAAA,CAAY,GAAA,EAAK,YAAY,IAAW,CAAA;AAAA;AAEtF;AA/dE,eAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AACA,YAAA,GAAA,IAAA,OAAA,EAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,mBAAA,GAAA,IAAA,OAAA,EAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA;AACA,wBAAA,GAAA,IAAA,OAAA,EAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,oBAAA,GAAA,IAAA,OAAA,EAAA;AAEA,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,iBAAA,GAAA,IAAA,OAAA,EAAA;AAsdF,SAAS,qBAAA,GAA6B;AACpC,EAAA,IAAI,OAAA,EAAc,MAAA;AAElB,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,SAAU,UAAU,OAAA,EAAS;AACvD,IAAA,OAAA,GAAU,QAAA;AACV,IAAA,MAAA,GAAS,OAAA;AAAA,GACV,CAAA;AAED,EAAC,QAAgB,OAAA,GAAU,OAAA;AAC3B,EAAC,QAAgB,MAAA,GAAS,MAAA;AAC1B,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,OAAO,IAAA,CAAK,QAAO,CAChB,QAAA,CAAS,EAAE,CAAA,CACX,SAAA,CAAU,CAAA,EAAG,CAAA,GAAI,MAAM,CAAA;AAC5B;;;;"}