quake2ts 0.0.584 → 0.0.585
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.
- package/package.json +4 -2
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/render/__mocks__/frame.d.ts +31 -0
- package/packages/engine/dist/types/render/__mocks__/frame.d.ts.map +1 -0
- package/packages/test-utils/dist/index.cjs +107 -17
- package/packages/test-utils/dist/index.cjs.map +1 -1
- package/packages/test-utils/dist/index.d.cts +57 -3
- package/packages/test-utils/dist/index.d.ts +57 -3
- package/packages/test-utils/dist/index.js +92 -11
- package/packages/test-utils/dist/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/mocks.ts","../src/shared/bsp.ts","../src/game/factories.ts","../src/game/helpers.ts","../src/game/mocks/ai.ts","../src/game/mocks/combat.ts","../src/game/mocks/items.ts","../src/game/mocks.ts","../src/server/mocks/transport.ts","../src/server/mocks/state.ts","../src/server/mocks/connection.ts","../src/server/mocks/commands.ts","../src/server/mocks/master.ts","../src/server/mocks/physics.ts","../src/server/helpers/multiplayer.ts","../src/server/helpers/snapshot.ts","../src/server/helpers/bandwidth.ts","../src/setup/browser.ts","../src/client/mocks/input.ts","../src/engine/mocks/webgl.ts","../src/setup/canvas.ts","../src/engine/mocks/webgpu.ts","../src/setup/timing.ts","../src/setup/node.ts","../src/engine/rendering.ts","../src/setup/storage.ts","../src/setup/audio.ts","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/common.js","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/vec3.js","../src/client/helpers/view.ts","../src/e2e/playwright.ts","../src/e2e/network.ts","../src/e2e/visual.ts"],"sourcesContent":["import { vi, type Mock } from 'vitest';\n\nexport interface BinaryWriterMock {\n writeByte: Mock<[number], void>;\n writeShort: Mock<[number], void>;\n writeLong: Mock<[number], void>;\n writeString: Mock<[string], void>;\n writeBytes: Mock<[Uint8Array], void>;\n getBuffer: Mock<[], Uint8Array>;\n reset: Mock<[], void>;\n writeInt8: Mock<[number], void>;\n writeUint8: Mock<[number], void>;\n writeInt16: Mock<[number], void>;\n writeUint16: Mock<[number], void>;\n writeInt32: Mock<[number], void>;\n writeUint32: Mock<[number], void>;\n writeFloat: Mock<[number], void>;\n getData: Mock<[], Uint8Array>;\n}\n\nexport const createBinaryWriterMock = (): BinaryWriterMock => ({\n writeByte: vi.fn(),\n writeShort: vi.fn(),\n writeLong: vi.fn(),\n writeString: vi.fn(),\n writeBytes: vi.fn(),\n getBuffer: vi.fn<[], Uint8Array>(() => new Uint8Array(0)),\n reset: vi.fn(),\n // Legacy methods (if any)\n writeInt8: vi.fn(),\n writeUint8: vi.fn(),\n writeInt16: vi.fn(),\n writeUint16: vi.fn(),\n writeInt32: vi.fn(),\n writeUint32: vi.fn(),\n writeFloat: vi.fn(),\n getData: vi.fn<[], Uint8Array>(() => new Uint8Array(0)),\n});\n\nexport const createNetChanMock = () => ({\n qport: 1234,\n\n // Sequencing\n incomingSequence: 0,\n outgoingSequence: 0,\n incomingAcknowledged: 0,\n\n // Reliable messaging\n incomingReliableAcknowledged: false,\n incomingReliableSequence: 0,\n outgoingReliableSequence: 0,\n reliableMessage: createBinaryWriterMock(),\n reliableLength: 0,\n\n // Fragmentation\n fragmentSendOffset: 0,\n fragmentBuffer: null,\n fragmentLength: 0,\n fragmentReceived: 0,\n\n // Timing\n lastReceived: 0,\n lastSent: 0,\n\n remoteAddress: { type: 'IP', port: 1234 },\n\n // Methods\n setup: vi.fn(),\n reset: vi.fn(),\n transmit: vi.fn(),\n process: vi.fn(),\n canSendReliable: vi.fn(() => true),\n writeReliableByte: vi.fn(),\n writeReliableShort: vi.fn(),\n writeReliableLong: vi.fn(),\n writeReliableString: vi.fn(),\n getReliableData: vi.fn<[], Uint8Array>(() => new Uint8Array(0)),\n needsKeepalive: vi.fn(() => false),\n isTimedOut: vi.fn(() => false),\n});\n\nexport interface BinaryStreamMock {\n getPosition: Mock<[], number>;\n getReadPosition: Mock<[], number>;\n getLength: Mock<[], number>;\n getRemaining: Mock<[], number>;\n seek: Mock<[number], void>;\n setReadPosition: Mock<[number], void>;\n hasMore: Mock<[], boolean>;\n hasBytes: Mock<[number], boolean>;\n\n readChar: Mock<[], number>;\n readByte: Mock<[], number>;\n readShort: Mock<[], number>;\n readUShort: Mock<[], number>;\n readLong: Mock<[], number>;\n readULong: Mock<[], number>;\n readFloat: Mock<[], number>;\n\n readString: Mock<[], string>;\n readStringLine: Mock<[], string>;\n\n readCoord: Mock<[], number>;\n readAngle: Mock<[], number>;\n readAngle16: Mock<[], number>;\n\n readData: Mock<[number], Uint8Array>;\n\n readPos: Mock<[], any>; // Use proper type if available, e.g., Vec3\n readDir: Mock<[], any>;\n}\n\nexport const createBinaryStreamMock = (): BinaryStreamMock => ({\n getPosition: vi.fn(() => 0),\n getReadPosition: vi.fn(() => 0),\n getLength: vi.fn(() => 0),\n getRemaining: vi.fn(() => 0),\n seek: vi.fn(),\n setReadPosition: vi.fn(),\n hasMore: vi.fn(() => true),\n hasBytes: vi.fn((amount: number) => true),\n\n readChar: vi.fn(() => 0),\n readByte: vi.fn(() => 0),\n readShort: vi.fn(() => 0),\n readUShort: vi.fn(() => 0),\n readLong: vi.fn(() => 0),\n readULong: vi.fn(() => 0),\n readFloat: vi.fn(() => 0),\n\n readString: vi.fn(() => ''),\n readStringLine: vi.fn(() => ''),\n\n readCoord: vi.fn(() => 0),\n readAngle: vi.fn(() => 0),\n readAngle16: vi.fn(() => 0),\n\n readData: vi.fn<[number], Uint8Array>((length: number) => new Uint8Array(length)),\n\n readPos: vi.fn(),\n readDir: vi.fn(),\n});\n","import {\n computePlaneSignBits,\n type CollisionBrush,\n type CollisionModel,\n type CollisionPlane,\n type CollisionNode,\n type CollisionLeaf,\n CONTENTS_SOLID,\n type Vec3\n} from '@quake2ts/shared';\n\nexport function makePlane(normal: Vec3, dist: number): CollisionPlane {\n return {\n normal,\n dist,\n type: Math.abs(normal.x) === 1 ? 0 : Math.abs(normal.y) === 1 ? 1 : Math.abs(normal.z) === 1 ? 2 : 3,\n signbits: computePlaneSignBits(normal),\n };\n}\n\nexport function makeAxisBrush(size: number, contents = CONTENTS_SOLID): CollisionBrush {\n const half = size / 2;\n const planes = [\n makePlane({ x: 1, y: 0, z: 0 }, half),\n makePlane({ x: -1, y: 0, z: 0 }, half),\n makePlane({ x: 0, y: 1, z: 0 }, half),\n makePlane({ x: 0, y: -1, z: 0 }, half),\n makePlane({ x: 0, y: 0, z: 1 }, half),\n makePlane({ x: 0, y: 0, z: -1 }, half),\n ];\n\n return {\n contents,\n sides: planes.map((plane) => ({ plane, surfaceFlags: 0 })),\n };\n}\n\nexport function makeNode(plane: CollisionPlane, children: [number, number]): CollisionNode {\n return { plane, children };\n}\n\nexport function makeBspModel(\n planes: CollisionPlane[],\n nodes: CollisionNode[],\n leaves: CollisionLeaf[],\n brushes: CollisionBrush[],\n leafBrushes: number[]\n): CollisionModel {\n return {\n planes,\n nodes,\n leaves,\n brushes,\n leafBrushes,\n bmodels: [],\n };\n}\n\nexport function makeLeaf(contents: number, firstLeafBrush: number, numLeafBrushes: number): CollisionLeaf {\n return { contents, cluster: 0, area: 0, firstLeafBrush, numLeafBrushes };\n}\n\nexport function makeLeafModel(brushes: CollisionBrush[]): CollisionModel {\n const planes = brushes.flatMap((brush) => brush.sides.map((side) => side.plane));\n\n return {\n planes,\n nodes: [],\n leaves: [makeLeaf(0, 0, brushes.length)],\n brushes,\n leafBrushes: brushes.map((_, i) => i),\n bmodels: [],\n };\n}\n\nexport function makeBrushFromMinsMaxs(mins: Vec3, maxs: Vec3, contents = CONTENTS_SOLID): CollisionBrush {\n const planes = [\n makePlane({ x: 1, y: 0, z: 0 }, maxs.x),\n makePlane({ x: -1, y: 0, z: 0 }, -mins.x),\n makePlane({ x: 0, y: 1, z: 0 }, maxs.y),\n makePlane({ x: 0, y: -1, z: 0 }, -mins.y),\n makePlane({ x: 0, y: 0, z: 1 }, maxs.z),\n makePlane({ x: 0, y: 0, z: -1 }, -mins.z),\n ];\n\n return {\n contents,\n sides: planes.map((plane) => ({ plane, surfaceFlags: 0 })),\n };\n}\n","import {\n Entity,\n MoveType,\n Solid,\n ServerFlags,\n DeadFlag,\n EntityFlags\n} from '@quake2ts/game';\nimport type { PlayerState, EntityState } from '@quake2ts/shared';\nimport type { GameStateSnapshot } from '@quake2ts/game';\n\n// -- Shared / Game State Factories --\n\nexport const createPlayerStateFactory = (overrides?: Partial<PlayerState>): PlayerState => ({\n pm_type: 0,\n pm_time: 0,\n pm_flags: 0,\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewAngles: { x: 0, y: 0, z: 0 },\n onGround: false,\n waterLevel: 0,\n watertype: 0,\n mins: { x: 0, y: 0, z: 0 },\n maxs: { x: 0, y: 0, z: 0 },\n damageAlpha: 0,\n damageIndicators: [],\n blend: [0, 0, 0, 0],\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n ...overrides,\n});\n\nexport const createEntityStateFactory = (overrides?: Partial<EntityState>): EntityState => ({\n number: 0,\n origin: { x: 0, y: 0, z: 0 },\n angles: { x: 0, y: 0, z: 0 },\n oldOrigin: { x: 0, y: 0, z: 0 },\n modelIndex: 0,\n modelIndex2: 0,\n modelIndex3: 0,\n modelIndex4: 0,\n frame: 0,\n skinNum: 0,\n effects: 0,\n renderfx: 0,\n solid: 0,\n sound: 0,\n event: 0,\n ...overrides,\n});\n\nexport const createGameStateSnapshotFactory = (overrides?: Partial<GameStateSnapshot>): GameStateSnapshot => ({\n gravity: { x: 0, y: 0, z: -800 },\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewangles: { x: 0, y: 0, z: 0 },\n level: { timeSeconds: 0, frameNumber: 0, previousTimeSeconds: 0, deltaSeconds: 0.1 },\n entities: {\n activeCount: 0,\n worldClassname: 'worldspawn',\n },\n packetEntities: [],\n pmFlags: 0,\n pmType: 0,\n waterlevel: 0,\n watertype: 0,\n deltaAngles: { x: 0, y: 0, z: 0 },\n health: 100,\n armor: 0,\n ammo: 0,\n blend: [0, 0, 0, 0],\n damageAlpha: 0,\n damageIndicators: [],\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n pm_time: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n pm_flags: 0,\n pm_type: 0,\n ...overrides,\n});\n\n// -- Entity Factories --\n\nexport function createEntityFactory(overrides: Partial<Entity> = {}): Entity {\n const ent = new Entity(1);\n Object.assign(ent, {\n classname: 'info_null',\n health: 0,\n max_health: 0,\n takedamage: false,\n deadflag: DeadFlag.Alive,\n solid: Solid.Not,\n movetype: MoveType.None,\n flags: 0,\n svflags: 0,\n ...overrides\n });\n return ent;\n}\n\nexport function createPlayerEntityFactory(overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname: 'player',\n health: 100,\n max_health: 100,\n takedamage: true,\n solid: Solid.BoundingBox,\n movetype: MoveType.Walk,\n svflags: ServerFlags.Player,\n viewheight: 22,\n ...overrides\n });\n}\n\nexport function createMonsterEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n health: 100,\n max_health: 100,\n takedamage: true,\n solid: Solid.BoundingBox,\n movetype: MoveType.Step,\n svflags: ServerFlags.Monster,\n deadflag: DeadFlag.Alive,\n ...overrides\n });\n}\n\nexport function createItemEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n solid: Solid.Trigger,\n movetype: MoveType.Toss,\n ...overrides\n });\n}\n\nexport function createProjectileEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n solid: Solid.Bsp,\n movetype: MoveType.FlyMissile,\n svflags: ServerFlags.Projectile,\n ...overrides\n });\n}\n\nexport function createTriggerEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n solid: Solid.Trigger,\n movetype: MoveType.None,\n ...overrides\n });\n}\n","import { vi, type Mock } from 'vitest';\nimport { Entity, SpawnRegistry, ScriptHookRegistry, type SpawnContext, type EntitySystem } from '@quake2ts/game';\nimport { createRandomGenerator, type Vec3 } from '@quake2ts/shared';\n\n// Re-export generic helpers from shared\nexport { intersects, stairTrace, ladderTrace } from '@quake2ts/shared';\n\n// -- Types --\n\nexport interface MockEngine {\n sound: Mock<[Entity, number, string, number, number, number], void>;\n soundIndex: Mock<[string], number>;\n modelIndex: Mock<[string], number>;\n centerprintf: Mock<[Entity, string], void>;\n}\n\nexport interface MockGame {\n random: ReturnType<typeof createRandomGenerator>;\n registerEntitySpawn: Mock<[string, (entity: Entity) => void], void>;\n unregisterEntitySpawn: Mock<[string], void>;\n getCustomEntities: Mock<[], string[]>;\n hooks: ScriptHookRegistry;\n registerHooks: Mock<[any], any>;\n spawnWorld: Mock<[], void>;\n clientBegin: Mock<[any], void>;\n damage: Mock<[number], void>;\n}\n\nexport interface TestContext extends SpawnContext {\n entities: EntitySystem;\n game: MockGame;\n engine: MockEngine;\n}\n\n// -- Factories --\n\nexport const createMockEngine = (): MockEngine => ({\n sound: vi.fn(),\n soundIndex: vi.fn((sound: string) => 0),\n modelIndex: vi.fn((model: string) => 0),\n centerprintf: vi.fn(),\n});\n\nexport const createMockGame = (seed: number = 12345): { game: MockGame, spawnRegistry: SpawnRegistry } => {\n const spawnRegistry = new SpawnRegistry();\n const hooks = new ScriptHookRegistry();\n\n const game: MockGame = {\n random: createRandomGenerator({ seed }),\n registerEntitySpawn: vi.fn((classname: string, spawnFunc: (entity: Entity) => void) => {\n spawnRegistry.register(classname, (entity) => spawnFunc(entity));\n }),\n unregisterEntitySpawn: vi.fn((classname: string) => {\n spawnRegistry.unregister(classname);\n }),\n getCustomEntities: vi.fn(() => Array.from(spawnRegistry.keys())),\n hooks,\n registerHooks: vi.fn((newHooks) => hooks.register(newHooks)),\n spawnWorld: vi.fn(() => {\n hooks.onMapLoad('q2dm1');\n }),\n clientBegin: vi.fn((client) => {\n hooks.onPlayerSpawn({} as any);\n }),\n damage: vi.fn((amount: number) => {\n hooks.onDamage({} as any, null, null, amount, 0, 0);\n })\n };\n\n return { game, spawnRegistry };\n};\n\nexport function createTestContext(options?: { seed?: number, initialEntities?: Entity[] }): TestContext {\n const engine = createMockEngine();\n const seed = options?.seed ?? 12345;\n const { game, spawnRegistry } = createMockGame(seed);\n\n const traceFn = vi.fn((start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3) => ({\n fraction: 1.0,\n ent: null,\n allsolid: false,\n startsolid: false,\n endpos: end,\n plane: { normal: { x: 0, y: 0, z: 1 }, dist: 0 },\n surfaceFlags: 0,\n contents: 0\n }));\n\n const entityList: Entity[] = options?.initialEntities ? [...options.initialEntities] : [];\n\n // Create hooks helper that interacts with the entity list\n const hooks = game.hooks;\n\n const entities = {\n spawn: vi.fn(() => {\n const ent = new Entity(entityList.length + 1);\n entityList.push(ent);\n hooks.onEntitySpawn(ent);\n return ent;\n }),\n free: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n hooks.onEntityRemove(ent);\n }),\n finalizeSpawn: vi.fn(),\n freeImmediate: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n }),\n setSpawnRegistry: vi.fn(),\n timeSeconds: 10,\n deltaSeconds: 0.1,\n modelIndex: vi.fn(() => 0),\n scheduleThink: vi.fn((entity: Entity, time: number) => {\n entity.nextthink = time;\n }),\n linkentity: vi.fn(),\n trace: traceFn,\n pointcontents: vi.fn(() => 0),\n multicast: vi.fn(),\n unicast: vi.fn(),\n engine,\n game,\n sound: vi.fn((ent: Entity, chan: number, sound: string, vol: number, attn: number, timeofs: number) => {\n engine.sound(ent, chan, sound, vol, attn, timeofs);\n }),\n soundIndex: vi.fn((sound: string) => engine.soundIndex(sound)),\n useTargets: vi.fn((entity: Entity, activator: Entity | null) => {\n }),\n findByTargetName: vi.fn(() => []),\n pickTarget: vi.fn(() => null),\n killBox: vi.fn(),\n rng: createRandomGenerator({ seed }),\n imports: {\n configstring: vi.fn(),\n trace: traceFn,\n pointcontents: vi.fn(() => 0),\n },\n level: {\n intermission_angle: { x: 0, y: 0, z: 0 },\n intermission_origin: { x: 0, y: 0, z: 0 },\n next_auto_save: 0,\n health_bar_entities: null\n },\n targetNameIndex: new Map(),\n forEachEntity: vi.fn((callback: (ent: Entity) => void) => {\n entityList.forEach(callback);\n }),\n find: vi.fn((predicate: (ent: Entity) => boolean) => {\n return entityList.find(predicate);\n }),\n findByClassname: vi.fn((classname: string) => {\n return entityList.find(e => e.classname === classname);\n }),\n beginFrame: vi.fn((timeSeconds: number) => {\n (entities as any).timeSeconds = timeSeconds;\n }),\n targetAwareness: {\n timeSeconds: 10,\n frameNumber: 1,\n sightEntity: null,\n soundEntity: null,\n },\n // Adding missing properties to satisfy EntitySystem interface partially or fully\n // We cast to unknown first anyway, but filling these in makes it safer for consumers\n skill: 1,\n deathmatch: false,\n coop: false,\n activeCount: entityList.length,\n world: entityList.find(e => e.classname === 'worldspawn') || new Entity(0),\n // ... other EntitySystem properties would go here\n } as unknown as EntitySystem;\n\n return {\n keyValues: {},\n entities,\n game,\n engine,\n health_multiplier: 1,\n warn: vi.fn(),\n free: vi.fn(),\n // Mock precache functions if they are part of SpawnContext in future or TestContext extensions\n precacheModel: vi.fn(),\n precacheSound: vi.fn(),\n precacheImage: vi.fn(),\n } as unknown as TestContext;\n}\n\nexport function createSpawnTestContext(mapName?: string): TestContext {\n const ctx = createTestContext();\n // Simulate map load if needed\n if (mapName) {\n ctx.game.spawnWorld();\n }\n return ctx;\n}\n\nexport function createCombatTestContext(): TestContext {\n return createTestContext();\n}\n\nexport function createPhysicsTestContext(): TestContext {\n return createTestContext();\n}\n\nexport function createEntity(): Entity {\n return new Entity(1);\n}\n","import { vi, type Mock } from 'vitest';\nimport { Entity, EntitySystem, MonsterMove, MonsterAction, AIAction } from '@quake2ts/game';\n\nexport interface MockAI {\n checkAttack: Mock;\n findTarget: Mock;\n visible: Mock;\n infront: Mock;\n}\n\nexport interface MockMonsterAI {\n stand: Mock;\n walk: Mock;\n run: Mock;\n dodge: Mock;\n attack: Mock;\n melee: Mock;\n sight: Mock;\n idle: Mock;\n}\n\nexport function createMockAI(overrides: Partial<MockAI> = {}): MockAI {\n return {\n checkAttack: vi.fn(() => false),\n findTarget: vi.fn(() => null),\n visible: vi.fn(() => true),\n infront: vi.fn(() => true),\n ...overrides\n };\n}\n\nexport function createMockMonsterAI(overrides: Partial<MockMonsterAI> = {}): MockMonsterAI {\n return {\n stand: vi.fn(),\n walk: vi.fn(),\n run: vi.fn(),\n dodge: vi.fn(),\n attack: vi.fn(),\n melee: vi.fn(),\n sight: vi.fn(),\n idle: vi.fn(),\n ...overrides\n };\n}\n\nexport function createMockMonsterMove(\n first: number,\n last: number,\n think: (self: Entity, context: EntitySystem) => void,\n action: (self: Entity, dist: number, context: EntitySystem) => void\n): MonsterMove {\n const frames = [];\n for (let i = first; i <= last; i++) {\n frames.push({\n ai: action,\n dist: 0,\n think: think\n });\n }\n\n return {\n firstframe: first,\n lastframe: last,\n frames,\n endfunc: null\n };\n}\n","import { vi, type Mock } from 'vitest';\nimport { DamageMod, Entity, EntitySystem, WeaponState } from '@quake2ts/game';\n\nexport interface MockDamageInfo {\n damage: number;\n mod: DamageMod;\n knockback: number;\n attacker: Entity | null;\n inflictor: Entity | null;\n dir: { x: number, y: number, z: number } | null;\n point: { x: number, y: number, z: number } | null;\n}\n\nexport function createMockDamageInfo(overrides: Partial<MockDamageInfo> = {}): MockDamageInfo {\n return {\n damage: 10,\n mod: DamageMod.UNKNOWN,\n knockback: 0,\n attacker: null,\n inflictor: null,\n dir: null,\n point: null,\n ...overrides\n };\n}\n\nconst WEAPON_NAMES: Record<string, string> = {\n 'weapon_blaster': 'Blaster',\n 'weapon_shotgun': 'Shotgun',\n 'weapon_supershotgun': 'Super Shotgun',\n 'weapon_machinegun': 'Machinegun',\n 'weapon_chaingun': 'Chaingun',\n 'weapon_grenadelauncher': 'Grenade Launcher',\n 'weapon_rocketlauncher': 'Rocket Launcher',\n 'weapon_hyperblaster': 'HyperBlaster',\n 'weapon_railgun': 'Railgun',\n 'weapon_bfg': 'BFG10K',\n};\n\nexport function createMockWeapon(name: string = 'Mock Weapon') {\n const displayName = WEAPON_NAMES[name] || name;\n return {\n name: displayName,\n ammoType: 'bullets',\n ammoUse: 1,\n selection: vi.fn(),\n think: vi.fn(),\n command: vi.fn(),\n };\n}\n\nexport const mockMonsterAttacks = {\n fireBlaster: vi.fn(),\n fireRocket: vi.fn(),\n fireGrenade: vi.fn(),\n fireHeat: vi.fn(),\n fireBullet: vi.fn(),\n fireShotgun: vi.fn(),\n fireRailgun: vi.fn(),\n fireBFG: vi.fn(),\n};\n","import {\n type PlayerInventory,\n createPlayerInventory,\n WeaponId,\n PowerupId,\n KeyId,\n createAmmoInventory\n} from '@quake2ts/game';\nimport {\n type BaseItem,\n type WeaponItem,\n type HealthItem,\n type ArmorItem,\n type PowerupItem,\n type PowerArmorItem,\n type KeyItem,\n type FlagItem,\n WEAPON_ITEMS,\n HEALTH_ITEMS,\n ARMOR_ITEMS,\n POWERUP_ITEMS,\n POWER_ARMOR_ITEMS,\n KEY_ITEMS,\n FLAG_ITEMS,\n getAmmoItemDefinition,\n AmmoItemId\n} from '@quake2ts/game';\n// import { getAmmoItemDefinition, AmmoItemId } from '@quake2ts/game/src/inventory/ammo.js';\n\n/**\n * Creates a mock player inventory with default values suitable for testing.\n * Can be customized with overrides.\n */\nexport function createMockInventory(overrides: Partial<PlayerInventory> = {}): PlayerInventory {\n const defaultInventory = createPlayerInventory();\n\n // Merge simple properties\n const inventory: PlayerInventory = {\n ...defaultInventory,\n ...overrides\n };\n\n // If overrides.ammo is provided (as a full object), it replaces the default.\n // We don't merge deeper here because the caller usually provides a complete mock\n // or is happy with the default structure.\n\n return inventory;\n}\n\n/**\n * Generic factory for any item type.\n * Attempts to find a predefined item by ID first, then applies overrides.\n */\nexport function createMockItem(id: string, overrides: Partial<BaseItem> = {}): BaseItem {\n let base: BaseItem | undefined;\n\n // Search in all registries\n base = WEAPON_ITEMS[id] ||\n HEALTH_ITEMS[id] ||\n ARMOR_ITEMS[id] ||\n POWERUP_ITEMS[id] ||\n POWER_ARMOR_ITEMS[id] ||\n KEY_ITEMS[id] ||\n FLAG_ITEMS[id];\n\n if (!base) {\n // If not found, create a generic minimal item\n base = {\n id,\n name: `Mock Item ${id}`\n };\n }\n\n return {\n ...base,\n ...overrides\n };\n}\n\n/**\n * Creates a mock WeaponItem\n */\nexport function createMockWeaponItem(weaponId: WeaponId, overrides: Partial<WeaponItem> = {}): WeaponItem {\n // Find the item definition for this weaponId\n const found = Object.values(WEAPON_ITEMS).find(w => w.weaponId === weaponId);\n\n const base: WeaponItem = found ? { ...found } : {\n type: 'weapon',\n id: `weapon_${weaponId}`,\n name: `Mock Weapon ${weaponId}`,\n weaponId,\n ammoType: null,\n initialAmmo: 0,\n pickupAmmo: 0,\n fireRate: 1\n };\n\n return { ...base, ...overrides };\n}\n\n/**\n * Creates a mock HealthItem\n */\nexport function createMockHealthItem(amount: number, overrides: Partial<HealthItem> = {}): HealthItem {\n return {\n type: 'health',\n id: 'item_health_mock',\n name: 'Mock Health',\n amount,\n max: 100,\n ...overrides\n };\n}\n\n/**\n * Creates a mock ArmorItem\n */\nexport function createMockArmorItem(amount: number, overrides: Partial<ArmorItem> = {}): ArmorItem {\n return {\n type: 'armor',\n id: 'item_armor_mock',\n name: 'Mock Armor',\n amount,\n ...overrides\n };\n}\n\n/**\n * Creates a mock AmmoItem\n */\nexport function createMockAmmoItem(ammoItemId: AmmoItemId, overrides: Partial<BaseItem> = {}): BaseItem {\n const def = getAmmoItemDefinition(ammoItemId);\n if (!def) {\n throw new Error(`Unknown ammo item id: ${ammoItemId}`);\n }\n\n const base: BaseItem = {\n id: def.id,\n name: `Mock Ammo ${def.id}`\n };\n\n return {\n ...base,\n ...overrides\n };\n}\n\n\n/**\n * Creates a mock PowerupItem\n */\nexport function createMockPowerupItem(id: string, duration: number, overrides: Partial<PowerupItem> = {}): PowerupItem {\n const found = POWERUP_ITEMS[id];\n const base: PowerupItem = found ? { ...found } : {\n type: 'powerup',\n id,\n name: `Mock Powerup ${id}`,\n timer: duration\n };\n\n if (duration !== undefined && !found) {\n base.timer = duration;\n }\n\n return { ...base, ...overrides };\n}\n","import { Entity, GameExports, GameImports } from '@quake2ts/game';\nimport { vi } from 'vitest';\n\nexport interface GameState {\n levelName: string;\n time: number;\n entities: Entity[];\n clients: any[]; // Mock client objects\n}\n\n/**\n * Creates a mock game state object.\n * @param overrides Optional overrides for the game state.\n */\nexport function createMockGameState(overrides?: Partial<GameState>): GameState {\n return {\n levelName: 'test_level',\n time: 0,\n entities: [],\n clients: [],\n ...overrides\n };\n}\n\n/**\n * Creates a mock GameExports object.\n */\nexport function createMockGameExports(overrides?: Partial<GameExports>): GameExports {\n return {\n init: vi.fn(),\n shutdown: vi.fn(),\n spawnWorld: vi.fn(),\n frame: vi.fn().mockReturnValue({ state: {} }),\n clientConnect: vi.fn().mockReturnValue(true),\n clientBegin: vi.fn().mockReturnValue({ index: 1, origin: { x: 0, y: 0, z: 0 } }),\n clientDisconnect: vi.fn(),\n clientThink: vi.fn(),\n // clientUserInfoChanged is not in GameExports\n // clientCommand is not in GameExports (it's serverCommand?) No, clientCommand might be missing from interface but present in impl or legacy.\n // Checking GameExports interface in src/index.ts:\n /*\n clientConnect(ent: Entity | null, userInfo: string): string | true;\n clientBegin(client: PlayerClient): Entity;\n clientDisconnect(ent: Entity): void;\n clientThink(ent: Entity, cmd: UserCommand): void;\n respawn(ent: Entity): void;\n ...\n configstring(index: number, value: string): void;\n serverCommand(cmd: string): void;\n */\n respawn: vi.fn(),\n entities: {\n getByIndex: vi.fn(),\n forEachEntity: vi.fn(),\n findByRadius: vi.fn(),\n find: vi.fn(),\n checkAnyCollision: vi.fn(),\n trace: vi.fn(),\n pointcontents: vi.fn(),\n link: vi.fn(), // linkentity mapped to link in EntitySystem? No, linkentity in imports, link/unlink in System.\n unlink: vi.fn(),\n spawn: vi.fn(),\n free: vi.fn(),\n activeCount: 0,\n world: { classname: 'worldspawn' } as any,\n } as any,\n multicast: vi.fn(),\n unicast: vi.fn(),\n configstring: vi.fn(),\n serverCommand: vi.fn(),\n sound: vi.fn(),\n soundIndex: vi.fn(),\n centerprintf: vi.fn(),\n trace: vi.fn(),\n time: 0,\n deathmatch: false,\n skill: 1,\n rogue: false,\n xatrix: false,\n coop: false,\n friendlyFire: false,\n random: {\n next: vi.fn(),\n nextFloat: vi.fn(),\n range: vi.fn(),\n crandom: vi.fn(),\n getState: vi.fn(),\n setState: vi.fn()\n } as any,\n createSave: vi.fn(),\n loadSave: vi.fn(),\n serialize: vi.fn(),\n loadState: vi.fn(),\n setGodMode: vi.fn(),\n setNoclip: vi.fn(),\n setNotarget: vi.fn(),\n giveItem: vi.fn(),\n damage: vi.fn(),\n teleport: vi.fn(),\n registerHooks: vi.fn(),\n hooks: {\n onMapLoad: vi.fn(),\n onMapUnload: vi.fn(),\n onPlayerSpawn: vi.fn(),\n onPlayerDeath: vi.fn(),\n register: vi.fn()\n } as any,\n setSpectator: vi.fn(),\n registerEntitySpawn: vi.fn(),\n unregisterEntitySpawn: vi.fn(),\n getCustomEntities: vi.fn(),\n ...overrides\n };\n}\n","import { NetworkTransport } from '@quake2ts/server';\nimport { NetDriver } from '@quake2ts/shared';\nimport { vi } from 'vitest';\n\n/**\n * Mock implementation of the NetworkTransport interface for server testing.\n * Allows simulating connections and errors.\n */\nexport class MockTransport implements NetworkTransport {\n public onConnectionCallback?: (driver: NetDriver, info?: any) => void;\n public onErrorCallback?: (error: Error) => void;\n public address: string = '127.0.0.1';\n public port: number = 27910;\n public sentMessages: Uint8Array[] = [];\n public receivedMessages: Uint8Array[] = [];\n public listening: boolean = false;\n\n public listenSpy = vi.fn().mockImplementation(async (port: number) => {\n this.port = port;\n this.listening = true;\n });\n public closeSpy = vi.fn().mockImplementation(() => {\n this.listening = false;\n });\n\n /**\n * Start listening on the specified port.\n */\n async listen(port: number): Promise<void> {\n return this.listenSpy(port);\n }\n\n /**\n * Close the transport.\n */\n close() {\n this.closeSpy();\n }\n\n /**\n * Register a callback for new connections.\n */\n onConnection(callback: (driver: NetDriver, info?: any) => void) {\n this.onConnectionCallback = callback;\n }\n\n /**\n * Register a callback for errors.\n */\n onError(callback: (error: Error) => void) {\n this.onErrorCallback = callback;\n }\n\n /**\n * Check if the transport is currently listening.\n */\n public isListening(): boolean {\n return this.listening;\n }\n\n /**\n * Helper to simulate a new connection.\n * @param driver The network driver for the connection.\n * @param info Optional connection info.\n */\n public simulateConnection(driver: NetDriver, info?: any) {\n if (this.onConnectionCallback) {\n this.onConnectionCallback(driver, info);\n }\n }\n\n /**\n * Helper to simulate an error.\n * @param error The error to simulate.\n */\n public simulateError(error: Error) {\n if (this.onErrorCallback) {\n this.onErrorCallback(error);\n }\n }\n}\n\n/**\n * Interface for mock UDP socket.\n * This is a partial mock of Node.js dgram.Socket or similar.\n */\nexport interface MockUDPSocket {\n send: (msg: Uint8Array, offset: number, length: number, port: number, address: string, callback?: (error: Error | null, bytes: number) => void) => void;\n on: (event: string, callback: (...args: any[]) => void) => void;\n close: () => void;\n bind: (port: number, address?: string) => void;\n address: () => { address: string; family: string; port: number };\n}\n\n/**\n * Creates a mock UDP socket.\n * @param overrides Optional overrides for the socket methods.\n */\nexport function createMockUDPSocket(overrides?: Partial<MockUDPSocket>): MockUDPSocket {\n const socket: MockUDPSocket = {\n send: vi.fn(),\n on: vi.fn(),\n close: vi.fn(),\n bind: vi.fn(),\n address: vi.fn().mockReturnValue({ address: '127.0.0.1', family: 'IPv4', port: 0 }),\n ...overrides,\n };\n return socket;\n}\n\n/**\n * Interface for network address.\n */\nexport interface NetworkAddress {\n ip: string;\n port: number;\n}\n\n/**\n * Creates a mock network address.\n * @param ip IP address (default: '127.0.0.1')\n * @param port Port number (default: 27910)\n */\nexport function createMockNetworkAddress(ip: string = '127.0.0.1', port: number = 27910): NetworkAddress {\n return { ip, port };\n}\n\n/**\n * Creates a configured MockTransport instance.\n * @param address Address to bind to (default: '127.0.0.1')\n * @param port Port to listen on (default: 27910)\n * @param overrides Optional overrides for the transport properties.\n */\nexport function createMockTransport(\n address: string = '127.0.0.1',\n port: number = 27910,\n overrides?: Partial<MockTransport>\n): MockTransport {\n const transport = new MockTransport();\n transport.address = address;\n transport.port = port;\n Object.assign(transport, overrides);\n return transport;\n}\n\n/**\n * Creates a mock NetDriver instance.\n * @param overrides Optional overrides for the NetDriver methods.\n */\nexport function createMockNetDriver(overrides?: Partial<NetDriver>): NetDriver {\n return {\n connect: vi.fn().mockResolvedValue(undefined),\n disconnect: vi.fn(),\n send: vi.fn(),\n onMessage: vi.fn(),\n onClose: vi.fn(),\n onError: vi.fn(),\n isConnected: vi.fn().mockReturnValue(true),\n ...overrides\n };\n}\n","import { Server, ServerState, ServerStatic, Client, ClientState } from '@quake2ts/server';\nimport { NetDriver, MAX_CONFIGSTRINGS, MAX_EDICTS, EntityState } from '@quake2ts/shared';\nimport { Entity } from '@quake2ts/game';\nimport { vi } from 'vitest';\nimport { createMockNetDriver } from './transport.js';\n\n/**\n * Creates a mock server state object.\n * @param overrides Optional overrides for the server state.\n */\nexport function createMockServerState(overrides?: Partial<Server>): Server {\n return {\n state: ServerState.Game,\n attractLoop: false,\n loadGame: false,\n startTime: Date.now(),\n time: 0,\n frame: 0,\n name: 'test_map',\n collisionModel: null,\n configStrings: new Array(MAX_CONFIGSTRINGS).fill(''),\n baselines: new Array(MAX_EDICTS).fill(null),\n multicastBuf: new Uint8Array(0),\n ...overrides\n };\n}\n\n/**\n * Creates a mock server static object.\n * @param maxClients Maximum number of clients.\n * @param overrides Optional overrides for the server static state.\n */\nexport function createMockServerStatic(maxClients: number = 16, overrides?: Partial<ServerStatic>): ServerStatic {\n return {\n initialized: true,\n realTime: Date.now(),\n mapCmd: '',\n spawnCount: 1,\n clients: new Array(maxClients).fill(null),\n lastHeartbeat: 0,\n challenges: [],\n ...overrides\n };\n}\n\n/**\n * Creates a mock server client.\n * @param clientNum The client index.\n * @param overrides Optional overrides for the client.\n */\nexport function createMockServerClient(clientNum: number, overrides?: Partial<Client>): Client {\n // Create a minimal mock net driver\n const mockNet: NetDriver = createMockNetDriver();\n\n return {\n index: clientNum,\n state: ClientState.Connected,\n edict: { index: clientNum + 1 } as Entity,\n net: mockNet,\n netchan: {\n qport: 0,\n remoteAddress: '127.0.0.1',\n incomingSequence: 0,\n outgoingSequence: 0,\n lastReceived: 0,\n process: vi.fn(),\n transmit: vi.fn(),\n writeReliableByte: vi.fn(),\n writeReliableShort: vi.fn(),\n writeReliableLong: vi.fn(),\n writeReliableString: vi.fn(),\n writeReliableData: vi.fn(),\n } as any, // Cast as any because NetChan might be complex to fully mock here\n userInfo: '',\n lastMessage: 0,\n lastCommandTime: 0,\n commandCount: 0,\n messageQueue: [],\n frames: [],\n lastFrame: 0,\n lastPacketEntities: [],\n challenge: 0,\n lastConnect: 0,\n ping: 0,\n rate: 0,\n name: `Client${clientNum}`,\n messageLevel: 0,\n datagram: new Uint8Array(0),\n downloadSize: 0,\n downloadCount: 0,\n commandMsec: 0,\n frameLatency: [],\n messageSize: [],\n suppressCount: 0,\n commandQueue: [],\n lastCmd: {\n msec: 0,\n buttons: 0,\n angles: { x: 0, y: 0, z: 0 },\n forwardmove: 0,\n sidemove: 0,\n upmove: 0,\n sequence: 0,\n lightlevel: 0,\n impulse: 0,\n serverFrame: 0\n },\n ...overrides\n };\n}\n\n/**\n * Mock interface for the Server class (DedicatedServer).\n * This allows mocking the server instance itself.\n */\nexport interface MockServer {\n start(mapName: string): Promise<void>;\n stop(): void;\n // tick(): void; // runFrame is private in DedicatedServer, usually we simulate via game.frame\n multicast(origin: any, type: any, event: any, ...args: any[]): void;\n unicast(ent: Entity, reliable: boolean, event: any, ...args: any[]): void;\n configstring(index: number, value: string): void;\n kickPlayer(clientId: number): void;\n changeMap(mapName: string): Promise<void>;\n}\n\n/**\n * Creates a mock server instance.\n * @param overrides Optional overrides for server methods.\n */\nexport function createMockServer(overrides?: Partial<MockServer>): MockServer {\n return {\n start: vi.fn().mockResolvedValue(undefined),\n stop: vi.fn(),\n multicast: vi.fn(),\n unicast: vi.fn(),\n configstring: vi.fn(),\n kickPlayer: vi.fn(),\n changeMap: vi.fn().mockResolvedValue(undefined),\n ...overrides\n };\n}\n","import { Client, ClientState } from '@quake2ts/server';\nimport { createMockServerClient } from './state.js';\n\n/**\n * Interface representing connection state for testing.\n */\nexport interface Connection {\n state: ClientState;\n address: string;\n challenge: number;\n userInfo: UserInfo;\n}\n\n/**\n * Stages of the client connection handshake.\n */\nexport enum HandshakeStage {\n None = 0,\n Challenge = 1,\n Connect = 2,\n Info = 3,\n Active = 4\n}\n\n/**\n * Interface representing a handshake state.\n */\nexport interface Handshake {\n stage: HandshakeStage;\n clientNum: number;\n challenge: number;\n qport: number;\n}\n\n/**\n * Interface for UserInfo structure.\n */\nexport interface UserInfo {\n name: string;\n skin: string;\n model: string;\n fov: number;\n hand: number;\n rate: number;\n msg: number;\n spectator?: number;\n [key: string]: string | number | undefined;\n}\n\n/**\n * Helper to serialize UserInfo to Quake 2 info string format.\n * Format: \\key\\value\\key2\\value2\n */\nexport function serializeUserInfo(info: UserInfo): string {\n return Object.entries(info).reduce((acc, [key, value]) => {\n if (value !== undefined) {\n return `${acc}\\\\${key}\\\\${value}`;\n }\n return acc;\n }, '');\n}\n\n/**\n * Creates a mock UserInfo object.\n * @param overrides Optional overrides for the user info.\n */\nexport function createMockUserInfo(overrides?: Partial<UserInfo>): UserInfo {\n return {\n name: 'Player',\n skin: 'male/grunt',\n model: 'male/grunt',\n fov: 90,\n hand: 0,\n rate: 25000,\n msg: 1,\n ...overrides\n };\n}\n\n/**\n * Creates a mock connection object (Client) with specific state.\n * @param state The client state (default: Connected).\n * @param overrides Optional overrides for the client.\n */\nexport function createMockConnection(state: ClientState = ClientState.Connected, overrides?: Partial<Client>): Client {\n return createMockServerClient(0, {\n state,\n userInfo: serializeUserInfo(createMockUserInfo()),\n challenge: Math.floor(Math.random() * 100000),\n ...overrides\n });\n}\n\n/**\n * Creates a mock handshake object.\n * @param stage The stage of the handshake (default: None).\n */\nexport function createMockHandshake(stage: HandshakeStage = HandshakeStage.None): Handshake {\n return {\n stage,\n clientNum: -1,\n challenge: 0,\n qport: Math.floor(Math.random() * 65536)\n };\n}\n\n/**\n * Simulates a handshake between a mock client and server.\n * Note: This is a high-level simulation helper.\n * @param client The mock client connection.\n * @param server The mock server instance.\n * @returns Promise that resolves to true if handshake succeeded.\n */\nexport async function simulateHandshake(client: Client, server: any): Promise<boolean> {\n // 1. Get Challenge\n // In a real scenario, client sends getchallenge, server responds with challenge\n const challenge = Math.floor(Math.random() * 100000);\n client.challenge = challenge;\n\n // 2. Connect\n // Client sends connect command with qport, challenge, userinfo\n // Server assigns client slot\n if (server && server.clients) {\n // rudimentary check if server has space\n }\n\n // 3. Update state to Connected\n client.state = ClientState.Connected;\n\n // 4. Send configstrings (usually handled by server)\n\n // 5. Client enters game (prespawn)\n // Server sends stuff\n\n // 6. Client ready\n client.state = ClientState.Active;\n\n return true;\n}\n","import { vi } from 'vitest';\nimport { ServerCommand } from '@quake2ts/shared';\n\n/**\n * Interface for a mocked server console that can execute commands.\n * Reference: quake2/server/sv_main.c (SV_ExecuteUserCommand)\n */\nexport interface MockServerConsole {\n exec(cmd: string): string;\n print(text: string): void;\n broadcast(text: string): void;\n commandBuffer: string[];\n outputBuffer: string[];\n}\n\n/**\n * Creates a mock server console.\n * @param overrides Optional overrides for the mock console.\n */\nexport function createMockServerConsole(overrides?: Partial<MockServerConsole>): MockServerConsole {\n const outputBuffer: string[] = [];\n const commandBuffer: string[] = [];\n\n return {\n exec: vi.fn((cmd: string) => {\n commandBuffer.push(cmd);\n return `Executed: ${cmd}`;\n }),\n print: vi.fn((text: string) => {\n outputBuffer.push(text);\n }),\n broadcast: vi.fn((text: string) => {\n outputBuffer.push(`Broadcast: ${text}`);\n }),\n commandBuffer,\n outputBuffer,\n ...overrides\n };\n}\n\n/**\n * Interface for a mocked RCON client.\n * Reference: quake2/server/sv_user.c (SV_ExecuteUserCommand for RCON handling)\n */\nexport interface MockRConClient {\n connect(address: string, port: number, password?: string): Promise<boolean>;\n sendCommand(cmd: string): Promise<string>;\n disconnect(): void;\n connected: boolean;\n lastCommand: string;\n lastResponse: string;\n}\n\n/**\n * Creates a mock RCON client.\n * @param password Optional password for the client to use.\n */\nexport function createMockRConClient(password: string = ''): MockRConClient {\n return {\n connected: false,\n lastCommand: '',\n lastResponse: '',\n connect: vi.fn(async (address, port, pwd) => {\n return pwd === password; // Simple mock: connect succeeds if password matches constructor password\n }),\n sendCommand: vi.fn(async (cmd) => {\n return `RCON Response for: ${cmd}`;\n }),\n disconnect: vi.fn(),\n };\n}\n\n/**\n * Simulates a command execution on the server.\n * @param server The mock server instance (assumed to have some command handling capability).\n * @param command The command string to execute.\n * @returns The output of the command.\n */\nexport function simulateServerCommand(server: any, command: string): string {\n // This assumes the server has a method to execute commands, or we simulate the effect.\n // In a real integration, this might interact with the server's command buffer.\n if (server.executeBuffer) {\n server.executeBuffer(command);\n return \"Executed\";\n }\n\n // Fallback for mocked servers\n if (server.exec) {\n return server.exec(command);\n }\n\n return \"Unknown command handler\";\n}\n","import { Client } from '@quake2ts/server';\n\nexport interface MasterServer {\n registerServer(info: ServerInfo): Promise<boolean>;\n heartbeat(serverAddress: string): Promise<boolean>;\n getServerList(filter?: ServerListFilter): Promise<ServerInfo[]>;\n}\n\nexport interface ServerInfo {\n address: string;\n name: string;\n map: string;\n players: number;\n maxPlayers: number;\n gametype: string;\n version: string;\n password?: boolean;\n}\n\nexport interface ServerListFilter {\n gametype?: string;\n map?: string;\n notEmpty?: boolean;\n notFull?: boolean;\n}\n\n/**\n * Creates a mock master server for testing server registration and browsing\n * @param overrides - Optional overrides for the master server behavior\n */\nexport function createMockMasterServer(overrides: Partial<MasterServer> = {}): MasterServer {\n const servers = new Map<string, ServerInfo>();\n\n return {\n registerServer: async (info: ServerInfo): Promise<boolean> => {\n servers.set(info.address, info);\n return true;\n },\n heartbeat: async (serverAddress: string): Promise<boolean> => {\n return servers.has(serverAddress);\n },\n getServerList: async (filter?: ServerListFilter): Promise<ServerInfo[]> => {\n let list = Array.from(servers.values());\n\n if (filter) {\n if (filter.gametype) {\n list = list.filter(s => s.gametype === filter.gametype);\n }\n if (filter.map) {\n list = list.filter(s => s.map === filter.map);\n }\n if (filter.notEmpty) {\n list = list.filter(s => s.players > 0);\n }\n if (filter.notFull) {\n list = list.filter(s => s.players < s.maxPlayers);\n }\n }\n\n return list;\n },\n ...overrides\n };\n}\n\n/**\n * Creates a mock server info object\n * @param overrides - Optional overrides\n */\nexport function createMockServerInfo(overrides: Partial<ServerInfo> = {}): ServerInfo {\n return {\n address: '127.0.0.1:27910',\n name: 'Quake 2 Test Server',\n map: 'q2dm1',\n players: 0,\n maxPlayers: 16,\n gametype: 'deathmatch',\n version: '1.0',\n ...overrides\n };\n}\n\n/**\n * Simulates the process of a game server registering with the master server\n * @param server - The mock game server instance (typed as any to accept mock)\n * @param master - The mock master server\n */\nexport async function simulateServerRegistration(server: any, master: MasterServer): Promise<boolean> {\n const info = createMockServerInfo({\n name: server.name || 'Test Server',\n map: server.mapName || 'q2dm1',\n players: server.clients ? server.clients.filter((c: Client | null) => c && c.state >= 2).length : 0,\n maxPlayers: server.maxClients || 16\n });\n\n return master.registerServer(info);\n}\n","import { vi } from 'vitest';\nimport { TraceResult } from '@quake2ts/shared';\n\n/**\n * Mock interface for CollisionEntityIndex.\n */\nexport interface MockCollisionEntityIndex {\n trace: (start: any, mins: any, maxs: any, end: any, passEntity: any, contentMask: number) => TraceResult;\n link: (entity: any) => void;\n unlink: (entity: any) => void;\n gatherTriggerTouches: (entity: any) => any[];\n}\n\n/**\n * Creates a mock CollisionEntityIndex.\n * @param overrides Optional overrides for the mock methods.\n */\nexport function createMockCollisionEntityIndex(overrides?: Partial<MockCollisionEntityIndex>): MockCollisionEntityIndex {\n return {\n trace: vi.fn().mockReturnValue({\n fraction: 1.0,\n allsolid: false,\n startsolid: false,\n endpos: { x: 0, y: 0, z: 0 },\n entityId: null\n }),\n link: vi.fn(),\n unlink: vi.fn(),\n gatherTriggerTouches: vi.fn().mockReturnValue([]),\n ...overrides\n };\n}\n","import { Server, Client, ClientState, ServerState, ServerStatic } from '@quake2ts/server';\nimport { Entity } from '@quake2ts/game';\nimport { UserCommand } from '@quake2ts/shared';\nimport { createMockServerState } from '../mocks/state.js';\nimport { createMockServerClient } from '../mocks/state.js';\nimport { createMockUserInfo, serializeUserInfo, UserInfo } from '../mocks/connection.js';\n\n// Define a type that combines Server and ServerStatic for convenience in tests\n// since the real server implementation splits these but tests often need both.\nexport type MockServerContext = Server & {\n clients: (Client | null)[];\n entities?: Entity[];\n};\n\nexport interface MultiplayerScenario {\n server: MockServerContext;\n clients: Client[];\n entities: Entity[];\n}\n\n/**\n * Creates a multiplayer test scenario with a mock server and a number of clients.\n * @param numPlayers Number of players to simulate.\n */\nexport function createMultiplayerTestScenario(numPlayers: number = 2): MultiplayerScenario {\n const baseServer = createMockServerState();\n const clients: Client[] = [];\n const entities: Entity[] = [];\n\n const server: MockServerContext = {\n ...baseServer,\n clients: new Array(numPlayers).fill(null),\n entities: []\n };\n\n for (let i = 0; i < numPlayers; i++) {\n // Create client\n const client = createMockServerClient(i, {\n state: ClientState.Active,\n userInfo: serializeUserInfo(createMockUserInfo({ name: `Player${i}` }))\n });\n\n // Create player entity\n const entity = {\n classname: 'player',\n s: { origin: { x: 0, y: 0, z: 0 }, number: i + 1 },\n client: client\n } as unknown as Entity;\n\n client.edict = entity;\n server.clients[i] = client;\n clients.push(client);\n entities.push(entity);\n }\n\n // Assign entities to server\n server.entities = entities;\n\n return {\n server,\n clients,\n entities\n };\n}\n\n/**\n * Simulates a player joining the server.\n * @param server The mock server instance.\n * @param userInfo Optional user info overrides.\n */\nexport async function simulatePlayerJoin(server: MockServerContext, userInfo?: Partial<UserInfo>): Promise<Client> {\n // Find free client slot\n const index = server.clients.findIndex((c) => !c || c.state === ClientState.Free);\n if (index === -1) {\n throw new Error('Server full');\n }\n\n const client = createMockServerClient(index, {\n state: ClientState.Connected,\n userInfo: serializeUserInfo(createMockUserInfo(userInfo))\n });\n\n server.clients[index] = client;\n\n // Simulate connection process\n client.state = ClientState.Active;\n\n // Create entity\n const entity = {\n classname: 'player',\n s: { origin: { x: 0, y: 0, z: 0 }, number: index + 1 },\n client: client\n } as unknown as Entity;\n client.edict = entity;\n\n // Add to entities list if possible (mock behavior)\n if (server.entities && Array.isArray(server.entities)) {\n // This is a simplified view, normally entities are in a fixed array\n (server.entities as Entity[])[index + 1] = entity;\n }\n\n return client;\n}\n\n/**\n * Simulates a player leaving the server.\n * @param server The mock server instance.\n * @param clientNum The client number to disconnect.\n */\nexport function simulatePlayerLeave(server: MockServerContext, clientNum: number): void {\n const client = server.clients[clientNum];\n if (client) {\n client.state = ClientState.Free;\n client.edict = null;\n }\n}\n\n/**\n * Simulates a single server frame update.\n * @param server The mock server instance.\n * @param deltaTime Time step in seconds (default: 0.1).\n */\nexport function simulateServerTick(server: MockServerContext, deltaTime: number = 0.1): void {\n server.time += deltaTime;\n server.frame++;\n // In a real server, we would call RunFrame, Physics, etc.\n // For mocks, we might just update client lastCmd times\n\n server.clients.forEach((client: Client | null) => {\n if (client && client.state === ClientState.Active) {\n // Update client logic if needed\n }\n });\n}\n\n/**\n * Simulates player input for a specific client.\n * @param client The server client.\n * @param input The input command.\n */\nexport function simulatePlayerInput(client: Client, input: Partial<UserCommand>): void {\n const cmd: UserCommand = {\n msec: 100,\n buttons: 0,\n angles: { x: 0, y: 0, z: 0 },\n forwardmove: 0,\n sidemove: 0,\n upmove: 0,\n sequence: client.lastCmd.sequence + 1,\n lightlevel: 0,\n impulse: 0,\n ...input\n };\n\n client.lastCmd = cmd;\n client.commandQueue.push(cmd);\n client.commandCount++;\n}\n","import { Server } from '@quake2ts/server';\nimport { EntityState } from '@quake2ts/shared';\n\nexport interface Snapshot {\n serverTime: number;\n playerState: any; // Simplified PlayerState\n entities: EntityState[];\n}\n\nexport interface DeltaSnapshot {\n snapshot: Snapshot;\n deltaEntities: EntityState[];\n removedEntities: number[];\n}\n\nexport interface ConsistencyReport {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Creates a client-specific snapshot from the server state.\n * @param serverState The current server state.\n * @param clientNum The client number to generate snapshot for.\n */\nexport function createServerSnapshot(serverState: Server, clientNum: number): Snapshot {\n // Collect visible entities\n const visibleEntities: EntityState[] = [];\n\n // In a real implementation, this would use PVS/PHS\n // For mock, we just take all entities that have a model or are solid\n if (serverState.baselines) {\n serverState.baselines.forEach((ent: EntityState | null, index: number) => {\n if (ent && index !== clientNum + 1) { // Skip self in packet entities usually\n visibleEntities.push({ ...ent });\n }\n });\n }\n\n return {\n serverTime: serverState.time,\n playerState: {\n origin: { x: 0, y: 0, z: 0 },\n viewangles: { x: 0, y: 0, z: 0 },\n pm_type: 0\n },\n entities: visibleEntities\n };\n}\n\n/**\n * Calculates the delta between two snapshots.\n * @param oldSnapshot The baseline snapshot.\n * @param newSnapshot The current snapshot.\n */\nexport function createDeltaSnapshot(oldSnapshot: Snapshot, newSnapshot: Snapshot): DeltaSnapshot {\n const deltaEntities: EntityState[] = [];\n const removedEntities: number[] = [];\n\n const oldMap = new Map(oldSnapshot.entities.map(e => [e.number, e]));\n const newMap = new Map(newSnapshot.entities.map(e => [e.number, e]));\n\n // Find changed or new entities\n newSnapshot.entities.forEach(newEnt => {\n const oldEnt = oldMap.get(newEnt.number);\n if (!oldEnt) {\n // New entity\n deltaEntities.push(newEnt);\n } else if (JSON.stringify(newEnt) !== JSON.stringify(oldEnt)) {\n // Changed entity (simplified check)\n deltaEntities.push(newEnt);\n }\n });\n\n // Find removed entities\n oldSnapshot.entities.forEach(oldEnt => {\n if (!newMap.has(oldEnt.number)) {\n removedEntities.push(oldEnt.number);\n }\n });\n\n return {\n snapshot: newSnapshot,\n deltaEntities,\n removedEntities\n };\n}\n\n/**\n * Verifies the consistency of a sequence of snapshots.\n * @param snapshots Array of snapshots ordered by time.\n */\nexport function verifySnapshotConsistency(snapshots: Snapshot[]): ConsistencyReport {\n const report: ConsistencyReport = { valid: true, errors: [] };\n\n if (snapshots.length < 2) return report;\n\n for (let i = 1; i < snapshots.length; i++) {\n const prev = snapshots[i-1];\n const curr = snapshots[i];\n\n if (curr.serverTime <= prev.serverTime) {\n report.valid = false;\n report.errors.push(`Snapshot ${i} has time ${curr.serverTime} <= prev ${prev.serverTime}`);\n }\n }\n\n return report;\n}\n\n/**\n * Simulates network delivery of a snapshot with potential packet loss.\n * @param snapshot The snapshot to deliver.\n * @param reliability Probability of successful delivery (0.0 to 1.0).\n */\nexport async function simulateSnapshotDelivery(snapshot: Snapshot, reliability: number = 1.0): Promise<Snapshot | null> {\n if (Math.random() > reliability) {\n return null;\n }\n return snapshot;\n}\n","import { Client, ClientFrame } from '@quake2ts/server';\n\nexport interface RateLimiter {\n bytesPerSecond: number;\n allow(bytes: number): boolean;\n update(deltaSeconds: number): void;\n reset(): void;\n getUsage(): number;\n}\n\nexport interface Message {\n data: Uint8Array;\n size: number;\n timestamp: number;\n}\n\nexport interface BandwidthScenario {\n bandwidth: number;\n clients: Client[];\n duration: number;\n totalBytesSent: number;\n totalBytesReceived: number;\n droppedPackets: number;\n}\n\n/**\n * Creates a mock rate limiter for bandwidth testing\n * @param bytesPerSecond - Maximum bytes per second allowed\n */\nexport function createMockRateLimiter(bytesPerSecond: number): RateLimiter {\n let bucket = bytesPerSecond;\n const maxBucket = bytesPerSecond; // Max burst size equal to 1 second of bandwidth\n let usage = 0;\n\n return {\n bytesPerSecond,\n allow(bytes: number): boolean {\n if (bucket >= bytes) {\n bucket -= bytes;\n usage += bytes;\n return true;\n }\n return false;\n },\n update(deltaSeconds: number): void {\n bucket += bytesPerSecond * deltaSeconds;\n if (bucket > maxBucket) {\n bucket = maxBucket;\n }\n },\n reset(): void {\n bucket = maxBucket;\n usage = 0;\n },\n getUsage(): number {\n return usage;\n }\n };\n}\n\n/**\n * Simulates bandwidth limiting on a stream of messages\n * @param messages - Array of messages to process\n * @param bandwidth - Bandwidth limit in bytes per second\n * @returns Filtered array of messages that passed the bandwidth check\n */\nexport function simulateBandwidthLimit(messages: Message[], bandwidth: number): Message[] {\n const limiter = createMockRateLimiter(bandwidth);\n const result: Message[] = [];\n let lastTime = messages.length > 0 ? messages[0].timestamp : 0;\n\n for (const msg of messages) {\n const delta = (msg.timestamp - lastTime) / 1000;\n if (delta > 0) {\n limiter.update(delta);\n }\n lastTime = msg.timestamp;\n\n if (limiter.allow(msg.size)) {\n result.push(msg);\n }\n }\n\n return result;\n}\n\n/**\n * Calculates the size of a client snapshot in bytes\n * @param snapshot - The client frame snapshot\n */\nexport function measureSnapshotSize(snapshot: ClientFrame): number {\n let size = 0;\n\n // Area bits\n size += snapshot.areaBytes;\n\n // Player state (approximate based on struct size or serialization)\n // This is an estimation, as actual network serialization compresses this\n size += 200; // Baseline size for PlayerState\n\n // Entities\n // Each EntityState is approx 20-30 bytes compressed\n size += snapshot.entities.length * 20;\n\n return size;\n}\n\n/**\n * Creates a scenario for testing bandwidth limits with multiple clients\n * @param bandwidth - Bandwidth limit per client or total\n * @param numClients - Number of clients to simulate\n */\nexport function createBandwidthTestScenario(bandwidth: number, numClients: number): BandwidthScenario {\n const clients: Client[] = [];\n // Populate with mock clients if needed (currently creating dummy objects to satisfy type)\n // In a real scenario we might use createClient factory but that requires net driver\n // For now we assume caller will populate fully or we return empty array if 0\n\n return {\n bandwidth,\n clients,\n duration: 0,\n totalBytesSent: 0,\n totalBytesReceived: 0,\n droppedPackets: 0\n };\n}\n","import { JSDOM } from 'jsdom';\nimport { Canvas, Image, ImageData } from '@napi-rs/canvas';\nimport 'fake-indexeddb/auto';\nimport { MockPointerLock } from '../client/mocks/input.js';\nimport { createMockWebGL2Context } from './webgl.js';\n\nexport interface BrowserSetupOptions {\n url?: string;\n pretendToBeVisual?: boolean;\n resources?: \"usable\";\n enableWebGL2?: boolean;\n enablePointerLock?: boolean;\n}\n\n/**\n * Sets up a browser environment for testing using JSDOM and napi-rs/canvas.\n * This should be called in your vitest.setup.ts file.\n */\nexport function setupBrowserEnvironment(options: BrowserSetupOptions = {}) {\n const {\n url = 'http://localhost',\n pretendToBeVisual = true,\n resources = undefined,\n enableWebGL2 = false,\n enablePointerLock = false\n } = options;\n\n // Create a JSDOM instance\n const dom = new JSDOM('<!DOCTYPE html><html><head></head><body></body></html>', {\n url,\n pretendToBeVisual,\n resources: resources as any\n });\n\n // Set up global variables\n global.window = dom.window as any;\n global.document = dom.window.document;\n\n // Handle navigator assignment safely\n try {\n // @ts-ignore\n global.navigator = dom.window.navigator;\n } catch (e) {\n try {\n Object.defineProperty(global, 'navigator', {\n value: dom.window.navigator,\n writable: true,\n configurable: true\n });\n } catch (e2) {\n console.warn('Could not assign global.navigator, skipping.');\n }\n }\n\n global.location = dom.window.location;\n global.HTMLElement = dom.window.HTMLElement;\n global.HTMLCanvasElement = dom.window.HTMLCanvasElement;\n\n // Polyfill global Event constructors\n global.Event = dom.window.Event;\n global.CustomEvent = dom.window.CustomEvent;\n global.DragEvent = dom.window.DragEvent as any;\n global.MouseEvent = dom.window.MouseEvent;\n global.KeyboardEvent = dom.window.KeyboardEvent;\n global.FocusEvent = dom.window.FocusEvent;\n global.WheelEvent = dom.window.WheelEvent;\n global.InputEvent = dom.window.InputEvent;\n global.UIEvent = dom.window.UIEvent;\n\n // Setup Storage mocks\n try {\n global.localStorage = dom.window.localStorage;\n } catch (e) {\n // Ignore if it fails\n }\n\n if (!global.localStorage) {\n const storage = new Map<string, string>();\n global.localStorage = {\n getItem: (key: string) => storage.get(key) || null,\n setItem: (key: string, value: string) => storage.set(key, value),\n removeItem: (key: string) => storage.delete(key),\n clear: () => storage.clear(),\n key: (index: number) => Array.from(storage.keys())[index] || null,\n get length() { return storage.size; }\n } as Storage;\n }\n\n // Override document.createElement for canvas elements\n const originalCreateElement = document.createElement.bind(document);\n document.createElement = function (tagName: string, options?: any) {\n if (tagName.toLowerCase() === 'canvas') {\n const napiCanvas = new Canvas(300, 150);\n const domCanvas = originalCreateElement('canvas', options);\n\n Object.defineProperty(domCanvas, 'width', {\n get: () => napiCanvas.width,\n set: (value) => { napiCanvas.width = value; },\n enumerable: true,\n configurable: true\n });\n\n Object.defineProperty(domCanvas, 'height', {\n get: () => napiCanvas.height,\n set: (value) => { napiCanvas.height = value; },\n enumerable: true,\n configurable: true\n });\n\n const originalGetContext = domCanvas.getContext.bind(domCanvas);\n domCanvas.getContext = function(contextId: string, options?: any) {\n if (contextId === '2d') {\n return napiCanvas.getContext('2d', options);\n }\n\n if (enableWebGL2 && contextId === 'webgl2') {\n return createMockWebGL2Context(domCanvas as HTMLCanvasElement);\n }\n\n if (contextId === 'webgl' || contextId === 'webgl2') {\n return originalGetContext(contextId, options);\n }\n return napiCanvas.getContext(contextId as any, options);\n } as any;\n\n (domCanvas as any).__napiCanvas = napiCanvas;\n\n return domCanvas;\n }\n return originalCreateElement(tagName, options);\n } as any;\n\n if (enableWebGL2) {\n const originalProtoGetContext = global.HTMLCanvasElement.prototype.getContext;\n global.HTMLCanvasElement.prototype.getContext = function (\n contextId: string,\n options?: any\n ): any {\n if (contextId === 'webgl2') {\n return createMockWebGL2Context(this);\n }\n // @ts-ignore\n return originalProtoGetContext.call(this, contextId as any, options);\n };\n }\n\n global.Image = Image as any;\n global.ImageData = ImageData as any;\n\n if (typeof global.createImageBitmap === 'undefined') {\n global.createImageBitmap = async function (\n image: any,\n _options?: ImageBitmapOptions\n ): Promise<any> {\n if (image && typeof image.width === 'number' && typeof image.height === 'number') {\n const canvas = new Canvas(image.width, image.height);\n const ctx = canvas.getContext('2d');\n if (image.data) {\n ctx.putImageData(image as any, 0, 0);\n }\n return canvas;\n }\n const canvas = new Canvas(100, 100);\n return canvas;\n } as unknown as any;\n }\n\n if (typeof global.btoa === 'undefined') {\n global.btoa = function (str: string): string {\n return Buffer.from(str, 'binary').toString('base64');\n };\n }\n\n if (typeof global.atob === 'undefined') {\n global.atob = function (str: string): string {\n return Buffer.from(str, 'base64').toString('binary');\n };\n }\n\n if (enablePointerLock) {\n new MockPointerLock(global.document);\n }\n\n if (typeof global.requestAnimationFrame === 'undefined') {\n let lastTime = 0;\n global.requestAnimationFrame = (callback: FrameRequestCallback) => {\n const currTime = Date.now();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(() => {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id as unknown as number;\n };\n\n global.cancelAnimationFrame = (id: number) => {\n clearTimeout(id);\n };\n }\n}\n\n/**\n * Cleans up the browser environment.\n */\nexport function teardownBrowserEnvironment() {\n // @ts-ignore\n delete global.window;\n // @ts-ignore\n delete global.document;\n // @ts-ignore\n delete global.navigator;\n // @ts-ignore\n delete global.localStorage;\n // @ts-ignore\n delete global.location;\n // @ts-ignore\n delete global.HTMLElement;\n // @ts-ignore\n delete global.HTMLCanvasElement;\n // @ts-ignore\n delete global.Image;\n // @ts-ignore\n delete global.ImageData;\n // @ts-ignore\n delete global.createImageBitmap;\n // @ts-ignore\n delete global.Event;\n // @ts-ignore\n delete global.CustomEvent;\n // @ts-ignore\n delete global.DragEvent;\n // @ts-ignore\n delete global.MouseEvent;\n // @ts-ignore\n delete global.KeyboardEvent;\n // @ts-ignore\n delete global.FocusEvent;\n // @ts-ignore\n delete global.WheelEvent;\n // @ts-ignore\n delete global.InputEvent;\n // @ts-ignore\n delete global.UIEvent;\n}\n","\n/**\n * Client Input System Mocks\n *\n * Provides utilities for simulating user input (keyboard, mouse, pointer lock)\n * in a test environment (JSDOM/Browser).\n */\n\nexport interface KeyModifiers {\n ctrl?: boolean;\n alt?: boolean;\n shift?: boolean;\n meta?: boolean;\n}\n\n/**\n * Factory for creating a mock KeyboardEvent.\n */\nexport function createMockKeyboardEvent(key: string, type: 'keydown' | 'keyup' = 'keydown', modifiers: KeyModifiers = {}): KeyboardEvent {\n return new KeyboardEvent(type, {\n key,\n code: key, // Default code to key if not specified (caller can override property if needed)\n ctrlKey: modifiers.ctrl,\n altKey: modifiers.alt,\n shiftKey: modifiers.shift,\n metaKey: modifiers.meta,\n bubbles: true,\n cancelable: true,\n view: window\n });\n}\n\n/**\n * Factory for creating a mock MouseEvent with support for movementX/Y.\n */\nexport function createMockMouseEvent(type: string, options: MouseEventInit = {}): MouseEvent {\n const event = new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n ...options\n });\n\n // Patch movementX/Y if needed as JSDOM MouseEvent might not initialize them from options\n if (options.movementX !== undefined) {\n Object.defineProperty(event, 'movementX', { value: options.movementX });\n }\n if (options.movementY !== undefined) {\n Object.defineProperty(event, 'movementY', { value: options.movementY });\n }\n\n return event;\n}\n\n/**\n * Factory for creating a mock WheelEvent.\n */\nexport function createMockWheelEvent(deltaX: number = 0, deltaY: number = 0): WheelEvent {\n return new WheelEvent('wheel', {\n deltaX,\n deltaY,\n bubbles: true,\n cancelable: true,\n view: window\n });\n}\n\n/**\n * Class implementing a mock for the Pointer Lock API.\n * Handles patching the document and element prototypes to simulate pointer lock.\n */\nexport class MockPointerLock {\n private _doc: Document;\n\n constructor(doc: Document = document) {\n this._doc = doc;\n this.setup();\n }\n\n private setup() {\n // Check if already patched to avoid conflicts\n if ((this._doc as any).__mockPointerLockInstalled) return;\n\n let _pointerLockElement: Element | null = null;\n const doc = this._doc;\n\n // Patch document.pointerLockElement\n Object.defineProperty(doc, 'pointerLockElement', {\n get: () => _pointerLockElement,\n configurable: true\n });\n\n // Patch document.exitPointerLock\n doc.exitPointerLock = () => {\n if (_pointerLockElement) {\n _pointerLockElement = null;\n doc.dispatchEvent(new Event('pointerlockchange'));\n }\n };\n\n // Patch HTMLElement.prototype.requestPointerLock\n // Save original if needed, but in JSDOM it might not exist or do nothing\n if (!(global.HTMLElement.prototype as any).__originalRequestPointerLock) {\n (global.HTMLElement.prototype as any).__originalRequestPointerLock = (global.HTMLElement.prototype as any).requestPointerLock;\n }\n\n (global.HTMLElement.prototype as any).requestPointerLock = function() {\n _pointerLockElement = this;\n doc.dispatchEvent(new Event('pointerlockchange'));\n };\n\n (doc as any).__mockPointerLockInstalled = true;\n }\n\n get element(): Element | null {\n return this._doc.pointerLockElement;\n }\n\n get locked(): boolean {\n return !!this.element;\n }\n\n request(element: HTMLElement) {\n element.requestPointerLock();\n }\n\n exit() {\n this._doc.exitPointerLock();\n }\n\n isLocked(): boolean {\n return this.locked;\n }\n}\n\n/**\n * Class for simulating input events.\n */\nexport class InputInjector {\n constructor(private doc: Document = document, private win: Window = window) {}\n\n keyDown(key: string, code?: string, modifiers?: KeyModifiers) {\n const event = createMockKeyboardEvent(key, 'keydown', modifiers);\n if (code) {\n Object.defineProperty(event, 'code', { value: code });\n }\n this.doc.dispatchEvent(event);\n }\n\n keyUp(key: string, code?: string, modifiers?: KeyModifiers) {\n const event = createMockKeyboardEvent(key, 'keyup', modifiers);\n if (code) {\n Object.defineProperty(event, 'code', { value: code });\n }\n this.doc.dispatchEvent(event);\n }\n\n mouseMove(movementX: number, movementY: number, clientX = 0, clientY = 0) {\n const event = createMockMouseEvent('mousemove', {\n clientX,\n clientY,\n movementX,\n movementY\n });\n this.dispatchToTarget(event);\n }\n\n mouseButton(button: number, state: 'down' | 'up' = 'down') {\n if (state === 'down') {\n this.mouseDown(button);\n } else {\n this.mouseUp(button);\n }\n }\n\n mouseDown(button: number = 0) {\n const event = createMockMouseEvent('mousedown', { button });\n this.dispatchToTarget(event);\n }\n\n mouseUp(button: number = 0) {\n const event = createMockMouseEvent('mouseup', { button });\n this.dispatchToTarget(event);\n }\n\n mouseWheel(deltaY: number) {\n const event = createMockWheelEvent(0, deltaY);\n this.dispatchToTarget(event);\n }\n\n // Alias for backward compatibility/ease of use\n wheel(deltaY: number) {\n this.mouseWheel(deltaY);\n }\n\n private dispatchToTarget(event: Event) {\n const target = this.doc.pointerLockElement || this.doc;\n target.dispatchEvent(event);\n }\n}\n\n/**\n * Factory for creating a MockPointerLock instance.\n */\nexport function createMockPointerLock(element?: HTMLElement): MockPointerLock {\n const mock = new MockPointerLock();\n if (element) {\n mock.request(element);\n }\n return mock;\n}\n\n/**\n * Factory for creating an InputInjector.\n */\nexport function createInputInjector(target?: EventTarget): InputInjector {\n // If target is provided and is a Document, use it.\n // Otherwise default to global document.\n const doc = (target instanceof Document) ? target : document;\n const win = (doc.defaultView) ? doc.defaultView : window;\n return new InputInjector(doc, win);\n}\n","import { vi } from 'vitest';\n\ninterface ShaderRecord {\n readonly id: number;\n readonly type: GLenum;\n}\n\ninterface ProgramRecord {\n readonly id: number;\n}\n\nexport class MockWebGL2RenderingContext {\n readonly ARRAY_BUFFER = 0x8892;\n readonly ELEMENT_ARRAY_BUFFER = 0x8893;\n readonly STATIC_DRAW = 0x88e4;\n readonly DYNAMIC_DRAW = 0x88e8;\n readonly FLOAT = 0x1406;\n readonly UNSIGNED_SHORT = 0x1403;\n readonly TEXTURE_2D = 0x0de1;\n readonly TEXTURE_CUBE_MAP = 0x8513;\n readonly TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\n readonly TEXTURE0 = 0x84c0;\n readonly TEXTURE_WRAP_S = 0x2802;\n readonly TEXTURE_WRAP_T = 0x2803;\n readonly TEXTURE_MIN_FILTER = 0x2801;\n readonly TEXTURE_MAG_FILTER = 0x2800;\n readonly LINEAR = 0x2601;\n readonly NEAREST = 0x2600;\n readonly CLAMP_TO_EDGE = 0x812f;\n readonly RGBA = 0x1908;\n readonly UNSIGNED_BYTE = 0x1401;\n readonly FRAMEBUFFER = 0x8d40;\n readonly COLOR_ATTACHMENT0 = 0x8ce0;\n readonly DEPTH_ATTACHMENT = 0x8d00;\n readonly RENDERBUFFER = 0x8d41;\n readonly DEPTH_COMPONENT24 = 0x81a6;\n readonly FRAMEBUFFER_COMPLETE = 0x8cd5;\n readonly TRIANGLES = 0x0004;\n readonly DEPTH_TEST = 0x0b71;\n readonly CULL_FACE = 0x0b44;\n readonly BLEND = 0x0be2;\n readonly SRC_ALPHA = 0x0302;\n readonly ONE_MINUS_SRC_ALPHA = 0x0303;\n readonly ONE = 1;\n readonly BACK = 0x0405;\n readonly LEQUAL = 0x0203;\n readonly VERTEX_SHADER = 0x8b31;\n readonly FRAGMENT_SHADER = 0x8b30;\n readonly COMPILE_STATUS = 0x8b81;\n readonly LINK_STATUS = 0x8b82;\n readonly ONE_MINUS_SRC_COLOR = 0x0301;\n readonly TRIANGLE_STRIP = 0x0005;\n readonly QUERY_RESULT_AVAILABLE = 0x8867;\n readonly QUERY_RESULT = 0x8866;\n\n // Constants commonly used in setup/webgl.ts\n readonly TRIANGLE_FAN = 0x0006;\n readonly COLOR_BUFFER_BIT = 0x4000;\n readonly DEPTH_BUFFER_BIT = 0x0100;\n\n readonly canvas: HTMLCanvasElement | { width: number; height: number };\n readonly drawingBufferWidth: number;\n readonly drawingBufferHeight: number;\n\n private shaderCounter = 0;\n private programCounter = 0;\n\n compileSucceeds = true;\n linkSucceeds = true;\n shaderInfoLog = 'shader failed';\n programInfoLog = 'program failed';\n\n readonly extensions = new Map<string, unknown>();\n readonly calls: string[] = [];\n readonly uniformLocations = new Map<string, WebGLUniformLocation | null>();\n readonly attributeLocations = new Map<string, number>();\n\n constructor(canvas?: HTMLCanvasElement) {\n if (canvas) {\n this.canvas = canvas;\n this.drawingBufferWidth = canvas.width;\n this.drawingBufferHeight = canvas.height;\n } else {\n this.canvas = { width: 800, height: 600 };\n this.drawingBufferWidth = 800;\n this.drawingBufferHeight = 600;\n }\n }\n\n enable = vi.fn((cap: GLenum) => this.calls.push(`enable:${cap}`));\n disable = vi.fn((cap: GLenum) => this.calls.push(`disable:${cap}`));\n depthFunc = vi.fn((func: GLenum) => this.calls.push(`depthFunc:${func}`));\n cullFace = vi.fn((mode: GLenum) => this.calls.push(`cullFace:${mode}`));\n depthMask = vi.fn((flag: GLboolean) => this.calls.push(`depthMask:${flag}`));\n blendFuncSeparate = vi.fn((srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) =>\n this.calls.push(`blendFuncSeparate:${srcRGB}:${dstRGB}:${srcAlpha}:${dstAlpha}`)\n );\n blendFunc = vi.fn((sfactor: GLenum, dfactor: GLenum) => this.calls.push(`blendFunc:${sfactor}:${dfactor}`));\n getExtension = vi.fn((name: string) => this.extensions.get(name) ?? null);\n viewport = vi.fn((x: number, y: number, w: number, h: number) => this.calls.push(`viewport:${x}:${y}:${w}:${h}`));\n clear = vi.fn((mask: number) => this.calls.push(`clear:${mask}`));\n clearColor = vi.fn((r: number, g: number, b: number, a: number) => this.calls.push(`clearColor:${r}:${g}:${b}:${a}`));\n\n createShader = vi.fn((type: GLenum) => ({ id: ++this.shaderCounter, type } as unknown as WebGLShader));\n shaderSource = vi.fn((shader: ShaderRecord, source: string) => this.calls.push(`shaderSource:${shader.id}:${source}`));\n compileShader = vi.fn((shader: ShaderRecord) => this.calls.push(`compileShader:${shader.id}`));\n getShaderParameter = vi.fn((shader: ShaderRecord, pname: GLenum) =>\n pname === this.COMPILE_STATUS ? this.compileSucceeds : null\n );\n getShaderInfoLog = vi.fn(() => (this.compileSucceeds ? '' : this.shaderInfoLog));\n deleteShader = vi.fn((shader: ShaderRecord) => this.calls.push(`deleteShader:${shader.id}`));\n\n createProgram = vi.fn(() => ({ id: ++this.programCounter } as unknown as WebGLProgram));\n attachShader = vi.fn((program: ProgramRecord, shader: ShaderRecord) =>\n this.calls.push(`attach:${program.id}:${shader.id}`)\n );\n bindAttribLocation = vi.fn((program: ProgramRecord, index: number, name: string) =>\n this.calls.push(`bindAttribLocation:${program.id}:${index}:${name}`)\n );\n linkProgram = vi.fn((program: ProgramRecord) => this.calls.push(`link:${program.id}`));\n getProgramParameter = vi.fn((program: ProgramRecord, pname: GLenum) =>\n pname === this.LINK_STATUS ? this.linkSucceeds : null\n );\n getProgramInfoLog = vi.fn(() => (this.linkSucceeds ? '' : this.programInfoLog));\n deleteProgram = vi.fn((program: ProgramRecord) => this.calls.push(`deleteProgram:${program.id}`));\n useProgram = vi.fn((program: ProgramRecord | null) => this.calls.push(`useProgram:${program?.id ?? 'null'}`));\n getUniformLocation = vi.fn((program: ProgramRecord, name: string) => {\n this.calls.push(`getUniformLocation:${program.id}:${name}`);\n return this.uniformLocations.get(name) ?? null;\n });\n getAttribLocation = vi.fn((program: ProgramRecord, name: string) => {\n this.calls.push(`getAttribLocation:${program.id}:${name}`);\n return this.attributeLocations.get(name) ?? -1;\n });\n\n createBuffer = vi.fn(() => ({ buffer: {} } as unknown as WebGLBuffer));\n bindBuffer = vi.fn((target: GLenum, buffer: WebGLBuffer | null) => this.calls.push(`bindBuffer:${target}:${!!buffer}`));\n bufferData = vi.fn((target: GLenum, data: number | BufferSource, usage: GLenum) =>\n this.calls.push(`bufferData:${target}:${usage}:${typeof data === 'number' ? data : 'data'}`)\n );\n bufferSubData = vi.fn((target: GLenum, offset: number, data: BufferSource) =>\n this.calls.push(`bufferSubData:${target}:${offset}:${data.byteLength ?? 'len'}`)\n );\n deleteBuffer = vi.fn((buffer: WebGLBuffer) => this.calls.push(`deleteBuffer:${!!buffer}`));\n\n createVertexArray = vi.fn(() => ({ vao: {} } as unknown as WebGLVertexArrayObject));\n bindVertexArray = vi.fn((vao: WebGLVertexArrayObject | null) => this.calls.push(`bindVertexArray:${!!vao}`));\n enableVertexAttribArray = vi.fn((index: number) => this.calls.push(`enableAttrib:${index}`));\n vertexAttribPointer = vi.fn(\n (index: number, size: number, type: GLenum, normalized: boolean, stride: number, offset: number) =>\n this.calls.push(`vertexAttribPointer:${index}:${size}:${type}:${normalized}:${stride}:${offset}`)\n );\n vertexAttribDivisor = vi.fn((index: number, divisor: number) => this.calls.push(`divisor:${index}:${divisor}`));\n deleteVertexArray = vi.fn((vao: WebGLVertexArrayObject) => this.calls.push(`deleteVertexArray:${!!vao}`));\n\n createTexture = vi.fn(() => ({ texture: {} } as unknown as WebGLTexture));\n activeTexture = vi.fn((unit: GLenum) => this.calls.push(`activeTexture:${unit}`));\n bindTexture = vi.fn((target: GLenum, texture: WebGLTexture | null) => this.calls.push(`bindTexture:${target}:${!!texture}`));\n texParameteri = vi.fn((target: GLenum, pname: GLenum, param: GLint) =>\n this.calls.push(`texParameteri:${target}:${pname}:${param}`)\n );\n texImage2D = vi.fn(\n (\n target: GLenum,\n level: GLint,\n internalFormat: GLenum,\n width: GLsizei,\n height: GLsizei,\n border: GLint,\n format: GLenum,\n type: GLenum,\n pixels: ArrayBufferView | null\n ) =>\n this.calls.push(\n `texImage2D:${target}:${level}:${internalFormat}:${width}:${height}:${border}:${format}:${type}:${pixels ? 'data' : 'null'}`\n )\n );\n texImage3D = vi.fn(); // Stub for compatibility\n deleteTexture = vi.fn((texture: WebGLTexture) => this.calls.push(`deleteTexture:${!!texture}`));\n\n createFramebuffer = vi.fn(() => ({ fb: {} } as unknown as WebGLFramebuffer));\n bindFramebuffer = vi.fn((target: GLenum, framebuffer: WebGLFramebuffer | null) =>\n this.calls.push(`bindFramebuffer:${target}:${!!framebuffer}`)\n );\n framebufferTexture2D = vi.fn(\n (target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture | null, level: GLint) =>\n this.calls.push(`framebufferTexture2D:${target}:${attachment}:${textarget}:${!!texture}:${level}`)\n );\n deleteFramebuffer = vi.fn((fb: WebGLFramebuffer) => this.calls.push(`deleteFramebuffer:${!!fb}`));\n checkFramebufferStatus = vi.fn((target: GLenum) => this.FRAMEBUFFER_COMPLETE);\n\n createRenderbuffer = vi.fn(() => ({ rb: {} } as unknown as WebGLRenderbuffer));\n bindRenderbuffer = vi.fn((target: GLenum, renderbuffer: WebGLRenderbuffer | null) =>\n this.calls.push(`bindRenderbuffer:${target}:${!!renderbuffer}`)\n );\n renderbufferStorage = vi.fn((target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) =>\n this.calls.push(`renderbufferStorage:${target}:${internalformat}:${width}:${height}`)\n );\n framebufferRenderbuffer = vi.fn((target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer | null) =>\n this.calls.push(`framebufferRenderbuffer:${target}:${attachment}:${renderbuffertarget}:${!!renderbuffer}`)\n );\n deleteRenderbuffer = vi.fn((rb: WebGLRenderbuffer) => this.calls.push(`deleteRenderbuffer:${!!rb}`));\n\n drawArrays = vi.fn((mode: GLenum, first: GLint, count: GLsizei) =>\n this.calls.push(`drawArrays:${mode}:${first}:${count}`)\n );\n\n drawElements = vi.fn((mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr) =>\n this.calls.push(`drawElements:${mode}:${count}:${type}:${offset}`)\n );\n\n // Queries\n createQuery = vi.fn(() => ({}) as WebGLQuery);\n beginQuery = vi.fn();\n endQuery = vi.fn();\n deleteQuery = vi.fn();\n getQueryParameter = vi.fn();\n getParameter = vi.fn();\n\n uniform1f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat) =>\n this.calls.push(`uniform1f:${location ? 'set' : 'null'}:${x}`)\n );\n uniform1i = vi.fn((location: WebGLUniformLocation | null, x: GLint) =>\n this.calls.push(`uniform1i:${location ? 'set' : 'null'}:${x}`)\n );\n uniform4f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) =>\n this.calls.push(`uniform4f:${location ? 'set' : 'null'}:${x}:${y}:${z}:${w}`)\n );\n uniform3fv = vi.fn((location: WebGLUniformLocation | null, data: Float32List | number[]) =>\n this.calls.push(`uniform3fv:${location ? 'set' : 'null'}:${Array.from(data as Iterable<number>).join(',')}`)\n );\n uniform3f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat) =>\n this.calls.push(`uniform3f:${location ? 'set' : 'null'}:${x}:${y}:${z}`)\n );\n uniform2f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat) =>\n this.calls.push(`uniform2f:${location ? 'set' : 'null'}:${x}:${y}`)\n );\n uniform4fv = vi.fn((location: WebGLUniformLocation | null, data: Float32List) =>\n this.calls.push(`uniform4fv:${location ? 'set' : 'null'}:${Array.from(data as Iterable<number>).join(',')}`)\n );\n uniformMatrix4fv = vi.fn(\n (location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List | Iterable<number>) =>\n this.calls.push(`uniformMatrix4fv:${location ? 'set' : 'null'}:${transpose}:${Array.from(data as Iterable<number>).join(',')}`)\n );\n\n uniformBlockBinding = vi.fn();\n\n isContextLost = vi.fn(() => false);\n}\n\nexport function createMockWebGL2Context(\n overridesOrCanvas?: Partial<WebGL2RenderingContext> | HTMLCanvasElement\n): MockWebGL2RenderingContext {\n let context: MockWebGL2RenderingContext;\n\n if (overridesOrCanvas instanceof Object && 'width' in overridesOrCanvas && 'height' in overridesOrCanvas && 'getContext' in overridesOrCanvas) {\n // It's likely a canvas element (or mock of it)\n context = new MockWebGL2RenderingContext(overridesOrCanvas as HTMLCanvasElement);\n } else {\n context = new MockWebGL2RenderingContext();\n if (overridesOrCanvas) {\n Object.assign(context, overridesOrCanvas);\n }\n }\n\n return context;\n}\n","import { Canvas, ImageData } from '@napi-rs/canvas';\nimport { createMockWebGL2Context } from '../engine/mocks/webgl.js';\n\n/**\n * Creates a mock HTMLCanvasElement backed by napi-rs/canvas,\n * with support for both 2D and WebGL2 contexts.\n */\nexport function createMockCanvas(width: number = 300, height: number = 150): HTMLCanvasElement {\n // Use a real JSDOM canvas if available in the environment (setupBrowserEnvironment)\n if (typeof document !== 'undefined' && document.createElement) {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n\n // Fallback for non-JSDOM environments or specialized testing\n const napiCanvas = new Canvas(width, height);\n const canvas = {\n width,\n height,\n getContext: (contextId: string, options?: any) => {\n if (contextId === '2d') {\n return napiCanvas.getContext('2d', options);\n }\n if (contextId === 'webgl2') {\n return createMockWebGL2Context(canvas as any);\n }\n return null;\n },\n toDataURL: () => napiCanvas.toDataURL(),\n toBuffer: (mime: any) => napiCanvas.toBuffer(mime),\n // Add other properties as needed\n } as unknown as HTMLCanvasElement;\n\n return canvas;\n}\n\n/**\n * Creates a mock CanvasRenderingContext2D.\n */\nexport function createMockCanvasContext2D(canvas?: HTMLCanvasElement): CanvasRenderingContext2D {\n const c = canvas || createMockCanvas();\n const ctx = c.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to create 2D context');\n }\n return ctx as CanvasRenderingContext2D;\n}\n\n/**\n * Information about a captured draw call.\n */\nexport interface DrawCall {\n method: string;\n args: any[];\n}\n\n/**\n * Wraps a CanvasRenderingContext2D to capture all method calls.\n */\nexport function captureCanvasDrawCalls(context: CanvasRenderingContext2D): DrawCall[] {\n const calls: DrawCall[] = [];\n const proto = Object.getPrototypeOf(context);\n\n // Iterate over all properties of the context prototype\n for (const key of Object.getOwnPropertyNames(proto)) {\n const value = (context as any)[key];\n if (typeof value === 'function') {\n // Override function\n (context as any)[key] = function(...args: any[]) {\n calls.push({ method: key, args });\n return value.apply(context, args);\n };\n }\n }\n\n return calls;\n}\n\n/**\n * Creates a mock ImageData object.\n */\nexport function createMockImageData(width: number, height: number, fillColor?: [number, number, number, number]): ImageData {\n // Check if global ImageData is available (polyfilled by setupBrowserEnvironment)\n if (typeof global.ImageData !== 'undefined') {\n const data = new Uint8ClampedArray(width * height * 4);\n if (fillColor) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = fillColor[0];\n data[i + 1] = fillColor[1];\n data[i + 2] = fillColor[2];\n data[i + 3] = fillColor[3];\n }\n }\n return new global.ImageData(data, width, height) as unknown as ImageData;\n }\n\n // Fallback if not globally available, though it should be with @napi-rs/canvas\n const data = new Uint8ClampedArray(width * height * 4);\n if (fillColor) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = fillColor[0];\n data[i + 1] = fillColor[1];\n data[i + 2] = fillColor[2];\n data[i + 3] = fillColor[3];\n }\n }\n return new ImageData(data, width, height);\n}\n\n/**\n * Creates a mock HTMLImageElement.\n */\nexport function createMockImage(width: number = 100, height: number = 100, src: string = ''): HTMLImageElement {\n if (typeof document !== 'undefined' && document.createElement) {\n const img = document.createElement('img');\n img.width = width;\n img.height = height;\n if (src) img.src = src;\n return img;\n }\n\n // Fallback\n const img = {\n width,\n height,\n src,\n complete: true,\n onload: null,\n onerror: null,\n } as unknown as HTMLImageElement;\n\n // Simulate async load if src is provided\n if (src) {\n setTimeout(() => {\n if (img.onload) (img.onload as any)();\n }, 0);\n }\n\n return img;\n}\n","\nimport { vi } from 'vitest';\n\nexport function createMockGPUAdapter(): Partial<GPUAdapter> {\n return {\n requestDevice: vi.fn().mockResolvedValue(createMockGPUDevice()),\n features: new Set() as any,\n limits: {} as any,\n };\n}\n\nexport function createMockGPUDevice(): Partial<GPUDevice> {\n return {\n features: new Set() as any,\n limits: {} as any,\n queue: {\n submit: vi.fn(),\n writeBuffer: vi.fn(),\n writeTexture: vi.fn(),\n copyExternalImageToTexture: vi.fn(),\n } as any,\n createCommandEncoder: vi.fn().mockReturnValue({\n beginRenderPass: vi.fn().mockReturnValue({\n setPipeline: vi.fn(),\n draw: vi.fn(),\n end: vi.fn(),\n }),\n finish: vi.fn(),\n }),\n createRenderPipeline: vi.fn(),\n createShaderModule: vi.fn(),\n createBindGroup: vi.fn(),\n createBindGroupLayout: vi.fn(),\n createBuffer: vi.fn(),\n createTexture: vi.fn(),\n createSampler: vi.fn(),\n };\n}\n\nexport function createMockGPUCanvasContext(): Partial<GPUCanvasContext> {\n return {\n configure: vi.fn(),\n unconfigure: vi.fn(),\n getCurrentTexture: vi.fn(),\n };\n}\n\nexport function setupWebGPUMocks() {\n const mockAdapter = createMockGPUAdapter();\n\n // Mock navigator.gpu\n const mockGpu = {\n requestAdapter: vi.fn().mockResolvedValue(mockAdapter),\n getPreferredCanvasFormat: vi.fn().mockReturnValue('bgra8unorm'),\n };\n\n // Assign to global navigator\n Object.defineProperty(global.navigator, 'gpu', {\n value: mockGpu,\n writable: true,\n configurable: true,\n });\n\n // Mock global GPUTextureUsage\n (global as any).GPUTextureUsage = {\n COPY_SRC: 0x01,\n COPY_DST: 0x02,\n TEXTURE_BINDING: 0x04,\n STORAGE_BINDING: 0x08,\n RENDER_ATTACHMENT: 0x10,\n };\n}\n","/**\n * Interface for the mock RequestAnimationFrame implementation.\n */\nexport interface MockRAF {\n /**\n * Advances time by one tick (simulating one frame).\n * @param time Timestamp to pass to callbacks (default: calls Date.now())\n */\n tick(time?: number): void;\n /**\n * Advances time by a specific amount, triggering multiple frames if necessary.\n * Not fully implemented in simple version, acts as alias to tick() with specific time.\n */\n advance(ms: number): void;\n /**\n * Returns current pending callbacks.\n */\n getCallbacks(): Array<{id: number, callback: FrameRequestCallback}>;\n}\n\n/**\n * Creates a mock RequestAnimationFrame implementation.\n * Replaces global.requestAnimationFrame and cancelAnimationFrame.\n */\nexport function createMockRAF(): MockRAF {\n let callbacks: Array<{id: number, callback: FrameRequestCallback}> = [];\n let lastId = 0;\n let currentTime = 0;\n\n const originalRAF = global.requestAnimationFrame;\n const originalCancelRAF = global.cancelAnimationFrame;\n\n global.requestAnimationFrame = (callback: FrameRequestCallback): number => {\n lastId++;\n callbacks.push({ id: lastId, callback });\n return lastId;\n };\n\n global.cancelAnimationFrame = (id: number): void => {\n callbacks = callbacks.filter(cb => cb.id !== id);\n };\n\n return {\n tick(time?: number) {\n if (time) currentTime = time;\n else currentTime += 16.66; // ~60fps\n\n const currentCallbacks = [...callbacks];\n callbacks = []; // Clear before execution to allow re-scheduling\n\n currentCallbacks.forEach(cb => cb.callback(currentTime));\n },\n advance(ms: number) {\n // Simple implementation: just advance time and process one batch\n // For more complex simulation, we might loop\n currentTime += ms;\n this.tick(currentTime);\n },\n getCallbacks() {\n return callbacks;\n }\n };\n}\n\n/**\n * Creates a mock Performance object.\n */\nexport function createMockPerformance(startTime: number = 0): Performance {\n let now = startTime;\n\n const mockPerformance = {\n now: () => now,\n timeOrigin: startTime,\n timing: {\n navigationStart: startTime,\n },\n mark: (_name: string) => {},\n measure: (_name: string, _start: string, _end: string) => {},\n getEntries: () => [],\n getEntriesByName: (_name: string) => [],\n getEntriesByType: (_type: string) => [],\n clearMarks: (_name?: string) => {},\n clearMeasures: (_name?: string) => {},\n clearResourceTimings: () => {},\n setResourceTimingBufferSize: (_maxSize: number) => {},\n onresourcetimingbufferfull: null,\n toJSON: () => ({})\n } as unknown as Performance;\n\n // Polyfill global if needed, or return for injection\n if (typeof global.performance === 'undefined') {\n global.performance = mockPerformance;\n }\n\n return mockPerformance;\n}\n\nexport interface ControlledTimer {\n /**\n * Advances virtual time by ms.\n */\n advanceBy(ms: number): void;\n /**\n * Runs all pending timers.\n */\n runAll(): void;\n /**\n * Restores original timer functions.\n */\n clear(): void;\n}\n\n/**\n * Creates controlled timers (setTimeout/setInterval).\n * Note: Use verify's useFakeTimers() for better integration with test runner.\n * This is a lightweight alternative or specific helper.\n */\nexport function createControlledTimer(): ControlledTimer {\n // This functionality is best provided by vitest/jest directly via vi.useFakeTimers()\n // Wrapping it here for convenience if needed, but for now we'll recommend `vi`.\n console.warn('createControlledTimer: Recommend using vi.useFakeTimers() instead.');\n\n return {\n advanceBy: (ms: number) => { /* delegate to vi.advanceTimersByTime(ms) in consumer */ },\n runAll: () => { /* delegate to vi.runAllTimers() */ },\n clear: () => { /* delegate to vi.useRealTimers() */ }\n };\n}\n\n/**\n * Simulates multiple RAF frames.\n */\nexport function simulateFrames(count: number, frameTime: number = 16, callback?: (frameIndex: number) => void): void {\n for (let i = 0; i < count; i++) {\n // If using the global mock RAF from createMockRAF, we just rely on callbacks being scheduled.\n // However, if we need to manually trigger them, we assume existing RAF loop.\n // This helper assumes a synchronous execution where we can just wait or tick.\n // With `vi.useFakeTimers()`, we would `vi.advanceTimersByTime(frameTime)`.\n\n if (callback) callback(i);\n }\n}\n","/**\n * Setup helpers for Node.js environments.\n */\nexport interface NodeSetupOptions {\n // Add options as needed, e.g. mocking fs, process.env, etc.\n}\n\n/**\n * Sets up a Node.js environment for testing.\n * Currently a placeholder for future Node-specific setup.\n */\nexport function setupNodeEnvironment(options: NodeSetupOptions = {}) {\n // No-op for now, but provides a hook for future setup\n}\n\n/**\n * Teardown for Node.js environment.\n */\nexport function teardownNodeEnvironment() {\n // No-op for now\n}\n","import { vi } from 'vitest';\nimport { createMockWebGL2Context, MockWebGL2RenderingContext } from './mocks/webgl.js';\n\n// Define minimal mock interfaces for internal engine components not publicly exported.\ninterface MockPipeline {\n render: ReturnType<typeof vi.fn>;\n init: ReturnType<typeof vi.fn>;\n resize: ReturnType<typeof vi.fn>;\n}\n\ninterface MockCamera {\n update: ReturnType<typeof vi.fn>;\n getViewMatrix: ReturnType<typeof vi.fn>;\n getProjectionMatrix: ReturnType<typeof vi.fn>;\n getViewProjectionMatrix: ReturnType<typeof vi.fn>;\n getPosition: ReturnType<typeof vi.fn>;\n getForward: ReturnType<typeof vi.fn>;\n getRight: ReturnType<typeof vi.fn>;\n getUp: ReturnType<typeof vi.fn>;\n extractFrustumPlanes: ReturnType<typeof vi.fn>;\n transform: {\n origin: number[];\n angles: number[];\n fov: number;\n };\n}\n\nexport interface MockRenderingContext {\n gl: MockWebGL2RenderingContext;\n camera: MockCamera;\n pipelines: {\n md2: MockPipeline;\n bsp: MockPipeline;\n sprite: MockPipeline;\n poly: MockPipeline;\n particle: MockPipeline;\n };\n}\n\nexport function createMockRenderingContext(): MockRenderingContext {\n const gl = createMockWebGL2Context();\n\n // Mock Camera\n const camera: MockCamera = {\n update: vi.fn(),\n getViewMatrix: vi.fn().mockReturnValue(new Float32Array(16)),\n getProjectionMatrix: vi.fn().mockReturnValue(new Float32Array(16)),\n getViewProjectionMatrix: vi.fn().mockReturnValue(new Float32Array(16)),\n getPosition: vi.fn().mockReturnValue([0, 0, 0]),\n getForward: vi.fn().mockReturnValue([0, 0, -1]),\n getRight: vi.fn().mockReturnValue([1, 0, 0]),\n getUp: vi.fn().mockReturnValue([0, 1, 0]),\n extractFrustumPlanes: vi.fn(),\n transform: {\n origin: [0, 0, 0],\n angles: [0, 0, 0],\n fov: 90\n }\n };\n\n // Mock Pipelines\n const md2: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const bsp: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const sprite: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const poly: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const particle: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n return {\n gl,\n camera,\n pipelines: {\n md2,\n bsp,\n sprite,\n poly,\n particle\n }\n };\n}\n","/**\n * Helper to create a storage-like object (localStorage/sessionStorage).\n */\nfunction createStorageMock(initialData: Record<string, string> = {}): Storage {\n const store = new Map<string, string>(Object.entries(initialData));\n\n return {\n getItem: (key: string) => store.get(key) || null,\n setItem: (key: string, value: string) => store.set(key, value.toString()),\n removeItem: (key: string) => store.delete(key),\n clear: () => store.clear(),\n key: (index: number) => Array.from(store.keys())[index] || null,\n get length() { return store.size; }\n } as Storage;\n}\n\n/**\n * Creates a mock LocalStorage instance.\n */\nexport function createMockLocalStorage(initialData: Record<string, string> = {}): Storage {\n return createStorageMock(initialData);\n}\n\n/**\n * Creates a mock SessionStorage instance.\n */\nexport function createMockSessionStorage(initialData: Record<string, string> = {}): Storage {\n return createStorageMock(initialData);\n}\n\n/**\n * Creates a mock IndexedDB factory.\n * Wraps fake-indexeddb.\n */\nexport function createMockIndexedDB(databases?: IDBDatabase[]): IDBFactory {\n // fake-indexeddb/auto already sets global.indexedDB\n // If we need to return a specific instance or customized one, we can do it here.\n // For now, return the global one or a fresh 'fake-indexeddb' instance if we were to import it directly.\n\n // Since we imported 'fake-indexeddb/auto' in setup/browser.ts, global.indexedDB is already mocked.\n // We can return that.\n return global.indexedDB;\n}\n\nexport interface StorageScenario {\n localStorage: Storage;\n sessionStorage: Storage;\n indexedDB: IDBFactory;\n}\n\n/**\n * Creates a complete storage test scenario.\n */\nexport function createStorageTestScenario(storageType: 'local' | 'session' | 'indexed' = 'local'): StorageScenario {\n return {\n localStorage: createMockLocalStorage(),\n sessionStorage: createMockSessionStorage(),\n indexedDB: createMockIndexedDB()\n };\n}\n","/**\n * Mocks for Web Audio API.\n */\n\n/**\n * Sets up a mock AudioContext globally.\n */\nexport function setupMockAudioContext(): void {\n class MockAudioContext {\n state = 'suspended';\n destination = {};\n currentTime = 0;\n listener = {\n positionX: { value: 0 },\n positionY: { value: 0 },\n positionZ: { value: 0 },\n forwardX: { value: 0 },\n forwardY: { value: 0 },\n forwardZ: { value: 0 },\n upX: { value: 0 },\n upY: { value: 0 },\n upZ: { value: 0 },\n setOrientation: () => {},\n setPosition: () => {}\n };\n\n createGain() {\n return {\n gain: { value: 1, linearRampToValueAtTime: () => {} },\n connect: () => {},\n disconnect: () => {}\n };\n }\n\n createBufferSource() {\n return {\n buffer: null,\n loop: false,\n playbackRate: { value: 1 },\n connect: () => {},\n start: () => {},\n stop: () => {},\n disconnect: () => {},\n onended: null\n };\n }\n\n createPanner() {\n return {\n panningModel: 'equalpower',\n distanceModel: 'inverse',\n positionX: { value: 0 },\n positionY: { value: 0 },\n positionZ: { value: 0 },\n orientationX: { value: 0 },\n orientationY: { value: 0 },\n orientationZ: { value: 0 },\n coneInnerAngle: 360,\n coneOuterAngle: 360,\n coneOuterGain: 0,\n connect: () => {},\n disconnect: () => {},\n setPosition: () => {},\n setOrientation: () => {}\n }\n }\n\n createBuffer(numOfChannels: number, length: number, sampleRate: number) {\n return {\n duration: length / sampleRate,\n length,\n sampleRate,\n numberOfChannels: numOfChannels,\n getChannelData: () => new Float32Array(length)\n }\n }\n\n decodeAudioData(data: ArrayBuffer, success?: (buffer: any) => void) {\n const buffer = this.createBuffer(2, 100, 44100);\n if (success) success(buffer);\n return Promise.resolve(buffer);\n }\n\n resume() { return Promise.resolve(); }\n suspend() { return Promise.resolve(); }\n close() { return Promise.resolve(); }\n }\n\n global.AudioContext = MockAudioContext as any;\n // @ts-ignore\n global.webkitAudioContext = MockAudioContext as any;\n}\n\n/**\n * Restores original AudioContext.\n */\nexport function teardownMockAudioContext(): void {\n // @ts-ignore\n delete global.AudioContext;\n // @ts-ignore\n delete global.webkitAudioContext;\n}\n\nexport interface AudioEvent {\n type: string;\n data?: any;\n}\n\n/**\n * Captures audio events from a context.\n * Requires the context to be instrumented or mocked to emit events.\n * This helper currently works with the `setupMockAudioContext` mock if extended.\n */\nexport function captureAudioEvents(context: AudioContext): AudioEvent[] {\n // Placeholder for capturing events.\n // Real implementation would attach spies to context methods.\n return [];\n}\n","/**\n * Common utilities\n * @module glMatrix\n */\n\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nexport var RANDOM = Math.random;\nexport var ANGLE_ORDER = \"zyx\";\n\n/**\n * Symmetric round\n * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background\n *\n * @param {Number} a value to round\n */\nexport function round(a) {\n if (a >= 0) return Math.round(a);\n return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nvar radian = 180 / Math.PI;\n\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\nexport function toRadian(a) {\n return a * degree;\n}\n\n/**\n * Convert Radian To Degree\n *\n * @param {Number} a Angle in Radians\n */\nexport function toDegree(a) {\n return a * radian;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @param {Number} tolerance Absolute or relative tolerance (default glMatrix.EPSILON)\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b));\n}","import * as glMatrix from \"./common.js\";\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n return out;\n}\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n\n/**\n * symmetric round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\nexport function round(out, a) {\n out[0] = glMatrix.round(a[0]);\n out[1] = glMatrix.round(a[1]);\n out[2] = glMatrix.round(a[2]);\n return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function slerp(out, a, b, t) {\n var angle = Math.acos(Math.min(Math.max(dot(a, b), -1), 1));\n var sinTotal = Math.sin(angle);\n var ratioA = Math.sin((1 - t) * angle) / sinTotal;\n var ratioB = Math.sin(t * angle) / sinTotal;\n out[0] = ratioA * a[0] + ratioB * b[0];\n out[1] = ratioA * a[1] + ratioB * b[1];\n out[2] = ratioA * a[2] + ratioB * b[2];\n return out;\n}\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec3} out\n */\nexport function random(out, scale) {\n scale = scale === undefined ? 1.0 : scale;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q normalized quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n // Fast Vector Rotation using Quaternions by Robert Eisele\n // https://raw.org/proof/vector-rotation-using-quaternions/\n\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var vx = a[0],\n vy = a[1],\n vz = a[2];\n\n // t = q x v\n var tx = qy * vz - qz * vy;\n var ty = qz * vx - qx * vz;\n var tz = qx * vy - qy * vx;\n\n // t = 2t\n tx = tx + tx;\n ty = ty + ty;\n tz = tz + tz;\n\n // v + w t + q x t\n out[0] = vx + qw * tx + qy * tz - qz * ty;\n out[1] = vy + qw * ty + qz * tx - qx * tz;\n out[2] = vz + qw * tz + qx * ty - qy * tx;\n return out;\n}\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2];\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)),\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nexport var sub = subtract;\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nexport var div = divide;\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nexport var dist = distance;\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nexport var sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nexport var len = length;\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nexport var sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n if (!stride) {\n stride = 3;\n }\n if (!offset) {\n offset = 0;\n }\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n return a;\n };\n}();","\nimport { vec3 } from 'gl-matrix';\nimport { Camera } from '@quake2ts/engine';\n\n// Define RefDef interface locally if it's not exported from shared/engine,\n// or import it if we find it.\n// Based on grep, RefDef seems elusive or I missed it.\n// Standard Quake 2 RefDef:\nexport interface RefDef {\n x: number;\n y: number;\n width: number;\n height: number;\n fov_x: number;\n fov_y: number;\n vieworg: vec3;\n viewangles: vec3;\n time: number;\n rdflags: number;\n // ... other fields\n}\n\nexport interface ViewState {\n camera: Camera;\n viewport: { x: number; y: number; width: number; height: number };\n refdef: RefDef;\n}\n\nexport interface ViewScenario {\n viewState: ViewState;\n cleanup: () => void;\n}\n\nexport interface CameraInput {\n forward?: number;\n right?: number;\n up?: number;\n pitchDelta?: number;\n yawDelta?: number;\n rollDelta?: number;\n}\n\n/**\n * Creates a mock Camera instance with optional overrides.\n */\nexport function createMockCamera(overrides: Partial<Camera> = {}): Camera {\n // We instantiate a real Camera because it's logic-heavy (matrices)\n // and we often want that logic in tests.\n // If we wanted a pure mock (jest.fn()), we would need a different approach (interface based).\n // But the task says \"MockCamera\", and usually we use a real class configured for tests.\n\n const camera = new Camera();\n\n if (overrides.position) {\n camera.position = overrides.position;\n }\n if (overrides.angles) {\n camera.angles = overrides.angles;\n }\n if (overrides.fov !== undefined) {\n camera.fov = overrides.fov;\n }\n // Apply other properties if exposed by Camera class setters\n\n return camera;\n}\n\n/**\n * Creates a mock RefDef object.\n */\nexport function createMockRefDef(overrides: Partial<RefDef> = {}): RefDef {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 240,\n fov_x: 90,\n fov_y: 90,\n vieworg: vec3.create(),\n viewangles: vec3.create(),\n time: 0,\n rdflags: 0,\n ...overrides\n };\n}\n\n/**\n * Creates a mock ViewState object.\n */\nexport function createMockViewState(overrides: Partial<ViewState> = {}): ViewState {\n return {\n camera: overrides.camera || createMockCamera(),\n viewport: overrides.viewport || { x: 0, y: 0, width: 800, height: 600 },\n refdef: overrides.refdef || createMockRefDef(),\n ...overrides\n };\n}\n\n/**\n * Creates a pre-configured view test scenario.\n */\nexport function createViewTestScenario(scenarioType: 'firstPerson' | 'thirdPerson' | 'spectator'): ViewScenario {\n const camera = createMockCamera();\n const refdef = createMockRefDef();\n\n switch (scenarioType) {\n case 'firstPerson':\n camera.position = vec3.fromValues(100, 100, 50);\n camera.angles = vec3.fromValues(0, 45, 0);\n vec3.copy(refdef.vieworg, camera.position);\n vec3.copy(refdef.viewangles, camera.angles);\n break;\n case 'thirdPerson':\n camera.position = vec3.fromValues(100, 100, 100); // Higher/back\n camera.angles = vec3.fromValues(30, 45, 0); // Looking down\n // Refdef might differ from camera in 3rd person (refdef usually is player eye, camera is offset)\n vec3.set(refdef.vieworg, 100, 100, 50); // Player origin\n break;\n case 'spectator':\n camera.position = vec3.fromValues(0, 0, 100);\n camera.angles = vec3.fromValues(90, 0, 0); // Top down\n break;\n }\n\n return {\n viewState: {\n camera,\n viewport: { x: 0, y: 0, width: 800, height: 600 },\n refdef\n },\n cleanup: () => {\n // Any cleanup if needed\n }\n };\n}\n\n/**\n * Simulates camera movement based on input delta.\n * This is a helper to verify camera logic, not a replacement for full physics.\n */\nexport function simulateCameraMovement(camera: Camera, input: CameraInput, deltaTime: number): Camera {\n // Simple movement simulation\n const speed = 100; // units per second\n\n // Update angles\n if (input.pitchDelta) camera.angles[0] += input.pitchDelta;\n if (input.yawDelta) camera.angles[1] += input.yawDelta;\n if (input.rollDelta) camera.angles[2] += input.rollDelta;\n\n // Force update dirty flag in Camera\n camera.angles = camera.angles;\n\n // Calculate forward/right/up vectors based on new angles\n // For simplicity, we can use simple trig or just assume standard axis aligned for basic tests\n // But proper way is AngleVectors.\n // Since we don't have AngleVectors imported here (it's in shared), we might skip complex relative movement\n // or import it.\n\n // Ideally: import { angleVectors } from '@quake2ts/shared/math/angles';\n // But we want to avoid deep deps if possible.\n\n // For now, let's just apply absolute movement if provided, or simplistic axis logic\n if (input.forward || input.right || input.up) {\n // simplistic impl\n camera.position[0] += (input.forward || 0) * deltaTime;\n camera.position[1] += (input.right || 0) * deltaTime;\n camera.position[2] += (input.up || 0) * deltaTime;\n camera.position = camera.position;\n }\n\n return camera;\n}\n","export interface PlaywrightOptions {\n headless?: boolean;\n viewport?: { width: number; height: number };\n}\n\nexport interface PlaywrightTestClient {\n page: any; // Type as 'Page' from playwright in real usage, but keeping it generic here to avoid hard dependency on playwright types in this util file if not needed\n browser: any;\n navigate(url: string): Promise<void>;\n waitForGame(): Promise<void>;\n injectInput(type: string, data: any): Promise<void>;\n screenshot(name: string): Promise<Buffer>;\n close(): Promise<void>;\n}\n\n/**\n * Creates a Playwright test client.\n * Note: Requires playwright to be installed in the project.\n */\nexport async function createPlaywrightTestClient(options: PlaywrightOptions = {}): Promise<PlaywrightTestClient> {\n // Dynamic import to avoid hard dependency if not used\n let playwright;\n try {\n playwright = await import('playwright');\n } catch (e) {\n throw new Error('Playwright is not installed. Please install it to use this utility.');\n }\n\n const browser = await playwright.chromium.launch({\n headless: options.headless ?? true,\n });\n const context = await browser.newContext({\n viewport: options.viewport || { width: 1280, height: 720 },\n });\n const page = await context.newPage();\n\n return {\n page,\n browser,\n async navigate(url: string) {\n await page.goto(url);\n },\n async waitForGame() {\n await waitForGameReady(page);\n },\n async injectInput(type: string, data: any) {\n // Simulate input injection via evaluate\n await page.evaluate(({ type, data }: any) => {\n // Assumes a global function or event listener exists to receive injected input\n console.log('Injecting input', type, data);\n // (window as any).game.injectInput(type, data);\n }, { type, data });\n },\n async screenshot(name: string) {\n return await page.screenshot({ path: `${name}.png` });\n },\n async close() {\n await browser.close();\n }\n };\n}\n\n/**\n * Waits for the game to be ready.\n */\nexport async function waitForGameReady(page: any, timeout: number = 10000): Promise<void> {\n await page.waitForFunction(() => {\n // Check for some global game state or canvas presence\n return (window as any).game && (window as any).game.isRunning;\n }, { timeout });\n}\n\nexport interface GameStateCapture {\n time: number;\n entities: number;\n // Add other state properties\n}\n\n/**\n * Captures current game state from the browser.\n */\nexport async function captureGameState(page: any): Promise<GameStateCapture> {\n return await page.evaluate(() => {\n const game = (window as any).game;\n return {\n time: game ? game.time : 0,\n entities: game && game.entities ? game.entities.length : 0\n };\n });\n}\n","export type NetworkCondition = 'good' | 'slow' | 'unstable' | 'offline' | 'custom';\n\nexport interface NetworkSimulator {\n latency: number; // ms\n jitter: number; // ms\n packetLoss: number; // percentage 0-1\n bandwidth: number; // bytes per second\n}\n\n/**\n * Simulates network conditions.\n */\nexport function simulateNetworkCondition(condition: NetworkCondition): NetworkSimulator {\n switch (condition) {\n case 'good':\n return { latency: 20, jitter: 5, packetLoss: 0, bandwidth: 10 * 1024 * 1024 };\n case 'slow':\n return { latency: 150, jitter: 20, packetLoss: 0.01, bandwidth: 1 * 1024 * 1024 };\n case 'unstable':\n return { latency: 100, jitter: 100, packetLoss: 0.05, bandwidth: 512 * 1024 };\n case 'offline':\n return { latency: 0, jitter: 0, packetLoss: 1, bandwidth: 0 };\n case 'custom':\n default:\n return { latency: 0, jitter: 0, packetLoss: 0, bandwidth: Infinity };\n }\n}\n\n/**\n * Creates a custom network condition.\n */\nexport function createCustomNetworkCondition(latency: number, jitter: number, packetLoss: number): NetworkSimulator {\n return {\n latency,\n jitter,\n packetLoss,\n bandwidth: Infinity // Default to unlimited unless specified\n };\n}\n\n/**\n * Helper to throttle bandwidth (e.g. for Playwright).\n */\nexport function throttleBandwidth(bytesPerSecond: number): void {\n // This function would interface with Playwright's CDPSession in an E2E test.\n // It returns void here as a placeholder for the logic to be used within a test context.\n}\n","export interface VisualDiff {\n diffPercentage: number;\n diffImage?: Buffer;\n}\n\n/**\n * Captures a screenshot of the game.\n */\nexport async function captureGameScreenshot(page: any, name: string): Promise<Buffer> {\n return await page.screenshot({ path: `${name}.png` });\n}\n\n/**\n * Compares two screenshots (Buffers).\n * Uses a pixel comparison library if available, or simple buffer check.\n */\nexport function compareScreenshots(baseline: Buffer, current: Buffer, threshold: number = 0.01): VisualDiff {\n // Basic length check first\n if (baseline.length !== current.length) {\n return { diffPercentage: 1.0 };\n }\n\n let diffPixels = 0;\n const totalPixels = baseline.length; // Approximate bytes\n\n for (let i = 0; i < baseline.length; i++) {\n if (baseline[i] !== current[i]) {\n diffPixels++;\n }\n }\n\n const diffPercentage = diffPixels / totalPixels;\n\n return {\n diffPercentage,\n // Generating a diff image buffer would require a library like pixelmatch\n };\n}\n\nexport interface VisualScenario {\n sceneName: string;\n setup: () => Promise<void>;\n}\n\n/**\n * Creates a visual test scenario.\n */\nexport function createVisualTestScenario(sceneName: string): VisualScenario {\n return {\n sceneName,\n setup: async () => {\n // Setup scene logic\n }\n };\n}\n"],"mappings":";;;;;;;AAAA,SAAS,UAAqB;AAoBvB,IAAM,yBAAyB,OAAyB;AAAA,EAC7D,WAAW,GAAG,GAAG;AAAA,EACjB,YAAY,GAAG,GAAG;AAAA,EAClB,WAAW,GAAG,GAAG;AAAA,EACjB,aAAa,GAAG,GAAG;AAAA,EACnB,YAAY,GAAG,GAAG;AAAA,EAClB,WAAW,GAAG,GAAmB,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,EACxD,OAAO,GAAG,GAAG;AAAA;AAAA,EAEb,WAAW,GAAG,GAAG;AAAA,EACjB,YAAY,GAAG,GAAG;AAAA,EAClB,YAAY,GAAG,GAAG;AAAA,EAClB,aAAa,GAAG,GAAG;AAAA,EACnB,YAAY,GAAG,GAAG;AAAA,EAClB,aAAa,GAAG,GAAG;AAAA,EACnB,YAAY,GAAG,GAAG;AAAA,EAClB,SAAS,GAAG,GAAmB,MAAM,IAAI,WAAW,CAAC,CAAC;AACxD;AAEO,IAAM,oBAAoB,OAAO;AAAA,EACtC,OAAO;AAAA;AAAA,EAGP,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA;AAAA,EAGtB,8BAA8B;AAAA,EAC9B,0BAA0B;AAAA,EAC1B,0BAA0B;AAAA,EAC1B,iBAAiB,uBAAuB;AAAA,EACxC,gBAAgB;AAAA;AAAA,EAGhB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA;AAAA,EAGlB,cAAc;AAAA,EACd,UAAU;AAAA,EAEV,eAAe,EAAE,MAAM,MAAM,MAAM,KAAK;AAAA;AAAA,EAGxC,OAAO,GAAG,GAAG;AAAA,EACb,OAAO,GAAG,GAAG;AAAA,EACb,UAAU,GAAG,GAAG;AAAA,EAChB,SAAS,GAAG,GAAG;AAAA,EACf,iBAAiB,GAAG,GAAG,MAAM,IAAI;AAAA,EACjC,mBAAmB,GAAG,GAAG;AAAA,EACzB,oBAAoB,GAAG,GAAG;AAAA,EAC1B,mBAAmB,GAAG,GAAG;AAAA,EACzB,qBAAqB,GAAG,GAAG;AAAA,EAC3B,iBAAiB,GAAG,GAAmB,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,EAC9D,gBAAgB,GAAG,GAAG,MAAM,KAAK;AAAA,EACjC,YAAY,GAAG,GAAG,MAAM,KAAK;AAC/B;AAiCO,IAAM,yBAAyB,OAAyB;AAAA,EAC7D,aAAa,GAAG,GAAG,MAAM,CAAC;AAAA,EAC1B,iBAAiB,GAAG,GAAG,MAAM,CAAC;AAAA,EAC9B,WAAW,GAAG,GAAG,MAAM,CAAC;AAAA,EACxB,cAAc,GAAG,GAAG,MAAM,CAAC;AAAA,EAC3B,MAAM,GAAG,GAAG;AAAA,EACZ,iBAAiB,GAAG,GAAG;AAAA,EACvB,SAAS,GAAG,GAAG,MAAM,IAAI;AAAA,EACzB,UAAU,GAAG,GAAG,CAAC,WAAmB,IAAI;AAAA,EAExC,UAAU,GAAG,GAAG,MAAM,CAAC;AAAA,EACvB,UAAU,GAAG,GAAG,MAAM,CAAC;AAAA,EACvB,WAAW,GAAG,GAAG,MAAM,CAAC;AAAA,EACxB,YAAY,GAAG,GAAG,MAAM,CAAC;AAAA,EACzB,UAAU,GAAG,GAAG,MAAM,CAAC;AAAA,EACvB,WAAW,GAAG,GAAG,MAAM,CAAC;AAAA,EACxB,WAAW,GAAG,GAAG,MAAM,CAAC;AAAA,EAExB,YAAY,GAAG,GAAG,MAAM,EAAE;AAAA,EAC1B,gBAAgB,GAAG,GAAG,MAAM,EAAE;AAAA,EAE9B,WAAW,GAAG,GAAG,MAAM,CAAC;AAAA,EACxB,WAAW,GAAG,GAAG,MAAM,CAAC;AAAA,EACxB,aAAa,GAAG,GAAG,MAAM,CAAC;AAAA,EAE1B,UAAU,GAAG,GAAyB,CAACA,YAAmB,IAAI,WAAWA,OAAM,CAAC;AAAA,EAEhF,SAAS,GAAG,GAAG;AAAA,EACf,SAAS,GAAG,GAAG;AACjB;;;AC7IA;AAAA,EACE;AAAA,EAMA;AAAA,OAEK;AAEA,SAAS,UAAU,QAAcC,OAA8B;AACpE,SAAO;AAAA,IACL;AAAA,IACA,MAAAA;AAAA,IACA,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;AAAA,IACnG,UAAU,qBAAqB,MAAM;AAAA,EACvC;AACF;AAEO,SAAS,cAAc,MAAc,WAAW,gBAAgC;AACrF,QAAM,OAAO,OAAO;AACpB,QAAM,SAAS;AAAA,IACb,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI;AAAA,IACpC,UAAU,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI;AAAA,IACrC,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI;AAAA,IACpC,UAAU,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI;AAAA,IACrC,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI;AAAA,IACpC,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI;AAAA,EACvC;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,cAAc,EAAE,EAAE;AAAA,EAC3D;AACF;AAEO,SAAS,SAAS,OAAuB,UAA2C;AACzF,SAAO,EAAE,OAAO,SAAS;AAC3B;AAEO,SAAS,aACd,QACA,OACA,QACA,SACA,aACgB;AAChB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AACF;AAEO,SAAS,SAAS,UAAkB,gBAAwB,gBAAuC;AACxG,SAAO,EAAE,UAAU,SAAS,GAAG,MAAM,GAAG,gBAAgB,eAAe;AACzE;AAEO,SAAS,cAAc,SAA2C;AACvE,QAAM,SAAS,QAAQ,QAAQ,CAAC,UAAU,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAE/E,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC,SAAS,GAAG,GAAG,QAAQ,MAAM,CAAC;AAAA,IACvC;AAAA,IACA,aAAa,QAAQ,IAAI,CAAC,GAAG,MAAM,CAAC;AAAA,IACpC,SAAS,CAAC;AAAA,EACZ;AACF;AAEO,SAAS,sBAAsB,MAAY,MAAY,WAAW,gBAAgC;AACvG,QAAM,SAAS;AAAA,IACb,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC;AAAA,IACtC,UAAU,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;AAAA,IACxC,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC;AAAA,IACtC,UAAU,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;AAAA,IACxC,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC;AAAA,IACtC,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,cAAc,EAAE,EAAE;AAAA,EAC3D;AACF;;;ACzFA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAMA,IAAM,2BAA2B,CAAC,eAAmD;AAAA,EAC1F,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC3B,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC7B,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC/B,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EACzB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EACzB,aAAa;AAAA,EACb,kBAAkB,CAAC;AAAA,EACnB,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EAClB,OAAO,CAAC;AAAA,EACR,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAChC,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAChC,WAAW,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC9B,WAAW,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC9B,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,GAAG;AACL;AAEO,IAAM,2BAA2B,CAAC,eAAmD;AAAA,EAC1F,QAAQ;AAAA,EACR,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC3B,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC3B,WAAW,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC9B,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,GAAG;AACL;AAEO,IAAM,iCAAiC,CAAC,eAA+D;AAAA,EAC5G,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK;AAAA,EAC/B,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC3B,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC7B,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC/B,OAAO,EAAE,aAAa,GAAG,aAAa,GAAG,qBAAqB,GAAG,cAAc,IAAI;AAAA,EACnF,UAAU;AAAA,IACR,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AAAA,EACA,gBAAgB,CAAC;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAChC,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,EAClB,aAAa;AAAA,EACb,kBAAkB,CAAC;AAAA,EACnB,OAAO,CAAC;AAAA,EACR,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAChC,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAChC,WAAW,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC9B,WAAW,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EAC9B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,GAAG;AACL;AAIO,SAAS,oBAAoB,YAA6B,CAAC,GAAW;AAC3E,QAAM,MAAM,IAAI,OAAO,CAAC;AACxB,SAAO,OAAO,KAAK;AAAA,IACjB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU,SAAS;AAAA,IACnB,OAAO,MAAM;AAAA,IACb,UAAU,SAAS;AAAA,IACnB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,GAAG;AAAA,EACL,CAAC;AACD,SAAO;AACT;AAEO,SAAS,0BAA0B,YAA6B,CAAC,GAAW;AACjF,SAAO,oBAAoB;AAAA,IACzB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,UAAU,SAAS;AAAA,IACnB,SAAS,YAAY;AAAA,IACrB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,2BAA2B,WAAmB,YAA6B,CAAC,GAAW;AACrG,SAAO,oBAAoB;AAAA,IACzB;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,UAAU,SAAS;AAAA,IACnB,SAAS,YAAY;AAAA,IACrB,UAAU,SAAS;AAAA,IACnB,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,wBAAwB,WAAmB,YAA6B,CAAC,GAAW;AAClG,SAAO,oBAAoB;AAAA,IACzB;AAAA,IACA,OAAO,MAAM;AAAA,IACb,UAAU,SAAS;AAAA,IACnB,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,8BAA8B,WAAmB,YAA6B,CAAC,GAAW;AACxG,SAAO,oBAAoB;AAAA,IACzB;AAAA,IACA,OAAO,MAAM;AAAA,IACb,UAAU,SAAS;AAAA,IACnB,SAAS,YAAY;AAAA,IACrB,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,2BAA2B,WAAmB,YAA6B,CAAC,GAAW;AACrG,SAAO,oBAAoB;AAAA,IACzB;AAAA,IACA,OAAO,MAAM;AAAA,IACb,UAAU,SAAS;AAAA,IACnB,GAAG;AAAA,EACL,CAAC;AACH;;;AC3KA,SAAS,MAAAC,WAAqB;AAC9B,SAAS,UAAAC,SAAQ,eAAe,0BAAgE;AAChG,SAAS,6BAAwC;AAGjD,SAAS,YAAY,YAAY,mBAAmB;AA+B7C,IAAM,mBAAmB,OAAmB;AAAA,EACjD,OAAOD,IAAG,GAAG;AAAA,EACb,YAAYA,IAAG,GAAG,CAAC,UAAkB,CAAC;AAAA,EACtC,YAAYA,IAAG,GAAG,CAAC,UAAkB,CAAC;AAAA,EACtC,cAAcA,IAAG,GAAG;AACtB;AAEO,IAAM,iBAAiB,CAAC,OAAe,UAA4D;AACxG,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,QAAQ,IAAI,mBAAmB;AAErC,QAAM,OAAiB;AAAA,IACrB,QAAQ,sBAAsB,EAAE,KAAK,CAAC;AAAA,IACtC,qBAAqBA,IAAG,GAAG,CAAC,WAAmB,cAAwC;AACrF,oBAAc,SAAS,WAAW,CAAC,WAAW,UAAU,MAAM,CAAC;AAAA,IACjE,CAAC;AAAA,IACD,uBAAuBA,IAAG,GAAG,CAAC,cAAsB;AAClD,oBAAc,WAAW,SAAS;AAAA,IACpC,CAAC;AAAA,IACD,mBAAmBA,IAAG,GAAG,MAAM,MAAM,KAAK,cAAc,KAAK,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA,eAAeA,IAAG,GAAG,CAAC,aAAa,MAAM,SAAS,QAAQ,CAAC;AAAA,IAC3D,YAAYA,IAAG,GAAG,MAAM;AACtB,YAAM,UAAU,OAAO;AAAA,IACzB,CAAC;AAAA,IACD,aAAaA,IAAG,GAAG,CAAC,WAAW;AAC7B,YAAM,cAAc,CAAC,CAAQ;AAAA,IAC/B,CAAC;AAAA,IACD,QAAQA,IAAG,GAAG,CAAC,WAAmB;AAChC,YAAM,SAAS,CAAC,GAAU,MAAM,MAAM,QAAQ,GAAG,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,cAAc;AAC/B;AAEO,SAAS,kBAAkB,SAAsE;AACtG,QAAM,SAAS,iBAAiB;AAChC,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,EAAE,MAAM,cAAc,IAAI,eAAe,IAAI;AAEnD,QAAM,UAAUA,IAAG,GAAG,CAAC,OAAa,KAAW,MAAa,UAAiB;AAAA,IAC3E,UAAU;AAAA,IACV,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE;AAAA,IAC/C,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,EAAE;AAEF,QAAM,aAAuB,SAAS,kBAAkB,CAAC,GAAG,QAAQ,eAAe,IAAI,CAAC;AAGxF,QAAM,QAAQ,KAAK;AAEnB,QAAM,WAAW;AAAA,IACf,OAAOA,IAAG,GAAG,MAAM;AACjB,YAAM,MAAM,IAAIC,QAAO,WAAW,SAAS,CAAC;AAC5C,iBAAW,KAAK,GAAG;AACnB,YAAM,cAAc,GAAG;AACvB,aAAO;AAAA,IACT,CAAC;AAAA,IACD,MAAMD,IAAG,GAAG,CAAC,QAAgB;AAC3B,YAAM,MAAM,WAAW,QAAQ,GAAG;AAClC,UAAI,QAAQ,IAAI;AACd,mBAAW,OAAO,KAAK,CAAC;AAAA,MAC1B;AACA,YAAM,eAAe,GAAG;AAAA,IAC1B,CAAC;AAAA,IACD,eAAeA,IAAG,GAAG;AAAA,IACrB,eAAeA,IAAG,GAAG,CAAC,QAAgB;AACpC,YAAM,MAAM,WAAW,QAAQ,GAAG;AAClC,UAAI,QAAQ,IAAI;AACd,mBAAW,OAAO,KAAK,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,IACD,kBAAkBA,IAAG,GAAG;AAAA,IACxB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAYA,IAAG,GAAG,MAAM,CAAC;AAAA,IACzB,eAAeA,IAAG,GAAG,CAAC,QAAgB,SAAiB;AACrD,aAAO,YAAY;AAAA,IACrB,CAAC;AAAA,IACD,YAAYA,IAAG,GAAG;AAAA,IAClB,OAAO;AAAA,IACP,eAAeA,IAAG,GAAG,MAAM,CAAC;AAAA,IAC5B,WAAWA,IAAG,GAAG;AAAA,IACjB,SAASA,IAAG,GAAG;AAAA,IACf;AAAA,IACA;AAAA,IACA,OAAOA,IAAG,GAAG,CAAC,KAAa,MAAc,OAAe,KAAa,MAAc,YAAoB;AACrG,aAAO,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO;AAAA,IACnD,CAAC;AAAA,IACD,YAAYA,IAAG,GAAG,CAAC,UAAkB,OAAO,WAAW,KAAK,CAAC;AAAA,IAC7D,YAAYA,IAAG,GAAG,CAAC,QAAgB,cAA6B;AAAA,IAChE,CAAC;AAAA,IACD,kBAAkBA,IAAG,GAAG,MAAM,CAAC,CAAC;AAAA,IAChC,YAAYA,IAAG,GAAG,MAAM,IAAI;AAAA,IAC5B,SAASA,IAAG,GAAG;AAAA,IACf,KAAK,sBAAsB,EAAE,KAAK,CAAC;AAAA,IACnC,SAAS;AAAA,MACP,cAAcA,IAAG,GAAG;AAAA,MACpB,OAAO;AAAA,MACP,eAAeA,IAAG,GAAG,MAAM,CAAC;AAAA,IAC9B;AAAA,IACA,OAAO;AAAA,MACL,oBAAoB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MACvC,qBAAqB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MACxC,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,IACvB;AAAA,IACA,iBAAiB,oBAAI,IAAI;AAAA,IACzB,eAAeA,IAAG,GAAG,CAAC,aAAoC;AACxD,iBAAW,QAAQ,QAAQ;AAAA,IAC7B,CAAC;AAAA,IACD,MAAMA,IAAG,GAAG,CAAC,cAAwC;AACnD,aAAO,WAAW,KAAK,SAAS;AAAA,IAClC,CAAC;AAAA,IACD,iBAAiBA,IAAG,GAAG,CAAC,cAAsB;AAC5C,aAAO,WAAW,KAAK,OAAK,EAAE,cAAc,SAAS;AAAA,IACvD,CAAC;AAAA,IACD,YAAYA,IAAG,GAAG,CAAC,gBAAwB;AACzC,MAAC,SAAiB,cAAc;AAAA,IAClC,CAAC;AAAA,IACD,iBAAiB;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA;AAAA;AAAA,IAGA,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,aAAa,WAAW;AAAA,IACxB,OAAO,WAAW,KAAK,OAAK,EAAE,cAAc,YAAY,KAAK,IAAIC,QAAO,CAAC;AAAA;AAAA,EAE3E;AAEA,SAAO;AAAA,IACL,WAAW,CAAC;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB,MAAMD,IAAG,GAAG;AAAA,IACZ,MAAMA,IAAG,GAAG;AAAA;AAAA,IAEZ,eAAeA,IAAG,GAAG;AAAA,IACrB,eAAeA,IAAG,GAAG;AAAA,IACrB,eAAeA,IAAG,GAAG;AAAA,EACvB;AACF;AAEO,SAAS,uBAAuB,SAA+B;AACpE,QAAM,MAAM,kBAAkB;AAE9B,MAAI,SAAS;AACX,QAAI,KAAK,WAAW;AAAA,EACtB;AACA,SAAO;AACT;AAEO,SAAS,0BAAuC;AACrD,SAAO,kBAAkB;AAC3B;AAEO,SAAS,2BAAwC;AACtD,SAAO,kBAAkB;AAC3B;AAEO,SAAS,eAAuB;AACrC,SAAO,IAAIC,QAAO,CAAC;AACrB;;;ACpNA,SAAS,MAAAC,WAAqB;AAqBvB,SAAS,aAAa,YAA6B,CAAC,GAAW;AACpE,SAAO;AAAA,IACL,aAAaA,IAAG,GAAG,MAAM,KAAK;AAAA,IAC9B,YAAYA,IAAG,GAAG,MAAM,IAAI;AAAA,IAC5B,SAASA,IAAG,GAAG,MAAM,IAAI;AAAA,IACzB,SAASA,IAAG,GAAG,MAAM,IAAI;AAAA,IACzB,GAAG;AAAA,EACL;AACF;AAEO,SAAS,oBAAoB,YAAoC,CAAC,GAAkB;AACzF,SAAO;AAAA,IACL,OAAOA,IAAG,GAAG;AAAA,IACb,MAAMA,IAAG,GAAG;AAAA,IACZ,KAAKA,IAAG,GAAG;AAAA,IACX,OAAOA,IAAG,GAAG;AAAA,IACb,QAAQA,IAAG,GAAG;AAAA,IACd,OAAOA,IAAG,GAAG;AAAA,IACb,OAAOA,IAAG,GAAG;AAAA,IACb,MAAMA,IAAG,GAAG;AAAA,IACZ,GAAG;AAAA,EACL;AACF;AAEO,SAAS,sBACd,OACA,MACA,OACA,QACa;AACb,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,OAAO,KAAK,MAAM,KAAK;AAClC,WAAO,KAAK;AAAA,MACV,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AClEA,SAAS,MAAAC,WAAqB;AAC9B,SAAS,iBAAoD;AAYtD,SAAS,qBAAqB,YAAqC,CAAC,GAAmB;AAC5F,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,KAAK,UAAU;AAAA,IACf,WAAW;AAAA,IACX,UAAU;AAAA,IACV,WAAW;AAAA,IACX,KAAK;AAAA,IACL,OAAO;AAAA,IACP,GAAG;AAAA,EACL;AACF;AAEA,IAAM,eAAuC;AAAA,EAC3C,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,cAAc;AAChB;AAEO,SAAS,iBAAiB,OAAe,eAAe;AAC7D,QAAM,cAAc,aAAa,IAAI,KAAK;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAWA,IAAG,GAAG;AAAA,IACjB,OAAOA,IAAG,GAAG;AAAA,IACb,SAASA,IAAG,GAAG;AAAA,EACjB;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC,aAAaA,IAAG,GAAG;AAAA,EACnB,YAAYA,IAAG,GAAG;AAAA,EAClB,aAAaA,IAAG,GAAG;AAAA,EACnB,UAAUA,IAAG,GAAG;AAAA,EAChB,YAAYA,IAAG,GAAG;AAAA,EAClB,aAAaA,IAAG,GAAG;AAAA,EACnB,aAAaA,IAAG,GAAG;AAAA,EACnB,SAASA,IAAG,GAAG;AACjB;;;AC5DA;AAAA,EAEE;AAAA,OAKK;AACP;AAAA,EASE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAOA,SAAS,oBAAoB,YAAsC,CAAC,GAAoB;AAC7F,QAAM,mBAAmB,sBAAsB;AAG/C,QAAM,YAA6B;AAAA,IACjC,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAMA,SAAO;AACT;AAMO,SAAS,eAAe,IAAY,YAA+B,CAAC,GAAa;AACtF,MAAI;AAGJ,SAAO,aAAa,EAAE,KACf,aAAa,EAAE,KACf,YAAY,EAAE,KACd,cAAc,EAAE,KAChB,kBAAkB,EAAE,KACpB,UAAU,EAAE,KACZ,WAAW,EAAE;AAEpB,MAAI,CAAC,MAAM;AAET,WAAO;AAAA,MACL;AAAA,MACA,MAAM,aAAa,EAAE;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAKO,SAAS,qBAAqB,UAAoB,YAAiC,CAAC,GAAe;AAEtG,QAAM,QAAQ,OAAO,OAAO,YAAY,EAAE,KAAK,OAAK,EAAE,aAAa,QAAQ;AAE3E,QAAM,OAAmB,QAAQ,EAAE,GAAG,MAAM,IAAI;AAAA,IAC5C,MAAM;AAAA,IACN,IAAI,UAAU,QAAQ;AAAA,IACtB,MAAM,eAAe,QAAQ;AAAA,IAC7B;AAAA,IACA,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACd;AAEA,SAAO,EAAE,GAAG,MAAM,GAAG,UAAU;AACnC;AAKO,SAAS,qBAAqB,QAAgB,YAAiC,CAAC,GAAe;AAClG,SAAO;AAAA,IACH,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,KAAK;AAAA,IACL,GAAG;AAAA,EACP;AACJ;AAKO,SAAS,oBAAoB,QAAgB,YAAgC,CAAC,GAAc;AAC/F,SAAO;AAAA,IACH,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA,GAAG;AAAA,EACP;AACJ;AAKO,SAAS,mBAAmB,YAAwB,YAA+B,CAAC,GAAa;AACpG,QAAM,MAAM,sBAAsB,UAAU;AAC5C,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,yBAAyB,UAAU,EAAE;AAAA,EACzD;AAEA,QAAM,OAAiB;AAAA,IACnB,IAAI,IAAI;AAAA,IACR,MAAM,aAAa,IAAI,EAAE;AAAA,EAC7B;AAEA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACP;AACJ;AAMO,SAAS,sBAAsB,IAAY,UAAkB,YAAkC,CAAC,GAAgB;AACnH,QAAM,QAAQ,cAAc,EAAE;AAC9B,QAAM,OAAoB,QAAQ,EAAE,GAAG,MAAM,IAAI;AAAA,IAC7C,MAAM;AAAA,IACN;AAAA,IACA,MAAM,gBAAgB,EAAE;AAAA,IACxB,OAAO;AAAA,EACX;AAEA,MAAI,aAAa,UAAa,CAAC,OAAO;AAClC,SAAK,QAAQ;AAAA,EACjB;AAEA,SAAO,EAAE,GAAG,MAAM,GAAG,UAAU;AACnC;;;ACpKA,SAAS,MAAAC,WAAU;AAaZ,SAAS,oBAAoB,WAA2C;AAC3E,SAAO;AAAA,IACH,WAAW;AAAA,IACX,MAAM;AAAA,IACN,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,IACV,GAAG;AAAA,EACP;AACJ;AAKO,SAAS,sBAAsB,WAA+C;AACjF,SAAO;AAAA,IACH,MAAMA,IAAG,GAAG;AAAA,IACZ,UAAUA,IAAG,GAAG;AAAA,IAChB,YAAYA,IAAG,GAAG;AAAA,IAClB,OAAOA,IAAG,GAAG,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,IAC5C,eAAeA,IAAG,GAAG,EAAE,gBAAgB,IAAI;AAAA,IAC3C,aAAaA,IAAG,GAAG,EAAE,gBAAgB,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;AAAA,IAC/E,kBAAkBA,IAAG,GAAG;AAAA,IACxB,aAAaA,IAAG,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcnB,SAASA,IAAG,GAAG;AAAA,IACf,UAAU;AAAA,MACN,YAAYA,IAAG,GAAG;AAAA,MAClB,eAAeA,IAAG,GAAG;AAAA,MACrB,cAAcA,IAAG,GAAG;AAAA,MACpB,MAAMA,IAAG,GAAG;AAAA,MACZ,mBAAmBA,IAAG,GAAG;AAAA,MACzB,OAAOA,IAAG,GAAG;AAAA,MACb,eAAeA,IAAG,GAAG;AAAA,MACrB,MAAMA,IAAG,GAAG;AAAA;AAAA,MACZ,QAAQA,IAAG,GAAG;AAAA,MACd,OAAOA,IAAG,GAAG;AAAA,MACb,MAAMA,IAAG,GAAG;AAAA,MACZ,aAAa;AAAA,MACb,OAAO,EAAE,WAAW,aAAa;AAAA,IACrC;AAAA,IACA,WAAWA,IAAG,GAAG;AAAA,IACjB,SAASA,IAAG,GAAG;AAAA,IACf,cAAcA,IAAG,GAAG;AAAA,IACpB,eAAeA,IAAG,GAAG;AAAA,IACrB,OAAOA,IAAG,GAAG;AAAA,IACb,YAAYA,IAAG,GAAG;AAAA,IAClB,cAAcA,IAAG,GAAG;AAAA,IACpB,OAAOA,IAAG,GAAG;AAAA,IACb,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,cAAc;AAAA,IACd,QAAQ;AAAA,MACH,MAAMA,IAAG,GAAG;AAAA,MACZ,WAAWA,IAAG,GAAG;AAAA,MACjB,OAAOA,IAAG,GAAG;AAAA,MACb,SAASA,IAAG,GAAG;AAAA,MACf,UAAUA,IAAG,GAAG;AAAA,MAChB,UAAUA,IAAG,GAAG;AAAA,IACrB;AAAA,IACA,YAAYA,IAAG,GAAG;AAAA,IAClB,UAAUA,IAAG,GAAG;AAAA,IAChB,WAAWA,IAAG,GAAG;AAAA,IACjB,WAAWA,IAAG,GAAG;AAAA,IACjB,YAAYA,IAAG,GAAG;AAAA,IAClB,WAAWA,IAAG,GAAG;AAAA,IACjB,aAAaA,IAAG,GAAG;AAAA,IACnB,UAAUA,IAAG,GAAG;AAAA,IAChB,QAAQA,IAAG,GAAG;AAAA,IACd,UAAUA,IAAG,GAAG;AAAA,IAChB,eAAeA,IAAG,GAAG;AAAA,IACrB,OAAO;AAAA,MACH,WAAWA,IAAG,GAAG;AAAA,MACjB,aAAaA,IAAG,GAAG;AAAA,MACnB,eAAeA,IAAG,GAAG;AAAA,MACrB,eAAeA,IAAG,GAAG;AAAA,MACrB,UAAUA,IAAG,GAAG;AAAA,IACpB;AAAA,IACA,cAAcA,IAAG,GAAG;AAAA,IACpB,qBAAqBA,IAAG,GAAG;AAAA,IAC3B,uBAAuBA,IAAG,GAAG;AAAA,IAC7B,mBAAmBA,IAAG,GAAG;AAAA,IACzB,GAAG;AAAA,EACP;AACJ;;;AC/GA,SAAS,MAAAC,WAAU;AAMZ,IAAM,gBAAN,MAAgD;AAAA,EAAhD;AAGH,SAAO,UAAkB;AACzB,SAAO,OAAe;AACtB,SAAO,eAA6B,CAAC;AACrC,SAAO,mBAAiC,CAAC;AACzC,SAAO,YAAqB;AAE5B,SAAO,YAAYA,IAAG,GAAG,EAAE,mBAAmB,OAAO,SAAiB;AAClE,WAAK,OAAO;AACZ,WAAK,YAAY;AAAA,IACrB,CAAC;AACD,SAAO,WAAWA,IAAG,GAAG,EAAE,mBAAmB,MAAM;AAC/C,WAAK,YAAY;AAAA,IACrB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKD,MAAM,OAAO,MAA6B;AACtC,WAAO,KAAK,UAAU,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACJ,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAAmD;AAC5D,SAAK,uBAAuB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAAkC;AACtC,SAAK,kBAAkB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,cAAuB;AAC1B,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,mBAAmB,QAAmB,MAAY;AACrD,QAAI,KAAK,sBAAsB;AAC3B,WAAK,qBAAqB,QAAQ,IAAI;AAAA,IAC1C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,cAAc,OAAc;AAC/B,QAAI,KAAK,iBAAiB;AACtB,WAAK,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACJ;AACJ;AAkBO,SAAS,oBAAoB,WAAmD;AACnF,QAAM,SAAwB;AAAA,IAC1B,MAAMA,IAAG,GAAG;AAAA,IACZ,IAAIA,IAAG,GAAG;AAAA,IACV,OAAOA,IAAG,GAAG;AAAA,IACb,MAAMA,IAAG,GAAG;AAAA,IACZ,SAASA,IAAG,GAAG,EAAE,gBAAgB,EAAE,SAAS,aAAa,QAAQ,QAAQ,MAAM,EAAE,CAAC;AAAA,IAClF,GAAG;AAAA,EACP;AACA,SAAO;AACX;AAeO,SAAS,yBAAyB,KAAa,aAAa,OAAe,OAAuB;AACrG,SAAO,EAAE,IAAI,KAAK;AACtB;AAQO,SAAS,oBACZ,UAAkB,aAClB,OAAe,OACf,WACa;AACb,QAAM,YAAY,IAAI,cAAc;AACpC,YAAU,UAAU;AACpB,YAAU,OAAO;AACjB,SAAO,OAAO,WAAW,SAAS;AAClC,SAAO;AACX;AAMO,SAAS,oBAAoB,WAA2C;AAC3E,SAAO;AAAA,IACH,SAASA,IAAG,GAAG,EAAE,kBAAkB,MAAS;AAAA,IAC5C,YAAYA,IAAG,GAAG;AAAA,IAClB,MAAMA,IAAG,GAAG;AAAA,IACZ,WAAWA,IAAG,GAAG;AAAA,IACjB,SAASA,IAAG,GAAG;AAAA,IACf,SAASA,IAAG,GAAG;AAAA,IACf,aAAaA,IAAG,GAAG,EAAE,gBAAgB,IAAI;AAAA,IACzC,GAAG;AAAA,EACP;AACJ;;;AChKA,SAAiB,aAAmC,mBAAmB;AACvE,SAAoB,mBAAmB,kBAA+B;AAEtE,SAAS,MAAAC,WAAU;AAOZ,SAAS,sBAAsB,WAAqC;AACvE,SAAO;AAAA,IACH,OAAO,YAAY;AAAA,IACnB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW,KAAK,IAAI;AAAA,IACpB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe,IAAI,MAAM,iBAAiB,EAAE,KAAK,EAAE;AAAA,IACnD,WAAW,IAAI,MAAM,UAAU,EAAE,KAAK,IAAI;AAAA,IAC1C,cAAc,IAAI,WAAW,CAAC;AAAA,IAC9B,GAAG;AAAA,EACP;AACJ;AAOO,SAAS,uBAAuB,aAAqB,IAAI,WAAiD;AAC7G,SAAO;AAAA,IACH,aAAa;AAAA,IACb,UAAU,KAAK,IAAI;AAAA,IACnB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS,IAAI,MAAM,UAAU,EAAE,KAAK,IAAI;AAAA,IACxC,eAAe;AAAA,IACf,YAAY,CAAC;AAAA,IACb,GAAG;AAAA,EACP;AACJ;AAOO,SAAS,uBAAuB,WAAmB,WAAqC;AAE3F,QAAM,UAAqB,oBAAoB;AAE/C,SAAO;AAAA,IACH,OAAO;AAAA,IACP,OAAO,YAAY;AAAA,IACnB,OAAO,EAAE,OAAO,YAAY,EAAE;AAAA,IAC9B,KAAK;AAAA,IACL,SAAS;AAAA,MACL,OAAO;AAAA,MACP,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,SAASC,IAAG,GAAG;AAAA,MACf,UAAUA,IAAG,GAAG;AAAA,MAChB,mBAAmBA,IAAG,GAAG;AAAA,MACzB,oBAAoBA,IAAG,GAAG;AAAA,MAC1B,mBAAmBA,IAAG,GAAG;AAAA,MACzB,qBAAqBA,IAAG,GAAG;AAAA,MAC3B,mBAAmBA,IAAG,GAAG;AAAA,IAC7B;AAAA;AAAA,IACA,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,cAAc,CAAC;AAAA,IACf,QAAQ,CAAC;AAAA,IACT,WAAW;AAAA,IACX,oBAAoB,CAAC;AAAA,IACrB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,SAAS,SAAS;AAAA,IACxB,cAAc;AAAA,IACd,UAAU,IAAI,WAAW,CAAC;AAAA,IAC1B,cAAc;AAAA,IACd,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc,CAAC;AAAA,IACf,aAAa,CAAC;AAAA,IACd,eAAe;AAAA,IACf,cAAc,CAAC;AAAA,IACf,SAAS;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAC3B,aAAa;AAAA,MACb,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,IACjB;AAAA,IACA,GAAG;AAAA,EACP;AACJ;AAqBO,SAAS,iBAAiB,WAA6C;AAC1E,SAAO;AAAA,IACH,OAAOA,IAAG,GAAG,EAAE,kBAAkB,MAAS;AAAA,IAC1C,MAAMA,IAAG,GAAG;AAAA,IACZ,WAAWA,IAAG,GAAG;AAAA,IACjB,SAASA,IAAG,GAAG;AAAA,IACf,cAAcA,IAAG,GAAG;AAAA,IACpB,YAAYA,IAAG,GAAG;AAAA,IAClB,WAAWA,IAAG,GAAG,EAAE,kBAAkB,MAAS;AAAA,IAC9C,GAAG;AAAA,EACP;AACJ;;;AC7IA,SAAiB,eAAAC,oBAAmB;AAgB7B,IAAK,iBAAL,kBAAKC,oBAAL;AACH,EAAAA,gCAAA,UAAO,KAAP;AACA,EAAAA,gCAAA,eAAY,KAAZ;AACA,EAAAA,gCAAA,aAAU,KAAV;AACA,EAAAA,gCAAA,UAAO,KAAP;AACA,EAAAA,gCAAA,YAAS,KAAT;AALQ,SAAAA;AAAA,GAAA;AAqCL,SAAS,kBAAkB,MAAwB;AACtD,SAAO,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AACtD,QAAI,UAAU,QAAW;AACrB,aAAO,GAAG,GAAG,KAAK,GAAG,KAAK,KAAK;AAAA,IACnC;AACA,WAAO;AAAA,EACX,GAAG,EAAE;AACT;AAMO,SAAS,mBAAmB,WAAyC;AACxE,SAAO;AAAA,IACH,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,GAAG;AAAA,EACP;AACJ;AAOO,SAAS,qBAAqB,QAAqBC,aAAY,WAAW,WAAqC;AAClH,SAAO,uBAAuB,GAAG;AAAA,IAC7B;AAAA,IACA,UAAU,kBAAkB,mBAAmB,CAAC;AAAA,IAChD,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI,GAAM;AAAA,IAC5C,GAAG;AAAA,EACP,CAAC;AACL;AAMO,SAAS,oBAAoB,QAAwB,cAAgC;AACxF,SAAO;AAAA,IACH;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK;AAAA,EAC3C;AACJ;AASA,eAAsB,kBAAkB,QAAgB,QAA+B;AAGnF,QAAM,YAAY,KAAK,MAAM,KAAK,OAAO,IAAI,GAAM;AACnD,SAAO,YAAY;AAKnB,MAAI,UAAU,OAAO,SAAS;AAAA,EAE9B;AAGA,SAAO,QAAQA,aAAY;AAQ3B,SAAO,QAAQA,aAAY;AAE3B,SAAO;AACX;;;AC1IA,SAAS,MAAAC,WAAU;AAmBZ,SAAS,wBAAwB,WAA2D;AAC/F,QAAM,eAAyB,CAAC;AAChC,QAAM,gBAA0B,CAAC;AAEjC,SAAO;AAAA,IACH,MAAMA,IAAG,GAAG,CAAC,QAAgB;AACzB,oBAAc,KAAK,GAAG;AACtB,aAAO,aAAa,GAAG;AAAA,IAC3B,CAAC;AAAA,IACD,OAAOA,IAAG,GAAG,CAAC,SAAiB;AAC3B,mBAAa,KAAK,IAAI;AAAA,IAC1B,CAAC;AAAA,IACD,WAAWA,IAAG,GAAG,CAAC,SAAiB;AAC/B,mBAAa,KAAK,cAAc,IAAI,EAAE;AAAA,IAC1C,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACP;AACJ;AAmBO,SAAS,qBAAqB,WAAmB,IAAoB;AACxE,SAAO;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,cAAc;AAAA,IACd,SAASA,IAAG,GAAG,OAAO,SAAS,MAAM,QAAQ;AACzC,aAAO,QAAQ;AAAA,IACnB,CAAC;AAAA,IACD,aAAaA,IAAG,GAAG,OAAO,QAAQ;AAC9B,aAAO,sBAAsB,GAAG;AAAA,IACpC,CAAC;AAAA,IACD,YAAYA,IAAG,GAAG;AAAA,EACtB;AACJ;AAQO,SAAS,sBAAsB,QAAa,SAAyB;AAGxE,MAAI,OAAO,eAAe;AACtB,WAAO,cAAc,OAAO;AAC5B,WAAO;AAAA,EACX;AAGA,MAAI,OAAO,MAAM;AACb,WAAO,OAAO,KAAK,OAAO;AAAA,EAC9B;AAEA,SAAO;AACX;;;AC9DO,SAAS,uBAAuB,YAAmC,CAAC,GAAiB;AAC1F,QAAM,UAAU,oBAAI,IAAwB;AAE5C,SAAO;AAAA,IACL,gBAAgB,OAAO,SAAuC;AAC5D,cAAQ,IAAI,KAAK,SAAS,IAAI;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,WAAW,OAAO,kBAA4C;AAC5D,aAAO,QAAQ,IAAI,aAAa;AAAA,IAClC;AAAA,IACA,eAAe,OAAO,WAAqD;AACzE,UAAI,OAAO,MAAM,KAAK,QAAQ,OAAO,CAAC;AAEtC,UAAI,QAAQ;AACV,YAAI,OAAO,UAAU;AACnB,iBAAO,KAAK,OAAO,OAAK,EAAE,aAAa,OAAO,QAAQ;AAAA,QACxD;AACA,YAAI,OAAO,KAAK;AACd,iBAAO,KAAK,OAAO,OAAK,EAAE,QAAQ,OAAO,GAAG;AAAA,QAC9C;AACA,YAAI,OAAO,UAAU;AACnB,iBAAO,KAAK,OAAO,OAAK,EAAE,UAAU,CAAC;AAAA,QACvC;AACA,YAAI,OAAO,SAAS;AAClB,iBAAO,KAAK,OAAO,OAAK,EAAE,UAAU,EAAE,UAAU;AAAA,QAClD;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAMO,SAAS,qBAAqB,YAAiC,CAAC,GAAe;AACpF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,GAAG;AAAA,EACL;AACF;AAOA,eAAsB,2BAA2B,QAAa,QAAwC;AACpG,QAAM,OAAO,qBAAqB;AAAA,IAChC,MAAM,OAAO,QAAQ;AAAA,IACrB,KAAK,OAAO,WAAW;AAAA,IACvB,SAAS,OAAO,UAAU,OAAO,QAAQ,OAAO,CAAC,MAAqB,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS;AAAA,IAClG,YAAY,OAAO,cAAc;AAAA,EACnC,CAAC;AAED,SAAO,OAAO,eAAe,IAAI;AACnC;;;AChGA,SAAS,MAAAC,WAAU;AAiBZ,SAAS,+BAA+B,WAAyE;AACpH,SAAO;AAAA,IACH,OAAOA,IAAG,GAAG,EAAE,gBAAgB;AAAA,MAC3B,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAC3B,UAAU;AAAA,IACd,CAAC;AAAA,IACD,MAAMA,IAAG,GAAG;AAAA,IACZ,QAAQA,IAAG,GAAG;AAAA,IACd,sBAAsBA,IAAG,GAAG,EAAE,gBAAgB,CAAC,CAAC;AAAA,IAChD,GAAG;AAAA,EACP;AACJ;;;AC/BA,SAAyB,eAAAC,oBAA8C;AAwBhE,SAAS,8BAA8B,aAAqB,GAAwB;AACvF,QAAM,aAAa,sBAAsB;AACzC,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAE5B,QAAM,SAA4B;AAAA,IAC9B,GAAG;AAAA,IACH,SAAS,IAAI,MAAM,UAAU,EAAE,KAAK,IAAI;AAAA,IACxC,UAAU,CAAC;AAAA,EACf;AAEA,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AAEjC,UAAM,SAAS,uBAAuB,GAAG;AAAA,MACrC,OAAOC,aAAY;AAAA,MACnB,UAAU,kBAAkB,mBAAmB,EAAE,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;AAAA,IAC1E,CAAC;AAGD,UAAM,SAAS;AAAA,MACX,WAAW;AAAA,MACX,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,IAAI,EAAE;AAAA,MACjD;AAAA,IACJ;AAEA,WAAO,QAAQ;AACf,WAAO,QAAQ,CAAC,IAAI;AACpB,YAAQ,KAAK,MAAM;AACnB,aAAS,KAAK,MAAM;AAAA,EACxB;AAGA,SAAO,WAAW;AAElB,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAOA,eAAsB,mBAAmB,QAA2B,UAA+C;AAE/G,QAAM,QAAQ,OAAO,QAAQ,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,UAAUA,aAAY,IAAI;AAChF,MAAI,UAAU,IAAI;AACd,UAAM,IAAI,MAAM,aAAa;AAAA,EACjC;AAEA,QAAM,SAAS,uBAAuB,OAAO;AAAA,IACzC,OAAOA,aAAY;AAAA,IACnB,UAAU,kBAAkB,mBAAmB,QAAQ,CAAC;AAAA,EAC5D,CAAC;AAED,SAAO,QAAQ,KAAK,IAAI;AAGxB,SAAO,QAAQA,aAAY;AAG3B,QAAM,SAAS;AAAA,IACX,WAAW;AAAA,IACX,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,QAAQ,EAAE;AAAA,IACrD;AAAA,EACJ;AACA,SAAO,QAAQ;AAGf,MAAI,OAAO,YAAY,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAEnD,IAAC,OAAO,SAAsB,QAAQ,CAAC,IAAI;AAAA,EAC/C;AAEA,SAAO;AACX;AAOO,SAAS,oBAAoB,QAA2B,WAAyB;AACpF,QAAM,SAAS,OAAO,QAAQ,SAAS;AACvC,MAAI,QAAQ;AACR,WAAO,QAAQA,aAAY;AAC3B,WAAO,QAAQ;AAAA,EACnB;AACJ;AAOO,SAAS,mBAAmB,QAA2B,YAAoB,KAAW;AACzF,SAAO,QAAQ;AACf,SAAO;AAIP,SAAO,QAAQ,QAAQ,CAAC,WAA0B;AAC9C,QAAI,UAAU,OAAO,UAAUA,aAAY,QAAQ;AAAA,IAEnD;AAAA,EACJ,CAAC;AACL;AAOO,SAAS,oBAAoB,QAAgB,OAAmC;AACnF,QAAM,MAAmB;AAAA,IACrB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,IAC3B,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU,OAAO,QAAQ,WAAW;AAAA,IACpC,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,GAAG;AAAA,EACP;AAEA,SAAO,UAAU;AACjB,SAAO,aAAa,KAAK,GAAG;AAC5B,SAAO;AACX;;;ACpIO,SAAS,qBAAqB,aAAqB,WAA6B;AAEnF,QAAM,kBAAiC,CAAC;AAIxC,MAAI,YAAY,WAAW;AACvB,gBAAY,UAAU,QAAQ,CAAC,KAAyB,UAAkB;AACtE,UAAI,OAAO,UAAU,YAAY,GAAG;AAChC,wBAAgB,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,MACnC;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACH,YAAY,YAAY;AAAA,IACxB,aAAa;AAAA,MACT,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAC3B,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAC/B,SAAS;AAAA,IACb;AAAA,IACA,UAAU;AAAA,EACd;AACJ;AAOO,SAAS,oBAAoB,aAAuB,aAAsC;AAC7F,QAAM,gBAA+B,CAAC;AACtC,QAAM,kBAA4B,CAAC;AAEnC,QAAM,SAAS,IAAI,IAAI,YAAY,SAAS,IAAI,OAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnE,QAAM,SAAS,IAAI,IAAI,YAAY,SAAS,IAAI,OAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAGnE,cAAY,SAAS,QAAQ,YAAU;AACnC,UAAM,SAAS,OAAO,IAAI,OAAO,MAAM;AACvC,QAAI,CAAC,QAAQ;AAET,oBAAc,KAAK,MAAM;AAAA,IAC7B,WAAW,KAAK,UAAU,MAAM,MAAM,KAAK,UAAU,MAAM,GAAG;AAE1D,oBAAc,KAAK,MAAM;AAAA,IAC7B;AAAA,EACJ,CAAC;AAGD,cAAY,SAAS,QAAQ,YAAU;AACnC,QAAI,CAAC,OAAO,IAAI,OAAO,MAAM,GAAG;AAC5B,sBAAgB,KAAK,OAAO,MAAM;AAAA,IACtC;AAAA,EACJ,CAAC;AAED,SAAO;AAAA,IACH,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACJ;AACJ;AAMO,SAAS,0BAA0B,WAA0C;AAChF,QAAM,SAA4B,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE;AAE5D,MAAI,UAAU,SAAS,EAAG,QAAO;AAEjC,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACvC,UAAM,OAAO,UAAU,IAAE,CAAC;AAC1B,UAAM,OAAO,UAAU,CAAC;AAExB,QAAI,KAAK,cAAc,KAAK,YAAY;AACpC,aAAO,QAAQ;AACf,aAAO,OAAO,KAAK,YAAY,CAAC,aAAa,KAAK,UAAU,YAAY,KAAK,UAAU,EAAE;AAAA,IAC7F;AAAA,EACJ;AAEA,SAAO;AACX;AAOA,eAAsB,yBAAyB,UAAoB,cAAsB,GAA+B;AACpH,MAAI,KAAK,OAAO,IAAI,aAAa;AAC7B,WAAO;AAAA,EACX;AACA,SAAO;AACX;;;AC3FO,SAAS,sBAAsB,gBAAqC;AACzE,MAAI,SAAS;AACb,QAAM,YAAY;AAClB,MAAI,QAAQ;AAEZ,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAwB;AAC5B,UAAI,UAAU,OAAO;AACnB,kBAAU;AACV,iBAAS;AACT,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,OAAO,cAA4B;AACjC,gBAAU,iBAAiB;AAC3B,UAAI,SAAS,WAAW;AACtB,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,QAAc;AACZ,eAAS;AACT,cAAQ;AAAA,IACV;AAAA,IACA,WAAmB;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAQO,SAAS,uBAAuB,UAAqB,WAA8B;AACxF,QAAM,UAAU,sBAAsB,SAAS;AAC/C,QAAM,SAAoB,CAAC;AAC3B,MAAI,WAAW,SAAS,SAAS,IAAI,SAAS,CAAC,EAAE,YAAY;AAE7D,aAAW,OAAO,UAAU;AAC1B,UAAM,SAAS,IAAI,YAAY,YAAY;AAC3C,QAAI,QAAQ,GAAG;AACb,cAAQ,OAAO,KAAK;AAAA,IACtB;AACA,eAAW,IAAI;AAEf,QAAI,QAAQ,MAAM,IAAI,IAAI,GAAG;AAC3B,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,oBAAoB,UAA+B;AACjE,MAAI,OAAO;AAGX,UAAQ,SAAS;AAIjB,UAAQ;AAIR,UAAQ,SAAS,SAAS,SAAS;AAEnC,SAAO;AACT;AAOO,SAAS,4BAA4B,WAAmB,YAAuC;AACpG,QAAM,UAAoB,CAAC;AAK3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,EAClB;AACF;;;AC9HA,SAAS,aAAa;AACtB,SAAS,QAAQ,OAAO,iBAAiB;AACzC,OAAO;;;ACgBA,SAAS,wBAAwB,KAAa,OAA4B,WAAW,YAA0B,CAAC,GAAkB;AACvI,SAAO,IAAI,cAAc,MAAM;AAAA,IAC7B;AAAA,IACA,MAAM;AAAA;AAAA,IACN,SAAS,UAAU;AAAA,IACnB,QAAQ,UAAU;AAAA,IAClB,UAAU,UAAU;AAAA,IACpB,SAAS,UAAU;AAAA,IACnB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAM;AAAA,EACR,CAAC;AACH;AAKO,SAAS,qBAAqB,MAAc,UAA0B,CAAC,GAAe;AAC3F,QAAM,QAAQ,IAAI,WAAW,MAAM;AAAA,IACjC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,GAAG;AAAA,EACL,CAAC;AAGD,MAAI,QAAQ,cAAc,QAAW;AACnC,WAAO,eAAe,OAAO,aAAa,EAAE,OAAO,QAAQ,UAAU,CAAC;AAAA,EACxE;AACA,MAAI,QAAQ,cAAc,QAAW;AACnC,WAAO,eAAe,OAAO,aAAa,EAAE,OAAO,QAAQ,UAAU,CAAC;AAAA,EACxE;AAEA,SAAO;AACT;AAKO,SAAS,qBAAqB,SAAiB,GAAG,SAAiB,GAAe;AACvF,SAAO,IAAI,WAAW,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,MAAM;AAAA,EACR,CAAC;AACH;AAMO,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YAAY,MAAgB,UAAU;AACpC,SAAK,OAAO;AACZ,SAAK,MAAM;AAAA,EACb;AAAA,EAEQ,QAAQ;AAEd,QAAK,KAAK,KAAa,2BAA4B;AAEnD,QAAI,sBAAsC;AAC1C,UAAM,MAAM,KAAK;AAGjB,WAAO,eAAe,KAAK,sBAAsB;AAAA,MAC/C,KAAK,MAAM;AAAA,MACX,cAAc;AAAA,IAChB,CAAC;AAGD,QAAI,kBAAkB,MAAM;AAC1B,UAAI,qBAAqB;AACvB,8BAAsB;AACtB,YAAI,cAAc,IAAI,MAAM,mBAAmB,CAAC;AAAA,MAClD;AAAA,IACF;AAIA,QAAI,CAAE,OAAO,YAAY,UAAkB,8BAA8B;AACrE,MAAC,OAAO,YAAY,UAAkB,+BAAgC,OAAO,YAAY,UAAkB;AAAA,IAC/G;AAEA,IAAC,OAAO,YAAY,UAAkB,qBAAqB,WAAW;AAClE,4BAAsB;AACtB,UAAI,cAAc,IAAI,MAAM,mBAAmB,CAAC;AAAA,IACpD;AAEA,IAAC,IAAY,6BAA6B;AAAA,EAC5C;AAAA,EAEA,IAAI,UAA0B;AAC5B,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,SAAkB;AACpB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQ,SAAsB;AAC5B,YAAQ,mBAAmB;AAAA,EAC7B;AAAA,EAEA,OAAO;AACL,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AAAA,EAEA,WAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,MAAgB,UAAkB,MAAc,QAAQ;AAAxD;AAAkC;AAAA,EAAuB;AAAA,EAE7E,QAAQ,KAAa,MAAe,WAA0B;AAC5D,UAAM,QAAQ,wBAAwB,KAAK,WAAW,SAAS;AAC/D,QAAI,MAAM;AACR,aAAO,eAAe,OAAO,QAAQ,EAAE,OAAO,KAAK,CAAC;AAAA,IACtD;AACA,SAAK,IAAI,cAAc,KAAK;AAAA,EAC9B;AAAA,EAEA,MAAM,KAAa,MAAe,WAA0B;AAC1D,UAAM,QAAQ,wBAAwB,KAAK,SAAS,SAAS;AAC7D,QAAI,MAAM;AACR,aAAO,eAAe,OAAO,QAAQ,EAAE,OAAO,KAAK,CAAC;AAAA,IACtD;AACA,SAAK,IAAI,cAAc,KAAK;AAAA,EAC9B;AAAA,EAEA,UAAU,WAAmB,WAAmB,UAAU,GAAG,UAAU,GAAG;AACxE,UAAM,QAAQ,qBAAqB,aAAa;AAAA,MAC9C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,SAAK,iBAAiB,KAAK;AAAA,EAC7B;AAAA,EAEA,YAAY,QAAgB,QAAuB,QAAQ;AACzD,QAAI,UAAU,QAAQ;AACpB,WAAK,UAAU,MAAM;AAAA,IACvB,OAAO;AACL,WAAK,QAAQ,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,UAAU,SAAiB,GAAG;AAC5B,UAAM,QAAQ,qBAAqB,aAAa,EAAE,OAAO,CAAC;AAC1D,SAAK,iBAAiB,KAAK;AAAA,EAC7B;AAAA,EAEA,QAAQ,SAAiB,GAAG;AAC1B,UAAM,QAAQ,qBAAqB,WAAW,EAAE,OAAO,CAAC;AACxD,SAAK,iBAAiB,KAAK;AAAA,EAC7B;AAAA,EAEA,WAAW,QAAgB;AACvB,UAAM,QAAQ,qBAAqB,GAAG,MAAM;AAC5C,SAAK,iBAAiB,KAAK;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,QAAgB;AAClB,SAAK,WAAW,MAAM;AAAA,EAC1B;AAAA,EAEQ,iBAAiB,OAAc;AACrC,UAAM,SAAS,KAAK,IAAI,sBAAsB,KAAK;AACnD,WAAO,cAAc,KAAK;AAAA,EAC5B;AACF;AAKO,SAAS,sBAAsB,SAAwC;AAC5E,QAAM,OAAO,IAAI,gBAAgB;AACjC,MAAI,SAAS;AACX,SAAK,QAAQ,OAAO;AAAA,EACtB;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,QAAqC;AAGvE,QAAM,MAAO,kBAAkB,WAAY,SAAS;AACpD,QAAM,MAAO,IAAI,cAAe,IAAI,cAAc;AAClD,SAAO,IAAI,cAAc,KAAK,GAAG;AACnC;;;AC7NA,SAAS,MAAAC,YAAU;AAWZ,IAAM,6BAAN,MAAiC;AAAA,EAkEtC,YAAY,QAA4B;AAjExC,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,QAAQ;AACjB,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAC5B,SAAS,8BAA8B;AACvC,SAAS,WAAW;AACpB,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,SAAS;AAClB,SAAS,UAAU;AACnB,SAAS,gBAAgB;AACzB,SAAS,OAAO;AAChB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,QAAQ;AACjB,SAAS,YAAY;AACrB,SAAS,sBAAsB;AAC/B,SAAS,MAAM;AACf,SAAS,OAAO;AAChB,SAAS,SAAS;AAClB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAClC,SAAS,eAAe;AAGxB;AAAA,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAM5B,SAAQ,gBAAgB;AACxB,SAAQ,iBAAiB;AAEzB,2BAAkB;AAClB,wBAAe;AACf,yBAAgB;AAChB,0BAAiB;AAEjB,SAAS,aAAa,oBAAI,IAAqB;AAC/C,SAAS,QAAkB,CAAC;AAC5B,SAAS,mBAAmB,oBAAI,IAAyC;AACzE,SAAS,qBAAqB,oBAAI,IAAoB;AActD,kBAASA,KAAG,GAAG,CAAC,QAAgB,KAAK,MAAM,KAAK,UAAU,GAAG,EAAE,CAAC;AAChE,mBAAUA,KAAG,GAAG,CAAC,QAAgB,KAAK,MAAM,KAAK,WAAW,GAAG,EAAE,CAAC;AAClE,qBAAYA,KAAG,GAAG,CAAC,SAAiB,KAAK,MAAM,KAAK,aAAa,IAAI,EAAE,CAAC;AACxE,oBAAWA,KAAG,GAAG,CAAC,SAAiB,KAAK,MAAM,KAAK,YAAY,IAAI,EAAE,CAAC;AACtE,qBAAYA,KAAG,GAAG,CAAC,SAAoB,KAAK,MAAM,KAAK,aAAa,IAAI,EAAE,CAAC;AAC3E,6BAAoBA,KAAG;AAAA,MAAG,CAAC,QAAgB,QAAgB,UAAkB,aAC3E,KAAK,MAAM,KAAK,qBAAqB,MAAM,IAAI,MAAM,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAAA,IACjF;AACA,qBAAYA,KAAG,GAAG,CAAC,SAAiB,YAAoB,KAAK,MAAM,KAAK,aAAa,OAAO,IAAI,OAAO,EAAE,CAAC;AAC1G,wBAAeA,KAAG,GAAG,CAAC,SAAiB,KAAK,WAAW,IAAI,IAAI,KAAK,IAAI;AACxE,oBAAWA,KAAG,GAAG,CAAC,GAAW,GAAW,GAAW,MAAc,KAAK,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAChH,iBAAQA,KAAG,GAAG,CAAC,SAAiB,KAAK,MAAM,KAAK,SAAS,IAAI,EAAE,CAAC;AAChE,sBAAaA,KAAG,GAAG,CAAC,GAAW,GAAW,GAAW,MAAc,KAAK,MAAM,KAAK,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAEpH,wBAAeA,KAAG,GAAG,CAAC,UAAkB,EAAE,IAAI,EAAE,KAAK,eAAe,KAAK,EAA4B;AACrG,wBAAeA,KAAG,GAAG,CAAC,QAAsB,WAAmB,KAAK,MAAM,KAAK,gBAAgB,OAAO,EAAE,IAAI,MAAM,EAAE,CAAC;AACrH,yBAAgBA,KAAG,GAAG,CAAC,WAAyB,KAAK,MAAM,KAAK,iBAAiB,OAAO,EAAE,EAAE,CAAC;AAC7F,8BAAqBA,KAAG;AAAA,MAAG,CAAC,QAAsB,UAChD,UAAU,KAAK,iBAAiB,KAAK,kBAAkB;AAAA,IACzD;AACA,4BAAmBA,KAAG,GAAG,MAAO,KAAK,kBAAkB,KAAK,KAAK,aAAc;AAC/E,wBAAeA,KAAG,GAAG,CAAC,WAAyB,KAAK,MAAM,KAAK,gBAAgB,OAAO,EAAE,EAAE,CAAC;AAE3F,yBAAgBA,KAAG,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,eAAe,EAA6B;AACtF,wBAAeA,KAAG;AAAA,MAAG,CAAC,SAAwB,WAC5C,KAAK,MAAM,KAAK,UAAU,QAAQ,EAAE,IAAI,OAAO,EAAE,EAAE;AAAA,IACrD;AACA,8BAAqBA,KAAG;AAAA,MAAG,CAAC,SAAwB,OAAe,SACjE,KAAK,MAAM,KAAK,sBAAsB,QAAQ,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,IACrE;AACA,uBAAcA,KAAG,GAAG,CAAC,YAA2B,KAAK,MAAM,KAAK,QAAQ,QAAQ,EAAE,EAAE,CAAC;AACrF,+BAAsBA,KAAG;AAAA,MAAG,CAAC,SAAwB,UACnD,UAAU,KAAK,cAAc,KAAK,eAAe;AAAA,IACnD;AACA,6BAAoBA,KAAG,GAAG,MAAO,KAAK,eAAe,KAAK,KAAK,cAAe;AAC9E,yBAAgBA,KAAG,GAAG,CAAC,YAA2B,KAAK,MAAM,KAAK,iBAAiB,QAAQ,EAAE,EAAE,CAAC;AAChG,sBAAaA,KAAG,GAAG,CAAC,YAAkC,KAAK,MAAM,KAAK,cAAc,SAAS,MAAM,MAAM,EAAE,CAAC;AAC5G,8BAAqBA,KAAG,GAAG,CAAC,SAAwB,SAAiB;AACnE,WAAK,MAAM,KAAK,sBAAsB,QAAQ,EAAE,IAAI,IAAI,EAAE;AAC1D,aAAO,KAAK,iBAAiB,IAAI,IAAI,KAAK;AAAA,IAC5C,CAAC;AACD,6BAAoBA,KAAG,GAAG,CAAC,SAAwB,SAAiB;AAClE,WAAK,MAAM,KAAK,qBAAqB,QAAQ,EAAE,IAAI,IAAI,EAAE;AACzD,aAAO,KAAK,mBAAmB,IAAI,IAAI,KAAK;AAAA,IAC9C,CAAC;AAED,wBAAeA,KAAG,GAAG,OAAO,EAAE,QAAQ,CAAC,EAAE,EAA4B;AACrE,sBAAaA,KAAG,GAAG,CAAC,QAAgB,WAA+B,KAAK,MAAM,KAAK,cAAc,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AACtH,sBAAaA,KAAG;AAAA,MAAG,CAAC,QAAgB,MAA6B,UAC/D,KAAK,MAAM,KAAK,cAAc,MAAM,IAAI,KAAK,IAAI,OAAO,SAAS,WAAW,OAAO,MAAM,EAAE;AAAA,IAC7F;AACA,yBAAgBA,KAAG;AAAA,MAAG,CAAC,QAAgB,QAAgB,SACrD,KAAK,MAAM,KAAK,iBAAiB,MAAM,IAAI,MAAM,IAAI,KAAK,cAAc,KAAK,EAAE;AAAA,IACjF;AACA,wBAAeA,KAAG,GAAG,CAAC,WAAwB,KAAK,MAAM,KAAK,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC;AAEzF,6BAAoBA,KAAG,GAAG,OAAO,EAAE,KAAK,CAAC,EAAE,EAAuC;AAClF,2BAAkBA,KAAG,GAAG,CAAC,QAAuC,KAAK,MAAM,KAAK,mBAAmB,CAAC,CAAC,GAAG,EAAE,CAAC;AAC3G,mCAA0BA,KAAG,GAAG,CAAC,UAAkB,KAAK,MAAM,KAAK,gBAAgB,KAAK,EAAE,CAAC;AAC3F,+BAAsBA,KAAG;AAAA,MACvB,CAAC,OAAe,MAAc,MAAc,YAAqB,QAAgB,WAC/E,KAAK,MAAM,KAAK,uBAAuB,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,EAAE;AAAA,IACpG;AACA,+BAAsBA,KAAG,GAAG,CAAC,OAAe,YAAoB,KAAK,MAAM,KAAK,WAAW,KAAK,IAAI,OAAO,EAAE,CAAC;AAC9G,6BAAoBA,KAAG,GAAG,CAAC,QAAgC,KAAK,MAAM,KAAK,qBAAqB,CAAC,CAAC,GAAG,EAAE,CAAC;AAExG,yBAAgBA,KAAG,GAAG,OAAO,EAAE,SAAS,CAAC,EAAE,EAA6B;AACxE,yBAAgBA,KAAG,GAAG,CAAC,SAAiB,KAAK,MAAM,KAAK,iBAAiB,IAAI,EAAE,CAAC;AAChF,uBAAcA,KAAG,GAAG,CAAC,QAAgB,YAAiC,KAAK,MAAM,KAAK,eAAe,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC3H,yBAAgBA,KAAG;AAAA,MAAG,CAAC,QAAgB,OAAe,UACpD,KAAK,MAAM,KAAK,iBAAiB,MAAM,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,IAC7D;AACA,sBAAaA,KAAG;AAAA,MACd,CACE,QACA,OACA,gBACA,OACA,QACA,QACA,QACA,MACA,WAEA,KAAK,MAAM;AAAA,QACT,cAAc,MAAM,IAAI,KAAK,IAAI,cAAc,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,IAAI,IAAI,SAAS,SAAS,MAAM;AAAA,MAC5H;AAAA,IACJ;AACA,sBAAaA,KAAG,GAAG;AACnB;AAAA,yBAAgBA,KAAG,GAAG,CAAC,YAA0B,KAAK,MAAM,KAAK,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC;AAE9F,6BAAoBA,KAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,EAAiC;AAC3E,2BAAkBA,KAAG;AAAA,MAAG,CAAC,QAAgB,gBACvC,KAAK,MAAM,KAAK,mBAAmB,MAAM,IAAI,CAAC,CAAC,WAAW,EAAE;AAAA,IAC9D;AACA,gCAAuBA,KAAG;AAAA,MACxB,CAAC,QAAgB,YAAoB,WAAmB,SAA8B,UACpF,KAAK,MAAM,KAAK,wBAAwB,MAAM,IAAI,UAAU,IAAI,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,EAAE;AAAA,IACrG;AACA,6BAAoBA,KAAG,GAAG,CAAC,OAAyB,KAAK,MAAM,KAAK,qBAAqB,CAAC,CAAC,EAAE,EAAE,CAAC;AAChG,kCAAyBA,KAAG,GAAG,CAAC,WAAmB,KAAK,oBAAoB;AAE5E,8BAAqBA,KAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,EAAkC;AAC7E,4BAAmBA,KAAG;AAAA,MAAG,CAAC,QAAgB,iBACtC,KAAK,MAAM,KAAK,oBAAoB,MAAM,IAAI,CAAC,CAAC,YAAY,EAAE;AAAA,IAClE;AACA,+BAAsBA,KAAG;AAAA,MAAG,CAAC,QAAgB,gBAAwB,OAAgB,WACjF,KAAK,MAAM,KAAK,uBAAuB,MAAM,IAAI,cAAc,IAAI,KAAK,IAAI,MAAM,EAAE;AAAA,IACxF;AACA,mCAA0BA,KAAG;AAAA,MAAG,CAAC,QAAgB,YAAoB,oBAA4B,iBAC7F,KAAK,MAAM,KAAK,2BAA2B,MAAM,IAAI,UAAU,IAAI,kBAAkB,IAAI,CAAC,CAAC,YAAY,EAAE;AAAA,IAC7G;AACA,8BAAqBA,KAAG,GAAG,CAAC,OAA0B,KAAK,MAAM,KAAK,sBAAsB,CAAC,CAAC,EAAE,EAAE,CAAC;AAEnG,sBAAaA,KAAG;AAAA,MAAG,CAAC,MAAc,OAAc,UAC9C,KAAK,MAAM,KAAK,cAAc,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE;AAAA,IACxD;AAEA,wBAAeA,KAAG;AAAA,MAAG,CAAC,MAAc,OAAgB,MAAc,WAChE,KAAK,MAAM,KAAK,gBAAgB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,EAAE;AAAA,IACnE;AAGA;AAAA,uBAAcA,KAAG,GAAG,OAAO,CAAC,EAAgB;AAC5C,sBAAaA,KAAG,GAAG;AACnB,oBAAWA,KAAG,GAAG;AACjB,uBAAcA,KAAG,GAAG;AACpB,6BAAoBA,KAAG,GAAG;AAC1B,wBAAeA,KAAG,GAAG;AAErB,qBAAYA,KAAG;AAAA,MAAG,CAAC,UAAuC,MACxD,KAAK,MAAM,KAAK,aAAa,WAAW,QAAQ,MAAM,IAAI,CAAC,EAAE;AAAA,IAC/D;AACA,qBAAYA,KAAG;AAAA,MAAG,CAAC,UAAuC,MACxD,KAAK,MAAM,KAAK,aAAa,WAAW,QAAQ,MAAM,IAAI,CAAC,EAAE;AAAA,IAC/D;AACA,qBAAYA,KAAG;AAAA,MAAG,CAAC,UAAuC,GAAY,GAAY,GAAY,MAC5F,KAAK,MAAM,KAAK,aAAa,WAAW,QAAQ,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAAA,IAC9E;AACA,sBAAaA,KAAG;AAAA,MAAG,CAAC,UAAuC,SACzD,KAAK,MAAM,KAAK,cAAc,WAAW,QAAQ,MAAM,IAAI,MAAM,KAAK,IAAwB,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,IAC7G;AACA,qBAAYA,KAAG;AAAA,MAAG,CAAC,UAAuC,GAAY,GAAY,MAChF,KAAK,MAAM,KAAK,aAAa,WAAW,QAAQ,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAAA,IACzE;AACA,qBAAYA,KAAG;AAAA,MAAG,CAAC,UAAuC,GAAY,MACpE,KAAK,MAAM,KAAK,aAAa,WAAW,QAAQ,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;AAAA,IACpE;AACA,sBAAaA,KAAG;AAAA,MAAG,CAAC,UAAuC,SACzD,KAAK,MAAM,KAAK,cAAc,WAAW,QAAQ,MAAM,IAAI,MAAM,KAAK,IAAwB,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,IAC7G;AACA,4BAAmBA,KAAG;AAAA,MACpB,CAAC,UAAuC,WAAsB,SAC5D,KAAK,MAAM,KAAK,oBAAoB,WAAW,QAAQ,MAAM,IAAI,SAAS,IAAI,MAAM,KAAK,IAAwB,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,IAClI;AAEA,+BAAsBA,KAAG,GAAG;AAE5B,yBAAgBA,KAAG,GAAG,MAAM,KAAK;AAzK/B,QAAI,QAAQ;AACV,WAAK,SAAS;AACd,WAAK,qBAAqB,OAAO;AACjC,WAAK,sBAAsB,OAAO;AAAA,IACpC,OAAO;AACL,WAAK,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AACxC,WAAK,qBAAqB;AAC1B,WAAK,sBAAsB;AAAA,IAC7B;AAAA,EACF;AAiKF;AAEO,SAAS,wBACd,mBAC4B;AAC5B,MAAI;AAEJ,MAAI,6BAA6B,UAAU,WAAW,qBAAqB,YAAY,qBAAqB,gBAAgB,mBAAmB;AAE7I,cAAU,IAAI,2BAA2B,iBAAsC;AAAA,EACjF,OAAO;AACL,cAAU,IAAI,2BAA2B;AACzC,QAAI,mBAAmB;AACrB,aAAO,OAAO,SAAS,iBAAiB;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AACT;;;AFxPO,SAAS,wBAAwB,UAA+B,CAAC,GAAG;AACzE,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,oBAAoB;AAAA,EACtB,IAAI;AAGJ,QAAM,MAAM,IAAI,MAAM,0DAA0D;AAAA,IAC9E;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,SAAO,SAAS,IAAI;AACpB,SAAO,WAAW,IAAI,OAAO;AAG7B,MAAI;AAEF,WAAO,YAAY,IAAI,OAAO;AAAA,EAChC,SAAS,GAAG;AACV,QAAI;AACF,aAAO,eAAe,QAAQ,aAAa;AAAA,QACzC,OAAO,IAAI,OAAO;AAAA,QAClB,UAAU;AAAA,QACV,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,SAAS,IAAI;AACX,cAAQ,KAAK,8CAA8C;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,WAAW,IAAI,OAAO;AAC7B,SAAO,cAAc,IAAI,OAAO;AAChC,SAAO,oBAAoB,IAAI,OAAO;AAGtC,SAAO,QAAQ,IAAI,OAAO;AAC1B,SAAO,cAAc,IAAI,OAAO;AAChC,SAAO,YAAY,IAAI,OAAO;AAC9B,SAAO,aAAa,IAAI,OAAO;AAC/B,SAAO,gBAAgB,IAAI,OAAO;AAClC,SAAO,aAAa,IAAI,OAAO;AAC/B,SAAO,aAAa,IAAI,OAAO;AAC/B,SAAO,aAAa,IAAI,OAAO;AAC/B,SAAO,UAAU,IAAI,OAAO;AAG5B,MAAI;AACA,WAAO,eAAe,IAAI,OAAO;AAAA,EACrC,SAAS,GAAG;AAAA,EAEZ;AAEA,MAAI,CAAC,OAAO,cAAc;AACxB,UAAM,UAAU,oBAAI,IAAoB;AACxC,WAAO,eAAe;AAAA,MACpB,SAAS,CAAC,QAAgB,QAAQ,IAAI,GAAG,KAAK;AAAA,MAC9C,SAAS,CAAC,KAAa,UAAkB,QAAQ,IAAI,KAAK,KAAK;AAAA,MAC/D,YAAY,CAAC,QAAgB,QAAQ,OAAO,GAAG;AAAA,MAC/C,OAAO,MAAM,QAAQ,MAAM;AAAA,MAC3B,KAAK,CAAC,UAAkB,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK,KAAK;AAAA,MAC7D,IAAI,SAAS;AAAE,eAAO,QAAQ;AAAA,MAAM;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,wBAAwB,SAAS,cAAc,KAAK,QAAQ;AAClE,WAAS,gBAAgB,SAAU,SAAiBC,UAAe;AACjE,QAAI,QAAQ,YAAY,MAAM,UAAU;AACtC,YAAM,aAAa,IAAI,OAAO,KAAK,GAAG;AACtC,YAAM,YAAY,sBAAsB,UAAUA,QAAO;AAEzD,aAAO,eAAe,WAAW,SAAS;AAAA,QACxC,KAAK,MAAM,WAAW;AAAA,QACtB,KAAK,CAAC,UAAU;AAAE,qBAAW,QAAQ;AAAA,QAAO;AAAA,QAC5C,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAED,aAAO,eAAe,WAAW,UAAU;AAAA,QACzC,KAAK,MAAM,WAAW;AAAA,QACtB,KAAK,CAAC,UAAU;AAAE,qBAAW,SAAS;AAAA,QAAO;AAAA,QAC7C,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAED,YAAM,qBAAqB,UAAU,WAAW,KAAK,SAAS;AAC9D,gBAAU,aAAa,SAAS,WAAmBA,UAAe;AAChE,YAAI,cAAc,MAAM;AACtB,iBAAO,WAAW,WAAW,MAAMA,QAAO;AAAA,QAC5C;AAEA,YAAI,gBAAgB,cAAc,UAAU;AACzC,iBAAO,wBAAwB,SAA8B;AAAA,QAChE;AAEA,YAAI,cAAc,WAAW,cAAc,UAAU;AACnD,iBAAO,mBAAmB,WAAWA,QAAO;AAAA,QAC9C;AACA,eAAO,WAAW,WAAW,WAAkBA,QAAO;AAAA,MACxD;AAEA,MAAC,UAAkB,eAAe;AAElC,aAAO;AAAA,IACT;AACA,WAAO,sBAAsB,SAASA,QAAO;AAAA,EAC/C;AAEA,MAAI,cAAc;AACd,UAAM,0BAA0B,OAAO,kBAAkB,UAAU;AACnE,WAAO,kBAAkB,UAAU,aAAa,SAC9C,WACAA,UACK;AACL,UAAI,cAAc,UAAU;AAC1B,eAAO,wBAAwB,IAAI;AAAA,MACrC;AAEA,aAAO,wBAAwB,KAAK,MAAM,WAAkBA,QAAO;AAAA,IACrE;AAAA,EACJ;AAEA,SAAO,QAAQ;AACf,SAAO,YAAY;AAEnB,MAAI,OAAO,OAAO,sBAAsB,aAAa;AACnD,WAAO,oBAAoB,eACzB,OACA,UACc;AACd,UAAI,SAAS,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,WAAW,UAAU;AAChF,cAAMC,UAAS,IAAI,OAAO,MAAM,OAAO,MAAM,MAAM;AACnD,cAAM,MAAMA,QAAO,WAAW,IAAI;AAClC,YAAI,MAAM,MAAM;AACb,cAAI,aAAa,OAAc,GAAG,CAAC;AAAA,QACtC;AACA,eAAOA;AAAA,MACT;AACA,YAAM,SAAS,IAAI,OAAO,KAAK,GAAG;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,SAAS,aAAa;AACtC,WAAO,OAAO,SAAUC,MAAqB;AAC3C,aAAO,OAAO,KAAKA,MAAK,QAAQ,EAAE,SAAS,QAAQ;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,SAAS,aAAa;AACtC,WAAO,OAAO,SAAUA,MAAqB;AAC3C,aAAO,OAAO,KAAKA,MAAK,QAAQ,EAAE,SAAS,QAAQ;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,mBAAmB;AACnB,QAAI,gBAAgB,OAAO,QAAQ;AAAA,EACvC;AAEA,MAAI,OAAO,OAAO,0BAA0B,aAAa;AACrD,QAAI,WAAW;AACf,WAAO,wBAAwB,CAAC,aAAmC;AACjE,YAAM,WAAW,KAAK,IAAI;AAC1B,YAAM,aAAa,KAAK,IAAI,GAAG,MAAM,WAAW,SAAS;AACzD,YAAM,KAAK,WAAW,MAAM;AACxB,iBAAS,WAAW,UAAU;AAAA,MAClC,GAAG,UAAU;AACb,iBAAW,WAAW;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,uBAAuB,CAAC,OAAe;AAC5C,mBAAa,EAAE;AAAA,IACjB;AAAA,EACJ;AACF;AAKO,SAAS,6BAA6B;AAE3C,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAEd,SAAO,OAAO;AAChB;;;AGnPA,SAAS,UAAAC,SAAQ,aAAAC,kBAAiB;AAO3B,SAAS,iBAAiB,QAAgB,KAAK,SAAiB,KAAwB;AAE7F,MAAI,OAAO,aAAa,eAAe,SAAS,eAAe;AAC7D,UAAMC,UAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,QAAO,QAAQ;AACf,IAAAA,QAAO,SAAS;AAChB,WAAOA;AAAA,EACT;AAGA,QAAM,aAAa,IAAIC,QAAO,OAAO,MAAM;AAC3C,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,YAAY,CAAC,WAAmB,YAAkB;AAChD,UAAI,cAAc,MAAM;AACtB,eAAO,WAAW,WAAW,MAAM,OAAO;AAAA,MAC5C;AACA,UAAI,cAAc,UAAU;AACzB,eAAO,wBAAwB,MAAa;AAAA,MAC/C;AACA,aAAO;AAAA,IACT;AAAA,IACA,WAAW,MAAM,WAAW,UAAU;AAAA,IACtC,UAAU,CAAC,SAAc,WAAW,SAAS,IAAI;AAAA;AAAA,EAEnD;AAEA,SAAO;AACT;AAKO,SAAS,0BAA0B,QAAsD;AAC9F,QAAM,IAAI,UAAU,iBAAiB;AACrC,QAAM,MAAM,EAAE,WAAW,IAAI;AAC7B,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,6BAA6B;AAAA,EACjD;AACA,SAAO;AACT;AAaO,SAAS,uBAAuB,SAA+C;AACpF,QAAM,QAAoB,CAAC;AAC3B,QAAM,QAAQ,OAAO,eAAe,OAAO;AAG3C,aAAW,OAAO,OAAO,oBAAoB,KAAK,GAAG;AAClD,UAAM,QAAS,QAAgB,GAAG;AAClC,QAAI,OAAO,UAAU,YAAY;AAE7B,MAAC,QAAgB,GAAG,IAAI,YAAY,MAAa;AAC7C,cAAM,KAAK,EAAE,QAAQ,KAAK,KAAK,CAAC;AAChC,eAAO,MAAM,MAAM,SAAS,IAAI;AAAA,MACpC;AAAA,IACJ;AAAA,EACH;AAEA,SAAO;AACT;AAKO,SAAS,oBAAoB,OAAe,QAAgB,WAAyD;AAE1H,MAAI,OAAO,OAAO,cAAc,aAAa;AACzC,UAAMC,QAAO,IAAI,kBAAkB,QAAQ,SAAS,CAAC;AACrD,QAAI,WAAW;AACX,eAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK,GAAG;AACrC,QAAAA,MAAK,CAAC,IAAI,UAAU,CAAC;AACrB,QAAAA,MAAK,IAAI,CAAC,IAAI,UAAU,CAAC;AACzB,QAAAA,MAAK,IAAI,CAAC,IAAI,UAAU,CAAC;AACzB,QAAAA,MAAK,IAAI,CAAC,IAAI,UAAU,CAAC;AAAA,MAC7B;AAAA,IACJ;AACA,WAAO,IAAI,OAAO,UAAUA,OAAM,OAAO,MAAM;AAAA,EACnD;AAGA,QAAM,OAAO,IAAI,kBAAkB,QAAQ,SAAS,CAAC;AACnD,MAAI,WAAW;AACX,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACrC,WAAK,CAAC,IAAI,UAAU,CAAC;AACrB,WAAK,IAAI,CAAC,IAAI,UAAU,CAAC;AACzB,WAAK,IAAI,CAAC,IAAI,UAAU,CAAC;AACzB,WAAK,IAAI,CAAC,IAAI,UAAU,CAAC;AAAA,IAC7B;AAAA,EACJ;AACF,SAAO,IAAIC,WAAU,MAAM,OAAO,MAAM;AAC1C;AAKO,SAAS,gBAAgB,QAAgB,KAAK,SAAiB,KAAK,MAAc,IAAsB;AAC3G,MAAI,OAAO,aAAa,eAAe,SAAS,eAAe;AAC3D,UAAMC,OAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,KAAI,QAAQ;AACZ,IAAAA,KAAI,SAAS;AACb,QAAI,IAAK,CAAAA,KAAI,MAAM;AACnB,WAAOA;AAAA,EACX;AAGA,QAAM,MAAM;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,EACb;AAGA,MAAI,KAAK;AACL,eAAW,MAAM;AACb,UAAI,IAAI,OAAQ,CAAC,IAAI,OAAe;AAAA,IACxC,GAAG,CAAC;AAAA,EACR;AAEA,SAAO;AACX;;;AC5IA,SAAS,MAAAC,YAAU;AAEZ,SAAS,uBAA4C;AAC1D,SAAO;AAAA,IACL,eAAeA,KAAG,GAAG,EAAE,kBAAkB,oBAAoB,CAAC;AAAA,IAC9D,UAAU,oBAAI,IAAI;AAAA,IAClB,QAAQ,CAAC;AAAA,EACX;AACF;AAEO,SAAS,sBAA0C;AACxD,SAAO;AAAA,IACL,UAAU,oBAAI,IAAI;AAAA,IAClB,QAAQ,CAAC;AAAA,IACT,OAAO;AAAA,MACL,QAAQA,KAAG,GAAG;AAAA,MACd,aAAaA,KAAG,GAAG;AAAA,MACnB,cAAcA,KAAG,GAAG;AAAA,MACpB,4BAA4BA,KAAG,GAAG;AAAA,IACpC;AAAA,IACA,sBAAsBA,KAAG,GAAG,EAAE,gBAAgB;AAAA,MAC5C,iBAAiBA,KAAG,GAAG,EAAE,gBAAgB;AAAA,QACvC,aAAaA,KAAG,GAAG;AAAA,QACnB,MAAMA,KAAG,GAAG;AAAA,QACZ,KAAKA,KAAG,GAAG;AAAA,MACb,CAAC;AAAA,MACD,QAAQA,KAAG,GAAG;AAAA,IAChB,CAAC;AAAA,IACD,sBAAsBA,KAAG,GAAG;AAAA,IAC5B,oBAAoBA,KAAG,GAAG;AAAA,IAC1B,iBAAiBA,KAAG,GAAG;AAAA,IACvB,uBAAuBA,KAAG,GAAG;AAAA,IAC7B,cAAcA,KAAG,GAAG;AAAA,IACpB,eAAeA,KAAG,GAAG;AAAA,IACrB,eAAeA,KAAG,GAAG;AAAA,EACvB;AACF;AAEO,SAAS,6BAAwD;AACtE,SAAO;AAAA,IACL,WAAWA,KAAG,GAAG;AAAA,IACjB,aAAaA,KAAG,GAAG;AAAA,IACnB,mBAAmBA,KAAG,GAAG;AAAA,EAC3B;AACF;AAEO,SAAS,mBAAmB;AACjC,QAAM,cAAc,qBAAqB;AAGzC,QAAM,UAAU;AAAA,IACd,gBAAgBA,KAAG,GAAG,EAAE,kBAAkB,WAAW;AAAA,IACrD,0BAA0BA,KAAG,GAAG,EAAE,gBAAgB,YAAY;AAAA,EAChE;AAGA,SAAO,eAAe,OAAO,WAAW,OAAO;AAAA,IAC7C,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC;AAGD,EAAC,OAAe,kBAAkB;AAAA,IAChC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,EACrB;AACF;;;AC/CO,SAAS,gBAAyB;AACvC,MAAI,YAAiE,CAAC;AACtE,MAAI,SAAS;AACb,MAAI,cAAc;AAElB,QAAM,cAAc,OAAO;AAC3B,QAAM,oBAAoB,OAAO;AAEjC,SAAO,wBAAwB,CAAC,aAA2C;AACzE;AACA,cAAU,KAAK,EAAE,IAAI,QAAQ,SAAS,CAAC;AACvC,WAAO;AAAA,EACT;AAEA,SAAO,uBAAuB,CAAC,OAAqB;AAClD,gBAAY,UAAU,OAAO,QAAM,GAAG,OAAO,EAAE;AAAA,EACjD;AAEA,SAAO;AAAA,IACL,KAAK,MAAe;AAClB,UAAI,KAAM,eAAc;AAAA,UACnB,gBAAe;AAEpB,YAAM,mBAAmB,CAAC,GAAG,SAAS;AACtC,kBAAY,CAAC;AAEb,uBAAiB,QAAQ,QAAM,GAAG,SAAS,WAAW,CAAC;AAAA,IACzD;AAAA,IACA,QAAQ,IAAY;AAGlB,qBAAe;AACf,WAAK,KAAK,WAAW;AAAA,IACvB;AAAA,IACA,eAAe;AACb,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,YAAoB,GAAgB;AACxE,MAAI,MAAM;AAEV,QAAM,kBAAkB;AAAA,IACtB,KAAK,MAAM;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,iBAAiB;AAAA,IACnB;AAAA,IACA,MAAM,CAAC,UAAkB;AAAA,IAAC;AAAA,IAC1B,SAAS,CAAC,OAAe,QAAgB,SAAiB;AAAA,IAAC;AAAA,IAC3D,YAAY,MAAM,CAAC;AAAA,IACnB,kBAAkB,CAAC,UAAkB,CAAC;AAAA,IACtC,kBAAkB,CAAC,UAAkB,CAAC;AAAA,IACtC,YAAY,CAAC,UAAmB;AAAA,IAAC;AAAA,IACjC,eAAe,CAAC,UAAmB;AAAA,IAAC;AAAA,IACpC,sBAAsB,MAAM;AAAA,IAAC;AAAA,IAC7B,6BAA6B,CAAC,aAAqB;AAAA,IAAC;AAAA,IACpD,4BAA4B;AAAA,IAC5B,QAAQ,OAAO,CAAC;AAAA,EAClB;AAGA,MAAI,OAAO,OAAO,gBAAgB,aAAa;AAC3C,WAAO,cAAc;AAAA,EACzB;AAEA,SAAO;AACT;AAsBO,SAAS,wBAAyC;AAGrD,UAAQ,KAAK,oEAAoE;AAEjF,SAAO;AAAA,IACH,WAAW,CAAC,OAAe;AAAA,IAA2D;AAAA,IACtF,QAAQ,MAAM;AAAA,IAAsC;AAAA,IACpD,OAAO,MAAM;AAAA,IAAuC;AAAA,EACxD;AACJ;AAKO,SAAS,eAAe,OAAe,YAAoB,IAAI,UAA+C;AACnH,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAM9B,QAAI,SAAU,UAAS,CAAC;AAAA,EAC1B;AACF;;;AClIO,SAAS,qBAAqB,UAA4B,CAAC,GAAG;AAErE;AAKO,SAAS,0BAA0B;AAE1C;;;ACpBA,SAAS,MAAAC,YAAU;AAuCZ,SAAS,6BAAmD;AACjE,QAAM,KAAK,wBAAwB;AAGnC,QAAM,SAAqB;AAAA,IACzB,QAAQC,KAAG,GAAG;AAAA,IACd,eAAeA,KAAG,GAAG,EAAE,gBAAgB,IAAI,aAAa,EAAE,CAAC;AAAA,IAC3D,qBAAqBA,KAAG,GAAG,EAAE,gBAAgB,IAAI,aAAa,EAAE,CAAC;AAAA,IACjE,yBAAyBA,KAAG,GAAG,EAAE,gBAAgB,IAAI,aAAa,EAAE,CAAC;AAAA,IACrE,aAAaA,KAAG,GAAG,EAAE,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IAC9C,YAAYA,KAAG,GAAG,EAAE,gBAAgB,CAAC,GAAG,GAAG,EAAE,CAAC;AAAA,IAC9C,UAAUA,KAAG,GAAG,EAAE,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IAC3C,OAAOA,KAAG,GAAG,EAAE,gBAAgB,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,IACxC,sBAAsBA,KAAG,GAAG;AAAA,IAC5B,WAAW;AAAA,MACT,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,MAChB,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,MAChB,KAAK;AAAA,IACP;AAAA,EACF;AAGA,QAAM,MAAoB;AAAA,IACxB,QAAQA,KAAG,GAAG;AAAA,IACd,MAAMA,KAAG,GAAG;AAAA,IACZ,QAAQA,KAAG,GAAG;AAAA,EAChB;AAEA,QAAM,MAAoB;AAAA,IACxB,QAAQA,KAAG,GAAG;AAAA,IACd,MAAMA,KAAG,GAAG;AAAA,IACZ,QAAQA,KAAG,GAAG;AAAA,EAChB;AAEA,QAAM,SAAuB;AAAA,IAC3B,QAAQA,KAAG,GAAG;AAAA,IACd,MAAMA,KAAG,GAAG;AAAA,IACZ,QAAQA,KAAG,GAAG;AAAA,EAChB;AAEA,QAAM,OAAqB;AAAA,IACzB,QAAQA,KAAG,GAAG;AAAA,IACd,MAAMA,KAAG,GAAG;AAAA,IACZ,QAAQA,KAAG,GAAG;AAAA,EAChB;AAEA,QAAM,WAAyB;AAAA,IAC7B,QAAQA,KAAG,GAAG;AAAA,IACd,MAAMA,KAAG,GAAG;AAAA,IACZ,QAAQA,KAAG,GAAG;AAAA,EAChB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ACnGA,SAAS,kBAAkB,cAAsC,CAAC,GAAY;AAC5E,QAAM,QAAQ,IAAI,IAAoB,OAAO,QAAQ,WAAW,CAAC;AAEjE,SAAO;AAAA,IACL,SAAS,CAAC,QAAgB,MAAM,IAAI,GAAG,KAAK;AAAA,IAC5C,SAAS,CAAC,KAAa,UAAkB,MAAM,IAAI,KAAK,MAAM,SAAS,CAAC;AAAA,IACxE,YAAY,CAAC,QAAgB,MAAM,OAAO,GAAG;AAAA,IAC7C,OAAO,MAAM,MAAM,MAAM;AAAA,IACzB,KAAK,CAAC,UAAkB,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK;AAAA,IAC3D,IAAI,SAAS;AAAE,aAAO,MAAM;AAAA,IAAM;AAAA,EACpC;AACF;AAKO,SAAS,uBAAuB,cAAsC,CAAC,GAAY;AACxF,SAAO,kBAAkB,WAAW;AACtC;AAKO,SAAS,yBAAyB,cAAsC,CAAC,GAAY;AAC1F,SAAO,kBAAkB,WAAW;AACtC;AAMO,SAAS,oBAAoB,WAAuC;AAOzE,SAAO,OAAO;AAChB;AAWO,SAAS,0BAA0B,cAA+C,SAA0B;AACjH,SAAO;AAAA,IACL,cAAc,uBAAuB;AAAA,IACrC,gBAAgB,yBAAyB;AAAA,IACzC,WAAW,oBAAoB;AAAA,EACjC;AACF;;;ACpDO,SAAS,wBAA8B;AAAA,EAC5C,MAAM,iBAAiB;AAAA,IAAvB;AACE,mBAAQ;AACR,yBAAc,CAAC;AACf,yBAAc;AACd,sBAAW;AAAA,QACP,WAAW,EAAE,OAAO,EAAE;AAAA,QACtB,WAAW,EAAE,OAAO,EAAE;AAAA,QACtB,WAAW,EAAE,OAAO,EAAE;AAAA,QACtB,UAAU,EAAE,OAAO,EAAE;AAAA,QACrB,UAAU,EAAE,OAAO,EAAE;AAAA,QACrB,UAAU,EAAE,OAAO,EAAE;AAAA,QACrB,KAAK,EAAE,OAAO,EAAE;AAAA,QAChB,KAAK,EAAE,OAAO,EAAE;AAAA,QAChB,KAAK,EAAE,OAAO,EAAE;AAAA,QAChB,gBAAgB,MAAM;AAAA,QAAC;AAAA,QACvB,aAAa,MAAM;AAAA,QAAC;AAAA,MACxB;AAAA;AAAA,IAEA,aAAa;AACX,aAAO;AAAA,QACL,MAAM,EAAE,OAAO,GAAG,yBAAyB,MAAM;AAAA,QAAC,EAAE;AAAA,QACpD,SAAS,MAAM;AAAA,QAAC;AAAA,QAChB,YAAY,MAAM;AAAA,QAAC;AAAA,MACrB;AAAA,IACF;AAAA,IAEA,qBAAqB;AACjB,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,cAAc,EAAE,OAAO,EAAE;AAAA,QACzB,SAAS,MAAM;AAAA,QAAC;AAAA,QAChB,OAAO,MAAM;AAAA,QAAC;AAAA,QACd,MAAM,MAAM;AAAA,QAAC;AAAA,QACb,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,SAAS;AAAA,MACb;AAAA,IACJ;AAAA,IAEA,eAAe;AACX,aAAO;AAAA,QACH,cAAc;AAAA,QACd,eAAe;AAAA,QACf,WAAW,EAAE,OAAO,EAAE;AAAA,QACtB,WAAW,EAAE,OAAO,EAAE;AAAA,QACtB,WAAW,EAAE,OAAO,EAAE;AAAA,QACtB,cAAc,EAAE,OAAO,EAAE;AAAA,QACzB,cAAc,EAAE,OAAO,EAAE;AAAA,QACzB,cAAc,EAAE,OAAO,EAAE;AAAA,QACzB,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,SAAS,MAAM;AAAA,QAAC;AAAA,QAChB,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,aAAa,MAAM;AAAA,QAAC;AAAA,QACpB,gBAAgB,MAAM;AAAA,QAAC;AAAA,MAC3B;AAAA,IACJ;AAAA,IAEA,aAAa,eAAuBC,SAAgB,YAAoB;AACpE,aAAO;AAAA,QACH,UAAUA,UAAS;AAAA,QACnB,QAAAA;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,gBAAgB,MAAM,IAAI,aAAaA,OAAM;AAAA,MACjD;AAAA,IACJ;AAAA,IAEA,gBAAgB,MAAmB,SAAiC;AAChE,YAAM,SAAS,KAAK,aAAa,GAAG,KAAK,KAAK;AAC9C,UAAI,QAAS,SAAQ,MAAM;AAC3B,aAAO,QAAQ,QAAQ,MAAM;AAAA,IACjC;AAAA,IAEA,SAAS;AAAE,aAAO,QAAQ,QAAQ;AAAA,IAAG;AAAA,IACrC,UAAU;AAAE,aAAO,QAAQ,QAAQ;AAAA,IAAG;AAAA,IACtC,QAAQ;AAAE,aAAO,QAAQ,QAAQ;AAAA,IAAG;AAAA,EACtC;AAEA,SAAO,eAAe;AAEtB,SAAO,qBAAqB;AAC9B;AAKO,SAAS,2BAAiC;AAE/C,SAAO,OAAO;AAEd,SAAO,OAAO;AAChB;AAYO,SAAS,mBAAmB,SAAqC;AAGtE,SAAO,CAAC;AACV;;;AC/GO,IAAI,UAAU;AACd,IAAI,aAAa,OAAO,iBAAiB,cAAc,eAAe;AACtE,IAAI,SAAS,KAAK;AASlB,SAAS,MAAM,GAAG;AACvB,MAAI,KAAK,EAAG,QAAO,KAAK,MAAM,CAAC;AAC/B,SAAO,IAAI,QAAQ,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AACrD;AAUA,IAAI,SAAS,KAAK,KAAK;AACvB,IAAI,SAAS,MAAM,KAAK;;;AC/BxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYO,SAAS,SAAS;AACvB,MAAI,MAAM,IAAa,WAAW,CAAC;AACnC,MAAa,cAAc,cAAc;AACvC,QAAI,CAAC,IAAI;AACT,QAAI,CAAC,IAAI;AACT,QAAI,CAAC,IAAI;AAAA,EACX;AACA,SAAO;AACT;AAQO,SAAS,MAAM,GAAG;AACvB,MAAI,MAAM,IAAa,WAAW,CAAC;AACnC,MAAI,CAAC,IAAI,EAAE,CAAC;AACZ,MAAI,CAAC,IAAI,EAAE,CAAC;AACZ,MAAI,CAAC,IAAI,EAAE,CAAC;AACZ,SAAO;AACT;AAQO,SAAS,OAAO,GAAG;AACxB,MAAI,IAAI,EAAE,CAAC;AACX,MAAI,IAAI,EAAE,CAAC;AACX,MAAI,IAAI,EAAE,CAAC;AACX,SAAO,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AACxC;AAUO,SAAS,WAAW,GAAG,GAAG,GAAG;AAClC,MAAI,MAAM,IAAa,WAAW,CAAC;AACnC,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,SAAO;AACT;AASO,SAAS,KAAK,KAAK,GAAG;AAC3B,MAAI,CAAC,IAAI,EAAE,CAAC;AACZ,MAAI,CAAC,IAAI,EAAE,CAAC;AACZ,MAAI,CAAC,IAAI,EAAE,CAAC;AACZ,SAAO;AACT;AAWO,SAAS,IAAI,KAAK,GAAG,GAAG,GAAG;AAChC,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,SAAO;AACT;AAUO,SAAS,IAAI,KAAK,GAAG,GAAG;AAC7B,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,SAAO;AACT;AAUO,SAAS,SAAS,KAAK,GAAG,GAAG;AAClC,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,SAAO;AACT;AAUO,SAAS,SAAS,KAAK,GAAG,GAAG;AAClC,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,SAAO;AACT;AAUO,SAAS,OAAO,KAAK,GAAG,GAAG;AAChC,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,SAAO;AACT;AASO,SAAS,KAAK,KAAK,GAAG;AAC3B,MAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;AACvB,MAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;AACvB,MAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;AACvB,SAAO;AACT;AASO,SAAS,MAAM,KAAK,GAAG;AAC5B,MAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;AACxB,MAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;AACxB,MAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;AACxB,SAAO;AACT;AAUO,SAAS,IAAI,KAAK,GAAG,GAAG;AAC7B,MAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5B,MAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5B,MAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5B,SAAO;AACT;AAUO,SAAS,IAAI,KAAK,GAAG,GAAG;AAC7B,MAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5B,MAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5B,MAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5B,SAAO;AACT;AASO,SAASC,OAAM,KAAK,GAAG;AAC5B,MAAI,CAAC,IAAa,MAAM,EAAE,CAAC,CAAC;AAC5B,MAAI,CAAC,IAAa,MAAM,EAAE,CAAC,CAAC;AAC5B,MAAI,CAAC,IAAa,MAAM,EAAE,CAAC,CAAC;AAC5B,SAAO;AACT;AAUO,SAAS,MAAM,KAAK,GAAG,GAAG;AAC/B,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI;AAChB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI;AAChB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI;AAChB,SAAO;AACT;AAWO,SAAS,YAAY,KAAK,GAAG,GAAGC,QAAO;AAC5C,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAIA;AACvB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAIA;AACvB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAIA;AACvB,SAAO;AACT;AASO,SAAS,SAAS,GAAG,GAAG;AAC7B,MAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,MAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,MAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,SAAO,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AACxC;AASO,SAAS,gBAAgB,GAAG,GAAG;AACpC,MAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,MAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,MAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,SAAO,IAAI,IAAI,IAAI,IAAI,IAAI;AAC7B;AAQO,SAAS,cAAc,GAAG;AAC/B,MAAI,IAAI,EAAE,CAAC;AACX,MAAI,IAAI,EAAE,CAAC;AACX,MAAI,IAAI,EAAE,CAAC;AACX,SAAO,IAAI,IAAI,IAAI,IAAI,IAAI;AAC7B;AASO,SAAS,OAAO,KAAK,GAAG;AAC7B,MAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACb,MAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACb,MAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACb,SAAO;AACT;AASO,SAAS,QAAQ,KAAK,GAAG;AAC9B,MAAI,CAAC,IAAI,IAAM,EAAE,CAAC;AAClB,MAAI,CAAC,IAAI,IAAM,EAAE,CAAC;AAClB,MAAI,CAAC,IAAI,IAAM,EAAE,CAAC;AAClB,SAAO;AACT;AASO,SAAS,UAAU,KAAK,GAAG;AAChC,MAAI,IAAI,EAAE,CAAC;AACX,MAAI,IAAI,EAAE,CAAC;AACX,MAAI,IAAI,EAAE,CAAC;AACX,MAAIC,OAAM,IAAI,IAAI,IAAI,IAAI,IAAI;AAC9B,MAAIA,OAAM,GAAG;AAEX,IAAAA,OAAM,IAAI,KAAK,KAAKA,IAAG;AAAA,EACzB;AACA,MAAI,CAAC,IAAI,EAAE,CAAC,IAAIA;AAChB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAIA;AAChB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAIA;AAChB,SAAO;AACT;AASO,SAAS,IAAI,GAAG,GAAG;AACxB,SAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/C;AAUO,SAAS,MAAM,KAAK,GAAG,GAAG;AAC/B,MAAI,KAAK,EAAE,CAAC,GACV,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC;AACV,MAAI,KAAK,EAAE,CAAC,GACV,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC;AACV,MAAI,CAAC,IAAI,KAAK,KAAK,KAAK;AACxB,MAAI,CAAC,IAAI,KAAK,KAAK,KAAK;AACxB,MAAI,CAAC,IAAI,KAAK,KAAK,KAAK;AACxB,SAAO;AACT;AAWO,SAAS,KAAK,KAAK,GAAG,GAAG,GAAG;AACjC,MAAI,KAAK,EAAE,CAAC;AACZ,MAAI,KAAK,EAAE,CAAC;AACZ,MAAI,KAAK,EAAE,CAAC;AACZ,MAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI;AAC1B,MAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI;AAC1B,MAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI;AAC1B,SAAO;AACT;AAWO,SAAS,MAAM,KAAK,GAAG,GAAG,GAAG;AAClC,MAAIC,SAAQ,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1D,MAAI,WAAW,KAAK,IAAIA,MAAK;AAC7B,MAAI,SAAS,KAAK,KAAK,IAAI,KAAKA,MAAK,IAAI;AACzC,MAAI,SAAS,KAAK,IAAI,IAAIA,MAAK,IAAI;AACnC,MAAI,CAAC,IAAI,SAAS,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;AACrC,MAAI,CAAC,IAAI,SAAS,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;AACrC,MAAI,CAAC,IAAI,SAAS,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;AACrC,SAAO;AACT;AAaO,SAAS,QAAQ,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG;AAC1C,MAAI,eAAe,IAAI;AACvB,MAAI,UAAU,gBAAgB,IAAI,IAAI,KAAK;AAC3C,MAAI,UAAU,gBAAgB,IAAI,KAAK;AACvC,MAAI,UAAU,gBAAgB,IAAI;AAClC,MAAI,UAAU,gBAAgB,IAAI,IAAI;AACtC,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI;AACnE,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI;AACnE,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI;AACnE,SAAO;AACT;AAaO,SAAS,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG;AACzC,MAAI,gBAAgB,IAAI;AACxB,MAAI,wBAAwB,gBAAgB;AAC5C,MAAI,eAAe,IAAI;AACvB,MAAI,UAAU,wBAAwB;AACtC,MAAI,UAAU,IAAI,IAAI;AACtB,MAAI,UAAU,IAAI,eAAe;AACjC,MAAI,UAAU,eAAe;AAC7B,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI;AACnE,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI;AACnE,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI;AACnE,SAAO;AACT;AASO,SAAS,OAAO,KAAKF,QAAO;AACjC,EAAAA,SAAQA,WAAU,SAAY,IAAMA;AACpC,MAAI,IAAa,OAAO,IAAI,IAAM,KAAK;AACvC,MAAI,IAAa,OAAO,IAAI,IAAM;AAClC,MAAI,SAAS,KAAK,KAAK,IAAM,IAAI,CAAC,IAAIA;AACtC,MAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AACvB,MAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AACvB,MAAI,CAAC,IAAI,IAAIA;AACb,SAAO;AACT;AAWO,SAAS,cAAc,KAAK,GAAG,GAAG;AACvC,MAAI,IAAI,EAAE,CAAC,GACT,IAAI,EAAE,CAAC,GACP,IAAI,EAAE,CAAC;AACT,MAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE;AAC9C,MAAI,KAAK;AACT,MAAI,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK;AACpD,MAAI,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK;AACpD,MAAI,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK;AACrD,SAAO;AACT;AAUO,SAAS,cAAc,KAAK,GAAG,GAAG;AACvC,MAAI,IAAI,EAAE,CAAC,GACT,IAAI,EAAE,CAAC,GACP,IAAI,EAAE,CAAC;AACT,MAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AACtC,MAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AACtC,MAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AACtC,SAAO;AACT;AAWO,SAAS,cAAc,KAAK,GAAG,GAAG;AAIvC,MAAI,KAAK,EAAE,CAAC,GACV,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC;AACV,MAAI,KAAK,EAAE,CAAC,GACV,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC;AAGV,MAAI,KAAK,KAAK,KAAK,KAAK;AACxB,MAAI,KAAK,KAAK,KAAK,KAAK;AACxB,MAAI,KAAK,KAAK,KAAK,KAAK;AAGxB,OAAK,KAAK;AACV,OAAK,KAAK;AACV,OAAK,KAAK;AAGV,MAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AACvC,MAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AACvC,MAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AACvC,SAAO;AACT;AAUO,SAAS,QAAQ,KAAK,GAAG,GAAG,KAAK;AACtC,MAAI,IAAI,CAAC,GACP,IAAI,CAAC;AAEP,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAGjB,IAAE,CAAC,IAAI,EAAE,CAAC;AACV,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;AACjD,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;AAGjD,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,SAAO;AACT;AAUO,SAAS,QAAQ,KAAK,GAAG,GAAG,KAAK;AACtC,MAAI,IAAI,CAAC,GACP,IAAI,CAAC;AAEP,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAGjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;AACjD,IAAE,CAAC,IAAI,EAAE,CAAC;AACV,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;AAGjD,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,SAAO;AACT;AAUO,SAAS,QAAQ,KAAK,GAAG,GAAG,KAAK;AACtC,MAAI,IAAI,CAAC,GACP,IAAI,CAAC;AAEP,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAGjB,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;AACjD,IAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;AACjD,IAAE,CAAC,IAAI,EAAE,CAAC;AAGV,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,MAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AACnB,SAAO;AACT;AAQO,SAAS,MAAM,GAAG,GAAG;AAC1B,MAAI,KAAK,EAAE,CAAC,GACV,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC,GACR,MAAM,KAAK,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAC7E,SAAS,OAAO,IAAI,GAAG,CAAC,IAAI;AAC9B,SAAO,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,QAAQ,EAAE,GAAG,CAAC,CAAC;AACpD;AAQO,SAAS,KAAK,KAAK;AACxB,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,SAAO;AACT;AAQO,SAAS,IAAI,GAAG;AACrB,SAAO,UAAU,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI;AACtD;AASO,SAAS,YAAY,GAAG,GAAG;AAChC,SAAO,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;AACvD;AASO,SAAS,OAAO,GAAG,GAAG;AAC3B,MAAI,KAAK,EAAE,CAAC,GACV,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC;AACV,MAAI,KAAK,EAAE,CAAC,GACV,KAAK,EAAE,CAAC,GACR,KAAK,EAAE,CAAC;AACV,SAAO,KAAK,IAAI,KAAK,EAAE,KAAc,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAc,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAc,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AACnQ;AAMO,IAAI,MAAM;AAMV,IAAI,MAAM;AAMV,IAAI,MAAM;AAMV,IAAI,OAAO;AAMX,IAAI,UAAU;AAMd,IAAI,MAAM;AAMV,IAAI,SAAS;AAcb,IAAI,WAAU,WAAY;AAC/B,MAAI,MAAM,OAAO;AACjB,SAAO,SAAU,GAAG,QAAQ,QAAQ,OAAO,IAAI,KAAK;AAClD,QAAI,GAAG;AACP,QAAI,CAAC,QAAQ;AACX,eAAS;AAAA,IACX;AACA,QAAI,CAAC,QAAQ;AACX,eAAS;AAAA,IACX;AACA,QAAI,OAAO;AACT,UAAI,KAAK,IAAI,QAAQ,SAAS,QAAQ,EAAE,MAAM;AAAA,IAChD,OAAO;AACL,UAAI,EAAE;AAAA,IACR;AACA,SAAK,IAAI,QAAQ,IAAI,GAAG,KAAK,QAAQ;AACnC,UAAI,CAAC,IAAI,EAAE,CAAC;AACZ,UAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAChB,UAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAChB,SAAG,KAAK,KAAK,GAAG;AAChB,QAAE,CAAC,IAAI,IAAI,CAAC;AACZ,QAAE,IAAI,CAAC,IAAI,IAAI,CAAC;AAChB,QAAE,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AACF,GAAE;;;AC1xBF,SAAS,cAAc;AA2ChB,SAAS,iBAAiB,YAA6B,CAAC,GAAW;AAMxE,QAAM,SAAS,IAAI,OAAO;AAE1B,MAAI,UAAU,UAAU;AACtB,WAAO,WAAW,UAAU;AAAA,EAC9B;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO,SAAS,UAAU;AAAA,EAC5B;AACA,MAAI,UAAU,QAAQ,QAAW;AAC/B,WAAO,MAAM,UAAU;AAAA,EACzB;AAGA,SAAO;AACT;AAKO,SAAS,iBAAiB,YAA6B,CAAC,GAAW;AACxE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS,aAAK,OAAO;AAAA,IACrB,YAAY,aAAK,OAAO;AAAA,IACxB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,GAAG;AAAA,EACL;AACF;AAKO,SAAS,oBAAoB,YAAgC,CAAC,GAAc;AACjF,SAAO;AAAA,IACL,QAAQ,UAAU,UAAU,iBAAiB;AAAA,IAC7C,UAAU,UAAU,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,IAAI;AAAA,IACtE,QAAQ,UAAU,UAAU,iBAAiB;AAAA,IAC7C,GAAG;AAAA,EACL;AACF;AAKO,SAAS,uBAAuB,cAAyE;AAC9G,QAAM,SAAS,iBAAiB;AAChC,QAAM,SAAS,iBAAiB;AAEhC,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAO,WAAW,aAAK,WAAW,KAAK,KAAK,EAAE;AAC9C,aAAO,SAAS,aAAK,WAAW,GAAG,IAAI,CAAC;AACxC,mBAAK,KAAK,OAAO,SAAS,OAAO,QAAQ;AACzC,mBAAK,KAAK,OAAO,YAAY,OAAO,MAAM;AAC1C;AAAA,IACF,KAAK;AACH,aAAO,WAAW,aAAK,WAAW,KAAK,KAAK,GAAG;AAC/C,aAAO,SAAS,aAAK,WAAW,IAAI,IAAI,CAAC;AAEzC,mBAAK,IAAI,OAAO,SAAS,KAAK,KAAK,EAAE;AACrC;AAAA,IACF,KAAK;AACH,aAAO,WAAW,aAAK,WAAW,GAAG,GAAG,GAAG;AAC3C,aAAO,SAAS,aAAK,WAAW,IAAI,GAAG,CAAC;AACxC;AAAA,EACJ;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,MACT;AAAA,MACA,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,IAAI;AAAA,MAChD;AAAA,IACF;AAAA,IACA,SAAS,MAAM;AAAA,IAEf;AAAA,EACF;AACF;AAMO,SAAS,uBAAuB,QAAgB,OAAoB,WAA2B;AAEpG,QAAM,QAAQ;AAGd,MAAI,MAAM,WAAY,QAAO,OAAO,CAAC,KAAK,MAAM;AAChD,MAAI,MAAM,SAAU,QAAO,OAAO,CAAC,KAAK,MAAM;AAC9C,MAAI,MAAM,UAAW,QAAO,OAAO,CAAC,KAAK,MAAM;AAG/C,SAAO,SAAS,OAAO;AAYvB,MAAI,MAAM,WAAW,MAAM,SAAS,MAAM,IAAI;AAE1C,WAAO,SAAS,CAAC,MAAM,MAAM,WAAW,KAAK;AAC7C,WAAO,SAAS,CAAC,MAAM,MAAM,SAAS,KAAK;AAC3C,WAAO,SAAS,CAAC,MAAM,MAAM,MAAM,KAAK;AACxC,WAAO,WAAW,OAAO;AAAA,EAC7B;AAEA,SAAO;AACT;;;ACxJA,eAAsB,2BAA2B,UAA6B,CAAC,GAAkC;AAE7G,MAAI;AACJ,MAAI;AACA,iBAAa,MAAM,OAAO,YAAY;AAAA,EAC1C,SAAS,GAAG;AACR,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACzF;AAEA,QAAM,UAAU,MAAM,WAAW,SAAS,OAAO;AAAA,IAC7C,UAAU,QAAQ,YAAY;AAAA,EAClC,CAAC;AACD,QAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,IACrC,UAAU,QAAQ,YAAY,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,EAC7D,CAAC;AACD,QAAM,OAAO,MAAM,QAAQ,QAAQ;AAEnC,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,MAAM,SAAS,KAAa;AACxB,YAAM,KAAK,KAAK,GAAG;AAAA,IACvB;AAAA,IACA,MAAM,cAAc;AAChB,YAAM,iBAAiB,IAAI;AAAA,IAC/B;AAAA,IACA,MAAM,YAAY,MAAc,MAAW;AAEtC,YAAM,KAAK,SAAS,CAAC,EAAE,MAAAG,OAAM,MAAAC,MAAK,MAAW;AAEzC,gBAAQ,IAAI,mBAAmBD,OAAMC,KAAI;AAAA,MAE7C,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IACtB;AAAA,IACA,MAAM,WAAW,MAAc;AAC3B,aAAO,MAAM,KAAK,WAAW,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC;AAAA,IACxD;AAAA,IACA,MAAM,QAAQ;AACV,YAAM,QAAQ,MAAM;AAAA,IACxB;AAAA,EACJ;AACJ;AAKA,eAAsB,iBAAiB,MAAW,UAAkB,KAAsB;AACtF,QAAM,KAAK,gBAAgB,MAAM;AAE7B,WAAQ,OAAe,QAAS,OAAe,KAAK;AAAA,EACxD,GAAG,EAAE,QAAQ,CAAC;AAClB;AAWA,eAAsB,iBAAiB,MAAsC;AACzE,SAAO,MAAM,KAAK,SAAS,MAAM;AAC7B,UAAM,OAAQ,OAAe;AAC7B,WAAO;AAAA,MACH,MAAM,OAAO,KAAK,OAAO;AAAA,MACzB,UAAU,QAAQ,KAAK,WAAW,KAAK,SAAS,SAAS;AAAA,IAC7D;AAAA,EACJ,CAAC;AACL;;;AC7EO,SAAS,yBAAyB,WAA+C;AACtF,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,SAAS,IAAI,QAAQ,GAAG,YAAY,GAAG,WAAW,KAAK,OAAO,KAAK;AAAA,IAC9E,KAAK;AACH,aAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,YAAY,MAAM,WAAW,IAAI,OAAO,KAAK;AAAA,IAClF,KAAK;AACH,aAAO,EAAE,SAAS,KAAK,QAAQ,KAAK,YAAY,MAAM,WAAW,MAAM,KAAK;AAAA,IAC9E,KAAK;AACH,aAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,EAAE;AAAA,IAC9D,KAAK;AAAA,IACL;AACE,aAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,SAAS;AAAA,EACvE;AACF;AAKO,SAAS,6BAA6B,SAAiB,QAAgB,YAAsC;AAClH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA;AAAA,EACb;AACF;AAKO,SAAS,kBAAkB,gBAA8B;AAGhE;;;ACtCA,eAAsB,sBAAsB,MAAW,MAA+B;AAClF,SAAO,MAAM,KAAK,WAAW,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC;AACxD;AAMO,SAAS,mBAAmB,UAAkB,SAAiB,YAAoB,MAAkB;AAExG,MAAI,SAAS,WAAW,QAAQ,QAAQ;AACpC,WAAO,EAAE,gBAAgB,EAAI;AAAA,EACjC;AAEA,MAAI,aAAa;AACjB,QAAM,cAAc,SAAS;AAE7B,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACtC,QAAI,SAAS,CAAC,MAAM,QAAQ,CAAC,GAAG;AAC5B;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,iBAAiB,aAAa;AAEpC,SAAO;AAAA,IACH;AAAA;AAAA,EAEJ;AACJ;AAUO,SAAS,yBAAyB,WAAmC;AACxE,SAAO;AAAA,IACH;AAAA,IACA,OAAO,YAAY;AAAA,IAEnB;AAAA,EACJ;AACJ;","names":["length","dist","vi","Entity","vi","vi","vi","vi","vi","vi","ClientState","HandshakeStage","ClientState","vi","vi","ClientState","ClientState","vi","options","canvas","str","Canvas","ImageData","canvas","Canvas","data","ImageData","img","vi","vi","vi","length","round","round","scale","len","angle","type","data"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/mocks.ts","../src/shared/bsp.ts","../src/shared/math.ts","../src/game/factories.ts","../src/game/helpers.ts","../src/shared/collision.ts","../src/game/mocks/ai.ts","../src/game/mocks/combat.ts","../src/game/mocks/items.ts","../src/game/mocks.ts","../src/server/mocks/transport.ts","../src/server/mocks/state.ts","../src/server/mocks/connection.ts","../src/server/mocks/commands.ts","../src/server/mocks/master.ts","../src/server/mocks/physics.ts","../src/server/helpers/multiplayer.ts","../src/server/helpers/snapshot.ts","../src/server/helpers/bandwidth.ts","../src/setup/browser.ts","../src/client/mocks/input.ts","../src/engine/mocks/webgl.ts","../src/setup/canvas.ts","../src/engine/mocks/webgpu.ts","../src/setup/timing.ts","../src/setup/node.ts","../src/engine/rendering.ts","../src/setup/storage.ts","../src/setup/audio.ts","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/common.js","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/vec3.js","../src/client/helpers/view.ts","../src/e2e/playwright.ts","../src/e2e/network.ts","../src/e2e/visual.ts"],"sourcesContent":["import { vi, type Mock } from 'vitest';\n\nexport interface BinaryWriterMock {\n writeByte: Mock<[number], void>;\n writeShort: Mock<[number], void>;\n writeLong: Mock<[number], void>;\n writeString: Mock<[string], void>;\n writeBytes: Mock<[Uint8Array], void>;\n getBuffer: Mock<[], Uint8Array>;\n reset: Mock<[], void>;\n writeInt8: Mock<[number], void>;\n writeUint8: Mock<[number], void>;\n writeInt16: Mock<[number], void>;\n writeUint16: Mock<[number], void>;\n writeInt32: Mock<[number], void>;\n writeUint32: Mock<[number], void>;\n writeFloat: Mock<[number], void>;\n getData: Mock<[], Uint8Array>;\n writePos: Mock<[any], void>;\n writeDir: Mock<[any], void>;\n}\n\nexport const createBinaryWriterMock = (): BinaryWriterMock => ({\n writeByte: vi.fn(),\n writeShort: vi.fn(),\n writeLong: vi.fn(),\n writeString: vi.fn(),\n writeBytes: vi.fn(),\n getBuffer: vi.fn<[], Uint8Array>(() => new Uint8Array(0)),\n reset: vi.fn(),\n // Legacy methods (if any)\n writeInt8: vi.fn(),\n writeUint8: vi.fn(),\n writeInt16: vi.fn(),\n writeUint16: vi.fn(),\n writeInt32: vi.fn(),\n writeUint32: vi.fn(),\n writeFloat: vi.fn(),\n getData: vi.fn<[], Uint8Array>(() => new Uint8Array(0)),\n writePos: vi.fn(),\n writeDir: vi.fn(),\n});\n\nexport const createNetChanMock = () => ({\n qport: 1234,\n\n // Sequencing\n incomingSequence: 0,\n outgoingSequence: 0,\n incomingAcknowledged: 0,\n\n // Reliable messaging\n incomingReliableAcknowledged: false,\n incomingReliableSequence: 0,\n outgoingReliableSequence: 0,\n reliableMessage: createBinaryWriterMock(),\n reliableLength: 0,\n\n // Fragmentation\n fragmentSendOffset: 0,\n fragmentBuffer: null,\n fragmentLength: 0,\n fragmentReceived: 0,\n\n // Timing\n lastReceived: 0,\n lastSent: 0,\n\n remoteAddress: { type: 'IP', port: 1234 },\n\n // Methods\n setup: vi.fn(),\n reset: vi.fn(),\n transmit: vi.fn(),\n process: vi.fn(),\n canSendReliable: vi.fn(() => true),\n writeReliableByte: vi.fn(),\n writeReliableShort: vi.fn(),\n writeReliableLong: vi.fn(),\n writeReliableString: vi.fn(),\n getReliableData: vi.fn<[], Uint8Array>(() => new Uint8Array(0)),\n needsKeepalive: vi.fn(() => false),\n isTimedOut: vi.fn(() => false),\n});\n\nexport interface BinaryStreamMock {\n getPosition: Mock<[], number>;\n getReadPosition: Mock<[], number>;\n getLength: Mock<[], number>;\n getRemaining: Mock<[], number>;\n seek: Mock<[number], void>;\n setReadPosition: Mock<[number], void>;\n hasMore: Mock<[], boolean>;\n hasBytes: Mock<[number], boolean>;\n\n readChar: Mock<[], number>;\n readByte: Mock<[], number>;\n readShort: Mock<[], number>;\n readUShort: Mock<[], number>;\n readLong: Mock<[], number>;\n readULong: Mock<[], number>;\n readFloat: Mock<[], number>;\n\n readString: Mock<[], string>;\n readStringLine: Mock<[], string>;\n\n readCoord: Mock<[], number>;\n readAngle: Mock<[], number>;\n readAngle16: Mock<[], number>;\n\n readData: Mock<[number], Uint8Array>;\n\n readPos: Mock<[], any>; // Use proper type if available, e.g., Vec3\n readDir: Mock<[], any>;\n}\n\nexport const createBinaryStreamMock = (): BinaryStreamMock => ({\n getPosition: vi.fn(() => 0),\n getReadPosition: vi.fn(() => 0),\n getLength: vi.fn(() => 0),\n getRemaining: vi.fn(() => 0),\n seek: vi.fn(),\n setReadPosition: vi.fn(),\n hasMore: vi.fn(() => true),\n hasBytes: vi.fn((amount: number) => true),\n\n readChar: vi.fn(() => 0),\n readByte: vi.fn(() => 0),\n readShort: vi.fn(() => 0),\n readUShort: vi.fn(() => 0),\n readLong: vi.fn(() => 0),\n readULong: vi.fn(() => 0),\n readFloat: vi.fn(() => 0),\n\n readString: vi.fn(() => ''),\n readStringLine: vi.fn(() => ''),\n\n readCoord: vi.fn(() => 0),\n readAngle: vi.fn(() => 0),\n readAngle16: vi.fn(() => 0),\n\n readData: vi.fn<[number], Uint8Array>((length: number) => new Uint8Array(length)),\n\n readPos: vi.fn(),\n readDir: vi.fn(),\n});\n\n// Alias for MessageWriter to match requested API\nexport interface MessageWriterMock extends BinaryWriterMock {\n writeInt: Mock<[number], void>;\n writeVector: Mock<[any], void>;\n}\n\nexport const createMessageWriterMock = (overrides?: Partial<MessageWriterMock>): MessageWriterMock => {\n const mock = createBinaryWriterMock();\n const writer: MessageWriterMock = {\n ...mock,\n writeInt: mock.writeInt32, // Alias writeInt to writeInt32\n writeVector: mock.writePos, // Alias writeVector to writePos\n ...overrides\n };\n return writer;\n};\n\n// Alias for MessageReader to match requested API\nexport interface MessageReaderMock extends BinaryStreamMock {\n readInt: Mock<[], number>;\n readVector: Mock<[], any>;\n}\n\nexport const createMessageReaderMock = (data?: Uint8Array): MessageReaderMock => {\n const mock = createBinaryStreamMock();\n const reader: MessageReaderMock = {\n ...mock,\n readInt: mock.readLong, // Alias readInt to readLong (int32)\n readVector: mock.readPos, // Alias readVector to readPos\n };\n return reader;\n};\n\nexport interface PacketMock {\n type: 'connection' | 'data' | 'ack' | 'disconnect';\n sequence: number;\n ack: number;\n qport: number;\n data: Uint8Array;\n}\n\nexport const createPacketMock = (overrides?: Partial<PacketMock>): PacketMock => ({\n type: 'data',\n sequence: 0,\n ack: 0,\n qport: 0,\n data: new Uint8Array(0),\n ...overrides\n});\n","import {\n computePlaneSignBits,\n type CollisionBrush,\n type CollisionModel,\n type CollisionPlane,\n type CollisionNode,\n type CollisionLeaf,\n CONTENTS_SOLID,\n type Vec3\n} from '@quake2ts/shared';\n\nexport function makePlane(normal: Vec3, dist: number): CollisionPlane {\n return {\n normal,\n dist,\n type: Math.abs(normal.x) === 1 ? 0 : Math.abs(normal.y) === 1 ? 1 : Math.abs(normal.z) === 1 ? 2 : 3,\n signbits: computePlaneSignBits(normal),\n };\n}\n\nexport function makeAxisBrush(size: number, contents = CONTENTS_SOLID): CollisionBrush {\n const half = size / 2;\n const planes = [\n makePlane({ x: 1, y: 0, z: 0 }, half),\n makePlane({ x: -1, y: 0, z: 0 }, half),\n makePlane({ x: 0, y: 1, z: 0 }, half),\n makePlane({ x: 0, y: -1, z: 0 }, half),\n makePlane({ x: 0, y: 0, z: 1 }, half),\n makePlane({ x: 0, y: 0, z: -1 }, half),\n ];\n\n return {\n contents,\n sides: planes.map((plane) => ({ plane, surfaceFlags: 0 })),\n };\n}\n\nexport function makeNode(plane: CollisionPlane, children: [number, number]): CollisionNode {\n return { plane, children };\n}\n\nexport function makeBspModel(\n planes: CollisionPlane[],\n nodes: CollisionNode[],\n leaves: CollisionLeaf[],\n brushes: CollisionBrush[],\n leafBrushes: number[]\n): CollisionModel {\n return {\n planes,\n nodes,\n leaves,\n brushes,\n leafBrushes,\n bmodels: [],\n };\n}\n\nexport function makeLeaf(contents: number, firstLeafBrush: number, numLeafBrushes: number): CollisionLeaf {\n return { contents, cluster: 0, area: 0, firstLeafBrush, numLeafBrushes };\n}\n\nexport function makeLeafModel(brushes: CollisionBrush[]): CollisionModel {\n const planes = brushes.flatMap((brush) => brush.sides.map((side) => side.plane));\n\n return {\n planes,\n nodes: [],\n leaves: [makeLeaf(0, 0, brushes.length)],\n brushes,\n leafBrushes: brushes.map((_, i) => i),\n bmodels: [],\n };\n}\n\nexport function makeBrushFromMinsMaxs(mins: Vec3, maxs: Vec3, contents = CONTENTS_SOLID): CollisionBrush {\n const planes = [\n makePlane({ x: 1, y: 0, z: 0 }, maxs.x),\n makePlane({ x: -1, y: 0, z: 0 }, -mins.x),\n makePlane({ x: 0, y: 1, z: 0 }, maxs.y),\n makePlane({ x: 0, y: -1, z: 0 }, -mins.y),\n makePlane({ x: 0, y: 0, z: 1 }, maxs.z),\n makePlane({ x: 0, y: 0, z: -1 }, -mins.z),\n ];\n\n return {\n contents,\n sides: planes.map((plane) => ({ plane, surfaceFlags: 0 })),\n };\n}\n","import type { Vec3, Bounds3 } from '@quake2ts/shared/math/vec3';\n\nexport const createVector3 = (x: number = 0, y: number = 0, z: number = 0): Vec3 => ({\n x,\n y,\n z,\n});\n\nexport const createBounds = (\n mins: Vec3 = createVector3(0, 0, 0),\n maxs: Vec3 = createVector3(1, 1, 1)\n): Bounds3 => ({\n mins,\n maxs,\n});\n\nexport interface Transform {\n position: Vec3;\n rotation: Vec3; // Euler angles\n scale: Vec3;\n}\n\nexport const createTransform = (overrides?: Partial<Transform>): Transform => ({\n position: createVector3(),\n rotation: createVector3(),\n scale: createVector3(1, 1, 1),\n ...overrides\n});\n\nexport const randomVector3 = (min: number = -100, max: number = 100): Vec3 => ({\n x: Math.random() * (max - min) + min,\n y: Math.random() * (max - min) + min,\n z: Math.random() * (max - min) + min,\n});\n","import {\n Entity,\n MoveType,\n Solid,\n ServerFlags,\n DeadFlag,\n EntityFlags\n} from '@quake2ts/game';\nimport type { PlayerState, EntityState } from '@quake2ts/shared';\nimport type { GameStateSnapshot } from '@quake2ts/game';\n\n// -- Shared / Game State Factories --\n\nexport const createPlayerStateFactory = (overrides?: Partial<PlayerState>): PlayerState => ({\n pm_type: 0,\n pm_time: 0,\n pm_flags: 0,\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewAngles: { x: 0, y: 0, z: 0 },\n onGround: false,\n waterLevel: 0,\n watertype: 0,\n mins: { x: 0, y: 0, z: 0 },\n maxs: { x: 0, y: 0, z: 0 },\n damageAlpha: 0,\n damageIndicators: [],\n blend: [0, 0, 0, 0],\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n ...overrides,\n});\n\nexport const createEntityStateFactory = (overrides?: Partial<EntityState>): EntityState => ({\n number: 0,\n origin: { x: 0, y: 0, z: 0 },\n angles: { x: 0, y: 0, z: 0 },\n oldOrigin: { x: 0, y: 0, z: 0 },\n modelIndex: 0,\n modelIndex2: 0,\n modelIndex3: 0,\n modelIndex4: 0,\n frame: 0,\n skinNum: 0,\n effects: 0,\n renderfx: 0,\n solid: 0,\n sound: 0,\n event: 0,\n ...overrides,\n});\n\nexport const createGameStateSnapshotFactory = (overrides?: Partial<GameStateSnapshot>): GameStateSnapshot => ({\n gravity: { x: 0, y: 0, z: -800 },\n origin: { x: 0, y: 0, z: 0 },\n velocity: { x: 0, y: 0, z: 0 },\n viewangles: { x: 0, y: 0, z: 0 },\n level: { timeSeconds: 0, frameNumber: 0, previousTimeSeconds: 0, deltaSeconds: 0.1 },\n entities: {\n activeCount: 0,\n worldClassname: 'worldspawn',\n },\n packetEntities: [],\n pmFlags: 0,\n pmType: 0,\n waterlevel: 0,\n watertype: 0,\n deltaAngles: { x: 0, y: 0, z: 0 },\n health: 100,\n armor: 0,\n ammo: 0,\n blend: [0, 0, 0, 0],\n damageAlpha: 0,\n damageIndicators: [],\n stats: [],\n kick_angles: { x: 0, y: 0, z: 0 },\n kick_origin: { x: 0, y: 0, z: 0 },\n gunoffset: { x: 0, y: 0, z: 0 },\n gunangles: { x: 0, y: 0, z: 0 },\n gunindex: 0,\n pm_time: 0,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n pm_flags: 0,\n pm_type: 0,\n ...overrides,\n});\n\n// -- Entity Factories --\n\nexport function createEntityFactory(overrides: Partial<Entity> = {}): Entity {\n const ent = new Entity(1);\n Object.assign(ent, {\n classname: 'info_null',\n health: 0,\n max_health: 0,\n takedamage: false,\n deadflag: DeadFlag.Alive,\n solid: Solid.Not,\n movetype: MoveType.None,\n flags: 0,\n svflags: 0,\n ...overrides\n });\n return ent;\n}\n\nexport function createPlayerEntityFactory(overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname: 'player',\n health: 100,\n max_health: 100,\n takedamage: true,\n solid: Solid.BoundingBox,\n movetype: MoveType.Walk,\n svflags: ServerFlags.Player,\n viewheight: 22,\n ...overrides\n });\n}\n\nexport function createMonsterEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n health: 100,\n max_health: 100,\n takedamage: true,\n solid: Solid.BoundingBox,\n movetype: MoveType.Step,\n svflags: ServerFlags.Monster,\n deadflag: DeadFlag.Alive,\n ...overrides\n });\n}\n\nexport function createItemEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n solid: Solid.Trigger,\n movetype: MoveType.Toss,\n ...overrides\n });\n}\n\nexport function createProjectileEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n solid: Solid.Bsp,\n movetype: MoveType.FlyMissile,\n svflags: ServerFlags.Projectile,\n ...overrides\n });\n}\n\nexport function createTriggerEntityFactory(classname: string, overrides: Partial<Entity> = {}): Entity {\n return createEntityFactory({\n classname,\n solid: Solid.Trigger,\n movetype: MoveType.None,\n ...overrides\n });\n}\n","import { vi, type Mock } from 'vitest';\nimport { Entity, SpawnRegistry, ScriptHookRegistry, type SpawnContext, type EntitySystem } from '@quake2ts/game';\nimport { createRandomGenerator, type Vec3 } from '@quake2ts/shared';\nimport { createTraceMock } from '../shared/collision.js';\n\n// Re-export collision helpers from shared collision utility\nexport { intersects, stairTrace, ladderTrace, createTraceMock, createSurfaceMock } from '../shared/collision.js';\n\n// -- Types --\n\nexport interface MockEngine {\n sound: Mock<[Entity, number, string, number, number, number], void>;\n soundIndex: Mock<[string], number>;\n modelIndex: Mock<[string], number>;\n centerprintf: Mock<[Entity, string], void>;\n}\n\nexport interface MockGame {\n random: ReturnType<typeof createRandomGenerator>;\n registerEntitySpawn: Mock<[string, (entity: Entity) => void], void>;\n unregisterEntitySpawn: Mock<[string], void>;\n getCustomEntities: Mock<[], string[]>;\n hooks: ScriptHookRegistry;\n registerHooks: Mock<[any], any>;\n spawnWorld: Mock<[], void>;\n clientBegin: Mock<[any], void>;\n damage: Mock<[number], void>;\n}\n\nexport interface TestContext extends SpawnContext {\n entities: EntitySystem;\n game: MockGame;\n engine: MockEngine;\n}\n\n// -- Factories --\n\nexport const createMockEngine = (): MockEngine => ({\n sound: vi.fn(),\n soundIndex: vi.fn((sound: string) => 0),\n modelIndex: vi.fn((model: string) => 0),\n centerprintf: vi.fn(),\n});\n\nexport const createMockGame = (seed: number = 12345): { game: MockGame, spawnRegistry: SpawnRegistry } => {\n const spawnRegistry = new SpawnRegistry();\n const hooks = new ScriptHookRegistry();\n\n const game: MockGame = {\n random: createRandomGenerator({ seed }),\n registerEntitySpawn: vi.fn((classname: string, spawnFunc: (entity: Entity) => void) => {\n spawnRegistry.register(classname, (entity) => spawnFunc(entity));\n }),\n unregisterEntitySpawn: vi.fn((classname: string) => {\n spawnRegistry.unregister(classname);\n }),\n getCustomEntities: vi.fn(() => Array.from(spawnRegistry.keys())),\n hooks,\n registerHooks: vi.fn((newHooks) => hooks.register(newHooks)),\n spawnWorld: vi.fn(() => {\n hooks.onMapLoad('q2dm1');\n }),\n clientBegin: vi.fn((client) => {\n hooks.onPlayerSpawn({} as any);\n }),\n damage: vi.fn((amount: number) => {\n hooks.onDamage({} as any, null, null, amount, 0, 0);\n })\n };\n\n return { game, spawnRegistry };\n};\n\nexport function createTestContext(options?: { seed?: number, initialEntities?: Entity[] }): TestContext {\n const engine = createMockEngine();\n const seed = options?.seed ?? 12345;\n const { game, spawnRegistry } = createMockGame(seed);\n\n const traceFn = vi.fn((start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3) =>\n createTraceMock({\n endpos: end,\n plane: { normal: { x: 0, y: 0, z: 1 }, dist: 0, type: 0, signbits: 0 }\n })\n );\n\n const entityList: Entity[] = options?.initialEntities ? [...options.initialEntities] : [];\n\n // Create hooks helper that interacts with the entity list\n const hooks = game.hooks;\n\n const entities = {\n spawn: vi.fn(() => {\n const ent = new Entity(entityList.length + 1);\n entityList.push(ent);\n hooks.onEntitySpawn(ent);\n return ent;\n }),\n free: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n hooks.onEntityRemove(ent);\n }),\n finalizeSpawn: vi.fn(),\n freeImmediate: vi.fn((ent: Entity) => {\n const idx = entityList.indexOf(ent);\n if (idx !== -1) {\n entityList.splice(idx, 1);\n }\n }),\n setSpawnRegistry: vi.fn(),\n timeSeconds: 10,\n deltaSeconds: 0.1,\n modelIndex: vi.fn(() => 0),\n scheduleThink: vi.fn((entity: Entity, time: number) => {\n entity.nextthink = time;\n }),\n linkentity: vi.fn(),\n trace: traceFn,\n pointcontents: vi.fn(() => 0),\n multicast: vi.fn(),\n unicast: vi.fn(),\n engine,\n game,\n sound: vi.fn((ent: Entity, chan: number, sound: string, vol: number, attn: number, timeofs: number) => {\n engine.sound(ent, chan, sound, vol, attn, timeofs);\n }),\n soundIndex: vi.fn((sound: string) => engine.soundIndex(sound)),\n useTargets: vi.fn((entity: Entity, activator: Entity | null) => {\n }),\n findByTargetName: vi.fn(() => []),\n pickTarget: vi.fn(() => null),\n killBox: vi.fn(),\n rng: createRandomGenerator({ seed }),\n imports: {\n configstring: vi.fn(),\n trace: traceFn,\n pointcontents: vi.fn(() => 0),\n },\n level: {\n intermission_angle: { x: 0, y: 0, z: 0 },\n intermission_origin: { x: 0, y: 0, z: 0 },\n next_auto_save: 0,\n health_bar_entities: null\n },\n targetNameIndex: new Map(),\n forEachEntity: vi.fn((callback: (ent: Entity) => void) => {\n entityList.forEach(callback);\n }),\n find: vi.fn((predicate: (ent: Entity) => boolean) => {\n return entityList.find(predicate);\n }),\n findByClassname: vi.fn((classname: string) => {\n return entityList.find(e => e.classname === classname);\n }),\n beginFrame: vi.fn((timeSeconds: number) => {\n (entities as any).timeSeconds = timeSeconds;\n }),\n targetAwareness: {\n timeSeconds: 10,\n frameNumber: 1,\n sightEntity: null,\n soundEntity: null,\n },\n // Adding missing properties to satisfy EntitySystem interface partially or fully\n // We cast to unknown first anyway, but filling these in makes it safer for consumers\n skill: 1,\n deathmatch: false,\n coop: false,\n activeCount: entityList.length,\n world: entityList.find(e => e.classname === 'worldspawn') || new Entity(0),\n // ... other EntitySystem properties would go here\n } as unknown as EntitySystem;\n\n return {\n keyValues: {},\n entities,\n game,\n engine,\n health_multiplier: 1,\n warn: vi.fn(),\n free: vi.fn(),\n // Mock precache functions if they are part of SpawnContext in future or TestContext extensions\n precacheModel: vi.fn(),\n precacheSound: vi.fn(),\n precacheImage: vi.fn(),\n } as unknown as TestContext;\n}\n\nexport function createSpawnTestContext(mapName?: string): TestContext {\n const ctx = createTestContext();\n // Simulate map load if needed\n if (mapName) {\n ctx.game.spawnWorld();\n }\n return ctx;\n}\n\nexport function createCombatTestContext(): TestContext {\n return createTestContext();\n}\n\nexport function createPhysicsTestContext(): TestContext {\n return createTestContext();\n}\n\nexport function createEntity(): Entity {\n return new Entity(1);\n}\n","import type { Vec3 } from '@quake2ts/shared/math/vec3';\nimport type { TraceResult, CollisionPlane } from '@quake2ts/shared/bsp/collision';\n\n// Re-export trace helpers from shared if they exist there now, or redefine them here if needed\n// The plan says \"Move trace helpers from game/helpers.ts to shared/collision.ts\"\n// But currently `game/helpers.ts` re-exports them from `@quake2ts/shared`.\n// `intersects`, `stairTrace`, `ladderTrace` are in `packages/shared/src/testing.ts`.\n// I will re-export them here for test-utils consumers.\n\nexport { intersects, stairTrace, ladderTrace } from '@quake2ts/shared';\n\nexport interface TraceMock extends Partial<TraceResult> {\n fraction: number;\n endpos: Vec3;\n plane: CollisionPlane;\n surface: { flags: number, name?: string, value?: number };\n contents: number;\n ent: any; // Using any to avoid circular dependency with Entity\n allsolid: boolean;\n startsolid: boolean;\n}\n\nexport const createTraceMock = (overrides?: Partial<TraceMock>): TraceMock => ({\n fraction: 1.0,\n endpos: { x: 0, y: 0, z: 0 },\n plane: { normal: { x: 0, y: 0, z: 0 }, dist: 0, type: 0, signbits: 0 },\n surface: { flags: 0 },\n contents: 0,\n ent: null,\n allsolid: false,\n startsolid: false,\n ...overrides\n});\n\nexport interface SurfaceMock {\n flags: number;\n name: string;\n value: number;\n}\n\nexport const createSurfaceMock = (overrides?: Partial<SurfaceMock>): SurfaceMock => ({\n flags: 0,\n name: 'default',\n value: 0,\n ...overrides\n});\n","import { vi, type Mock } from 'vitest';\nimport { Entity, EntitySystem, MonsterMove, MonsterAction, AIAction } from '@quake2ts/game';\n\nexport interface MockAI {\n checkAttack: Mock;\n findTarget: Mock;\n visible: Mock;\n infront: Mock;\n}\n\nexport interface MockMonsterAI {\n stand: Mock;\n walk: Mock;\n run: Mock;\n dodge: Mock;\n attack: Mock;\n melee: Mock;\n sight: Mock;\n idle: Mock;\n}\n\nexport function createMockAI(overrides: Partial<MockAI> = {}): MockAI {\n return {\n checkAttack: vi.fn(() => false),\n findTarget: vi.fn(() => null),\n visible: vi.fn(() => true),\n infront: vi.fn(() => true),\n ...overrides\n };\n}\n\nexport function createMockMonsterAI(overrides: Partial<MockMonsterAI> = {}): MockMonsterAI {\n return {\n stand: vi.fn(),\n walk: vi.fn(),\n run: vi.fn(),\n dodge: vi.fn(),\n attack: vi.fn(),\n melee: vi.fn(),\n sight: vi.fn(),\n idle: vi.fn(),\n ...overrides\n };\n}\n\nexport function createMockMonsterMove(\n first: number,\n last: number,\n think: (self: Entity, context: EntitySystem) => void,\n action: (self: Entity, dist: number, context: EntitySystem) => void\n): MonsterMove {\n const frames = [];\n for (let i = first; i <= last; i++) {\n frames.push({\n ai: action,\n dist: 0,\n think: think\n });\n }\n\n return {\n firstframe: first,\n lastframe: last,\n frames,\n endfunc: null\n };\n}\n","import { vi, type Mock } from 'vitest';\nimport { DamageMod, Entity, EntitySystem, WeaponState } from '@quake2ts/game';\n\nexport interface MockDamageInfo {\n damage: number;\n mod: DamageMod;\n knockback: number;\n attacker: Entity | null;\n inflictor: Entity | null;\n dir: { x: number, y: number, z: number } | null;\n point: { x: number, y: number, z: number } | null;\n}\n\nexport function createMockDamageInfo(overrides: Partial<MockDamageInfo> = {}): MockDamageInfo {\n return {\n damage: 10,\n mod: DamageMod.UNKNOWN,\n knockback: 0,\n attacker: null,\n inflictor: null,\n dir: null,\n point: null,\n ...overrides\n };\n}\n\nconst WEAPON_NAMES: Record<string, string> = {\n 'weapon_blaster': 'Blaster',\n 'weapon_shotgun': 'Shotgun',\n 'weapon_supershotgun': 'Super Shotgun',\n 'weapon_machinegun': 'Machinegun',\n 'weapon_chaingun': 'Chaingun',\n 'weapon_grenadelauncher': 'Grenade Launcher',\n 'weapon_rocketlauncher': 'Rocket Launcher',\n 'weapon_hyperblaster': 'HyperBlaster',\n 'weapon_railgun': 'Railgun',\n 'weapon_bfg': 'BFG10K',\n};\n\nexport function createMockWeapon(name: string = 'Mock Weapon') {\n const displayName = WEAPON_NAMES[name] || name;\n return {\n name: displayName,\n ammoType: 'bullets',\n ammoUse: 1,\n selection: vi.fn(),\n think: vi.fn(),\n command: vi.fn(),\n };\n}\n\nexport const mockMonsterAttacks = {\n fireBlaster: vi.fn(),\n fireRocket: vi.fn(),\n fireGrenade: vi.fn(),\n fireHeat: vi.fn(),\n fireBullet: vi.fn(),\n fireShotgun: vi.fn(),\n fireRailgun: vi.fn(),\n fireBFG: vi.fn(),\n};\n","import {\n type PlayerInventory,\n createPlayerInventory,\n WeaponId,\n PowerupId,\n KeyId,\n createAmmoInventory\n} from '@quake2ts/game';\nimport {\n type BaseItem,\n type WeaponItem,\n type HealthItem,\n type ArmorItem,\n type PowerupItem,\n type PowerArmorItem,\n type KeyItem,\n type FlagItem,\n WEAPON_ITEMS,\n HEALTH_ITEMS,\n ARMOR_ITEMS,\n POWERUP_ITEMS,\n POWER_ARMOR_ITEMS,\n KEY_ITEMS,\n FLAG_ITEMS,\n getAmmoItemDefinition,\n AmmoItemId\n} from '@quake2ts/game';\n// import { getAmmoItemDefinition, AmmoItemId } from '@quake2ts/game/src/inventory/ammo.js';\n\n/**\n * Creates a mock player inventory with default values suitable for testing.\n * Can be customized with overrides.\n */\nexport function createMockInventory(overrides: Partial<PlayerInventory> = {}): PlayerInventory {\n const defaultInventory = createPlayerInventory();\n\n // Merge simple properties\n const inventory: PlayerInventory = {\n ...defaultInventory,\n ...overrides\n };\n\n // If overrides.ammo is provided (as a full object), it replaces the default.\n // We don't merge deeper here because the caller usually provides a complete mock\n // or is happy with the default structure.\n\n return inventory;\n}\n\n/**\n * Generic factory for any item type.\n * Attempts to find a predefined item by ID first, then applies overrides.\n */\nexport function createMockItem(id: string, overrides: Partial<BaseItem> = {}): BaseItem {\n let base: BaseItem | undefined;\n\n // Search in all registries\n base = WEAPON_ITEMS[id] ||\n HEALTH_ITEMS[id] ||\n ARMOR_ITEMS[id] ||\n POWERUP_ITEMS[id] ||\n POWER_ARMOR_ITEMS[id] ||\n KEY_ITEMS[id] ||\n FLAG_ITEMS[id];\n\n if (!base) {\n // If not found, create a generic minimal item\n base = {\n id,\n name: `Mock Item ${id}`\n };\n }\n\n return {\n ...base,\n ...overrides\n };\n}\n\n/**\n * Creates a mock WeaponItem\n */\nexport function createMockWeaponItem(weaponId: WeaponId, overrides: Partial<WeaponItem> = {}): WeaponItem {\n // Find the item definition for this weaponId\n const found = Object.values(WEAPON_ITEMS).find(w => w.weaponId === weaponId);\n\n const base: WeaponItem = found ? { ...found } : {\n type: 'weapon',\n id: `weapon_${weaponId}`,\n name: `Mock Weapon ${weaponId}`,\n weaponId,\n ammoType: null,\n initialAmmo: 0,\n pickupAmmo: 0,\n fireRate: 1\n };\n\n return { ...base, ...overrides };\n}\n\n/**\n * Creates a mock HealthItem\n */\nexport function createMockHealthItem(amount: number, overrides: Partial<HealthItem> = {}): HealthItem {\n return {\n type: 'health',\n id: 'item_health_mock',\n name: 'Mock Health',\n amount,\n max: 100,\n ...overrides\n };\n}\n\n/**\n * Creates a mock ArmorItem\n */\nexport function createMockArmorItem(amount: number, overrides: Partial<ArmorItem> = {}): ArmorItem {\n return {\n type: 'armor',\n id: 'item_armor_mock',\n name: 'Mock Armor',\n amount,\n ...overrides\n };\n}\n\n/**\n * Creates a mock AmmoItem\n */\nexport function createMockAmmoItem(ammoItemId: AmmoItemId, overrides: Partial<BaseItem> = {}): BaseItem {\n const def = getAmmoItemDefinition(ammoItemId);\n if (!def) {\n throw new Error(`Unknown ammo item id: ${ammoItemId}`);\n }\n\n const base: BaseItem = {\n id: def.id,\n name: `Mock Ammo ${def.id}`\n };\n\n return {\n ...base,\n ...overrides\n };\n}\n\n\n/**\n * Creates a mock PowerupItem\n */\nexport function createMockPowerupItem(id: string, duration: number, overrides: Partial<PowerupItem> = {}): PowerupItem {\n const found = POWERUP_ITEMS[id];\n const base: PowerupItem = found ? { ...found } : {\n type: 'powerup',\n id,\n name: `Mock Powerup ${id}`,\n timer: duration\n };\n\n if (duration !== undefined && !found) {\n base.timer = duration;\n }\n\n return { ...base, ...overrides };\n}\n","import { Entity, GameExports, GameImports } from '@quake2ts/game';\nimport { vi } from 'vitest';\n\nexport interface GameState {\n levelName: string;\n time: number;\n entities: Entity[];\n clients: any[]; // Mock client objects\n}\n\n/**\n * Creates a mock game state object.\n * @param overrides Optional overrides for the game state.\n */\nexport function createMockGameState(overrides?: Partial<GameState>): GameState {\n return {\n levelName: 'test_level',\n time: 0,\n entities: [],\n clients: [],\n ...overrides\n };\n}\n\n/**\n * Creates a mock GameExports object.\n */\nexport function createMockGameExports(overrides?: Partial<GameExports>): GameExports {\n return {\n init: vi.fn(),\n shutdown: vi.fn(),\n spawnWorld: vi.fn(),\n frame: vi.fn().mockReturnValue({ state: {} }),\n clientConnect: vi.fn().mockReturnValue(true),\n clientBegin: vi.fn().mockReturnValue({ index: 1, origin: { x: 0, y: 0, z: 0 } }),\n clientDisconnect: vi.fn(),\n clientThink: vi.fn(),\n // clientUserInfoChanged is not in GameExports\n // clientCommand is not in GameExports (it's serverCommand?) No, clientCommand might be missing from interface but present in impl or legacy.\n // Checking GameExports interface in src/index.ts:\n /*\n clientConnect(ent: Entity | null, userInfo: string): string | true;\n clientBegin(client: PlayerClient): Entity;\n clientDisconnect(ent: Entity): void;\n clientThink(ent: Entity, cmd: UserCommand): void;\n respawn(ent: Entity): void;\n ...\n configstring(index: number, value: string): void;\n serverCommand(cmd: string): void;\n */\n respawn: vi.fn(),\n entities: {\n getByIndex: vi.fn(),\n forEachEntity: vi.fn(),\n findByRadius: vi.fn(),\n find: vi.fn(),\n checkAnyCollision: vi.fn(),\n trace: vi.fn(),\n pointcontents: vi.fn(),\n link: vi.fn(), // linkentity mapped to link in EntitySystem? No, linkentity in imports, link/unlink in System.\n unlink: vi.fn(),\n spawn: vi.fn(),\n free: vi.fn(),\n activeCount: 0,\n world: { classname: 'worldspawn' } as any,\n } as any,\n multicast: vi.fn(),\n unicast: vi.fn(),\n configstring: vi.fn(),\n serverCommand: vi.fn(),\n sound: vi.fn(),\n soundIndex: vi.fn(),\n centerprintf: vi.fn(),\n trace: vi.fn(),\n time: 0,\n deathmatch: false,\n skill: 1,\n rogue: false,\n xatrix: false,\n coop: false,\n friendlyFire: false,\n random: {\n next: vi.fn(),\n nextFloat: vi.fn(),\n range: vi.fn(),\n crandom: vi.fn(),\n getState: vi.fn(),\n setState: vi.fn()\n } as any,\n createSave: vi.fn(),\n loadSave: vi.fn(),\n serialize: vi.fn(),\n loadState: vi.fn(),\n setGodMode: vi.fn(),\n setNoclip: vi.fn(),\n setNotarget: vi.fn(),\n giveItem: vi.fn(),\n damage: vi.fn(),\n teleport: vi.fn(),\n registerHooks: vi.fn(),\n hooks: {\n onMapLoad: vi.fn(),\n onMapUnload: vi.fn(),\n onPlayerSpawn: vi.fn(),\n onPlayerDeath: vi.fn(),\n register: vi.fn()\n } as any,\n setSpectator: vi.fn(),\n registerEntitySpawn: vi.fn(),\n unregisterEntitySpawn: vi.fn(),\n getCustomEntities: vi.fn(),\n ...overrides\n };\n}\n","import { NetworkTransport } from '@quake2ts/server';\nimport { NetDriver } from '@quake2ts/shared';\nimport { vi } from 'vitest';\n\n/**\n * Mock implementation of the NetworkTransport interface for server testing.\n * Allows simulating connections and errors.\n */\nexport class MockTransport implements NetworkTransport {\n public onConnectionCallback?: (driver: NetDriver, info?: any) => void;\n public onErrorCallback?: (error: Error) => void;\n public address: string = '127.0.0.1';\n public port: number = 27910;\n public sentMessages: Uint8Array[] = [];\n public receivedMessages: Uint8Array[] = [];\n public listening: boolean = false;\n\n public listenSpy = vi.fn().mockImplementation(async (port: number) => {\n this.port = port;\n this.listening = true;\n });\n public closeSpy = vi.fn().mockImplementation(() => {\n this.listening = false;\n });\n\n /**\n * Start listening on the specified port.\n */\n async listen(port: number): Promise<void> {\n return this.listenSpy(port);\n }\n\n /**\n * Close the transport.\n */\n close() {\n this.closeSpy();\n }\n\n /**\n * Register a callback for new connections.\n */\n onConnection(callback: (driver: NetDriver, info?: any) => void) {\n this.onConnectionCallback = callback;\n }\n\n /**\n * Register a callback for errors.\n */\n onError(callback: (error: Error) => void) {\n this.onErrorCallback = callback;\n }\n\n /**\n * Check if the transport is currently listening.\n */\n public isListening(): boolean {\n return this.listening;\n }\n\n /**\n * Helper to simulate a new connection.\n * @param driver The network driver for the connection.\n * @param info Optional connection info.\n */\n public simulateConnection(driver: NetDriver, info?: any) {\n if (this.onConnectionCallback) {\n this.onConnectionCallback(driver, info);\n }\n }\n\n /**\n * Helper to simulate an error.\n * @param error The error to simulate.\n */\n public simulateError(error: Error) {\n if (this.onErrorCallback) {\n this.onErrorCallback(error);\n }\n }\n}\n\n/**\n * Interface for mock UDP socket.\n * This is a partial mock of Node.js dgram.Socket or similar.\n */\nexport interface MockUDPSocket {\n send: (msg: Uint8Array, offset: number, length: number, port: number, address: string, callback?: (error: Error | null, bytes: number) => void) => void;\n on: (event: string, callback: (...args: any[]) => void) => void;\n close: () => void;\n bind: (port: number, address?: string) => void;\n address: () => { address: string; family: string; port: number };\n}\n\n/**\n * Creates a mock UDP socket.\n * @param overrides Optional overrides for the socket methods.\n */\nexport function createMockUDPSocket(overrides?: Partial<MockUDPSocket>): MockUDPSocket {\n const socket: MockUDPSocket = {\n send: vi.fn(),\n on: vi.fn(),\n close: vi.fn(),\n bind: vi.fn(),\n address: vi.fn().mockReturnValue({ address: '127.0.0.1', family: 'IPv4', port: 0 }),\n ...overrides,\n };\n return socket;\n}\n\n/**\n * Interface for network address.\n */\nexport interface NetworkAddress {\n ip: string;\n port: number;\n}\n\n/**\n * Creates a mock network address.\n * @param ip IP address (default: '127.0.0.1')\n * @param port Port number (default: 27910)\n */\nexport function createMockNetworkAddress(ip: string = '127.0.0.1', port: number = 27910): NetworkAddress {\n return { ip, port };\n}\n\n/**\n * Creates a configured MockTransport instance.\n * @param address Address to bind to (default: '127.0.0.1')\n * @param port Port to listen on (default: 27910)\n * @param overrides Optional overrides for the transport properties.\n */\nexport function createMockTransport(\n address: string = '127.0.0.1',\n port: number = 27910,\n overrides?: Partial<MockTransport>\n): MockTransport {\n const transport = new MockTransport();\n transport.address = address;\n transport.port = port;\n Object.assign(transport, overrides);\n return transport;\n}\n\n/**\n * Creates a mock NetDriver instance.\n * @param overrides Optional overrides for the NetDriver methods.\n */\nexport function createMockNetDriver(overrides?: Partial<NetDriver>): NetDriver {\n return {\n connect: vi.fn().mockResolvedValue(undefined),\n disconnect: vi.fn(),\n send: vi.fn(),\n onMessage: vi.fn(),\n onClose: vi.fn(),\n onError: vi.fn(),\n isConnected: vi.fn().mockReturnValue(true),\n ...overrides\n };\n}\n","import { Server, ServerState, ServerStatic, Client, ClientState } from '@quake2ts/server';\nimport { NetDriver, MAX_CONFIGSTRINGS, MAX_EDICTS, EntityState } from '@quake2ts/shared';\nimport { Entity } from '@quake2ts/game';\nimport { vi } from 'vitest';\nimport { createMockNetDriver } from './transport.js';\n\n/**\n * Creates a mock server state object.\n * @param overrides Optional overrides for the server state.\n */\nexport function createMockServerState(overrides?: Partial<Server>): Server {\n return {\n state: ServerState.Game,\n attractLoop: false,\n loadGame: false,\n startTime: Date.now(),\n time: 0,\n frame: 0,\n name: 'test_map',\n collisionModel: null,\n configStrings: new Array(MAX_CONFIGSTRINGS).fill(''),\n baselines: new Array(MAX_EDICTS).fill(null),\n multicastBuf: new Uint8Array(0),\n ...overrides\n };\n}\n\n/**\n * Creates a mock server static object.\n * @param maxClients Maximum number of clients.\n * @param overrides Optional overrides for the server static state.\n */\nexport function createMockServerStatic(maxClients: number = 16, overrides?: Partial<ServerStatic>): ServerStatic {\n return {\n initialized: true,\n realTime: Date.now(),\n mapCmd: '',\n spawnCount: 1,\n clients: new Array(maxClients).fill(null),\n lastHeartbeat: 0,\n challenges: [],\n ...overrides\n };\n}\n\n/**\n * Creates a mock server client.\n * @param clientNum The client index.\n * @param overrides Optional overrides for the client.\n */\nexport function createMockServerClient(clientNum: number, overrides?: Partial<Client>): Client {\n // Create a minimal mock net driver\n const mockNet: NetDriver = createMockNetDriver();\n\n return {\n index: clientNum,\n state: ClientState.Connected,\n edict: { index: clientNum + 1 } as Entity,\n net: mockNet,\n netchan: {\n qport: 0,\n remoteAddress: '127.0.0.1',\n incomingSequence: 0,\n outgoingSequence: 0,\n lastReceived: 0,\n process: vi.fn(),\n transmit: vi.fn(),\n writeReliableByte: vi.fn(),\n writeReliableShort: vi.fn(),\n writeReliableLong: vi.fn(),\n writeReliableString: vi.fn(),\n writeReliableData: vi.fn(),\n } as any, // Cast as any because NetChan might be complex to fully mock here\n userInfo: '',\n lastMessage: 0,\n lastCommandTime: 0,\n commandCount: 0,\n messageQueue: [],\n frames: [],\n lastFrame: 0,\n lastPacketEntities: [],\n challenge: 0,\n lastConnect: 0,\n ping: 0,\n rate: 0,\n name: `Client${clientNum}`,\n messageLevel: 0,\n datagram: new Uint8Array(0),\n downloadSize: 0,\n downloadCount: 0,\n commandMsec: 0,\n frameLatency: [],\n messageSize: [],\n suppressCount: 0,\n commandQueue: [],\n lastCmd: {\n msec: 0,\n buttons: 0,\n angles: { x: 0, y: 0, z: 0 },\n forwardmove: 0,\n sidemove: 0,\n upmove: 0,\n sequence: 0,\n lightlevel: 0,\n impulse: 0,\n serverFrame: 0\n },\n ...overrides\n };\n}\n\n/**\n * Mock interface for the Server class (DedicatedServer).\n * This allows mocking the server instance itself.\n */\nexport interface MockServer {\n start(mapName: string): Promise<void>;\n stop(): void;\n // tick(): void; // runFrame is private in DedicatedServer, usually we simulate via game.frame\n multicast(origin: any, type: any, event: any, ...args: any[]): void;\n unicast(ent: Entity, reliable: boolean, event: any, ...args: any[]): void;\n configstring(index: number, value: string): void;\n kickPlayer(clientId: number): void;\n changeMap(mapName: string): Promise<void>;\n}\n\n/**\n * Creates a mock server instance.\n * @param overrides Optional overrides for server methods.\n */\nexport function createMockServer(overrides?: Partial<MockServer>): MockServer {\n return {\n start: vi.fn().mockResolvedValue(undefined),\n stop: vi.fn(),\n multicast: vi.fn(),\n unicast: vi.fn(),\n configstring: vi.fn(),\n kickPlayer: vi.fn(),\n changeMap: vi.fn().mockResolvedValue(undefined),\n ...overrides\n };\n}\n","import { Client, ClientState } from '@quake2ts/server';\nimport { createMockServerClient } from './state.js';\n\n/**\n * Interface representing connection state for testing.\n */\nexport interface Connection {\n state: ClientState;\n address: string;\n challenge: number;\n userInfo: UserInfo;\n}\n\n/**\n * Stages of the client connection handshake.\n */\nexport enum HandshakeStage {\n None = 0,\n Challenge = 1,\n Connect = 2,\n Info = 3,\n Active = 4\n}\n\n/**\n * Interface representing a handshake state.\n */\nexport interface Handshake {\n stage: HandshakeStage;\n clientNum: number;\n challenge: number;\n qport: number;\n}\n\n/**\n * Interface for UserInfo structure.\n */\nexport interface UserInfo {\n name: string;\n skin: string;\n model: string;\n fov: number;\n hand: number;\n rate: number;\n msg: number;\n spectator?: number;\n [key: string]: string | number | undefined;\n}\n\n/**\n * Helper to serialize UserInfo to Quake 2 info string format.\n * Format: \\key\\value\\key2\\value2\n */\nexport function serializeUserInfo(info: UserInfo): string {\n return Object.entries(info).reduce((acc, [key, value]) => {\n if (value !== undefined) {\n return `${acc}\\\\${key}\\\\${value}`;\n }\n return acc;\n }, '');\n}\n\n/**\n * Creates a mock UserInfo object.\n * @param overrides Optional overrides for the user info.\n */\nexport function createMockUserInfo(overrides?: Partial<UserInfo>): UserInfo {\n return {\n name: 'Player',\n skin: 'male/grunt',\n model: 'male/grunt',\n fov: 90,\n hand: 0,\n rate: 25000,\n msg: 1,\n ...overrides\n };\n}\n\n/**\n * Creates a mock connection object (Client) with specific state.\n * @param state The client state (default: Connected).\n * @param overrides Optional overrides for the client.\n */\nexport function createMockConnection(state: ClientState = ClientState.Connected, overrides?: Partial<Client>): Client {\n return createMockServerClient(0, {\n state,\n userInfo: serializeUserInfo(createMockUserInfo()),\n challenge: Math.floor(Math.random() * 100000),\n ...overrides\n });\n}\n\n/**\n * Creates a mock handshake object.\n * @param stage The stage of the handshake (default: None).\n */\nexport function createMockHandshake(stage: HandshakeStage = HandshakeStage.None): Handshake {\n return {\n stage,\n clientNum: -1,\n challenge: 0,\n qport: Math.floor(Math.random() * 65536)\n };\n}\n\n/**\n * Simulates a handshake between a mock client and server.\n * Note: This is a high-level simulation helper.\n * @param client The mock client connection.\n * @param server The mock server instance.\n * @returns Promise that resolves to true if handshake succeeded.\n */\nexport async function simulateHandshake(client: Client, server: any): Promise<boolean> {\n // 1. Get Challenge\n // In a real scenario, client sends getchallenge, server responds with challenge\n const challenge = Math.floor(Math.random() * 100000);\n client.challenge = challenge;\n\n // 2. Connect\n // Client sends connect command with qport, challenge, userinfo\n // Server assigns client slot\n if (server && server.clients) {\n // rudimentary check if server has space\n }\n\n // 3. Update state to Connected\n client.state = ClientState.Connected;\n\n // 4. Send configstrings (usually handled by server)\n\n // 5. Client enters game (prespawn)\n // Server sends stuff\n\n // 6. Client ready\n client.state = ClientState.Active;\n\n return true;\n}\n","import { vi } from 'vitest';\nimport { ServerCommand } from '@quake2ts/shared';\n\n/**\n * Interface for a mocked server console that can execute commands.\n * Reference: quake2/server/sv_main.c (SV_ExecuteUserCommand)\n */\nexport interface MockServerConsole {\n exec(cmd: string): string;\n print(text: string): void;\n broadcast(text: string): void;\n commandBuffer: string[];\n outputBuffer: string[];\n}\n\n/**\n * Creates a mock server console.\n * @param overrides Optional overrides for the mock console.\n */\nexport function createMockServerConsole(overrides?: Partial<MockServerConsole>): MockServerConsole {\n const outputBuffer: string[] = [];\n const commandBuffer: string[] = [];\n\n return {\n exec: vi.fn((cmd: string) => {\n commandBuffer.push(cmd);\n return `Executed: ${cmd}`;\n }),\n print: vi.fn((text: string) => {\n outputBuffer.push(text);\n }),\n broadcast: vi.fn((text: string) => {\n outputBuffer.push(`Broadcast: ${text}`);\n }),\n commandBuffer,\n outputBuffer,\n ...overrides\n };\n}\n\n/**\n * Interface for a mocked RCON client.\n * Reference: quake2/server/sv_user.c (SV_ExecuteUserCommand for RCON handling)\n */\nexport interface MockRConClient {\n connect(address: string, port: number, password?: string): Promise<boolean>;\n sendCommand(cmd: string): Promise<string>;\n disconnect(): void;\n connected: boolean;\n lastCommand: string;\n lastResponse: string;\n}\n\n/**\n * Creates a mock RCON client.\n * @param password Optional password for the client to use.\n */\nexport function createMockRConClient(password: string = ''): MockRConClient {\n return {\n connected: false,\n lastCommand: '',\n lastResponse: '',\n connect: vi.fn(async (address, port, pwd) => {\n return pwd === password; // Simple mock: connect succeeds if password matches constructor password\n }),\n sendCommand: vi.fn(async (cmd) => {\n return `RCON Response for: ${cmd}`;\n }),\n disconnect: vi.fn(),\n };\n}\n\n/**\n * Simulates a command execution on the server.\n * @param server The mock server instance (assumed to have some command handling capability).\n * @param command The command string to execute.\n * @returns The output of the command.\n */\nexport function simulateServerCommand(server: any, command: string): string {\n // This assumes the server has a method to execute commands, or we simulate the effect.\n // In a real integration, this might interact with the server's command buffer.\n if (server.executeBuffer) {\n server.executeBuffer(command);\n return \"Executed\";\n }\n\n // Fallback for mocked servers\n if (server.exec) {\n return server.exec(command);\n }\n\n return \"Unknown command handler\";\n}\n","import { Client } from '@quake2ts/server';\n\nexport interface MasterServer {\n registerServer(info: ServerInfo): Promise<boolean>;\n heartbeat(serverAddress: string): Promise<boolean>;\n getServerList(filter?: ServerListFilter): Promise<ServerInfo[]>;\n}\n\nexport interface ServerInfo {\n address: string;\n name: string;\n map: string;\n players: number;\n maxPlayers: number;\n gametype: string;\n version: string;\n password?: boolean;\n}\n\nexport interface ServerListFilter {\n gametype?: string;\n map?: string;\n notEmpty?: boolean;\n notFull?: boolean;\n}\n\n/**\n * Creates a mock master server for testing server registration and browsing\n * @param overrides - Optional overrides for the master server behavior\n */\nexport function createMockMasterServer(overrides: Partial<MasterServer> = {}): MasterServer {\n const servers = new Map<string, ServerInfo>();\n\n return {\n registerServer: async (info: ServerInfo): Promise<boolean> => {\n servers.set(info.address, info);\n return true;\n },\n heartbeat: async (serverAddress: string): Promise<boolean> => {\n return servers.has(serverAddress);\n },\n getServerList: async (filter?: ServerListFilter): Promise<ServerInfo[]> => {\n let list = Array.from(servers.values());\n\n if (filter) {\n if (filter.gametype) {\n list = list.filter(s => s.gametype === filter.gametype);\n }\n if (filter.map) {\n list = list.filter(s => s.map === filter.map);\n }\n if (filter.notEmpty) {\n list = list.filter(s => s.players > 0);\n }\n if (filter.notFull) {\n list = list.filter(s => s.players < s.maxPlayers);\n }\n }\n\n return list;\n },\n ...overrides\n };\n}\n\n/**\n * Creates a mock server info object\n * @param overrides - Optional overrides\n */\nexport function createMockServerInfo(overrides: Partial<ServerInfo> = {}): ServerInfo {\n return {\n address: '127.0.0.1:27910',\n name: 'Quake 2 Test Server',\n map: 'q2dm1',\n players: 0,\n maxPlayers: 16,\n gametype: 'deathmatch',\n version: '1.0',\n ...overrides\n };\n}\n\n/**\n * Simulates the process of a game server registering with the master server\n * @param server - The mock game server instance (typed as any to accept mock)\n * @param master - The mock master server\n */\nexport async function simulateServerRegistration(server: any, master: MasterServer): Promise<boolean> {\n const info = createMockServerInfo({\n name: server.name || 'Test Server',\n map: server.mapName || 'q2dm1',\n players: server.clients ? server.clients.filter((c: Client | null) => c && c.state >= 2).length : 0,\n maxPlayers: server.maxClients || 16\n });\n\n return master.registerServer(info);\n}\n","import { vi } from 'vitest';\nimport { TraceResult } from '@quake2ts/shared';\n\n/**\n * Mock interface for CollisionEntityIndex.\n */\nexport interface MockCollisionEntityIndex {\n trace: (start: any, mins: any, maxs: any, end: any, passEntity: any, contentMask: number) => TraceResult;\n link: (entity: any) => void;\n unlink: (entity: any) => void;\n gatherTriggerTouches: (entity: any) => any[];\n}\n\n/**\n * Creates a mock CollisionEntityIndex.\n * @param overrides Optional overrides for the mock methods.\n */\nexport function createMockCollisionEntityIndex(overrides?: Partial<MockCollisionEntityIndex>): MockCollisionEntityIndex {\n return {\n trace: vi.fn().mockReturnValue({\n fraction: 1.0,\n allsolid: false,\n startsolid: false,\n endpos: { x: 0, y: 0, z: 0 },\n entityId: null\n }),\n link: vi.fn(),\n unlink: vi.fn(),\n gatherTriggerTouches: vi.fn().mockReturnValue([]),\n ...overrides\n };\n}\n","import { Server, Client, ClientState, ServerState, ServerStatic } from '@quake2ts/server';\nimport { Entity } from '@quake2ts/game';\nimport { UserCommand } from '@quake2ts/shared';\nimport { createMockServerState } from '../mocks/state.js';\nimport { createMockServerClient } from '../mocks/state.js';\nimport { createMockUserInfo, serializeUserInfo, UserInfo } from '../mocks/connection.js';\n\n// Define a type that combines Server and ServerStatic for convenience in tests\n// since the real server implementation splits these but tests often need both.\nexport type MockServerContext = Server & {\n clients: (Client | null)[];\n entities?: Entity[];\n};\n\nexport interface MultiplayerScenario {\n server: MockServerContext;\n clients: Client[];\n entities: Entity[];\n}\n\n/**\n * Creates a multiplayer test scenario with a mock server and a number of clients.\n * @param numPlayers Number of players to simulate.\n */\nexport function createMultiplayerTestScenario(numPlayers: number = 2): MultiplayerScenario {\n const baseServer = createMockServerState();\n const clients: Client[] = [];\n const entities: Entity[] = [];\n\n const server: MockServerContext = {\n ...baseServer,\n clients: new Array(numPlayers).fill(null),\n entities: []\n };\n\n for (let i = 0; i < numPlayers; i++) {\n // Create client\n const client = createMockServerClient(i, {\n state: ClientState.Active,\n userInfo: serializeUserInfo(createMockUserInfo({ name: `Player${i}` }))\n });\n\n // Create player entity\n const entity = {\n classname: 'player',\n s: { origin: { x: 0, y: 0, z: 0 }, number: i + 1 },\n client: client\n } as unknown as Entity;\n\n client.edict = entity;\n server.clients[i] = client;\n clients.push(client);\n entities.push(entity);\n }\n\n // Assign entities to server\n server.entities = entities;\n\n return {\n server,\n clients,\n entities\n };\n}\n\n/**\n * Simulates a player joining the server.\n * @param server The mock server instance.\n * @param userInfo Optional user info overrides.\n */\nexport async function simulatePlayerJoin(server: MockServerContext, userInfo?: Partial<UserInfo>): Promise<Client> {\n // Find free client slot\n const index = server.clients.findIndex((c) => !c || c.state === ClientState.Free);\n if (index === -1) {\n throw new Error('Server full');\n }\n\n const client = createMockServerClient(index, {\n state: ClientState.Connected,\n userInfo: serializeUserInfo(createMockUserInfo(userInfo))\n });\n\n server.clients[index] = client;\n\n // Simulate connection process\n client.state = ClientState.Active;\n\n // Create entity\n const entity = {\n classname: 'player',\n s: { origin: { x: 0, y: 0, z: 0 }, number: index + 1 },\n client: client\n } as unknown as Entity;\n client.edict = entity;\n\n // Add to entities list if possible (mock behavior)\n if (server.entities && Array.isArray(server.entities)) {\n // This is a simplified view, normally entities are in a fixed array\n (server.entities as Entity[])[index + 1] = entity;\n }\n\n return client;\n}\n\n/**\n * Simulates a player leaving the server.\n * @param server The mock server instance.\n * @param clientNum The client number to disconnect.\n */\nexport function simulatePlayerLeave(server: MockServerContext, clientNum: number): void {\n const client = server.clients[clientNum];\n if (client) {\n client.state = ClientState.Free;\n client.edict = null;\n }\n}\n\n/**\n * Simulates a single server frame update.\n * @param server The mock server instance.\n * @param deltaTime Time step in seconds (default: 0.1).\n */\nexport function simulateServerTick(server: MockServerContext, deltaTime: number = 0.1): void {\n server.time += deltaTime;\n server.frame++;\n // In a real server, we would call RunFrame, Physics, etc.\n // For mocks, we might just update client lastCmd times\n\n server.clients.forEach((client: Client | null) => {\n if (client && client.state === ClientState.Active) {\n // Update client logic if needed\n }\n });\n}\n\n/**\n * Simulates player input for a specific client.\n * @param client The server client.\n * @param input The input command.\n */\nexport function simulatePlayerInput(client: Client, input: Partial<UserCommand>): void {\n const cmd: UserCommand = {\n msec: 100,\n buttons: 0,\n angles: { x: 0, y: 0, z: 0 },\n forwardmove: 0,\n sidemove: 0,\n upmove: 0,\n sequence: client.lastCmd.sequence + 1,\n lightlevel: 0,\n impulse: 0,\n ...input\n };\n\n client.lastCmd = cmd;\n client.commandQueue.push(cmd);\n client.commandCount++;\n}\n","import { Server } from '@quake2ts/server';\nimport { EntityState } from '@quake2ts/shared';\n\nexport interface Snapshot {\n serverTime: number;\n playerState: any; // Simplified PlayerState\n entities: EntityState[];\n}\n\nexport interface DeltaSnapshot {\n snapshot: Snapshot;\n deltaEntities: EntityState[];\n removedEntities: number[];\n}\n\nexport interface ConsistencyReport {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Creates a client-specific snapshot from the server state.\n * @param serverState The current server state.\n * @param clientNum The client number to generate snapshot for.\n */\nexport function createServerSnapshot(serverState: Server, clientNum: number): Snapshot {\n // Collect visible entities\n const visibleEntities: EntityState[] = [];\n\n // In a real implementation, this would use PVS/PHS\n // For mock, we just take all entities that have a model or are solid\n if (serverState.baselines) {\n serverState.baselines.forEach((ent: EntityState | null, index: number) => {\n if (ent && index !== clientNum + 1) { // Skip self in packet entities usually\n visibleEntities.push({ ...ent });\n }\n });\n }\n\n return {\n serverTime: serverState.time,\n playerState: {\n origin: { x: 0, y: 0, z: 0 },\n viewangles: { x: 0, y: 0, z: 0 },\n pm_type: 0\n },\n entities: visibleEntities\n };\n}\n\n/**\n * Calculates the delta between two snapshots.\n * @param oldSnapshot The baseline snapshot.\n * @param newSnapshot The current snapshot.\n */\nexport function createDeltaSnapshot(oldSnapshot: Snapshot, newSnapshot: Snapshot): DeltaSnapshot {\n const deltaEntities: EntityState[] = [];\n const removedEntities: number[] = [];\n\n const oldMap = new Map(oldSnapshot.entities.map(e => [e.number, e]));\n const newMap = new Map(newSnapshot.entities.map(e => [e.number, e]));\n\n // Find changed or new entities\n newSnapshot.entities.forEach(newEnt => {\n const oldEnt = oldMap.get(newEnt.number);\n if (!oldEnt) {\n // New entity\n deltaEntities.push(newEnt);\n } else if (JSON.stringify(newEnt) !== JSON.stringify(oldEnt)) {\n // Changed entity (simplified check)\n deltaEntities.push(newEnt);\n }\n });\n\n // Find removed entities\n oldSnapshot.entities.forEach(oldEnt => {\n if (!newMap.has(oldEnt.number)) {\n removedEntities.push(oldEnt.number);\n }\n });\n\n return {\n snapshot: newSnapshot,\n deltaEntities,\n removedEntities\n };\n}\n\n/**\n * Verifies the consistency of a sequence of snapshots.\n * @param snapshots Array of snapshots ordered by time.\n */\nexport function verifySnapshotConsistency(snapshots: Snapshot[]): ConsistencyReport {\n const report: ConsistencyReport = { valid: true, errors: [] };\n\n if (snapshots.length < 2) return report;\n\n for (let i = 1; i < snapshots.length; i++) {\n const prev = snapshots[i-1];\n const curr = snapshots[i];\n\n if (curr.serverTime <= prev.serverTime) {\n report.valid = false;\n report.errors.push(`Snapshot ${i} has time ${curr.serverTime} <= prev ${prev.serverTime}`);\n }\n }\n\n return report;\n}\n\n/**\n * Simulates network delivery of a snapshot with potential packet loss.\n * @param snapshot The snapshot to deliver.\n * @param reliability Probability of successful delivery (0.0 to 1.0).\n */\nexport async function simulateSnapshotDelivery(snapshot: Snapshot, reliability: number = 1.0): Promise<Snapshot | null> {\n if (Math.random() > reliability) {\n return null;\n }\n return snapshot;\n}\n","import { Client, ClientFrame } from '@quake2ts/server';\n\nexport interface RateLimiter {\n bytesPerSecond: number;\n allow(bytes: number): boolean;\n update(deltaSeconds: number): void;\n reset(): void;\n getUsage(): number;\n}\n\nexport interface Message {\n data: Uint8Array;\n size: number;\n timestamp: number;\n}\n\nexport interface BandwidthScenario {\n bandwidth: number;\n clients: Client[];\n duration: number;\n totalBytesSent: number;\n totalBytesReceived: number;\n droppedPackets: number;\n}\n\n/**\n * Creates a mock rate limiter for bandwidth testing\n * @param bytesPerSecond - Maximum bytes per second allowed\n */\nexport function createMockRateLimiter(bytesPerSecond: number): RateLimiter {\n let bucket = bytesPerSecond;\n const maxBucket = bytesPerSecond; // Max burst size equal to 1 second of bandwidth\n let usage = 0;\n\n return {\n bytesPerSecond,\n allow(bytes: number): boolean {\n if (bucket >= bytes) {\n bucket -= bytes;\n usage += bytes;\n return true;\n }\n return false;\n },\n update(deltaSeconds: number): void {\n bucket += bytesPerSecond * deltaSeconds;\n if (bucket > maxBucket) {\n bucket = maxBucket;\n }\n },\n reset(): void {\n bucket = maxBucket;\n usage = 0;\n },\n getUsage(): number {\n return usage;\n }\n };\n}\n\n/**\n * Simulates bandwidth limiting on a stream of messages\n * @param messages - Array of messages to process\n * @param bandwidth - Bandwidth limit in bytes per second\n * @returns Filtered array of messages that passed the bandwidth check\n */\nexport function simulateBandwidthLimit(messages: Message[], bandwidth: number): Message[] {\n const limiter = createMockRateLimiter(bandwidth);\n const result: Message[] = [];\n let lastTime = messages.length > 0 ? messages[0].timestamp : 0;\n\n for (const msg of messages) {\n const delta = (msg.timestamp - lastTime) / 1000;\n if (delta > 0) {\n limiter.update(delta);\n }\n lastTime = msg.timestamp;\n\n if (limiter.allow(msg.size)) {\n result.push(msg);\n }\n }\n\n return result;\n}\n\n/**\n * Calculates the size of a client snapshot in bytes\n * @param snapshot - The client frame snapshot\n */\nexport function measureSnapshotSize(snapshot: ClientFrame): number {\n let size = 0;\n\n // Area bits\n size += snapshot.areaBytes;\n\n // Player state (approximate based on struct size or serialization)\n // This is an estimation, as actual network serialization compresses this\n size += 200; // Baseline size for PlayerState\n\n // Entities\n // Each EntityState is approx 20-30 bytes compressed\n size += snapshot.entities.length * 20;\n\n return size;\n}\n\n/**\n * Creates a scenario for testing bandwidth limits with multiple clients\n * @param bandwidth - Bandwidth limit per client or total\n * @param numClients - Number of clients to simulate\n */\nexport function createBandwidthTestScenario(bandwidth: number, numClients: number): BandwidthScenario {\n const clients: Client[] = [];\n // Populate with mock clients if needed (currently creating dummy objects to satisfy type)\n // In a real scenario we might use createClient factory but that requires net driver\n // For now we assume caller will populate fully or we return empty array if 0\n\n return {\n bandwidth,\n clients,\n duration: 0,\n totalBytesSent: 0,\n totalBytesReceived: 0,\n droppedPackets: 0\n };\n}\n","import { JSDOM } from 'jsdom';\nimport { Canvas, Image, ImageData } from '@napi-rs/canvas';\nimport 'fake-indexeddb/auto';\nimport { MockPointerLock } from '../client/mocks/input.js';\nimport { createMockWebGL2Context } from './webgl.js';\n\nexport interface BrowserSetupOptions {\n url?: string;\n pretendToBeVisual?: boolean;\n resources?: \"usable\";\n enableWebGL2?: boolean;\n enablePointerLock?: boolean;\n}\n\n/**\n * Sets up a browser environment for testing using JSDOM and napi-rs/canvas.\n * This should be called in your vitest.setup.ts file.\n */\nexport function setupBrowserEnvironment(options: BrowserSetupOptions = {}) {\n const {\n url = 'http://localhost',\n pretendToBeVisual = true,\n resources = undefined,\n enableWebGL2 = false,\n enablePointerLock = false\n } = options;\n\n // Create a JSDOM instance\n const dom = new JSDOM('<!DOCTYPE html><html><head></head><body></body></html>', {\n url,\n pretendToBeVisual,\n resources: resources as any\n });\n\n // Set up global variables\n global.window = dom.window as any;\n global.document = dom.window.document;\n\n // Handle navigator assignment safely\n try {\n // @ts-ignore\n global.navigator = dom.window.navigator;\n } catch (e) {\n try {\n Object.defineProperty(global, 'navigator', {\n value: dom.window.navigator,\n writable: true,\n configurable: true\n });\n } catch (e2) {\n console.warn('Could not assign global.navigator, skipping.');\n }\n }\n\n global.location = dom.window.location;\n global.HTMLElement = dom.window.HTMLElement;\n global.HTMLCanvasElement = dom.window.HTMLCanvasElement;\n\n // Polyfill global Event constructors\n global.Event = dom.window.Event;\n global.CustomEvent = dom.window.CustomEvent;\n global.DragEvent = dom.window.DragEvent as any;\n global.MouseEvent = dom.window.MouseEvent;\n global.KeyboardEvent = dom.window.KeyboardEvent;\n global.FocusEvent = dom.window.FocusEvent;\n global.WheelEvent = dom.window.WheelEvent;\n global.InputEvent = dom.window.InputEvent;\n global.UIEvent = dom.window.UIEvent;\n\n // Setup Storage mocks\n try {\n global.localStorage = dom.window.localStorage;\n } catch (e) {\n // Ignore if it fails\n }\n\n if (!global.localStorage) {\n const storage = new Map<string, string>();\n global.localStorage = {\n getItem: (key: string) => storage.get(key) || null,\n setItem: (key: string, value: string) => storage.set(key, value),\n removeItem: (key: string) => storage.delete(key),\n clear: () => storage.clear(),\n key: (index: number) => Array.from(storage.keys())[index] || null,\n get length() { return storage.size; }\n } as Storage;\n }\n\n // Override document.createElement for canvas elements\n const originalCreateElement = document.createElement.bind(document);\n document.createElement = function (tagName: string, options?: any) {\n if (tagName.toLowerCase() === 'canvas') {\n const napiCanvas = new Canvas(300, 150);\n const domCanvas = originalCreateElement('canvas', options);\n\n Object.defineProperty(domCanvas, 'width', {\n get: () => napiCanvas.width,\n set: (value) => { napiCanvas.width = value; },\n enumerable: true,\n configurable: true\n });\n\n Object.defineProperty(domCanvas, 'height', {\n get: () => napiCanvas.height,\n set: (value) => { napiCanvas.height = value; },\n enumerable: true,\n configurable: true\n });\n\n const originalGetContext = domCanvas.getContext.bind(domCanvas);\n domCanvas.getContext = function(contextId: string, options?: any) {\n if (contextId === '2d') {\n return napiCanvas.getContext('2d', options);\n }\n\n if (enableWebGL2 && contextId === 'webgl2') {\n return createMockWebGL2Context(domCanvas as HTMLCanvasElement);\n }\n\n if (contextId === 'webgl' || contextId === 'webgl2') {\n return originalGetContext(contextId, options);\n }\n return napiCanvas.getContext(contextId as any, options);\n } as any;\n\n (domCanvas as any).__napiCanvas = napiCanvas;\n\n return domCanvas;\n }\n return originalCreateElement(tagName, options);\n } as any;\n\n if (enableWebGL2) {\n const originalProtoGetContext = global.HTMLCanvasElement.prototype.getContext;\n global.HTMLCanvasElement.prototype.getContext = function (\n contextId: string,\n options?: any\n ): any {\n if (contextId === 'webgl2') {\n return createMockWebGL2Context(this);\n }\n // @ts-ignore\n return originalProtoGetContext.call(this, contextId as any, options);\n };\n }\n\n global.Image = Image as any;\n global.ImageData = ImageData as any;\n\n if (typeof global.createImageBitmap === 'undefined') {\n global.createImageBitmap = async function (\n image: any,\n _options?: ImageBitmapOptions\n ): Promise<any> {\n if (image && typeof image.width === 'number' && typeof image.height === 'number') {\n const canvas = new Canvas(image.width, image.height);\n const ctx = canvas.getContext('2d');\n if (image.data) {\n ctx.putImageData(image as any, 0, 0);\n }\n return canvas;\n }\n const canvas = new Canvas(100, 100);\n return canvas;\n } as unknown as any;\n }\n\n if (typeof global.btoa === 'undefined') {\n global.btoa = function (str: string): string {\n return Buffer.from(str, 'binary').toString('base64');\n };\n }\n\n if (typeof global.atob === 'undefined') {\n global.atob = function (str: string): string {\n return Buffer.from(str, 'base64').toString('binary');\n };\n }\n\n if (enablePointerLock) {\n new MockPointerLock(global.document);\n }\n\n if (typeof global.requestAnimationFrame === 'undefined') {\n let lastTime = 0;\n global.requestAnimationFrame = (callback: FrameRequestCallback) => {\n const currTime = Date.now();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(() => {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id as unknown as number;\n };\n\n global.cancelAnimationFrame = (id: number) => {\n clearTimeout(id);\n };\n }\n}\n\n/**\n * Cleans up the browser environment.\n */\nexport function teardownBrowserEnvironment() {\n // @ts-ignore\n delete global.window;\n // @ts-ignore\n delete global.document;\n // @ts-ignore\n delete global.navigator;\n // @ts-ignore\n delete global.localStorage;\n // @ts-ignore\n delete global.location;\n // @ts-ignore\n delete global.HTMLElement;\n // @ts-ignore\n delete global.HTMLCanvasElement;\n // @ts-ignore\n delete global.Image;\n // @ts-ignore\n delete global.ImageData;\n // @ts-ignore\n delete global.createImageBitmap;\n // @ts-ignore\n delete global.Event;\n // @ts-ignore\n delete global.CustomEvent;\n // @ts-ignore\n delete global.DragEvent;\n // @ts-ignore\n delete global.MouseEvent;\n // @ts-ignore\n delete global.KeyboardEvent;\n // @ts-ignore\n delete global.FocusEvent;\n // @ts-ignore\n delete global.WheelEvent;\n // @ts-ignore\n delete global.InputEvent;\n // @ts-ignore\n delete global.UIEvent;\n}\n","\n/**\n * Client Input System Mocks\n *\n * Provides utilities for simulating user input (keyboard, mouse, pointer lock)\n * in a test environment (JSDOM/Browser).\n */\n\nexport interface KeyModifiers {\n ctrl?: boolean;\n alt?: boolean;\n shift?: boolean;\n meta?: boolean;\n}\n\n/**\n * Factory for creating a mock KeyboardEvent.\n */\nexport function createMockKeyboardEvent(key: string, type: 'keydown' | 'keyup' = 'keydown', modifiers: KeyModifiers = {}): KeyboardEvent {\n return new KeyboardEvent(type, {\n key,\n code: key, // Default code to key if not specified (caller can override property if needed)\n ctrlKey: modifiers.ctrl,\n altKey: modifiers.alt,\n shiftKey: modifiers.shift,\n metaKey: modifiers.meta,\n bubbles: true,\n cancelable: true,\n view: window\n });\n}\n\n/**\n * Factory for creating a mock MouseEvent with support for movementX/Y.\n */\nexport function createMockMouseEvent(type: string, options: MouseEventInit = {}): MouseEvent {\n const event = new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n ...options\n });\n\n // Patch movementX/Y if needed as JSDOM MouseEvent might not initialize them from options\n if (options.movementX !== undefined) {\n Object.defineProperty(event, 'movementX', { value: options.movementX });\n }\n if (options.movementY !== undefined) {\n Object.defineProperty(event, 'movementY', { value: options.movementY });\n }\n\n return event;\n}\n\n/**\n * Factory for creating a mock WheelEvent.\n */\nexport function createMockWheelEvent(deltaX: number = 0, deltaY: number = 0): WheelEvent {\n return new WheelEvent('wheel', {\n deltaX,\n deltaY,\n bubbles: true,\n cancelable: true,\n view: window\n });\n}\n\n/**\n * Class implementing a mock for the Pointer Lock API.\n * Handles patching the document and element prototypes to simulate pointer lock.\n */\nexport class MockPointerLock {\n private _doc: Document;\n\n constructor(doc: Document = document) {\n this._doc = doc;\n this.setup();\n }\n\n private setup() {\n // Check if already patched to avoid conflicts\n if ((this._doc as any).__mockPointerLockInstalled) return;\n\n let _pointerLockElement: Element | null = null;\n const doc = this._doc;\n\n // Patch document.pointerLockElement\n Object.defineProperty(doc, 'pointerLockElement', {\n get: () => _pointerLockElement,\n configurable: true\n });\n\n // Patch document.exitPointerLock\n doc.exitPointerLock = () => {\n if (_pointerLockElement) {\n _pointerLockElement = null;\n doc.dispatchEvent(new Event('pointerlockchange'));\n }\n };\n\n // Patch HTMLElement.prototype.requestPointerLock\n // Save original if needed, but in JSDOM it might not exist or do nothing\n if (!(global.HTMLElement.prototype as any).__originalRequestPointerLock) {\n (global.HTMLElement.prototype as any).__originalRequestPointerLock = (global.HTMLElement.prototype as any).requestPointerLock;\n }\n\n (global.HTMLElement.prototype as any).requestPointerLock = function() {\n _pointerLockElement = this;\n doc.dispatchEvent(new Event('pointerlockchange'));\n };\n\n (doc as any).__mockPointerLockInstalled = true;\n }\n\n get element(): Element | null {\n return this._doc.pointerLockElement;\n }\n\n get locked(): boolean {\n return !!this.element;\n }\n\n request(element: HTMLElement) {\n element.requestPointerLock();\n }\n\n exit() {\n this._doc.exitPointerLock();\n }\n\n isLocked(): boolean {\n return this.locked;\n }\n}\n\n/**\n * Class for simulating input events.\n */\nexport class InputInjector {\n constructor(private doc: Document = document, private win: Window = window) {}\n\n keyDown(key: string, code?: string, modifiers?: KeyModifiers) {\n const event = createMockKeyboardEvent(key, 'keydown', modifiers);\n if (code) {\n Object.defineProperty(event, 'code', { value: code });\n }\n this.doc.dispatchEvent(event);\n }\n\n keyUp(key: string, code?: string, modifiers?: KeyModifiers) {\n const event = createMockKeyboardEvent(key, 'keyup', modifiers);\n if (code) {\n Object.defineProperty(event, 'code', { value: code });\n }\n this.doc.dispatchEvent(event);\n }\n\n mouseMove(movementX: number, movementY: number, clientX = 0, clientY = 0) {\n const event = createMockMouseEvent('mousemove', {\n clientX,\n clientY,\n movementX,\n movementY\n });\n this.dispatchToTarget(event);\n }\n\n mouseButton(button: number, state: 'down' | 'up' = 'down') {\n if (state === 'down') {\n this.mouseDown(button);\n } else {\n this.mouseUp(button);\n }\n }\n\n mouseDown(button: number = 0) {\n const event = createMockMouseEvent('mousedown', { button });\n this.dispatchToTarget(event);\n }\n\n mouseUp(button: number = 0) {\n const event = createMockMouseEvent('mouseup', { button });\n this.dispatchToTarget(event);\n }\n\n mouseWheel(deltaY: number) {\n const event = createMockWheelEvent(0, deltaY);\n this.dispatchToTarget(event);\n }\n\n // Alias for backward compatibility/ease of use\n wheel(deltaY: number) {\n this.mouseWheel(deltaY);\n }\n\n private dispatchToTarget(event: Event) {\n const target = this.doc.pointerLockElement || this.doc;\n target.dispatchEvent(event);\n }\n}\n\n/**\n * Factory for creating a MockPointerLock instance.\n */\nexport function createMockPointerLock(element?: HTMLElement): MockPointerLock {\n const mock = new MockPointerLock();\n if (element) {\n mock.request(element);\n }\n return mock;\n}\n\n/**\n * Factory for creating an InputInjector.\n */\nexport function createInputInjector(target?: EventTarget): InputInjector {\n // If target is provided and is a Document, use it.\n // Otherwise default to global document.\n const doc = (target instanceof Document) ? target : document;\n const win = (doc.defaultView) ? doc.defaultView : window;\n return new InputInjector(doc, win);\n}\n","import { vi } from 'vitest';\n\ninterface ShaderRecord {\n readonly id: number;\n readonly type: GLenum;\n}\n\ninterface ProgramRecord {\n readonly id: number;\n}\n\nexport class MockWebGL2RenderingContext {\n readonly ARRAY_BUFFER = 0x8892;\n readonly ELEMENT_ARRAY_BUFFER = 0x8893;\n readonly STATIC_DRAW = 0x88e4;\n readonly DYNAMIC_DRAW = 0x88e8;\n readonly FLOAT = 0x1406;\n readonly UNSIGNED_SHORT = 0x1403;\n readonly TEXTURE_2D = 0x0de1;\n readonly TEXTURE_CUBE_MAP = 0x8513;\n readonly TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\n readonly TEXTURE0 = 0x84c0;\n readonly TEXTURE_WRAP_S = 0x2802;\n readonly TEXTURE_WRAP_T = 0x2803;\n readonly TEXTURE_MIN_FILTER = 0x2801;\n readonly TEXTURE_MAG_FILTER = 0x2800;\n readonly LINEAR = 0x2601;\n readonly NEAREST = 0x2600;\n readonly CLAMP_TO_EDGE = 0x812f;\n readonly RGBA = 0x1908;\n readonly UNSIGNED_BYTE = 0x1401;\n readonly FRAMEBUFFER = 0x8d40;\n readonly COLOR_ATTACHMENT0 = 0x8ce0;\n readonly DEPTH_ATTACHMENT = 0x8d00;\n readonly RENDERBUFFER = 0x8d41;\n readonly DEPTH_COMPONENT24 = 0x81a6;\n readonly FRAMEBUFFER_COMPLETE = 0x8cd5;\n readonly TRIANGLES = 0x0004;\n readonly DEPTH_TEST = 0x0b71;\n readonly CULL_FACE = 0x0b44;\n readonly BLEND = 0x0be2;\n readonly SRC_ALPHA = 0x0302;\n readonly ONE_MINUS_SRC_ALPHA = 0x0303;\n readonly ONE = 1;\n readonly BACK = 0x0405;\n readonly LEQUAL = 0x0203;\n readonly VERTEX_SHADER = 0x8b31;\n readonly FRAGMENT_SHADER = 0x8b30;\n readonly COMPILE_STATUS = 0x8b81;\n readonly LINK_STATUS = 0x8b82;\n readonly ONE_MINUS_SRC_COLOR = 0x0301;\n readonly TRIANGLE_STRIP = 0x0005;\n readonly QUERY_RESULT_AVAILABLE = 0x8867;\n readonly QUERY_RESULT = 0x8866;\n\n // Constants commonly used in setup/webgl.ts\n readonly TRIANGLE_FAN = 0x0006;\n readonly COLOR_BUFFER_BIT = 0x4000;\n readonly DEPTH_BUFFER_BIT = 0x0100;\n\n readonly canvas: HTMLCanvasElement | { width: number; height: number };\n readonly drawingBufferWidth: number;\n readonly drawingBufferHeight: number;\n\n private shaderCounter = 0;\n private programCounter = 0;\n\n compileSucceeds = true;\n linkSucceeds = true;\n shaderInfoLog = 'shader failed';\n programInfoLog = 'program failed';\n\n readonly extensions = new Map<string, unknown>();\n readonly calls: string[] = [];\n readonly uniformLocations = new Map<string, WebGLUniformLocation | null>();\n readonly attributeLocations = new Map<string, number>();\n\n constructor(canvas?: HTMLCanvasElement) {\n if (canvas) {\n this.canvas = canvas;\n this.drawingBufferWidth = canvas.width;\n this.drawingBufferHeight = canvas.height;\n } else {\n this.canvas = { width: 800, height: 600 };\n this.drawingBufferWidth = 800;\n this.drawingBufferHeight = 600;\n }\n }\n\n enable = vi.fn((cap: GLenum) => this.calls.push(`enable:${cap}`));\n disable = vi.fn((cap: GLenum) => this.calls.push(`disable:${cap}`));\n depthFunc = vi.fn((func: GLenum) => this.calls.push(`depthFunc:${func}`));\n cullFace = vi.fn((mode: GLenum) => this.calls.push(`cullFace:${mode}`));\n depthMask = vi.fn((flag: GLboolean) => this.calls.push(`depthMask:${flag}`));\n blendFuncSeparate = vi.fn((srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) =>\n this.calls.push(`blendFuncSeparate:${srcRGB}:${dstRGB}:${srcAlpha}:${dstAlpha}`)\n );\n blendFunc = vi.fn((sfactor: GLenum, dfactor: GLenum) => this.calls.push(`blendFunc:${sfactor}:${dfactor}`));\n getExtension = vi.fn((name: string) => this.extensions.get(name) ?? null);\n viewport = vi.fn((x: number, y: number, w: number, h: number) => this.calls.push(`viewport:${x}:${y}:${w}:${h}`));\n clear = vi.fn((mask: number) => this.calls.push(`clear:${mask}`));\n clearColor = vi.fn((r: number, g: number, b: number, a: number) => this.calls.push(`clearColor:${r}:${g}:${b}:${a}`));\n\n createShader = vi.fn((type: GLenum) => ({ id: ++this.shaderCounter, type } as unknown as WebGLShader));\n shaderSource = vi.fn((shader: ShaderRecord, source: string) => this.calls.push(`shaderSource:${shader.id}:${source}`));\n compileShader = vi.fn((shader: ShaderRecord) => this.calls.push(`compileShader:${shader.id}`));\n getShaderParameter = vi.fn((shader: ShaderRecord, pname: GLenum) =>\n pname === this.COMPILE_STATUS ? this.compileSucceeds : null\n );\n getShaderInfoLog = vi.fn(() => (this.compileSucceeds ? '' : this.shaderInfoLog));\n deleteShader = vi.fn((shader: ShaderRecord) => this.calls.push(`deleteShader:${shader.id}`));\n\n createProgram = vi.fn(() => ({ id: ++this.programCounter } as unknown as WebGLProgram));\n attachShader = vi.fn((program: ProgramRecord, shader: ShaderRecord) =>\n this.calls.push(`attach:${program.id}:${shader.id}`)\n );\n bindAttribLocation = vi.fn((program: ProgramRecord, index: number, name: string) =>\n this.calls.push(`bindAttribLocation:${program.id}:${index}:${name}`)\n );\n linkProgram = vi.fn((program: ProgramRecord) => this.calls.push(`link:${program.id}`));\n getProgramParameter = vi.fn((program: ProgramRecord, pname: GLenum) =>\n pname === this.LINK_STATUS ? this.linkSucceeds : null\n );\n getProgramInfoLog = vi.fn(() => (this.linkSucceeds ? '' : this.programInfoLog));\n deleteProgram = vi.fn((program: ProgramRecord) => this.calls.push(`deleteProgram:${program.id}`));\n useProgram = vi.fn((program: ProgramRecord | null) => this.calls.push(`useProgram:${program?.id ?? 'null'}`));\n getUniformLocation = vi.fn((program: ProgramRecord, name: string) => {\n this.calls.push(`getUniformLocation:${program.id}:${name}`);\n return this.uniformLocations.get(name) ?? null;\n });\n getAttribLocation = vi.fn((program: ProgramRecord, name: string) => {\n this.calls.push(`getAttribLocation:${program.id}:${name}`);\n return this.attributeLocations.get(name) ?? -1;\n });\n\n createBuffer = vi.fn(() => ({ buffer: {} } as unknown as WebGLBuffer));\n bindBuffer = vi.fn((target: GLenum, buffer: WebGLBuffer | null) => this.calls.push(`bindBuffer:${target}:${!!buffer}`));\n bufferData = vi.fn((target: GLenum, data: number | BufferSource, usage: GLenum) =>\n this.calls.push(`bufferData:${target}:${usage}:${typeof data === 'number' ? data : 'data'}`)\n );\n bufferSubData = vi.fn((target: GLenum, offset: number, data: BufferSource) =>\n this.calls.push(`bufferSubData:${target}:${offset}:${data.byteLength ?? 'len'}`)\n );\n deleteBuffer = vi.fn((buffer: WebGLBuffer) => this.calls.push(`deleteBuffer:${!!buffer}`));\n\n createVertexArray = vi.fn(() => ({ vao: {} } as unknown as WebGLVertexArrayObject));\n bindVertexArray = vi.fn((vao: WebGLVertexArrayObject | null) => this.calls.push(`bindVertexArray:${!!vao}`));\n enableVertexAttribArray = vi.fn((index: number) => this.calls.push(`enableAttrib:${index}`));\n vertexAttribPointer = vi.fn(\n (index: number, size: number, type: GLenum, normalized: boolean, stride: number, offset: number) =>\n this.calls.push(`vertexAttribPointer:${index}:${size}:${type}:${normalized}:${stride}:${offset}`)\n );\n vertexAttribDivisor = vi.fn((index: number, divisor: number) => this.calls.push(`divisor:${index}:${divisor}`));\n deleteVertexArray = vi.fn((vao: WebGLVertexArrayObject) => this.calls.push(`deleteVertexArray:${!!vao}`));\n\n createTexture = vi.fn(() => ({ texture: {} } as unknown as WebGLTexture));\n activeTexture = vi.fn((unit: GLenum) => this.calls.push(`activeTexture:${unit}`));\n bindTexture = vi.fn((target: GLenum, texture: WebGLTexture | null) => this.calls.push(`bindTexture:${target}:${!!texture}`));\n texParameteri = vi.fn((target: GLenum, pname: GLenum, param: GLint) =>\n this.calls.push(`texParameteri:${target}:${pname}:${param}`)\n );\n texImage2D = vi.fn(\n (\n target: GLenum,\n level: GLint,\n internalFormat: GLenum,\n width: GLsizei,\n height: GLsizei,\n border: GLint,\n format: GLenum,\n type: GLenum,\n pixels: ArrayBufferView | null\n ) =>\n this.calls.push(\n `texImage2D:${target}:${level}:${internalFormat}:${width}:${height}:${border}:${format}:${type}:${pixels ? 'data' : 'null'}`\n )\n );\n texImage3D = vi.fn(); // Stub for compatibility\n deleteTexture = vi.fn((texture: WebGLTexture) => this.calls.push(`deleteTexture:${!!texture}`));\n\n createFramebuffer = vi.fn(() => ({ fb: {} } as unknown as WebGLFramebuffer));\n bindFramebuffer = vi.fn((target: GLenum, framebuffer: WebGLFramebuffer | null) =>\n this.calls.push(`bindFramebuffer:${target}:${!!framebuffer}`)\n );\n framebufferTexture2D = vi.fn(\n (target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture | null, level: GLint) =>\n this.calls.push(`framebufferTexture2D:${target}:${attachment}:${textarget}:${!!texture}:${level}`)\n );\n deleteFramebuffer = vi.fn((fb: WebGLFramebuffer) => this.calls.push(`deleteFramebuffer:${!!fb}`));\n checkFramebufferStatus = vi.fn((target: GLenum) => this.FRAMEBUFFER_COMPLETE);\n\n createRenderbuffer = vi.fn(() => ({ rb: {} } as unknown as WebGLRenderbuffer));\n bindRenderbuffer = vi.fn((target: GLenum, renderbuffer: WebGLRenderbuffer | null) =>\n this.calls.push(`bindRenderbuffer:${target}:${!!renderbuffer}`)\n );\n renderbufferStorage = vi.fn((target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) =>\n this.calls.push(`renderbufferStorage:${target}:${internalformat}:${width}:${height}`)\n );\n framebufferRenderbuffer = vi.fn((target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer | null) =>\n this.calls.push(`framebufferRenderbuffer:${target}:${attachment}:${renderbuffertarget}:${!!renderbuffer}`)\n );\n deleteRenderbuffer = vi.fn((rb: WebGLRenderbuffer) => this.calls.push(`deleteRenderbuffer:${!!rb}`));\n\n drawArrays = vi.fn((mode: GLenum, first: GLint, count: GLsizei) =>\n this.calls.push(`drawArrays:${mode}:${first}:${count}`)\n );\n\n drawElements = vi.fn((mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr) =>\n this.calls.push(`drawElements:${mode}:${count}:${type}:${offset}`)\n );\n\n // Queries\n createQuery = vi.fn(() => ({}) as WebGLQuery);\n beginQuery = vi.fn();\n endQuery = vi.fn();\n deleteQuery = vi.fn();\n getQueryParameter = vi.fn();\n getParameter = vi.fn();\n\n uniform1f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat) =>\n this.calls.push(`uniform1f:${location ? 'set' : 'null'}:${x}`)\n );\n uniform1i = vi.fn((location: WebGLUniformLocation | null, x: GLint) =>\n this.calls.push(`uniform1i:${location ? 'set' : 'null'}:${x}`)\n );\n uniform4f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) =>\n this.calls.push(`uniform4f:${location ? 'set' : 'null'}:${x}:${y}:${z}:${w}`)\n );\n uniform3fv = vi.fn((location: WebGLUniformLocation | null, data: Float32List | number[]) =>\n this.calls.push(`uniform3fv:${location ? 'set' : 'null'}:${Array.from(data as Iterable<number>).join(',')}`)\n );\n uniform3f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat) =>\n this.calls.push(`uniform3f:${location ? 'set' : 'null'}:${x}:${y}:${z}`)\n );\n uniform2f = vi.fn((location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat) =>\n this.calls.push(`uniform2f:${location ? 'set' : 'null'}:${x}:${y}`)\n );\n uniform4fv = vi.fn((location: WebGLUniformLocation | null, data: Float32List) =>\n this.calls.push(`uniform4fv:${location ? 'set' : 'null'}:${Array.from(data as Iterable<number>).join(',')}`)\n );\n uniformMatrix4fv = vi.fn(\n (location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List | Iterable<number>) =>\n this.calls.push(`uniformMatrix4fv:${location ? 'set' : 'null'}:${transpose}:${Array.from(data as Iterable<number>).join(',')}`)\n );\n\n uniformBlockBinding = vi.fn();\n\n isContextLost = vi.fn(() => false);\n}\n\nexport function createMockWebGL2Context(\n overridesOrCanvas?: Partial<WebGL2RenderingContext> | HTMLCanvasElement\n): MockWebGL2RenderingContext {\n let context: MockWebGL2RenderingContext;\n\n if (overridesOrCanvas instanceof Object && 'width' in overridesOrCanvas && 'height' in overridesOrCanvas && 'getContext' in overridesOrCanvas) {\n // It's likely a canvas element (or mock of it)\n context = new MockWebGL2RenderingContext(overridesOrCanvas as HTMLCanvasElement);\n } else {\n context = new MockWebGL2RenderingContext();\n if (overridesOrCanvas) {\n Object.assign(context, overridesOrCanvas);\n }\n }\n\n return context;\n}\n","import { Canvas, ImageData } from '@napi-rs/canvas';\nimport { createMockWebGL2Context } from '../engine/mocks/webgl.js';\n\n/**\n * Creates a mock HTMLCanvasElement backed by napi-rs/canvas,\n * with support for both 2D and WebGL2 contexts.\n */\nexport function createMockCanvas(width: number = 300, height: number = 150): HTMLCanvasElement {\n // Use a real JSDOM canvas if available in the environment (setupBrowserEnvironment)\n if (typeof document !== 'undefined' && document.createElement) {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n\n // Fallback for non-JSDOM environments or specialized testing\n const napiCanvas = new Canvas(width, height);\n const canvas = {\n width,\n height,\n getContext: (contextId: string, options?: any) => {\n if (contextId === '2d') {\n return napiCanvas.getContext('2d', options);\n }\n if (contextId === 'webgl2') {\n return createMockWebGL2Context(canvas as any);\n }\n return null;\n },\n toDataURL: () => napiCanvas.toDataURL(),\n toBuffer: (mime: any) => napiCanvas.toBuffer(mime),\n // Add other properties as needed\n } as unknown as HTMLCanvasElement;\n\n return canvas;\n}\n\n/**\n * Creates a mock CanvasRenderingContext2D.\n */\nexport function createMockCanvasContext2D(canvas?: HTMLCanvasElement): CanvasRenderingContext2D {\n const c = canvas || createMockCanvas();\n const ctx = c.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to create 2D context');\n }\n return ctx as CanvasRenderingContext2D;\n}\n\n/**\n * Information about a captured draw call.\n */\nexport interface DrawCall {\n method: string;\n args: any[];\n}\n\n/**\n * Wraps a CanvasRenderingContext2D to capture all method calls.\n */\nexport function captureCanvasDrawCalls(context: CanvasRenderingContext2D): DrawCall[] {\n const calls: DrawCall[] = [];\n const proto = Object.getPrototypeOf(context);\n\n // Iterate over all properties of the context prototype\n for (const key of Object.getOwnPropertyNames(proto)) {\n const value = (context as any)[key];\n if (typeof value === 'function') {\n // Override function\n (context as any)[key] = function(...args: any[]) {\n calls.push({ method: key, args });\n return value.apply(context, args);\n };\n }\n }\n\n return calls;\n}\n\n/**\n * Creates a mock ImageData object.\n */\nexport function createMockImageData(width: number, height: number, fillColor?: [number, number, number, number]): ImageData {\n // Check if global ImageData is available (polyfilled by setupBrowserEnvironment)\n if (typeof global.ImageData !== 'undefined') {\n const data = new Uint8ClampedArray(width * height * 4);\n if (fillColor) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = fillColor[0];\n data[i + 1] = fillColor[1];\n data[i + 2] = fillColor[2];\n data[i + 3] = fillColor[3];\n }\n }\n return new global.ImageData(data, width, height) as unknown as ImageData;\n }\n\n // Fallback if not globally available, though it should be with @napi-rs/canvas\n const data = new Uint8ClampedArray(width * height * 4);\n if (fillColor) {\n for (let i = 0; i < data.length; i += 4) {\n data[i] = fillColor[0];\n data[i + 1] = fillColor[1];\n data[i + 2] = fillColor[2];\n data[i + 3] = fillColor[3];\n }\n }\n return new ImageData(data, width, height);\n}\n\n/**\n * Creates a mock HTMLImageElement.\n */\nexport function createMockImage(width: number = 100, height: number = 100, src: string = ''): HTMLImageElement {\n if (typeof document !== 'undefined' && document.createElement) {\n const img = document.createElement('img');\n img.width = width;\n img.height = height;\n if (src) img.src = src;\n return img;\n }\n\n // Fallback\n const img = {\n width,\n height,\n src,\n complete: true,\n onload: null,\n onerror: null,\n } as unknown as HTMLImageElement;\n\n // Simulate async load if src is provided\n if (src) {\n setTimeout(() => {\n if (img.onload) (img.onload as any)();\n }, 0);\n }\n\n return img;\n}\n","\nimport { vi } from 'vitest';\n\nexport function createMockGPUAdapter(): Partial<GPUAdapter> {\n return {\n requestDevice: vi.fn().mockResolvedValue(createMockGPUDevice()),\n features: new Set() as any,\n limits: {} as any,\n };\n}\n\nexport function createMockGPUDevice(): Partial<GPUDevice> {\n return {\n features: new Set() as any,\n limits: {} as any,\n queue: {\n submit: vi.fn(),\n writeBuffer: vi.fn(),\n writeTexture: vi.fn(),\n copyExternalImageToTexture: vi.fn(),\n } as any,\n createCommandEncoder: vi.fn().mockReturnValue({\n beginRenderPass: vi.fn().mockReturnValue({\n setPipeline: vi.fn(),\n draw: vi.fn(),\n end: vi.fn(),\n }),\n finish: vi.fn(),\n }),\n createRenderPipeline: vi.fn(),\n createShaderModule: vi.fn(),\n createBindGroup: vi.fn(),\n createBindGroupLayout: vi.fn(),\n createBuffer: vi.fn(),\n createTexture: vi.fn(),\n createSampler: vi.fn(),\n };\n}\n\nexport function createMockGPUCanvasContext(): Partial<GPUCanvasContext> {\n return {\n configure: vi.fn(),\n unconfigure: vi.fn(),\n getCurrentTexture: vi.fn(),\n };\n}\n\nexport function setupWebGPUMocks() {\n const mockAdapter = createMockGPUAdapter();\n\n // Mock navigator.gpu\n const mockGpu = {\n requestAdapter: vi.fn().mockResolvedValue(mockAdapter),\n getPreferredCanvasFormat: vi.fn().mockReturnValue('bgra8unorm'),\n };\n\n // Assign to global navigator\n Object.defineProperty(global.navigator, 'gpu', {\n value: mockGpu,\n writable: true,\n configurable: true,\n });\n\n // Mock global GPUTextureUsage\n (global as any).GPUTextureUsage = {\n COPY_SRC: 0x01,\n COPY_DST: 0x02,\n TEXTURE_BINDING: 0x04,\n STORAGE_BINDING: 0x08,\n RENDER_ATTACHMENT: 0x10,\n };\n}\n","/**\n * Interface for the mock RequestAnimationFrame implementation.\n */\nexport interface MockRAF {\n /**\n * Advances time by one tick (simulating one frame).\n * @param time Timestamp to pass to callbacks (default: calls Date.now())\n */\n tick(time?: number): void;\n /**\n * Advances time by a specific amount, triggering multiple frames if necessary.\n * Not fully implemented in simple version, acts as alias to tick() with specific time.\n */\n advance(ms: number): void;\n /**\n * Returns current pending callbacks.\n */\n getCallbacks(): Array<{id: number, callback: FrameRequestCallback}>;\n}\n\n/**\n * Creates a mock RequestAnimationFrame implementation.\n * Replaces global.requestAnimationFrame and cancelAnimationFrame.\n */\nexport function createMockRAF(): MockRAF {\n let callbacks: Array<{id: number, callback: FrameRequestCallback}> = [];\n let lastId = 0;\n let currentTime = 0;\n\n const originalRAF = global.requestAnimationFrame;\n const originalCancelRAF = global.cancelAnimationFrame;\n\n global.requestAnimationFrame = (callback: FrameRequestCallback): number => {\n lastId++;\n callbacks.push({ id: lastId, callback });\n return lastId;\n };\n\n global.cancelAnimationFrame = (id: number): void => {\n callbacks = callbacks.filter(cb => cb.id !== id);\n };\n\n return {\n tick(time?: number) {\n if (time) currentTime = time;\n else currentTime += 16.66; // ~60fps\n\n const currentCallbacks = [...callbacks];\n callbacks = []; // Clear before execution to allow re-scheduling\n\n currentCallbacks.forEach(cb => cb.callback(currentTime));\n },\n advance(ms: number) {\n // Simple implementation: just advance time and process one batch\n // For more complex simulation, we might loop\n currentTime += ms;\n this.tick(currentTime);\n },\n getCallbacks() {\n return callbacks;\n }\n };\n}\n\n/**\n * Creates a mock Performance object.\n */\nexport function createMockPerformance(startTime: number = 0): Performance {\n let now = startTime;\n\n const mockPerformance = {\n now: () => now,\n timeOrigin: startTime,\n timing: {\n navigationStart: startTime,\n },\n mark: (_name: string) => {},\n measure: (_name: string, _start: string, _end: string) => {},\n getEntries: () => [],\n getEntriesByName: (_name: string) => [],\n getEntriesByType: (_type: string) => [],\n clearMarks: (_name?: string) => {},\n clearMeasures: (_name?: string) => {},\n clearResourceTimings: () => {},\n setResourceTimingBufferSize: (_maxSize: number) => {},\n onresourcetimingbufferfull: null,\n toJSON: () => ({})\n } as unknown as Performance;\n\n // Polyfill global if needed, or return for injection\n if (typeof global.performance === 'undefined') {\n global.performance = mockPerformance;\n }\n\n return mockPerformance;\n}\n\nexport interface ControlledTimer {\n /**\n * Advances virtual time by ms.\n */\n advanceBy(ms: number): void;\n /**\n * Runs all pending timers.\n */\n runAll(): void;\n /**\n * Restores original timer functions.\n */\n clear(): void;\n}\n\n/**\n * Creates controlled timers (setTimeout/setInterval).\n * Note: Use verify's useFakeTimers() for better integration with test runner.\n * This is a lightweight alternative or specific helper.\n */\nexport function createControlledTimer(): ControlledTimer {\n // This functionality is best provided by vitest/jest directly via vi.useFakeTimers()\n // Wrapping it here for convenience if needed, but for now we'll recommend `vi`.\n console.warn('createControlledTimer: Recommend using vi.useFakeTimers() instead.');\n\n return {\n advanceBy: (ms: number) => { /* delegate to vi.advanceTimersByTime(ms) in consumer */ },\n runAll: () => { /* delegate to vi.runAllTimers() */ },\n clear: () => { /* delegate to vi.useRealTimers() */ }\n };\n}\n\n/**\n * Simulates multiple RAF frames.\n */\nexport function simulateFrames(count: number, frameTime: number = 16, callback?: (frameIndex: number) => void): void {\n for (let i = 0; i < count; i++) {\n // If using the global mock RAF from createMockRAF, we just rely on callbacks being scheduled.\n // However, if we need to manually trigger them, we assume existing RAF loop.\n // This helper assumes a synchronous execution where we can just wait or tick.\n // With `vi.useFakeTimers()`, we would `vi.advanceTimersByTime(frameTime)`.\n\n if (callback) callback(i);\n }\n}\n","/**\n * Setup helpers for Node.js environments.\n */\nexport interface NodeSetupOptions {\n // Add options as needed, e.g. mocking fs, process.env, etc.\n}\n\n/**\n * Sets up a Node.js environment for testing.\n * Currently a placeholder for future Node-specific setup.\n */\nexport function setupNodeEnvironment(options: NodeSetupOptions = {}) {\n // No-op for now, but provides a hook for future setup\n}\n\n/**\n * Teardown for Node.js environment.\n */\nexport function teardownNodeEnvironment() {\n // No-op for now\n}\n","import { vi } from 'vitest';\nimport { createMockWebGL2Context, MockWebGL2RenderingContext } from './mocks/webgl.js';\n\n// Define minimal mock interfaces for internal engine components not publicly exported.\ninterface MockPipeline {\n render: ReturnType<typeof vi.fn>;\n init: ReturnType<typeof vi.fn>;\n resize: ReturnType<typeof vi.fn>;\n}\n\ninterface MockCamera {\n update: ReturnType<typeof vi.fn>;\n getViewMatrix: ReturnType<typeof vi.fn>;\n getProjectionMatrix: ReturnType<typeof vi.fn>;\n getViewProjectionMatrix: ReturnType<typeof vi.fn>;\n getPosition: ReturnType<typeof vi.fn>;\n getForward: ReturnType<typeof vi.fn>;\n getRight: ReturnType<typeof vi.fn>;\n getUp: ReturnType<typeof vi.fn>;\n extractFrustumPlanes: ReturnType<typeof vi.fn>;\n transform: {\n origin: number[];\n angles: number[];\n fov: number;\n };\n}\n\nexport interface MockRenderingContext {\n gl: MockWebGL2RenderingContext;\n camera: MockCamera;\n pipelines: {\n md2: MockPipeline;\n bsp: MockPipeline;\n sprite: MockPipeline;\n poly: MockPipeline;\n particle: MockPipeline;\n };\n}\n\nexport function createMockRenderingContext(): MockRenderingContext {\n const gl = createMockWebGL2Context();\n\n // Mock Camera\n const camera: MockCamera = {\n update: vi.fn(),\n getViewMatrix: vi.fn().mockReturnValue(new Float32Array(16)),\n getProjectionMatrix: vi.fn().mockReturnValue(new Float32Array(16)),\n getViewProjectionMatrix: vi.fn().mockReturnValue(new Float32Array(16)),\n getPosition: vi.fn().mockReturnValue([0, 0, 0]),\n getForward: vi.fn().mockReturnValue([0, 0, -1]),\n getRight: vi.fn().mockReturnValue([1, 0, 0]),\n getUp: vi.fn().mockReturnValue([0, 1, 0]),\n extractFrustumPlanes: vi.fn(),\n transform: {\n origin: [0, 0, 0],\n angles: [0, 0, 0],\n fov: 90\n }\n };\n\n // Mock Pipelines\n const md2: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const bsp: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const sprite: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const poly: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n const particle: MockPipeline = {\n render: vi.fn(),\n init: vi.fn(),\n resize: vi.fn(),\n };\n\n return {\n gl,\n camera,\n pipelines: {\n md2,\n bsp,\n sprite,\n poly,\n particle\n }\n };\n}\n","/**\n * Helper to create a storage-like object (localStorage/sessionStorage).\n */\nfunction createStorageMock(initialData: Record<string, string> = {}): Storage {\n const store = new Map<string, string>(Object.entries(initialData));\n\n return {\n getItem: (key: string) => store.get(key) || null,\n setItem: (key: string, value: string) => store.set(key, value.toString()),\n removeItem: (key: string) => store.delete(key),\n clear: () => store.clear(),\n key: (index: number) => Array.from(store.keys())[index] || null,\n get length() { return store.size; }\n } as Storage;\n}\n\n/**\n * Creates a mock LocalStorage instance.\n */\nexport function createMockLocalStorage(initialData: Record<string, string> = {}): Storage {\n return createStorageMock(initialData);\n}\n\n/**\n * Creates a mock SessionStorage instance.\n */\nexport function createMockSessionStorage(initialData: Record<string, string> = {}): Storage {\n return createStorageMock(initialData);\n}\n\n/**\n * Creates a mock IndexedDB factory.\n * Wraps fake-indexeddb.\n */\nexport function createMockIndexedDB(databases?: IDBDatabase[]): IDBFactory {\n // fake-indexeddb/auto already sets global.indexedDB\n // If we need to return a specific instance or customized one, we can do it here.\n // For now, return the global one or a fresh 'fake-indexeddb' instance if we were to import it directly.\n\n // Since we imported 'fake-indexeddb/auto' in setup/browser.ts, global.indexedDB is already mocked.\n // We can return that.\n return global.indexedDB;\n}\n\nexport interface StorageScenario {\n localStorage: Storage;\n sessionStorage: Storage;\n indexedDB: IDBFactory;\n}\n\n/**\n * Creates a complete storage test scenario.\n */\nexport function createStorageTestScenario(storageType: 'local' | 'session' | 'indexed' = 'local'): StorageScenario {\n return {\n localStorage: createMockLocalStorage(),\n sessionStorage: createMockSessionStorage(),\n indexedDB: createMockIndexedDB()\n };\n}\n","/**\n * Mocks for Web Audio API.\n */\n\n/**\n * Sets up a mock AudioContext globally.\n */\nexport function setupMockAudioContext(): void {\n class MockAudioContext {\n state = 'suspended';\n destination = {};\n currentTime = 0;\n listener = {\n positionX: { value: 0 },\n positionY: { value: 0 },\n positionZ: { value: 0 },\n forwardX: { value: 0 },\n forwardY: { value: 0 },\n forwardZ: { value: 0 },\n upX: { value: 0 },\n upY: { value: 0 },\n upZ: { value: 0 },\n setOrientation: () => {},\n setPosition: () => {}\n };\n\n createGain() {\n return {\n gain: { value: 1, linearRampToValueAtTime: () => {} },\n connect: () => {},\n disconnect: () => {}\n };\n }\n\n createBufferSource() {\n return {\n buffer: null,\n loop: false,\n playbackRate: { value: 1 },\n connect: () => {},\n start: () => {},\n stop: () => {},\n disconnect: () => {},\n onended: null\n };\n }\n\n createPanner() {\n return {\n panningModel: 'equalpower',\n distanceModel: 'inverse',\n positionX: { value: 0 },\n positionY: { value: 0 },\n positionZ: { value: 0 },\n orientationX: { value: 0 },\n orientationY: { value: 0 },\n orientationZ: { value: 0 },\n coneInnerAngle: 360,\n coneOuterAngle: 360,\n coneOuterGain: 0,\n connect: () => {},\n disconnect: () => {},\n setPosition: () => {},\n setOrientation: () => {}\n }\n }\n\n createBuffer(numOfChannels: number, length: number, sampleRate: number) {\n return {\n duration: length / sampleRate,\n length,\n sampleRate,\n numberOfChannels: numOfChannels,\n getChannelData: () => new Float32Array(length)\n }\n }\n\n decodeAudioData(data: ArrayBuffer, success?: (buffer: any) => void) {\n const buffer = this.createBuffer(2, 100, 44100);\n if (success) success(buffer);\n return Promise.resolve(buffer);\n }\n\n resume() { return Promise.resolve(); }\n suspend() { return Promise.resolve(); }\n close() { return Promise.resolve(); }\n }\n\n global.AudioContext = MockAudioContext as any;\n // @ts-ignore\n global.webkitAudioContext = MockAudioContext as any;\n}\n\n/**\n * Restores original AudioContext.\n */\nexport function teardownMockAudioContext(): void {\n // @ts-ignore\n delete global.AudioContext;\n // @ts-ignore\n delete global.webkitAudioContext;\n}\n\nexport interface AudioEvent {\n type: string;\n data?: any;\n}\n\n/**\n * Captures audio events from a context.\n * Requires the context to be instrumented or mocked to emit events.\n * This helper currently works with the `setupMockAudioContext` mock if extended.\n */\nexport function captureAudioEvents(context: AudioContext): AudioEvent[] {\n // Placeholder for capturing events.\n // Real implementation would attach spies to context methods.\n return [];\n}\n","/**\n * Common utilities\n * @module glMatrix\n */\n\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nexport var RANDOM = Math.random;\nexport var ANGLE_ORDER = \"zyx\";\n\n/**\n * Symmetric round\n * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background\n *\n * @param {Number} a value to round\n */\nexport function round(a) {\n if (a >= 0) return Math.round(a);\n return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nvar radian = 180 / Math.PI;\n\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\nexport function toRadian(a) {\n return a * degree;\n}\n\n/**\n * Convert Radian To Degree\n *\n * @param {Number} a Angle in Radians\n */\nexport function toDegree(a) {\n return a * radian;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @param {Number} tolerance Absolute or relative tolerance (default glMatrix.EPSILON)\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b));\n}","import * as glMatrix from \"./common.js\";\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n return out;\n}\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n\n/**\n * symmetric round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\nexport function round(out, a) {\n out[0] = glMatrix.round(a[0]);\n out[1] = glMatrix.round(a[1]);\n out[2] = glMatrix.round(a[2]);\n return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function slerp(out, a, b, t) {\n var angle = Math.acos(Math.min(Math.max(dot(a, b), -1), 1));\n var sinTotal = Math.sin(angle);\n var ratioA = Math.sin((1 - t) * angle) / sinTotal;\n var ratioB = Math.sin(t * angle) / sinTotal;\n out[0] = ratioA * a[0] + ratioB * b[0];\n out[1] = ratioA * a[1] + ratioB * b[1];\n out[2] = ratioA * a[2] + ratioB * b[2];\n return out;\n}\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec3} out\n */\nexport function random(out, scale) {\n scale = scale === undefined ? 1.0 : scale;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q normalized quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n // Fast Vector Rotation using Quaternions by Robert Eisele\n // https://raw.org/proof/vector-rotation-using-quaternions/\n\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var vx = a[0],\n vy = a[1],\n vz = a[2];\n\n // t = q x v\n var tx = qy * vz - qz * vy;\n var ty = qz * vx - qx * vz;\n var tz = qx * vy - qy * vx;\n\n // t = 2t\n tx = tx + tx;\n ty = ty + ty;\n tz = tz + tz;\n\n // v + w t + q x t\n out[0] = vx + qw * tx + qy * tz - qz * ty;\n out[1] = vy + qw * ty + qz * tx - qx * tz;\n out[2] = vz + qw * tz + qx * ty - qy * tx;\n return out;\n}\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2];\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)),\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nexport var sub = subtract;\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nexport var div = divide;\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nexport var dist = distance;\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nexport var sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nexport var len = length;\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nexport var sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n if (!stride) {\n stride = 3;\n }\n if (!offset) {\n offset = 0;\n }\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n return a;\n };\n}();","\nimport { vec3 } from 'gl-matrix';\nimport { Camera } from '@quake2ts/engine';\n\n// Define RefDef interface locally if it's not exported from shared/engine,\n// or import it if we find it.\n// Based on grep, RefDef seems elusive or I missed it.\n// Standard Quake 2 RefDef:\nexport interface RefDef {\n x: number;\n y: number;\n width: number;\n height: number;\n fov_x: number;\n fov_y: number;\n vieworg: vec3;\n viewangles: vec3;\n time: number;\n rdflags: number;\n // ... other fields\n}\n\nexport interface ViewState {\n camera: Camera;\n viewport: { x: number; y: number; width: number; height: number };\n refdef: RefDef;\n}\n\nexport interface ViewScenario {\n viewState: ViewState;\n cleanup: () => void;\n}\n\nexport interface CameraInput {\n forward?: number;\n right?: number;\n up?: number;\n pitchDelta?: number;\n yawDelta?: number;\n rollDelta?: number;\n}\n\n/**\n * Creates a mock Camera instance with optional overrides.\n */\nexport function createMockCamera(overrides: Partial<Camera> = {}): Camera {\n // We instantiate a real Camera because it's logic-heavy (matrices)\n // and we often want that logic in tests.\n // If we wanted a pure mock (jest.fn()), we would need a different approach (interface based).\n // But the task says \"MockCamera\", and usually we use a real class configured for tests.\n\n const camera = new Camera();\n\n if (overrides.position) {\n camera.position = overrides.position;\n }\n if (overrides.angles) {\n camera.angles = overrides.angles;\n }\n if (overrides.fov !== undefined) {\n camera.fov = overrides.fov;\n }\n // Apply other properties if exposed by Camera class setters\n\n return camera;\n}\n\n/**\n * Creates a mock RefDef object.\n */\nexport function createMockRefDef(overrides: Partial<RefDef> = {}): RefDef {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 240,\n fov_x: 90,\n fov_y: 90,\n vieworg: vec3.create(),\n viewangles: vec3.create(),\n time: 0,\n rdflags: 0,\n ...overrides\n };\n}\n\n/**\n * Creates a mock ViewState object.\n */\nexport function createMockViewState(overrides: Partial<ViewState> = {}): ViewState {\n return {\n camera: overrides.camera || createMockCamera(),\n viewport: overrides.viewport || { x: 0, y: 0, width: 800, height: 600 },\n refdef: overrides.refdef || createMockRefDef(),\n ...overrides\n };\n}\n\n/**\n * Creates a pre-configured view test scenario.\n */\nexport function createViewTestScenario(scenarioType: 'firstPerson' | 'thirdPerson' | 'spectator'): ViewScenario {\n const camera = createMockCamera();\n const refdef = createMockRefDef();\n\n switch (scenarioType) {\n case 'firstPerson':\n camera.position = vec3.fromValues(100, 100, 50);\n camera.angles = vec3.fromValues(0, 45, 0);\n vec3.copy(refdef.vieworg, camera.position);\n vec3.copy(refdef.viewangles, camera.angles);\n break;\n case 'thirdPerson':\n camera.position = vec3.fromValues(100, 100, 100); // Higher/back\n camera.angles = vec3.fromValues(30, 45, 0); // Looking down\n // Refdef might differ from camera in 3rd person (refdef usually is player eye, camera is offset)\n vec3.set(refdef.vieworg, 100, 100, 50); // Player origin\n break;\n case 'spectator':\n camera.position = vec3.fromValues(0, 0, 100);\n camera.angles = vec3.fromValues(90, 0, 0); // Top down\n break;\n }\n\n return {\n viewState: {\n camera,\n viewport: { x: 0, y: 0, width: 800, height: 600 },\n refdef\n },\n cleanup: () => {\n // Any cleanup if needed\n }\n };\n}\n\n/**\n * Simulates camera movement based on input delta.\n * This is a helper to verify camera logic, not a replacement for full physics.\n */\nexport function simulateCameraMovement(camera: Camera, input: CameraInput, deltaTime: number): Camera {\n // Simple movement simulation\n const speed = 100; // units per second\n\n // Update angles\n if (input.pitchDelta) camera.angles[0] += input.pitchDelta;\n if (input.yawDelta) camera.angles[1] += input.yawDelta;\n if (input.rollDelta) camera.angles[2] += input.rollDelta;\n\n // Force update dirty flag in Camera\n camera.angles = camera.angles;\n\n // Calculate forward/right/up vectors based on new angles\n // For simplicity, we can use simple trig or just assume standard axis aligned for basic tests\n // But proper way is AngleVectors.\n // Since we don't have AngleVectors imported here (it's in shared), we might skip complex relative movement\n // or import it.\n\n // Ideally: import { angleVectors } from '@quake2ts/shared/math/angles';\n // But we want to avoid deep deps if possible.\n\n // For now, let's just apply absolute movement if provided, or simplistic axis logic\n if (input.forward || input.right || input.up) {\n // simplistic impl\n camera.position[0] += (input.forward || 0) * deltaTime;\n camera.position[1] += (input.right || 0) * deltaTime;\n camera.position[2] += (input.up || 0) * deltaTime;\n camera.position = camera.position;\n }\n\n return camera;\n}\n","export interface PlaywrightOptions {\n headless?: boolean;\n viewport?: { width: number; height: number };\n}\n\nexport interface PlaywrightTestClient {\n page: any; // Type as 'Page' from playwright in real usage, but keeping it generic here to avoid hard dependency on playwright types in this util file if not needed\n browser: any;\n navigate(url: string): Promise<void>;\n waitForGame(): Promise<void>;\n injectInput(type: string, data: any): Promise<void>;\n screenshot(name: string): Promise<Buffer>;\n close(): Promise<void>;\n}\n\n/**\n * Creates a Playwright test client.\n * Note: Requires playwright to be installed in the project.\n */\nexport async function createPlaywrightTestClient(options: PlaywrightOptions = {}): Promise<PlaywrightTestClient> {\n // Dynamic import to avoid hard dependency if not used\n let playwright;\n try {\n playwright = await import('playwright');\n } catch (e) {\n throw new Error('Playwright is not installed. Please install it to use this utility.');\n }\n\n const browser = await playwright.chromium.launch({\n headless: options.headless ?? true,\n });\n const context = await browser.newContext({\n viewport: options.viewport || { width: 1280, height: 720 },\n });\n const page = await context.newPage();\n\n return {\n page,\n browser,\n async navigate(url: string) {\n await page.goto(url);\n },\n async waitForGame() {\n await waitForGameReady(page);\n },\n async injectInput(type: string, data: any) {\n // Simulate input injection via evaluate\n await page.evaluate(({ type, data }: any) => {\n // Assumes a global function or event listener exists to receive injected input\n console.log('Injecting input', type, data);\n // (window as any).game.injectInput(type, data);\n }, { type, data });\n },\n async screenshot(name: string) {\n return await page.screenshot({ path: `${name}.png` });\n },\n async close() {\n await browser.close();\n }\n };\n}\n\n/**\n * Waits for the game to be ready.\n */\nexport async function waitForGameReady(page: any, timeout: number = 10000): Promise<void> {\n await page.waitForFunction(() => {\n // Check for some global game state or canvas presence\n return (window as any).game && (window as any).game.isRunning;\n }, { timeout });\n}\n\nexport interface GameStateCapture {\n time: number;\n entities: number;\n // Add other state properties\n}\n\n/**\n * Captures current game state from the browser.\n */\nexport async function captureGameState(page: any): Promise<GameStateCapture> {\n return await page.evaluate(() => {\n const game = (window as any).game;\n return {\n time: game ? game.time : 0,\n entities: game && game.entities ? game.entities.length : 0\n };\n });\n}\n","export type NetworkCondition = 'good' | 'slow' | 'unstable' | 'offline' | 'custom';\n\nexport interface NetworkSimulator {\n latency: number; // ms\n jitter: number; // ms\n packetLoss: number; // percentage 0-1\n bandwidth: number; // bytes per second\n}\n\n/**\n * Simulates network conditions.\n */\nexport function simulateNetworkCondition(condition: NetworkCondition): NetworkSimulator {\n switch (condition) {\n case 'good':\n return { latency: 20, jitter: 5, packetLoss: 0, bandwidth: 10 * 1024 * 1024 };\n case 'slow':\n return { latency: 150, jitter: 20, packetLoss: 0.01, bandwidth: 1 * 1024 * 1024 };\n case 'unstable':\n return { latency: 100, jitter: 100, packetLoss: 0.05, bandwidth: 512 * 1024 };\n case 'offline':\n return { latency: 0, jitter: 0, packetLoss: 1, bandwidth: 0 };\n case 'custom':\n default:\n return { latency: 0, jitter: 0, packetLoss: 0, bandwidth: Infinity };\n }\n}\n\n/**\n * Creates a custom network condition.\n */\nexport function createCustomNetworkCondition(latency: number, jitter: number, packetLoss: number): NetworkSimulator {\n return {\n latency,\n jitter,\n packetLoss,\n bandwidth: Infinity // Default to unlimited unless specified\n };\n}\n\n/**\n * Helper to throttle bandwidth (e.g. for Playwright).\n */\nexport function throttleBandwidth(bytesPerSecond: number): void {\n // This function would interface with Playwright's CDPSession in an E2E test.\n // It returns void here as a placeholder for the logic to be used within a test context.\n}\n","export interface VisualDiff {\n diffPercentage: number;\n diffImage?: Buffer;\n}\n\n/**\n * Captures a screenshot of the game.\n */\nexport async function captureGameScreenshot(page: any, name: string): Promise<Buffer> {\n return await page.screenshot({ path: `${name}.png` });\n}\n\n/**\n * Compares two screenshots (Buffers).\n * Uses a pixel comparison library if available, or simple buffer check.\n */\nexport function compareScreenshots(baseline: Buffer, current: Buffer, threshold: number = 0.01): VisualDiff {\n // Basic length check first\n if (baseline.length !== current.length) {\n return { diffPercentage: 1.0 };\n }\n\n let diffPixels = 0;\n const totalPixels = baseline.length; // Approximate bytes\n\n for (let i = 0; i < baseline.length; i++) {\n if (baseline[i] !== current[i]) {\n diffPixels++;\n }\n }\n\n const diffPercentage = diffPixels / totalPixels;\n\n return {\n diffPercentage,\n // Generating a diff image buffer would require a library like pixelmatch\n };\n}\n\nexport interface VisualScenario {\n sceneName: string;\n setup: () => Promise<void>;\n}\n\n/**\n * Creates a visual test scenario.\n */\nexport function createVisualTestScenario(sceneName: string): VisualScenario {\n return {\n sceneName,\n setup: async () => {\n // Setup scene logic\n }\n };\n}\n"],"mappings":"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","names":["length","dist","min","max","vi","Entity","vi","Entity","vi","vi","vi","vi","vi","vi","ClientState","HandshakeStage","ClientState","vi","vi","ClientState","ClientState","vi","options","canvas","str","Canvas","ImageData","canvas","Canvas","data","ImageData","img","vi","vi","vi","length","round","round","scale","len","angle","type","data"]}
|