colyseus.js
Version:
Colyseus Multiplayer SDK for JavaScript/TypeScript
1 lines • 18.6 kB
Source Map (JSON)
{"version":3,"file":"Client.mjs","sources":["../../src/Client.ts"],"sourcesContent":["import { ServerError } from './errors/Errors';\nimport { Room } from './Room';\nimport { SchemaConstructor } from './serializer/SchemaSerializer';\nimport { HTTP } from \"./HTTP\";\nimport { Auth } from './Auth';\nimport { SeatReservation } from './Protocol';\nimport { discordURLBuilder } from './3rd_party/discord';\n\nexport type JoinOptions = any;\n\nexport class MatchMakeError extends Error {\n code: number;\n constructor(message: string, code: number) {\n super(message);\n this.code = code;\n this.name = \"MatchMakeError\";\n Object.setPrototypeOf(this, MatchMakeError.prototype);\n }\n}\n\n// - React Native does not provide `window.location`\n// - Cocos Creator (Native) does not provide `window.location.hostname`\nconst DEFAULT_ENDPOINT = (typeof (window) !== \"undefined\" && typeof (window?.location?.hostname) !== \"undefined\")\n ? `${window.location.protocol.replace(\"http\", \"ws\")}//${window.location.hostname}${(window.location.port && `:${window.location.port}`)}`\n : \"ws://127.0.0.1:2567\";\n\nexport interface EndpointSettings {\n hostname: string,\n secure: boolean,\n port?: number,\n pathname?: string,\n searchParams?: string,\n}\n\nexport interface ClientOptions {\n headers?: { [id: string]: string };\n urlBuilder?: (url: URL) => string;\n}\n\nexport class Client {\n static VERSION = process.env.VERSION;\n\n public http: HTTP;\n public auth: Auth;\n\n protected settings: EndpointSettings;\n protected urlBuilder: (url: URL) => string;\n\n constructor(\n settings: string | EndpointSettings = DEFAULT_ENDPOINT,\n options?: ClientOptions,\n ) {\n if (typeof (settings) === \"string\") {\n\n //\n // endpoint by url\n //\n const url = (settings.startsWith(\"/\"))\n ? new URL(settings, DEFAULT_ENDPOINT)\n : new URL(settings);\n\n const secure = (url.protocol === \"https:\" || url.protocol === \"wss:\");\n const port = Number(url.port || (secure ? 443 : 80));\n\n this.settings = {\n hostname: url.hostname,\n pathname: url.pathname,\n port,\n secure,\n searchParams: url.searchParams.toString() || undefined,\n };\n\n } else {\n //\n // endpoint by settings\n //\n if (settings.port === undefined) {\n settings.port = (settings.secure) ? 443 : 80;\n }\n if (settings.pathname === undefined) {\n settings.pathname = \"\";\n }\n this.settings = settings;\n }\n\n // make sure pathname does not end with \"/\"\n if (this.settings.pathname.endsWith(\"/\")) {\n this.settings.pathname = this.settings.pathname.slice(0, -1);\n }\n\n this.http = new HTTP(this, options?.headers || {});\n this.auth = new Auth(this.http);\n\n this.urlBuilder = options?.urlBuilder;\n\n //\n // Discord Embedded SDK requires a custom URL builder\n //\n if (\n !this.urlBuilder &&\n typeof (window) !== \"undefined\" &&\n window?.location?.hostname?.includes(\"discordsays.com\")\n ) {\n this.urlBuilder = discordURLBuilder;\n console.log(\"Colyseus SDK: Discord Embedded SDK detected. Using custom URL builder.\");\n }\n }\n\n public async joinOrCreate<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinOrCreate', roomName, options, rootSchema);\n }\n\n public async create<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('create', roomName, options, rootSchema);\n }\n\n public async join<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('join', roomName, options, rootSchema);\n }\n\n public async joinById<T = any>(roomId: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinById', roomId, options, rootSchema);\n }\n\n /**\n * Re-establish connection with a room this client was previously connected to.\n *\n * @param reconnectionToken The `room.reconnectionToken` from previously connected room.\n * @param rootSchema (optional) Concrete root schema definition\n * @returns Promise<Room>\n */\n public async reconnect<T = any>(reconnectionToken: string, rootSchema?: SchemaConstructor<T>) {\n if (typeof (reconnectionToken) === \"string\" && typeof (rootSchema) === \"string\") {\n throw new Error(\"DEPRECATED: .reconnect() now only accepts 'reconnectionToken' as argument.\\nYou can get this token from previously connected `room.reconnectionToken`\");\n }\n const [roomId, token] = reconnectionToken.split(\":\");\n\t\tif (!roomId || !token) {\n\t\t\tthrow new Error(\"Invalid reconnection token format.\\nThe format should be roomId:reconnectionToken\");\n\t\t}\n return await this.createMatchMakeRequest<T>('reconnect', roomId, { reconnectionToken: token }, rootSchema);\n }\n\n public async consumeSeatReservation<T = any>(\n response: SeatReservation,\n rootSchema?: SchemaConstructor<T>,\n reuseRoomInstance?: Room // used in devMode\n ): Promise<Room<T>> {\n const room = this.createRoom<T>(response.room.name, rootSchema);\n room.roomId = response.room.roomId;\n room.sessionId = response.sessionId;\n\n const options: any = { sessionId: room.sessionId };\n\n // forward \"reconnection token\" in case of reconnection.\n if (response.reconnectionToken) {\n options.reconnectionToken = response.reconnectionToken;\n }\n\n const targetRoom = reuseRoomInstance || room;\n room.connect(this.buildEndpoint(response.room, options, response.protocol), response.devMode && (async () => {\n console.info(`[Colyseus devMode]: ${String.fromCodePoint(0x1F504)} Re-establishing connection with room id '${room.roomId}'...`); // 🔄\n\n let retryCount = 0;\n let retryMaxRetries = 8;\n\n const retryReconnection = async () => {\n retryCount++;\n\n try {\n await this.consumeSeatReservation(response, rootSchema, targetRoom);\n console.info(`[Colyseus devMode]: ${String.fromCodePoint(0x2705)} Successfully re-established connection with room '${room.roomId}'`); // ✅\n\n } catch (e) {\n if (retryCount < retryMaxRetries) {\n console.info(`[Colyseus devMode]: ${String.fromCodePoint(0x1F504)} retrying... (${retryCount} out of ${retryMaxRetries})`); // 🔄\n setTimeout(retryReconnection, 2000);\n\n } else {\n console.info(`[Colyseus devMode]: ${String.fromCodePoint(0x274C)} Failed to reconnect. Is your server running? Please check server logs.`); // ❌\n }\n }\n };\n\n setTimeout(retryReconnection, 2000);\n }), targetRoom, response, this.http.headers);\n\n return new Promise((resolve, reject) => {\n const onError = (code, message) => reject(new ServerError(code, message));\n targetRoom.onError.once(onError);\n\n targetRoom['onJoin'].once(() => {\n targetRoom.onError.remove(onError);\n resolve(targetRoom);\n });\n });\n }\n\n protected async createMatchMakeRequest<T = any>(\n method: string,\n roomName: string,\n options: JoinOptions = {},\n rootSchema?: SchemaConstructor<T>,\n reuseRoomInstance?: Room,\n ) {\n const response = (\n await this.http.post<SeatReservation>(`matchmake/${method}/${roomName}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(options)\n })\n ).data;\n\n // FIXME: HTTP class is already handling this as ServerError.\n // @ts-ignore\n if (response.error) { throw new MatchMakeError(response.error, response.code); }\n\n // forward reconnection token during \"reconnect\" methods.\n if (method === \"reconnect\") {\n response.reconnectionToken = options.reconnectionToken;\n }\n\n return await this.consumeSeatReservation<T>(response, rootSchema, reuseRoomInstance);\n }\n\n protected createRoom<T = any>(roomName: string, rootSchema?: SchemaConstructor<T>) {\n return new Room<T>(roomName, rootSchema);\n }\n\n protected buildEndpoint(room: any, options: any = {}, protocol: string = \"ws\") {\n let searchParams = this.settings.searchParams || \"\";\n\n // forward authentication token\n if (this.http.authToken) {\n options['_authToken'] = this.http.authToken;\n }\n\n // append provided options\n for (const name in options) {\n if (!options.hasOwnProperty(name)) {\n continue;\n }\n searchParams += (searchParams ? '&' : '') + `${name}=${options[name]}`;\n }\n\n if (protocol === \"h3\") {\n protocol = \"http\";\n }\n\n let endpoint = (this.settings.secure)\n ? `${protocol}s://`\n : `${protocol}://`;\n\n if (room.publicAddress) {\n endpoint += `${room.publicAddress}`;\n\n } else {\n endpoint += `${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}`;\n }\n\n const endpointURL = `${endpoint}/${room.processId}/${room.roomId}?${searchParams}`;\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getHttpEndpoint(segments: string = '') {\n const path = segments.startsWith(\"/\") ? segments : `/${segments}`;\n\n let endpointURL = `${(this.settings.secure) ? \"https\" : \"http\"}://${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}${path}`;\n\n if (this.settings.searchParams) {\n endpointURL += `?${this.settings.searchParams}`;\n }\n\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getEndpointPort() {\n return (this.settings.port !== 80 && this.settings.port !== 443)\n ? `:${this.settings.port}`\n : \"\";\n }\n}\n"],"names":[],"mappings":";;;;;;;AAUM,MAAO,cAAe,SAAQ,KAAK,CAAA;AACrC,IAAA,IAAI;IACJ,WAAY,CAAA,OAAe,EAAE,IAAY,EAAA;QACrC,KAAK,CAAC,OAAO,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,IAAI,GAAG,gBAAgB;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC;;AAE5D;AAED;AACA;AACA,MAAM,gBAAgB,GAAG,CAAC,QAAQ,MAAM,CAAC,KAAK,WAAW,IAAK,QAAQ,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,WAAW;AAC7G,MAAE,CAAG,EAAA,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA,EAAA,EAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAI,CAAA,EAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAA,CAAE,EAAG;MACvI,qBAAqB;MAed,MAAM,CAAA;IACf,OAAO,OAAO,GAAG,SAAmB;AAE7B,IAAA,IAAI;AACJ,IAAA,IAAI;AAED,IAAA,QAAQ;AACR,IAAA,UAAU;IAEpB,WACI,CAAA,QAAA,GAAsC,gBAAgB,EACtD,OAAuB,EAAA;AAEvB,QAAA,IAAI,QAAQ,QAAQ,CAAC,KAAK,QAAQ,EAAE;;;;YAKhC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;AACjC,kBAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,gBAAgB;AACpC,kBAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;AAEvB,YAAA,MAAM,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;YACrE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;YAEpD,IAAI,CAAC,QAAQ,GAAG;gBACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,IAAI;gBACJ,MAAM;gBACN,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,SAAS;aACzD;;aAEE;;;;AAIH,YAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7B,gBAAA,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE;;AAEhD,YAAA,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;AACjC,gBAAA,QAAQ,CAAC,QAAQ,GAAG,EAAE;;AAE1B,YAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;;;QAI5B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;;AAGhE,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAE/B,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU;;;;QAKrC,IACI,CAAC,IAAI,CAAC,UAAU;AAChB,YAAA,QAAQ,MAAM,CAAC,KAAK,WAAW;YAC/B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACzD;AACE,YAAA,IAAI,CAAC,UAAU,GAAG,iBAAiB;AACnC,YAAA,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC;;;IAItF,MAAM,YAAY,CAAU,QAAgB,EAAE,OAAuB,GAAA,EAAE,EAAE,UAAiC,EAAA;AAC7G,QAAA,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAI,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;;IAGvF,MAAM,MAAM,CAAU,QAAgB,EAAE,OAAuB,GAAA,EAAE,EAAE,UAAiC,EAAA;AACvG,QAAA,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAI,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;;IAGjF,MAAM,IAAI,CAAU,QAAgB,EAAE,OAAuB,GAAA,EAAE,EAAE,UAAiC,EAAA;AACrG,QAAA,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAI,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;;IAG/E,MAAM,QAAQ,CAAU,MAAc,EAAE,OAAuB,GAAA,EAAE,EAAE,UAAiC,EAAA;AACvG,QAAA,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAI,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC;;AAGxF;;;;;;AAMG;AACI,IAAA,MAAM,SAAS,CAAU,iBAAyB,EAAE,UAAiC,EAAA;AACxF,QAAA,IAAI,QAAQ,iBAAiB,CAAC,KAAK,QAAQ,IAAI,QAAQ,UAAU,CAAC,KAAK,QAAQ,EAAE;AAC7E,YAAA,MAAM,IAAI,KAAK,CAAC,uJAAuJ,CAAC;;AAE5K,QAAA,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC;AAC1D,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC;;AAE/F,QAAA,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAI,WAAW,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC;;IAGvG,MAAM,sBAAsB,CAC/B,QAAyB,EACzB,UAAiC,EACjC,iBAAwB;;AAExB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS;QAEnC,MAAM,OAAO,GAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;;AAGlD,QAAA,IAAI,QAAQ,CAAC,iBAAiB,EAAE;AAC5B,YAAA,OAAO,CAAC,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB;;AAG1D,QAAA,MAAM,UAAU,GAAG,iBAAiB,IAAI,IAAI;QAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,KAAK,YAAW;AACxG,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA,0CAAA,EAA6C,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;YAEjI,IAAI,UAAU,GAAG,CAAC;YAClB,IAAI,eAAe,GAAG,CAAC;AAEvB,YAAA,MAAM,iBAAiB,GAAG,YAAW;AACjC,gBAAA,UAAU,EAAE;AAEZ,gBAAA,IAAI;oBACA,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;AACnE,oBAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA,mDAAA,EAAsD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;;gBAExI,OAAO,CAAC,EAAE;AACR,oBAAA,IAAI,UAAU,GAAG,eAAe,EAAE;AAC9B,wBAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA,cAAA,EAAiB,UAAU,CAAW,QAAA,EAAA,eAAe,GAAG,CAAC,CAAC;AAC3H,wBAAA,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC;;yBAEhC;AACH,wBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,oBAAA,EAAuB,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA,uEAAA,CAAyE,CAAC,CAAC;;;AAGvJ,aAAC;AAED,YAAA,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC;AACvC,SAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACnC,YAAA,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,YAAA,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AAEhC,YAAA,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAK;AAC3B,gBAAA,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAClC,OAAO,CAAC,UAAU,CAAC;AACvB,aAAC,CAAC;AACN,SAAC,CAAC;;AAGI,IAAA,MAAM,sBAAsB,CAClC,MAAc,EACd,QAAgB,EAChB,OAAA,GAAuB,EAAE,EACzB,UAAiC,EACjC,iBAAwB,EAAA;AAExB,QAAA,MAAM,QAAQ,GAAG,CACb,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,CAAa,UAAA,EAAA,MAAM,CAAI,CAAA,EAAA,QAAQ,EAAE,EAAE;AACrE,YAAA,OAAO,EAAE;AACL,gBAAA,QAAQ,EAAE,kBAAkB;AAC5B,gBAAA,cAAc,EAAE;AACnB,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;SAC/B,CAAC,EACJ,IAAI;;;AAIN,QAAA,IAAI,QAAQ,CAAC,KAAK,EAAE;YAAE,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC;;;AAG7E,QAAA,IAAI,MAAM,KAAK,WAAW,EAAE;AACxB,YAAA,QAAQ,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB;;QAG1D,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAI,QAAQ,EAAE,UAAU,EAAE,iBAAiB,CAAC;;IAG9E,UAAU,CAAU,QAAgB,EAAE,UAAiC,EAAA;AAC7E,QAAA,OAAO,IAAI,IAAI,CAAI,QAAQ,EAAE,UAAU,CAAC;;AAGlC,IAAA,aAAa,CAAC,IAAS,EAAE,UAAe,EAAE,EAAE,WAAmB,IAAI,EAAA;QACzE,IAAI,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE;;AAGnD,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACrB,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS;;;AAI/C,QAAA,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;YACxB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;gBAC/B;;YAEJ,YAAY,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,CAAA,CAAA,EAAI,OAAO,CAAC,IAAI,CAAC,CAAA,CAAE;;AAG1E,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;YACnB,QAAQ,GAAG,MAAM;;QAGrB,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;cAC9B,CAAG,EAAA,QAAQ,CAAM,IAAA;AACnB,cAAE,CAAA,EAAG,QAAQ,CAAA,GAAA,CAAK;AAEtB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,QAAQ,IAAI,CAAG,EAAA,IAAI,CAAC,aAAa,EAAE;;aAEhC;AACH,YAAA,QAAQ,IAAI,CAAG,EAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAG,EAAA,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;AAG7F,QAAA,MAAM,WAAW,GAAG,CAAG,EAAA,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,CAAI,CAAA,EAAA,YAAY,EAAE;AAClF,QAAA,OAAO,CAAC,IAAI,CAAC,UAAU;cACjB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC;cACpC,WAAW;;IAGX,eAAe,CAAC,WAAmB,EAAE,EAAA;AAC3C,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAI,CAAA,EAAA,QAAQ,EAAE;AAEjE,QAAA,IAAI,WAAW,GAAG,CAAA,EAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,OAAO,GAAG,MAAM,CAAA,GAAA,EAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAG,EAAA,IAAI,CAAC,eAAe,EAAE,CAAG,EAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAG,EAAA,IAAI,EAAE;AAErJ,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;YAC5B,WAAW,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;;AAGnD,QAAA,OAAO,CAAC,IAAI,CAAC,UAAU;cACjB,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC;cACpC,WAAW;;IAGX,eAAe,GAAA;AACrB,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG;AAC3D,cAAE,CAAI,CAAA,EAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAE;cACxB,EAAE;;;;;;"}