From 026450bb48c5ccc04f07b4dc6de2860a1c808085 Mon Sep 17 00:00:00 2001 From: c0repwn3r Date: Fri, 14 Apr 2023 08:10:13 -0400 Subject: [PATCH] add client code --- client/.gitignore | 24 ++ client/hearty.png | Bin 0 -> 37202 bytes client/index.html | 11 + client/package.json | 19 + client/public/vite.svg | 1 + client/src/gateway.ts | 35 ++ client/src/index.ts | 33 ++ client/src/logger.ts | 118 ++++++ client/src/protocol/GoodbyeReason.ts | 42 +++ client/src/protocol/MessageC2S.ts | 58 +++ client/src/protocol/MessageS2C.ts | 11 + client/src/protocol/State.ts | 4 + client/src/vite-env.d.ts | 1 + client/tsconfig.json | 19 + client/yarn.lock | 541 +++++++++++++++++++++++++++ 15 files changed, 917 insertions(+) create mode 100644 client/.gitignore create mode 100644 client/hearty.png create mode 100644 client/index.html create mode 100644 client/package.json create mode 100644 client/public/vite.svg create mode 100644 client/src/gateway.ts create mode 100644 client/src/index.ts create mode 100644 client/src/logger.ts create mode 100644 client/src/protocol/GoodbyeReason.ts create mode 100644 client/src/protocol/MessageC2S.ts create mode 100644 client/src/protocol/MessageS2C.ts create mode 100644 client/src/protocol/State.ts create mode 100644 client/src/vite-env.d.ts create mode 100644 client/tsconfig.json create mode 100644 client/yarn.lock diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a547bf36d8d11a4f89c59c144f24795749086dd1 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/client/hearty.png b/client/hearty.png new file mode 100644 index 0000000000000000000000000000000000000000..20a6a7203aaa346611aec3cb85e7317835d68ce5 GIT binary patch literal 37202 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 K+WL{D7v=v)pc26V literal 0 HcmV?d00001 diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000000000000000000000000000000000000..6ee0b25712756ea378f8abb65aa92f51b0e0243c --- /dev/null +++ b/client/index.html @@ -0,0 +1,11 @@ + + + + + + StarKingdoms + + + + + diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000000000000000000000000000000000000..c1a2efda0b5fd97fb5f96c2c04eb9b2e5b1295a1 --- /dev/null +++ b/client/package.json @@ -0,0 +1,19 @@ +{ + "name": "starkingdoms-client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^4.9.3", + "vite": "^4.2.0" + }, + "dependencies": { + "@msgpack/msgpack": "^3.0.0-beta2", + "pixi.js": "^7.2.4" + } +} diff --git a/client/public/vite.svg b/client/public/vite.svg new file mode 100644 index 0000000000000000000000000000000000000000..e7b8dfb1b2a60bd50538bec9f876511b9cac21e3 --- /dev/null +++ b/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/gateway.ts b/client/src/gateway.ts new file mode 100644 index 0000000000000000000000000000000000000000..0bbce51529daa474060dbc0b1a570bffd15f3916 --- /dev/null +++ b/client/src/gateway.ts @@ -0,0 +1,35 @@ +import {Logger} from "./logger"; +import { encode } from "@msgpack/msgpack"; +import {MessageC2S} from "./protocol/MessageC2S"; + +const logger = new Logger("Gateway"); + +export async function gateway_connect(gateway_url: string) { + logger.info("FAST CONNECT - Connecting to gateway socket at " + gateway_url); + + let ws = await _websocket_connect(gateway_url); + + logger.debug("[fastconnect] connected to gateway, performing handshake with server"); + + +} + +let socket: WebSocket | undefined = undefined; + +function _websocket_connect(url: string): Promise { + if (socket && socket.readyState < 2) { + // reuse socket connection + return Promise.resolve(socket); + } + + return new Promise((resolve, reject) => { + socket = new WebSocket(url); + socket.onopen = () => { + // @ts-ignore if here, guaranteed that `socket` != undefined + resolve(socket); + } + socket.onerror = (err) => { + reject(err); + } + }); +} \ No newline at end of file diff --git a/client/src/index.ts b/client/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..46cafed55e4c71022375ef3460b7f7d43af23a00 --- /dev/null +++ b/client/src/index.ts @@ -0,0 +1,33 @@ +//import * as PIXI from "pixi.js"; + +import {Logger, logSetup} from "./logger"; +import {gateway_connect} from "./gateway"; + +logSetup(); +const logger = new Logger("client"); + +async function client_main() { + logger.info("StarKingdoms client - starting"); + + await gateway_connect("ws://localhost:3000/ws"); +} + +client_main().then(() => {}); + +/* + +let app = new PIXI.Application({width: window.innerWidth, height: window.innerHeight, resizeTo: window }); + +// @ts-ignore +document.body.appendChild(app.view); + +let sprite = PIXI.Sprite.from("./hearty.png"); +app.stage.addChild(sprite); + +let elapsed = 0.0; +app.ticker.add((delta) => { + elapsed += delta; + sprite.x = 100.0 + Math.cos(elapsed/50.0) * 100.0; +}); + + */ \ No newline at end of file diff --git a/client/src/logger.ts b/client/src/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..a4d9a87c099753061669f26afb110fcfe87a745d --- /dev/null +++ b/client/src/logger.ts @@ -0,0 +1,118 @@ +// LOG LEVELS: +// 0: Fatal +// 1: Error +// 2: Warn +// 3: Info +// 4: Debug +// Logs are written in-memory and logged to console if logLevel > showLogLevel +let loglevel = 0; + +export const LEVEL_FATAL = 0; +export const LEVEL_ERROR = 1; +export const LEVEL_WARN = 2; +export const LEVEL_INFO = 3; +export const LEVEL_DEBUG = 4; + +interface LogLine { + level: number, + module: string, + message: string, + timestamp: number, + deltaStart: number, + deltaLast: number +} + +const debugLog: Array = []; +let timestampStart: number; +let deltaTimestamp: number; +let logger: Logger; +let loggerSetup = false; + +export function logSetup() { + if (loggerSetup) return; + loggerSetup = true; + timestampStart = Date.now(); + deltaTimestamp = Date.now(); + logger = new Logger("Logger.ts"); + consoleLogLevel(LEVEL_INFO); + logger.info("Logger setup complete"); +} + +function log(level: number, module: string, message: string) { + const log = { + level: level, + module: module, + message: message, + timestamp: Date.now(), + deltaStart: Date.now() - timestampStart, + deltaLast: Date.now() - deltaTimestamp + }; + deltaTimestamp = Date.now(); + + debugLog.push(log); + + consoleLogHandler(log); +} + +function consoleLogHandler(log: LogLine) { + if (import.meta.env.SSR) return; // no logging in ssr + if (log.level <= loglevel) { + let textstyle = ""; + switch (log.level) { + case 0: + textstyle = "color:red;font-weight:bold;"; + break; + case 1: + textstyle = "color:red;"; + break; + case 2: + textstyle = "color:yellow;"; + break; + case 3: + textstyle = ""; + break; + case 4: + textstyle = "color:gray;"; + break; + } + console.log(`%c${new Date(log.timestamp).toISOString()} ${(log.deltaStart / 1000).toFixed(3)}Σ ${(log.deltaLast / 1000).toFixed(3)}Δ\n%c[${log.module}]%c ${log.message}`, "color:gray", "color:#8c188c", textstyle); + } +} + +export function consoleLogLevel(level: number) { + loglevel = level; +} + +export function consoleLogDump() { + for (let i = 0; i < debugLog.length; i++) { + consoleLogHandler(debugLog[i]); + } +} + +export class Logger { + private readonly name: string; + + constructor(name: string) { + this.name = name; + } + + fatal(message: any) { + log(LEVEL_FATAL, this.name, message) + } + + error(message: any) { + log(LEVEL_ERROR, this.name, message) + } + + warn(message: any) { + log(LEVEL_WARN, this.name, message) + } + + info(message: any) { + log(LEVEL_INFO, this.name, message) + } + + debug(message: any) { + log(LEVEL_DEBUG, this.name, message) + } +} \ No newline at end of file diff --git a/client/src/protocol/GoodbyeReason.ts b/client/src/protocol/GoodbyeReason.ts new file mode 100644 index 0000000000000000000000000000000000000000..73cfec8e760dca98ae42a3e414c819d46b833535 --- /dev/null +++ b/client/src/protocol/GoodbyeReason.ts @@ -0,0 +1,42 @@ +export enum GoodbyeReason { + UnexpectedPacket, + UnexpectedNextState, + UsernameTaken, + PingPongTimeout, + Done +} + +export class GoodbyeReason_UnsupportedProtocol { + supported: number; + got: number; + + constructor(supported: number, got: number) { + this.supported = supported; + this.got = got; + } + + to_object(): object { + return { UnsupportedProtocol: {supported: this.supported, got: this.got} } + } +} + +// @ts-ignore +export function enum_GoodbyeReason_serialize(r: GoodbyeReason): string { + if (r == GoodbyeReason.UnexpectedPacket) { + return "UnexpectedPacket"; + } else if (r == GoodbyeReason.UnexpectedNextState) { + return "UnexpectedNextState"; + } else if (r == GoodbyeReason.UsernameTaken) { + return "UsernameTaken"; + } else if (r == GoodbyeReason.PingPongTimeout) { + return "PingPongTimeout"; + } else if (r == GoodbyeReason.Done) { + return "Done"; + } +} + +export function enum_GoodbyeReason_deserialize(r: string): GoodbyeReason { + if (r == "UnexpectedPacket") { + + } +} \ No newline at end of file diff --git a/client/src/protocol/MessageC2S.ts b/client/src/protocol/MessageC2S.ts new file mode 100644 index 0000000000000000000000000000000000000000..10259e0087e88730f2dc0f4882df0194686db844 --- /dev/null +++ b/client/src/protocol/MessageC2S.ts @@ -0,0 +1,58 @@ +import {State} from "./State"; +import {enum_GoodbyeReason_serialize, GoodbyeReason, GoodbyeReason_UnsupportedProtocol} from "./GoodbyeReason"; + +export class MessageC2S_Hello { + version: number; + requested_username: string; + next_state: State; + + constructor(version: number, requested_username: string, next_state: State) { + this.version = version; + this.requested_username = requested_username; + this.next_state = next_state; + } + + to_object(): object { + return { Hello: { version: this.version, requested_username: this.requested_username, next_state: this.next_state }} + } +} + +export class MessageC2S_Goodbye { + reason: GoodbyeReason | GoodbyeReason_UnsupportedProtocol; + + constructor(reason: GoodbyeReason | GoodbyeReason_UnsupportedProtocol) { + this.reason = reason; + } + + to_object(): object { + let reason; + + if (this.reason instanceof GoodbyeReason_UnsupportedProtocol) { + reason = this.reason.to_object(); + } else { + reason = enum_GoodbyeReason_serialize(this.reason); + } + + return { Goodbye: { reason: reason } } + } +} + +export class MessageC2S_Chat { + message: string; + + constructor(message: string) { + this.message = message; + } + + to_object(): object { + return { Chat: { message: this.message }} + } +} + +export class MessageC2S_Ping { + constructor() {} + + to_object(): object { + return { Ping: {} } + } +} \ No newline at end of file diff --git a/client/src/protocol/MessageS2C.ts b/client/src/protocol/MessageS2C.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5f2fa570540cf9e188c90778878d65029f9f9e5 --- /dev/null +++ b/client/src/protocol/MessageS2C.ts @@ -0,0 +1,11 @@ +import {State} from "./State"; + +export class MessageS2C_Hello { + version: number; + given_username: string; + next_state: State; + + constructor(version: number, given_username: string, next_state: State) { + this.version + } +} \ No newline at end of file diff --git a/client/src/protocol/State.ts b/client/src/protocol/State.ts new file mode 100644 index 0000000000000000000000000000000000000000..39059f33551414d332faec222f1b4a79142f4601 --- /dev/null +++ b/client/src/protocol/State.ts @@ -0,0 +1,4 @@ +export enum State { + Handshake, + Play +} \ No newline at end of file diff --git a/client/src/vite-env.d.ts b/client/src/vite-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..11f02fe2a0061d6e6e1f271b21da95423b448b32 --- /dev/null +++ b/client/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..eac16d14a6f2e2812f4574497f572ecfd675020b --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Node", + "strict": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/client/yarn.lock b/client/yarn.lock new file mode 100644 index 0000000000000000000000000000000000000000..c50cf8d932fcd9364b8ef21dc8e3053c9e530406 --- /dev/null +++ b/client/yarn.lock @@ -0,0 +1,541 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/android-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz#7b18cab5f4d93e878306196eed26b6d960c12576" + integrity sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q== + +"@esbuild/android-arm@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.16.tgz#5c47f6a7c2cada6ed4b4d4e72d8c66e76d812812" + integrity sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw== + +"@esbuild/android-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.16.tgz#8686a6e98359071ffd5312046551943e7244c51a" + integrity sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow== + +"@esbuild/darwin-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz#aa79fbf447630ca0696a596beba962a775bbf394" + integrity sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA== + +"@esbuild/darwin-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz#d5d68ee510507104da7e7503224c647c957e163e" + integrity sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ== + +"@esbuild/freebsd-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz#b00b4cc8c2e424907cfe3a607384ab24794edd52" + integrity sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA== + +"@esbuild/freebsd-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz#84af4430a07730b50bbc945a90cf7036c1853b76" + integrity sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g== + +"@esbuild/linux-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz#35571d15de6272c862d9ce6341372fb3cef0f266" + integrity sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA== + +"@esbuild/linux-arm@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz#b65c7cd5b0eadd08f91aab66b9dda81b6a4b2a70" + integrity sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw== + +"@esbuild/linux-ia32@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz#673a68cb251ce44a00a6422ada29064c5a1cd2c0" + integrity sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA== + +"@esbuild/linux-loong64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz#477e2da34ab46ffdbf4740fa6441e80045249385" + integrity sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ== + +"@esbuild/linux-mips64el@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz#e1e9687bbdaa831d7c34edc9278200982c1a4bf4" + integrity sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA== + +"@esbuild/linux-ppc64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz#2f19075d63622987e86e83a4b7866cd57b796c60" + integrity sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q== + +"@esbuild/linux-riscv64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz#bbf40a38f03ba2434fe69b5ceeec5d13c742b329" + integrity sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA== + +"@esbuild/linux-s390x@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz#d2b8c0779ccd2b7917cdf0fab8831a468e0f9c01" + integrity sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw== + +"@esbuild/linux-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz#da48b39cfdc1b12a74976625f583f031eac43590" + integrity sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g== + +"@esbuild/netbsd-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz#ddef985aed37cc81908d2573b66c0299dbc49037" + integrity sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA== + +"@esbuild/openbsd-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz#85035bf89efd66e9068bc72aa6bb85a2c317d090" + integrity sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew== + +"@esbuild/sunos-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz#16338ecab854cb2d831cc9ee9cc21ef69566e1f3" + integrity sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag== + +"@esbuild/win32-arm64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz#423f46bb744aff897a5f74435469e1ef4952e343" + integrity sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg== + +"@esbuild/win32-ia32@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz#1978be5b192c7063bd2c8d5960eb213e1964740e" + integrity sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA== + +"@esbuild/win32-x64@0.17.16": + version "0.17.16" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz#260f19b0a3300d22c3a3f52722c671dc561edaa3" + integrity sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg== + +"@msgpack/msgpack@^3.0.0-beta2": + version "3.0.0-beta2" + resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz#5bccee30f84df220b33905e3d8249ba96deca0b7" + integrity sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw== + +"@pixi/accessibility@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/accessibility/-/accessibility-7.2.4.tgz#3198d0059c230c668b1179457346a3b5dcba6e64" + integrity sha512-EVjuqUqv9FeYFXCv0S0qj1hgCtbAMNBPCbOGEtiMogpM++/IySxBZvcOYg3rRgo9inwt2s4Bi7kUiqMPD8hItw== + +"@pixi/app@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/app/-/app-7.2.4.tgz#ae16fdc9fce04224fb36311168d902a2e7d0e65a" + integrity sha512-eJ2jpu5P28ip07nLItw6sETXn45P4KR/leMJ6zPHRlhT1m8t5zTsWr3jK4Uj8LF2E+6KlPNzLQh5Alf/unn/aQ== + +"@pixi/assets@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/assets/-/assets-7.2.4.tgz#944f4a15acc888071c0811d3d68524afb0ed069c" + integrity sha512-7199re3wvMAlVqXLaCyAr8IkJSXqkeVAxcYyB2rBu4Id5m2hhlGX1dQsdMBiCXLwu6/LLVqDvJggSNVQBzL6ZQ== + dependencies: + "@types/css-font-loading-module" "^0.0.7" + +"@pixi/color@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/color/-/color-7.2.4.tgz#6d6d5dbc01ae2a4f1c8eb48e98fff89ac0c3e40d" + integrity sha512-B/+9JRcXe2uE8wQfsueFRPZVayF2VEMRB7XGeRAsWCryOX19nmWhv0Nt3nOU2rvzI0niz9XgugJXsB6vVmDFSg== + dependencies: + colord "^2.9.3" + +"@pixi/compressed-textures@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/compressed-textures/-/compressed-textures-7.2.4.tgz#bbf84689a9f4f41d5a8e9476ea6520a4c19412ac" + integrity sha512-atnWyw/ot/Wg69qhgskKiuTYCZx15IxV35sa0KyXMthyjyvDLCIvOn0nczM6wCBy9H96SjJbfgynVWhVrip6qw== + +"@pixi/constants@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/constants/-/constants-7.2.4.tgz#45c23b247309e78d4105f04063ad8b453dae8b2f" + integrity sha512-hKuHBWR6N4Q0Sf5MGF3/9l+POg/G5rqhueHfzofiuelnKg7aBs3BVjjZ+6hZbd6M++vOUmxYelEX/NEFBxrheA== + +"@pixi/core@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/core/-/core-7.2.4.tgz#9f93a0744c795b17045127c2630f976580f03008" + integrity sha512-0XtvrfxHlS2T+beBBSpo7GI8+QLyyTqMVQpNmPqB4woYxzrOEJ9JaUFBaBfCvycLeUkfVih1u6HAbtF+2d1EjQ== + dependencies: + "@pixi/color" "7.2.4" + "@pixi/constants" "7.2.4" + "@pixi/extensions" "7.2.4" + "@pixi/math" "7.2.4" + "@pixi/runner" "7.2.4" + "@pixi/settings" "7.2.4" + "@pixi/ticker" "7.2.4" + "@pixi/utils" "7.2.4" + "@types/offscreencanvas" "^2019.6.4" + +"@pixi/display@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/display/-/display-7.2.4.tgz#cbf46ba0c0c0d30064b9ce67190a0a6a3624c62f" + integrity sha512-w5tqb8cWEO5qIDaO9GEqRvxYhL0iMk0Wsngw23bbLm1gLEQmrFkB2tpJlRAqd7H82C3DrDDeWvkrrxW6+m4apg== + +"@pixi/events@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/events/-/events-7.2.4.tgz#06434c9e84838b87d7626151ec556a66796ac206" + integrity sha512-/JtmoB98fzIU8giN9xvlRvmvOi6u4MaD2DnKNOMHkQ1MBraj3pmrXM9fZ0JbNzi+324GraAAY76QidgHjIYoYQ== + +"@pixi/extensions@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/extensions/-/extensions-7.2.4.tgz#ab2940abce3935706e956d1bcf2dbf44aca440db" + integrity sha512-Mnqv9scbL1ARD3QFKfOWs2aSVJJfP1dL8g5UiqGImYO3rZbz/9QCzXOeMVIZ5n3iaRyKMNhFFr84/zUja2H7Dw== + +"@pixi/extract@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/extract/-/extract-7.2.4.tgz#2db62611a3135ee8232affdb7b26cab37cb2a0a3" + integrity sha512-wlXZg+J2L/1jQhRi5nZQP/cXshovhjksjss91eAKMvY5aGxNAQovCP4xotJ/XJjfTvPMpeRzHPFYzm3PrOPQ7g== + +"@pixi/filter-alpha@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/filter-alpha/-/filter-alpha-7.2.4.tgz#f33621fa4bdc95de09457780aa33eb253fe6447f" + integrity sha512-UTUMSGyktUr+I9vmigqJo9iUhb0nwGyqTTME2xBWZvVGCnl5z+/wHxvIBBCe5pNZ66IM15pGXQ4cDcfqCuP2kA== + +"@pixi/filter-blur@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/filter-blur/-/filter-blur-7.2.4.tgz#834447f9d6edec7d27414c9961b9e6009acd678a" + integrity sha512-aLyXIoxy14bTansCPtbY8x7Sdn2OrrqkF/pcKiRXHJGGhi7wPacvB/NcmYJdnI/n2ExQ6V5Njuj/nfrsejVwcA== + +"@pixi/filter-color-matrix@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/filter-color-matrix/-/filter-color-matrix-7.2.4.tgz#4c9e6e174b27635ce5e92f34d372366b901e250f" + integrity sha512-DFtayybYXoUh73eHUFRK5REbi1t3FZuVUnaQTj+euHKF9L7EaYc3Q9wctpx1WPRcwkqEX50M4SNFhxpA7Pxtaw== + +"@pixi/filter-displacement@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/filter-displacement/-/filter-displacement-7.2.4.tgz#39da0592966079d7e194be46494b8055b5eebda2" + integrity sha512-Simq3IBJKt7+Gvk4kK7OFkfoeYUMhNhIyATCdeT+Jkdkq5WV7pYnH5hqO0YW7eAHrgjV13yn6t4H/GC4+6LhEA== + +"@pixi/filter-fxaa@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/filter-fxaa/-/filter-fxaa-7.2.4.tgz#78fac5466ca1a249f343be1af90c79bae399bf92" + integrity sha512-qzKjdL+Ih18uGTJLg8tT/H+YCsTeGkw2uF7lyKnw/lxGLJQhLWIhM95M9qSNgxbXyW1vp7SbG81a9aAEz2HAhA== + +"@pixi/filter-noise@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/filter-noise/-/filter-noise-7.2.4.tgz#0586a00381ec0e63f6c00d49cd58b781eaf07f37" + integrity sha512-QAU9Ybj2ZQrWM9ZEjTTC0iLnQcuyNoZNRinxSbg1G0yacpmsSb9wvV5ltIZ66+hfY+90+u2Nudt/v9g6pvOdGg== + +"@pixi/graphics@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/graphics/-/graphics-7.2.4.tgz#8500b604c36184736926393cb0ca9b9de9afef86" + integrity sha512-3A2EumTjWJgXlDLOyuBrl9b6v1Za/E+/IjOGUIX843HH4NYaf1a2sfDfljx6r3oiDvy+VhuBFmgynRcV5IyA0Q== + +"@pixi/math@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/math/-/math-7.2.4.tgz#219b64ca44348a1ee900ee074c51ee7e41615059" + integrity sha512-LJB+mozyEPllxa0EssFZrKNfVwysfaBun4b2dJKQQInp0DafgbA0j7A+WVg0oe51KhFULTJMpDqbLn/ITFc41A== + +"@pixi/mesh-extras@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/mesh-extras/-/mesh-extras-7.2.4.tgz#e3c6721c1a8ff5852e76402276b2f495b7db702d" + integrity sha512-Lxqq/1E2EmDgjZX8KzjhBy3VvITIQ00arr2ikyHYF1d0XtQTKEYpr8VKzhchqZ5/9DuyTDbDMYGhcxoNXQmZrQ== + +"@pixi/mesh@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/mesh/-/mesh-7.2.4.tgz#c78cc24f831a9e08d4ac0a1706e82f3498ba6907" + integrity sha512-wiALIqcRKib2BqeH9kOA5fOKWN352nqAspgbDa8gA7OyWzmNwqIedIlElixd0oLFOrIN5jOZAdzeKnoYQlt9Aw== + +"@pixi/mixin-cache-as-bitmap@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-7.2.4.tgz#4fb69efc40b30b0a8c2c1ad1eee6ca3227eccaed" + integrity sha512-95L/9nzfLHw6GoeqqRl/RjSloKvRt0xrc2inCmjMZvMsFUEtHN2F8IWd1k5vcv0S+83NCreFkJg6nJm1m5AZqg== + +"@pixi/mixin-get-child-by-name@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-7.2.4.tgz#863b14c774d3af7e2a38a68904c06bc51a2b51dd" + integrity sha512-9g17KgSBEEhkinnKk4dqmxagzHOCPSTvGB6lOopBq4yyXmr/2WVv+QGjuzE0O+p80szQeBJjPBQxzrfBILaSRw== + +"@pixi/mixin-get-global-position@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/mixin-get-global-position/-/mixin-get-global-position-7.2.4.tgz#8c0b96a0bcd381db9486954aeeb6d06c5ea2e2c0" + integrity sha512-UrAUF2BXCeWtFgR2m+er41Ky7zShT7r228cZkB6ZfYwMeThhwqG5mH68UeCyP6p68JMpT1gjI2DPfeSRY3ecnA== + +"@pixi/particle-container@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/particle-container/-/particle-container-7.2.4.tgz#8f277f65e73b061d0859c7e526f5161f9b090242" + integrity sha512-tpSzilZGFtAoi8XhzL0TecLPNRQAbY8nWV9XNGXJDw+nxXp18GCe8L6eEmnHLlAug67BRHl65DtrdvTknPX+4g== + +"@pixi/prepare@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/prepare/-/prepare-7.2.4.tgz#fd470bbc7dd90c4a8111989c405ffb5521850ff9" + integrity sha512-Yff5Sh4kTLdKc5VkkM44LW9gpj7Izw8ns3P1TzWxqeGjzPZ3folr/tQujGL+Qw+8A9VESp+hX9MSIHyw+jpyrg== + +"@pixi/runner@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/runner/-/runner-7.2.4.tgz#7356e768a43809ed6f8b3254e9bdd8c1a47af0e7" + integrity sha512-YtyqPk1LA+0guEFKSFx6t/YSvbEQwajFwi4Ft8iDhioa6VK2MmTir1GjWwy7JQYLcDmYSAcQjnmFtVTZohyYSw== + +"@pixi/settings@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/settings/-/settings-7.2.4.tgz#bfd3107ad425f99316018ee441accdf7d55627e6" + integrity sha512-ZPKRar9EwibijGmH8EViu4Greq1I/O7V/xQx2rNqN23XA7g09Qo6yfaeQpufu5xl8+/lZrjuHtQSnuY7OgG1CA== + dependencies: + "@pixi/constants" "7.2.4" + "@types/css-font-loading-module" "^0.0.7" + ismobilejs "^1.1.0" + +"@pixi/sprite-animated@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/sprite-animated/-/sprite-animated-7.2.4.tgz#46b95e52781dd7cf84ee315521c209e48c40656d" + integrity sha512-9eRriPSC0QVS7U9zQlrG3uEI5+h3fi+mqofXy+yjk1sGCmXSIJME5p2wg2mzxoJk3qkSMagQA9QHtL26Fti8Iw== + +"@pixi/sprite-tiling@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/sprite-tiling/-/sprite-tiling-7.2.4.tgz#7bcbd6e0096512fe18934a7b3250c57be19b63e4" + integrity sha512-nGfxQoACRx49dUN0oW1vFm3141M+7gkAbzoNJym2Pljd2dpLME9fb5E6Lyahu0yWMaPRhhGorn6z9VIGmTF3Jw== + +"@pixi/sprite@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/sprite/-/sprite-7.2.4.tgz#be7cd2d58d263131019545a83bb4df7340452ba1" + integrity sha512-DhR1B+/d0eXpxHIesJMXcVPrKFwQ+zRA1LvEIFfzewqfaRN3X6PMIuoKX8SIb6tl+Hq8Ba9Pe28zI7d2rmRzrA== + +"@pixi/spritesheet@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/spritesheet/-/spritesheet-7.2.4.tgz#9214d0c75aa95639c1f528091ac4a4850f5b5b8e" + integrity sha512-LNmlavyiMQeCF0U4S+yhzxUYmPmat6EpLjLnkGukQTZV5CZkxDCVgXM9uKoRF2DvNydj4yuwZ6+JjK8QssHI8Q== + +"@pixi/text-bitmap@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/text-bitmap/-/text-bitmap-7.2.4.tgz#444010da3898c35e2cdb01493bdc21706c9356a1" + integrity sha512-3u2CP4VN+muCaq/jtj7gn0hb3DET/X2S04zTBcgc2WVGufJc62yz+UDzS9jC+ellotVdt9c8U74++vpz3zJGfw== + +"@pixi/text-html@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/text-html/-/text-html-7.2.4.tgz#4702cdb97c6a10ca883d004808d45b1517c7129b" + integrity sha512-0NfLAE/w51ZtatxVqLvDS62iO0VLKsSdctqTAVv4Zlgdk9TKJmX1WUucHJboTvbm2SbDjNDGfZ6qXM5nAslIDQ== + +"@pixi/text@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/text/-/text-7.2.4.tgz#b31e7619ba80acee69cd9fb33948d34f1839bc61" + integrity sha512-DGu7ktpe+zHhqR2sG9NsJt4mgvSObv5EqXTtUxD4Z0li1gmqF7uktpLyn5I6vSg1TTEL4TECClRDClVDGiykWw== + +"@pixi/ticker@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/ticker/-/ticker-7.2.4.tgz#5acb761d3b53a1bbb2e34db59eb2a1b0442a8ed8" + integrity sha512-hQQHIHvGeFsP4GNezZqjzuhUgNQEVgCH9+qU05UX1Mc5UHC9l6OJnY4VTVhhcHxZjA6RnyaY+1zBxCnoXuazpg== + dependencies: + "@pixi/extensions" "7.2.4" + "@pixi/settings" "7.2.4" + "@pixi/utils" "7.2.4" + +"@pixi/utils@7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@pixi/utils/-/utils-7.2.4.tgz#9f74e859481e3efbb6e54e524427b39a6d99829c" + integrity sha512-VUGQHBOINIS4ePzoqafwxaGPVRTa3oM/mEutIIHbNGI3b+QvSO+1Dnk40M0zcH6Bo+MxQZbOZK5X/wO9oU5+LQ== + dependencies: + "@pixi/color" "7.2.4" + "@pixi/constants" "7.2.4" + "@pixi/settings" "7.2.4" + "@types/earcut" "^2.1.0" + earcut "^2.2.4" + eventemitter3 "^4.0.0" + url "^0.11.0" + +"@types/css-font-loading-module@^0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz#2f98ede46acc0975de85c0b7b0ebe06041d24601" + integrity sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q== + +"@types/earcut@^2.1.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/earcut/-/earcut-2.1.1.tgz#573a0af609f17005c751f6f4ffec49cfe358ea51" + integrity sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ== + +"@types/offscreencanvas@^2019.6.4": + version "2019.7.0" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz#e4a932069db47bb3eabeb0b305502d01586fa90d" + integrity sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg== + +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +earcut@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== + +esbuild@^0.17.5: + version "0.17.16" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.16.tgz#5efec24a8ff29e0c157359f27e1b5532a728b720" + integrity sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg== + optionalDependencies: + "@esbuild/android-arm" "0.17.16" + "@esbuild/android-arm64" "0.17.16" + "@esbuild/android-x64" "0.17.16" + "@esbuild/darwin-arm64" "0.17.16" + "@esbuild/darwin-x64" "0.17.16" + "@esbuild/freebsd-arm64" "0.17.16" + "@esbuild/freebsd-x64" "0.17.16" + "@esbuild/linux-arm" "0.17.16" + "@esbuild/linux-arm64" "0.17.16" + "@esbuild/linux-ia32" "0.17.16" + "@esbuild/linux-loong64" "0.17.16" + "@esbuild/linux-mips64el" "0.17.16" + "@esbuild/linux-ppc64" "0.17.16" + "@esbuild/linux-riscv64" "0.17.16" + "@esbuild/linux-s390x" "0.17.16" + "@esbuild/linux-x64" "0.17.16" + "@esbuild/netbsd-x64" "0.17.16" + "@esbuild/openbsd-x64" "0.17.16" + "@esbuild/sunos-x64" "0.17.16" + "@esbuild/win32-arm64" "0.17.16" + "@esbuild/win32-ia32" "0.17.16" + "@esbuild/win32-x64" "0.17.16" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +is-core-module@^2.11.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== + dependencies: + has "^1.0.3" + +ismobilejs@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-1.1.1.tgz#c56ca0ae8e52b24ca0f22ba5ef3215a2ddbbaa0e" + integrity sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw== + +nanoid@^3.3.4: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +pixi.js@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-7.2.4.tgz#4cd6776bf7f74a6c5e121dd1b59329e66be2ce49" + integrity sha512-nBH60meoLnHxoMFz17HoMxXS4uJpG5jwIdL+Gx2S11TzWgP3iKF+/WLOTrkSdyuQoQSdIBxVqpnYii0Wiox15A== + dependencies: + "@pixi/accessibility" "7.2.4" + "@pixi/app" "7.2.4" + "@pixi/assets" "7.2.4" + "@pixi/compressed-textures" "7.2.4" + "@pixi/core" "7.2.4" + "@pixi/display" "7.2.4" + "@pixi/events" "7.2.4" + "@pixi/extensions" "7.2.4" + "@pixi/extract" "7.2.4" + "@pixi/filter-alpha" "7.2.4" + "@pixi/filter-blur" "7.2.4" + "@pixi/filter-color-matrix" "7.2.4" + "@pixi/filter-displacement" "7.2.4" + "@pixi/filter-fxaa" "7.2.4" + "@pixi/filter-noise" "7.2.4" + "@pixi/graphics" "7.2.4" + "@pixi/mesh" "7.2.4" + "@pixi/mesh-extras" "7.2.4" + "@pixi/mixin-cache-as-bitmap" "7.2.4" + "@pixi/mixin-get-child-by-name" "7.2.4" + "@pixi/mixin-get-global-position" "7.2.4" + "@pixi/particle-container" "7.2.4" + "@pixi/prepare" "7.2.4" + "@pixi/sprite" "7.2.4" + "@pixi/sprite-animated" "7.2.4" + "@pixi/sprite-tiling" "7.2.4" + "@pixi/spritesheet" "7.2.4" + "@pixi/text" "7.2.4" + "@pixi/text-bitmap" "7.2.4" + "@pixi/text-html" "7.2.4" + +postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +resolve@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rollup@^3.18.0: + version "3.20.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.2.tgz#f798c600317f216de2e4ad9f4d9ab30a89b690ff" + integrity sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg== + optionalDependencies: + fsevents "~2.3.2" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +vite@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254" + integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg== + dependencies: + esbuild "^0.17.5" + postcss "^8.4.21" + resolve "^1.22.1" + rollup "^3.18.0" + optionalDependencies: + fsevents "~2.3.2"