diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9474a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +.env +.env.local +*.local diff --git a/apps/client/.env.example b/apps/client/.env.example new file mode 100644 index 0000000..d4e5c26 --- /dev/null +++ b/apps/client/.env.example @@ -0,0 +1,12 @@ +VITE_SERVER_URL=ws://localhost:2567 + +# Minitia chain (set after weave init) +VITE_CHAIN_ID=moveshot-1 +VITE_RPC_URL=http://localhost:26657 +VITE_REST_URL=http://localhost:1317 +VITE_INDEXER_URL=http://localhost:8080 +VITE_NATIVE_DENOM=umin +VITE_CONTRACT_ADDRESS=0x1 + +# InitiaScan explorer (for tx links) +VITE_EXPLORER_URL=https://scan.testnet.initia.xyz/initiation-2 diff --git a/apps/client/index.html b/apps/client/index.html new file mode 100644 index 0000000..40e79ed --- /dev/null +++ b/apps/client/index.html @@ -0,0 +1,18 @@ + + + + + + MoveShot + + + + + +
+ + + diff --git a/apps/client/package.json b/apps/client/package.json new file mode 100644 index 0000000..b5bc58b --- /dev/null +++ b/apps/client/package.json @@ -0,0 +1,36 @@ +{ + "name": "@arena/client", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@arena/sim": "workspace:*", + "@initia/initia.js": "^1.1.0", + "@initia/initia.proto": "^1.0.5", + "@initia/interwovenkit-react": "^2.5.1", + "@tanstack/react-query": "^5.96.1", + "buffer": "^6.0.3", + "colyseus.js": "^0.15.0", + "nanoid": "^5", + "phaser": "^3.87.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.5.1", + "util": "^0.12.5", + "wagmi": "^2.17.2" + }, + "devDependencies": { + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.7.3", + "vite": "^6.3.2", + "vite-plugin-node-polyfills": "^0.26.0" + } +} diff --git a/apps/client/src/App.tsx b/apps/client/src/App.tsx new file mode 100644 index 0000000..3b5dcb4 --- /dev/null +++ b/apps/client/src/App.tsx @@ -0,0 +1,14 @@ +import { Routes, Route } from 'react-router-dom'; +import HomePage from './pages/HomePage'; +import PlayPage from './pages/PlayPage'; +import GamePage from './pages/GamePage'; + +export default function App() { + return ( + + } /> + } /> + } /> + + ); +} diff --git a/apps/client/src/bridge/EventBridge.ts b/apps/client/src/bridge/EventBridge.ts new file mode 100644 index 0000000..9a8d422 --- /dev/null +++ b/apps/client/src/bridge/EventBridge.ts @@ -0,0 +1,83 @@ +// Typed event bridge connecting React components and Phaser scenes. +// Both sides import the same singleton instance. +// React → Phaser: wallet state, transaction results +// Phaser → React: match events, UI triggers + +export type EventMap = { + // Wallet events (React → Phaser) + WALLET_CONNECTED: { address: string }; + WALLET_DISCONNECTED: Record; + AUTO_SIGN_ENABLED: { chainId: string }; + AUTO_SIGN_DISABLED: { chainId: string }; + + // Transaction events (React → Phaser / Phaser → React) + TX_PENDING: { functionName: string }; + TX_SUCCESS: { hash: string; functionName: string }; + TX_ERROR: { error: string; functionName: string }; + + // Game events (Phaser → React) + MATCH_ENDED: { winner: number | null; scores: [number, number]; walletAddresses?: string[] }; + MATCH_RECORDED: { txHash: string }; + ROUND_ENDED: { winner: number | null; roundNumber: number }; + PLAYER_KILLED: { killerIndex: number; victimIndex: number; weapon: string }; + + // Cosmetic events + EQUIP_CHANGED: { slot: string; itemId: string }; +}; + +type EventHandler = (data: EventMap[K]) => void; + +class TypedEventBridge { + private listeners: Map>> = new Map(); + + emit(event: K, data: EventMap[K]): void { + const handlers = this.listeners.get(event); + if (handlers) { + handlers.forEach((h) => { + try { + (h as EventHandler)(data); + } catch (err) { + console.error(`[EventBridge] Error in handler for "${event}":`, err); + } + }); + } + } + + on(event: K, handler: EventHandler): () => void { + if (!this.listeners.has(event)) { + this.listeners.set(event, new Set()); + } + this.listeners.get(event)!.add(handler as EventHandler); + return () => this.off(event, handler); + } + + off(event: K, handler: EventHandler): void { + this.listeners.get(event)?.delete(handler as EventHandler); + } + + clear(event?: keyof EventMap): void { + if (event) { + this.listeners.delete(event); + } else { + this.listeners.clear(); + } + } +} + +export const eventBridge = new TypedEventBridge(); + +// Typed event name constants for auto-complete +export const BRIDGE_EVENTS = { + WALLET_CONNECTED: 'WALLET_CONNECTED', + WALLET_DISCONNECTED: 'WALLET_DISCONNECTED', + AUTO_SIGN_ENABLED: 'AUTO_SIGN_ENABLED', + AUTO_SIGN_DISABLED: 'AUTO_SIGN_DISABLED', + TX_PENDING: 'TX_PENDING', + TX_SUCCESS: 'TX_SUCCESS', + TX_ERROR: 'TX_ERROR', + MATCH_ENDED: 'MATCH_ENDED', + MATCH_RECORDED: 'MATCH_RECORDED', + ROUND_ENDED: 'ROUND_ENDED', + PLAYER_KILLED: 'PLAYER_KILLED', + EQUIP_CHANGED: 'EQUIP_CHANGED', +} as const satisfies Record; diff --git a/apps/client/src/components/wallet/AutoSignToggle.tsx b/apps/client/src/components/wallet/AutoSignToggle.tsx new file mode 100644 index 0000000..abf4627 --- /dev/null +++ b/apps/client/src/components/wallet/AutoSignToggle.tsx @@ -0,0 +1,69 @@ +import React from 'react'; + +interface Props { + enabled: boolean; + onEnable: () => Promise; + onDisable: () => Promise; +} + +export function AutoSignToggle({ enabled, onEnable, onDisable }: Props) { + const handleToggle = () => { + if (enabled) { + onDisable(); + } else { + onEnable(); + } + }; + + return ( +
+
+
Seamless Play
+
{enabled ? 'No wallet popups' : 'Enable to skip popups'}
+
+ +
+ ); +} + +const styles = { + row: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + padding: '8px 16px', + gap: 12, + } as React.CSSProperties, + + label: { + fontSize: '0.75rem', + color: '#ccc', + fontFamily: 'JetBrains Mono, monospace', + } as React.CSSProperties, + + desc: { + fontSize: '0.6rem', + color: '#666', + fontFamily: 'JetBrains Mono, monospace', + marginTop: 2, + } as React.CSSProperties, + + toggle: (active: boolean) => + ({ + background: active ? '#4ecdc4' : '#333', + color: active ? '#0a0a1a' : '#888', + border: 'none', + padding: '4px 10px', + fontFamily: 'JetBrains Mono, monospace', + fontSize: '0.65rem', + fontWeight: 'bold', + cursor: 'pointer', + flexShrink: 0, + }) as React.CSSProperties, +}; diff --git a/apps/client/src/components/wallet/ConnectButton.tsx b/apps/client/src/components/wallet/ConnectButton.tsx new file mode 100644 index 0000000..5617063 --- /dev/null +++ b/apps/client/src/components/wallet/ConnectButton.tsx @@ -0,0 +1,74 @@ +import React, { useState } from 'react'; +import { useWallet } from '../../hooks/useWallet'; +import { useAutoSign } from '../../hooks/useAutoSign'; +import { WalletDropdown } from './WalletDropdown'; + +export function ConnectButton() { + const { isConnected, truncatedAddress, connect, openWalletInfo } = useWallet(); + const { isAutoSignEnabled } = useAutoSign(); + const [dropdownOpen, setDropdownOpen] = useState(false); + + if (!isConnected) { + return ( + + ); + } + + return ( +
+ + + {dropdownOpen && ( + setDropdownOpen(false)} + onOpenWallet={openWalletInfo} + /> + )} +
+ ); +} + +const styles = { + connectBtn: { + background: '#ffd700', + color: '#0a0a1a', + border: 'none', + padding: '8px 18px', + fontFamily: 'JetBrains Mono, monospace', + fontWeight: 'bold', + fontSize: '0.8rem', + cursor: 'pointer', + letterSpacing: '0.05em', + } as React.CSSProperties, + + addressBtn: { + background: 'transparent', + color: '#4ecdc4', + border: '1px solid #4ecdc4', + padding: '8px 16px', + fontFamily: 'JetBrains Mono, monospace', + fontSize: '0.75rem', + cursor: 'pointer', + display: 'flex', + alignItems: 'center', + gap: 8, + } as React.CSSProperties, + + dot: (active: boolean) => + ({ + width: 8, + height: 8, + borderRadius: '50%', + background: active ? '#4ecdc4' : '#666', + flexShrink: 0, + }) as React.CSSProperties, +}; diff --git a/apps/client/src/components/wallet/TransactionToast.tsx b/apps/client/src/components/wallet/TransactionToast.tsx new file mode 100644 index 0000000..929e699 --- /dev/null +++ b/apps/client/src/components/wallet/TransactionToast.tsx @@ -0,0 +1,129 @@ +import React, { useEffect, useRef } from 'react'; +import { EXPLORER_URL } from '../../config/chain'; + +type Status = 'pending' | 'success' | 'error'; + +interface Props { + status: Status; + txHash?: string | null; + error?: string | null; + onDismiss: () => void; + autoDismissMs?: number; +} + +export function TransactionToast({ + status, + txHash, + error, + onDismiss, + autoDismissMs = 6000, +}: Props) { + const timerRef = useRef | null>(null); + + useEffect(() => { + if (status !== 'pending') { + timerRef.current = setTimeout(onDismiss, autoDismissMs); + } + return () => { + if (timerRef.current) clearTimeout(timerRef.current); + }; + }, [status, onDismiss, autoDismissMs]); + + const config: Record = { + pending: { color: '#ffd700', label: 'Recording match on-chain...' }, + success: { color: '#4ecdc4', label: 'Match recorded on-chain!' }, + error: { color: '#ff6b6b', label: 'Recording failed' }, + }; + + const { color, label } = config[status]; + + return ( +
+
+
+ {label} + + {status === 'pending' && } + + {status === 'success' && txHash && ( + + View on InitiaScan → + + )} + + {status === 'error' && error && ( + {error} + )} + + +
+
+ ); +} + +const styles = { + toast: { + position: 'fixed', + bottom: 24, + right: 24, + background: '#1a1a35', + border: '1px solid #2a2a4a', + maxWidth: 340, + zIndex: 9999, + overflow: 'hidden', + } as React.CSSProperties, + + bar: (color: string) => + ({ + height: 3, + background: color, + width: '100%', + }) as React.CSSProperties, + + content: { + padding: '12px 16px', + display: 'flex', + flexDirection: 'column', + gap: 6, + fontFamily: 'JetBrains Mono, monospace', + } as React.CSSProperties, + + spinner: { + display: 'inline-block', + animation: 'spin 1s linear infinite', + fontSize: '1rem', + color: '#ffd700', + } as React.CSSProperties, + + link: { + color: '#4ecdc4', + fontSize: '0.65rem', + textDecoration: 'none', + } as React.CSSProperties, + + errorMsg: { + color: '#ff6b6b', + fontSize: '0.65rem', + maxWidth: 280, + wordBreak: 'break-word', + } as React.CSSProperties, + + close: { + position: 'absolute', + top: 8, + right: 8, + background: 'transparent', + border: 'none', + color: '#666', + cursor: 'pointer', + fontSize: '1rem', + lineHeight: 1, + } as React.CSSProperties, +}; diff --git a/apps/client/src/components/wallet/WalletDropdown.tsx b/apps/client/src/components/wallet/WalletDropdown.tsx new file mode 100644 index 0000000..23dbd9b --- /dev/null +++ b/apps/client/src/components/wallet/WalletDropdown.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useRef } from 'react'; +import { useWallet } from '../../hooks/useWallet'; +import { useAutoSign } from '../../hooks/useAutoSign'; +import { AutoSignToggle } from './AutoSignToggle'; + +interface Props { + onClose: () => void; + onOpenWallet: () => void; +} + +export function WalletDropdown({ onClose, onOpenWallet }: Props) { + const { initiaAddress } = useWallet(); + const { isAutoSignEnabled, enableAutoSign, disableAutoSign } = useAutoSign(); + const ref = useRef(null); + + // Close on outside click + useEffect(() => { + const handler = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) { + onClose(); + } + }; + document.addEventListener('mousedown', handler); + return () => document.removeEventListener('mousedown', handler); + }, [onClose]); + + const copyAddress = () => { + if (initiaAddress) navigator.clipboard.writeText(initiaAddress); + }; + + return ( +
+
{initiaAddress}
+ + + + + +
+ + +
+ ); +} + +const styles = { + dropdown: { + position: 'absolute', + top: '100%', + right: 0, + marginTop: 4, + background: '#1a1a35', + border: '1px solid #2a2a4a', + minWidth: 220, + zIndex: 1000, + padding: '8px 0', + } as React.CSSProperties, + + address: { + padding: '8px 16px', + fontSize: '0.65rem', + color: '#888', + fontFamily: 'JetBrains Mono, monospace', + wordBreak: 'break-all', + borderBottom: '1px solid #2a2a4a', + marginBottom: 4, + } as React.CSSProperties, + + item: { + display: 'block', + width: '100%', + padding: '8px 16px', + background: 'transparent', + border: 'none', + color: '#ccc', + fontFamily: 'JetBrains Mono, monospace', + fontSize: '0.75rem', + cursor: 'pointer', + textAlign: 'left', + } as React.CSSProperties, + + divider: { + height: 1, + background: '#2a2a4a', + margin: '4px 0', + } as React.CSSProperties, +}; diff --git a/apps/client/src/config/chain.ts b/apps/client/src/config/chain.ts new file mode 100644 index 0000000..c0c98d1 --- /dev/null +++ b/apps/client/src/config/chain.ts @@ -0,0 +1,53 @@ +// Minitia chain configuration for MoveShot. +// All values come from environment variables with local-dev defaults. + +export const CHAIN_ID = import.meta.env.VITE_CHAIN_ID || 'moveshot-1'; +export const RPC_URL = import.meta.env.VITE_RPC_URL || 'http://localhost:26657'; +export const REST_URL = import.meta.env.VITE_REST_URL || 'http://localhost:1317'; +export const NATIVE_DENOM = import.meta.env.VITE_NATIVE_DENOM || 'umin'; +export const CONTRACT_ADDRESS = import.meta.env.VITE_CONTRACT_ADDRESS || '0x1'; +export const EXPLORER_URL = import.meta.env.VITE_EXPLORER_URL || 'https://scan.testnet.initia.xyz/initiation-2'; + +// InterwovenKit customChain config shape +export const MINITIA_CUSTOM_CHAIN = { + chain_id: CHAIN_ID, + chain_name: 'moveshot', + pretty_name: 'MoveShot Arena', + bech32_prefix: 'init', + network_type: 'testnet' as const, + apis: { + rpc: [{ address: RPC_URL }], + rest: [{ address: REST_URL }], + // Local indexer if available + ...(import.meta.env.VITE_INDEXER_URL + ? { indexer: [{ address: import.meta.env.VITE_INDEXER_URL }] } + : {}), + }, + fees: { + fee_tokens: [ + { + denom: NATIVE_DENOM, + fixed_min_gas_price: 0.015, + low_gas_price: 0.015, + average_gas_price: 0.025, + high_gas_price: 0.04, + }, + ], + }, + staking: { + staking_tokens: [{ denom: NATIVE_DENOM }], + }, + metadata: { + description: 'MoveShot — competitive 2D shooter on Initia Minitia', + images: [], + keywords: ['gaming', 'moveshot'], + socials: {}, + }, + native_assets: [ + { + denom: NATIVE_DENOM, + symbol: 'MIN', + decimals: 6, + }, + ], +}; diff --git a/apps/client/src/config/contracts.ts b/apps/client/src/config/contracts.ts new file mode 100644 index 0000000..b1c0c06 --- /dev/null +++ b/apps/client/src/config/contracts.ts @@ -0,0 +1,24 @@ +// Contract module configuration. +// CONTRACT_ADDRESS is the deployer address (all modules share the same address). + +export { CONTRACT_ADDRESS, CHAIN_ID, NATIVE_DENOM, EXPLORER_URL } from './chain'; + +export const MODULE_NAMES = { + GAME_CONFIG: 'game_config', + MATCH_REGISTRY: 'match_registry', + PLAYER_PROFILE: 'player_profile', + WEAPON_NFT: 'weapon_nft', + COSMETIC_NFT: 'cosmetic_nft', +} as const; + +export const FUNCTION_NAMES = { + RECORD_MATCH: 'record_match', + ENSURE_PROFILE: 'ensure_profile', + INIT_INVENTORY: 'init_inventory', + EQUIP_WEAPON: 'equip_weapon', + INIT_COSMETICS: 'init_cosmetics', + EQUIP_SKIN: 'equip_skin', + EQUIP_TITLE: 'equip_title', +} as const; + +export const TX_TYPE_URL = '/initia.move.v1.MsgExecute'; diff --git a/apps/client/src/hooks/useAutoSign.ts b/apps/client/src/hooks/useAutoSign.ts new file mode 100644 index 0000000..1cda9d9 --- /dev/null +++ b/apps/client/src/hooks/useAutoSign.ts @@ -0,0 +1,77 @@ +import { useState, useCallback, useEffect } from 'react'; +import { useWallet } from './useWallet'; +import { CHAIN_ID } from '../config/chain'; +import { eventBridge } from '../bridge/EventBridge'; + +export function useAutoSign() { + const { autoSign, isConnected } = useWallet(); + const [isAutoSignEnabled, setIsAutoSignEnabled] = useState(false); + const [isEnabling, setIsEnabling] = useState(false); + const [error, setError] = useState(null); + + // Sync auto-sign state when wallet connects / reconnects + useEffect(() => { + if (isConnected && autoSign) { + // InterwovenKit exposes isEnabledByChain map + const enabled = autoSign.isEnabledByChain?.[CHAIN_ID] ?? false; + setIsAutoSignEnabled(enabled); + } else { + setIsAutoSignEnabled(false); + } + }, [isConnected, autoSign]); + + const enableAutoSign = useCallback(async (): Promise => { + if (!autoSign) { + setError('Wallet not connected'); + return false; + } + + setIsEnabling(true); + setError(null); + + try { + await autoSign.enable(CHAIN_ID); + setIsAutoSignEnabled(true); + eventBridge.emit('AUTO_SIGN_ENABLED', { chainId: CHAIN_ID }); + return true; + } catch (err: unknown) { + const msg = (err as Error)?.message ?? 'Unknown error'; + if (msg.includes('rejected') || msg.includes('denied') || msg.includes('cancelled')) { + setError('Auto-signing declined. You can enable it later from wallet settings.'); + } else { + setError(`Failed to enable auto-signing: ${msg}`); + } + return false; + } finally { + setIsEnabling(false); + } + }, [autoSign]); + + const disableAutoSign = useCallback(async () => { + if (!autoSign) return; + try { + await autoSign.disable(CHAIN_ID); + setIsAutoSignEnabled(false); + eventBridge.emit('AUTO_SIGN_DISABLED', { chainId: CHAIN_ID }); + } catch (err: unknown) { + const msg = (err as Error)?.message ?? 'Unknown error'; + // If authorization not found, treat as already disabled + if (msg.includes('authorization not found') || msg.includes('not found')) { + setIsAutoSignEnabled(false); + } else { + setError(`Failed to disable auto-signing: ${msg}`); + } + } + }, [autoSign]); + + const clearError = useCallback(() => setError(null), []); + + return { + isAutoSignEnabled, + isEnabling, + error, + enableAutoSign, + disableAutoSign, + clearError, + }; +} diff --git a/apps/client/src/hooks/useMatchRecording.ts b/apps/client/src/hooks/useMatchRecording.ts new file mode 100644 index 0000000..f597a5c --- /dev/null +++ b/apps/client/src/hooks/useMatchRecording.ts @@ -0,0 +1,191 @@ +/** + * Hook for on-chain match recording. + * Listens for MATCH_ENDED events from the game and submits the server-attested result + * to the match_registry Move contract via auto-signed transaction. + */ +import { useState, useCallback, useEffect } from 'react'; +import { useWallet } from './useWallet'; +import { CHAIN_ID, CONTRACT_ADDRESS, EXPLORER_URL } from '../config/chain'; +import { MODULE_NAMES, TX_TYPE_URL } from '../config/contracts'; +import { eventBridge } from '../bridge/EventBridge'; + +export type RecordingStatus = 'idle' | 'pending' | 'success' | 'error'; + +interface MatchAttestation { + matchId: string; + winner: string; + loser: string; + winnerScore: number; + loserScore: number; + signatureHex: string; +} + +interface RecordingState { + status: RecordingStatus; + txHash: string | null; + txUrl: string | null; + error: string | null; + lastAttestation: MatchAttestation | null; +} + +export function useMatchRecording() { + const { initiaAddress, requestTxSync } = useWallet(); + const [state, setState] = useState({ + status: 'idle', + txHash: null, + txUrl: null, + error: null, + lastAttestation: null, + }); + + const recordMatch = useCallback( + async (attestation: MatchAttestation) => { + if (!initiaAddress || !requestTxSync) { + console.log('[matchRecording] Wallet not connected — skipping on-chain recording'); + return; + } + + setState((s) => ({ ...s, status: 'pending', lastAttestation: attestation, error: null })); + eventBridge.emit('TX_PENDING', { functionName: 'record_match' }); + + try { + const { MsgExecute } = await import('@initia/initia.proto/initia/move/v1/tx'); + + // Encode arguments as BCS bytes for the Move contract + // match_id: vector + // winner: address + // loser: address + // winner_score: u64 + // loser_score: u64 + // signature: vector + const encoder = new TextEncoder(); + const matchIdBytes = encoder.encode(attestation.matchId); + const signatureBytes = hexToBytes(attestation.signatureHex); + + // requestTxSync returns the tx hash string directly + const hash = await requestTxSync({ + chainId: CHAIN_ID, + messages: [ + { + typeUrl: TX_TYPE_URL, + value: MsgExecute.fromPartial({ + sender: initiaAddress, + moduleAddress: CONTRACT_ADDRESS, + moduleName: MODULE_NAMES.MATCH_REGISTRY, + functionName: 'record_match', + typeArgs: [], + args: [ + // config_addr (same as contract address) + encodeAddress(CONTRACT_ADDRESS), + // registry_addr + encodeAddress(CONTRACT_ADDRESS), + // match_id: vector + encodeVector(matchIdBytes), + // winner: address + encodeAddress(attestation.winner), + // loser: address + encodeAddress(attestation.loser), + // winner_score: u64 + encodeU64(attestation.winnerScore), + // loser_score: u64 + encodeU64(attestation.loserScore), + // signature: vector + encodeVector(signatureBytes), + ], + }), + }, + ], + }); + + const txUrl = `${EXPLORER_URL}/txs/${hash}`; + setState((s) => ({ ...s, status: 'success', txHash: hash, txUrl })); + eventBridge.emit('TX_SUCCESS', { hash, functionName: 'record_match' }); + eventBridge.emit('MATCH_RECORDED', { txHash: hash }); + console.log('[matchRecording] Match recorded on-chain:', hash); + } catch (err: unknown) { + const msg = (err as Error)?.message ?? 'Failed to record match'; + setState((s) => ({ ...s, status: 'error', error: msg })); + eventBridge.emit('TX_ERROR', { error: msg, functionName: 'record_match' }); + console.error('[matchRecording] Error:', err); + } + }, + [initiaAddress, requestTxSync], + ); + + const reset = useCallback(() => { + setState({ status: 'idle', txHash: null, txUrl: null, error: null, lastAttestation: null }); + }, []); + + // Retry with last attestation + const retry = useCallback(() => { + if (state.lastAttestation) { + recordMatch(state.lastAttestation); + } + }, [state.lastAttestation, recordMatch]); + + return { + recordMatch, + status: state.status, + txHash: state.txHash, + txUrl: state.txUrl, + error: state.error, + reset, + retry, + }; +} + +// ── BCS encoding helpers ────────────────────────────────────────────────────── +// Minimal BCS encoding for Move function args. +// In production, use @initia/initia.js bcs module. + +function hexToBytes(hex: string): Uint8Array { + const clean = hex.replace(/^0x/, ''); + const bytes = new Uint8Array(clean.length / 2); + for (let i = 0; i < bytes.length; i++) { + bytes[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16); + } + return bytes; +} + +/** Encode a vector in BCS: ULEB128 length prefix + bytes */ +function encodeVector(bytes: Uint8Array): Uint8Array { + const lenBytes = ulebEncode(bytes.length); + const result = new Uint8Array(lenBytes.length + bytes.length); + result.set(lenBytes); + result.set(bytes, lenBytes.length); + return result; +} + +/** Encode a u64 in BCS: 8-byte little-endian */ +function encodeU64(val: number): Uint8Array { + const bytes = new Uint8Array(8); + let v = BigInt(val); + for (let i = 0; i < 8; i++) { + bytes[i] = Number(v & 0xffn); + v >>= 8n; + } + return bytes; +} + +/** Encode an address string to BCS bytes (32 bytes) */ +function encodeAddress(addr: string): Uint8Array { + if (addr.startsWith('0x')) { + return hexToBytes(addr.padEnd(66, '0')); + } + // bech32 address: encode as UTF-8 padded to 32 bytes + const raw = new TextEncoder().encode(addr); + const padded = new Uint8Array(32); + padded.set(raw.slice(0, 32)); + return padded; +} + +function ulebEncode(n: number): Uint8Array { + const bytes: number[] = []; + do { + let byte = n & 0x7f; + n >>= 7; + if (n !== 0) byte |= 0x80; + bytes.push(byte); + } while (n !== 0); + return new Uint8Array(bytes); +} diff --git a/apps/client/src/hooks/useTransaction.ts b/apps/client/src/hooks/useTransaction.ts new file mode 100644 index 0000000..7b47695 --- /dev/null +++ b/apps/client/src/hooks/useTransaction.ts @@ -0,0 +1,95 @@ +import { useState, useCallback, useRef } from 'react'; +import { useWallet } from './useWallet'; +import { CHAIN_ID, CONTRACT_ADDRESS } from '../config/chain'; +import { TX_TYPE_URL } from '../config/contracts'; +import { eventBridge } from '../bridge/EventBridge'; + +const MIN_TX_INTERVAL_MS = 5_000; + +interface SendTxParams { + moduleName: string; + functionName: string; + typeArgs?: string[]; + args?: Uint8Array[]; +} + +interface TxResult { + txHash: string | null; + isPending: boolean; + error: string | null; +} + +export function useTransaction() { + const { initiaAddress, requestTxSync } = useWallet(); + const [state, setState] = useState({ txHash: null, isPending: false, error: null }); + const lastTxTimeRef = useRef(0); + + const send = useCallback( + async ({ moduleName, functionName, typeArgs = [], args = [] }: SendTxParams) => { + const now = Date.now(); + const elapsed = now - lastTxTimeRef.current; + if (elapsed < MIN_TX_INTERVAL_MS) { + const wait = Math.ceil((MIN_TX_INTERVAL_MS - elapsed) / 1000); + setState((s) => ({ ...s, error: `Please wait ${wait}s before sending another transaction.` })); + return null; + } + + if (!initiaAddress || !requestTxSync) { + setState((s) => ({ ...s, error: 'Wallet not connected' })); + return null; + } + + setState({ txHash: null, isPending: true, error: null }); + eventBridge.emit('TX_PENDING', { functionName }); + + try { + // Dynamic import to avoid bundling proto types at startup + const { MsgExecute } = await import('@initia/initia.proto/initia/move/v1/tx'); + + // requestTxSync returns the tx hash string directly + const hash = await requestTxSync({ + chainId: CHAIN_ID, + messages: [ + { + typeUrl: TX_TYPE_URL, + value: MsgExecute.fromPartial({ + sender: initiaAddress, + moduleAddress: CONTRACT_ADDRESS, + moduleName, + functionName, + typeArgs, + args, + }), + }, + ], + }); + + lastTxTimeRef.current = Date.now(); + setState({ txHash: hash, isPending: false, error: null }); + eventBridge.emit('TX_SUCCESS', { hash, functionName }); + return hash; + } catch (err: unknown) { + let message = (err as Error)?.message ?? 'Transaction failed'; + + if (message.includes('insufficient funds') || message.includes('insufficient fee')) { + message = 'Insufficient INIT for gas fees. Visit the faucet to get testnet tokens.'; + } + + setState({ txHash: null, isPending: false, error: message }); + eventBridge.emit('TX_ERROR', { error: message, functionName }); + return null; + } + }, + [initiaAddress, requestTxSync], + ); + + const clearError = useCallback(() => setState((s) => ({ ...s, error: null })), []); + + return { + send, + isPending: state.isPending, + txHash: state.txHash, + error: state.error, + clearError, + }; +} diff --git a/apps/client/src/hooks/useWallet.ts b/apps/client/src/hooks/useWallet.ts new file mode 100644 index 0000000..53ce804 --- /dev/null +++ b/apps/client/src/hooks/useWallet.ts @@ -0,0 +1,47 @@ +import { useCallback, useEffect, useMemo } from 'react'; +import { useInterwovenKit } from '@initia/interwovenkit-react'; +import { eventBridge } from '../bridge/EventBridge'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type IWKReturn = ReturnType & Record; + +/** Validates a bech32 Initia address (init1...). */ +function isValidInitiaAddress(addr: string): boolean { + return typeof addr === 'string' && addr.startsWith('init1') && addr.length >= 39; +} + +export function useWallet() { + const { initiaAddress, openConnect, openWallet, requestTxSync, autoSign } = useInterwovenKit(); + + const isConnected = useMemo(() => isValidInitiaAddress(initiaAddress ?? ''), [initiaAddress]); + + const truncatedAddress = useMemo(() => { + if (!initiaAddress) return ''; + return `${initiaAddress.slice(0, 8)}...${initiaAddress.slice(-4)}`; + }, [initiaAddress]); + + // Emit wallet connected event whenever address becomes available + useEffect(() => { + if (isConnected && initiaAddress) { + eventBridge.emit('WALLET_CONNECTED', { address: initiaAddress }); + } + }, [isConnected, initiaAddress]); + + const connect = useCallback(() => { + openConnect(); + }, [openConnect]); + + const openWalletInfo = useCallback(() => { + openWallet(); + }, [openWallet]); + + return { + initiaAddress: initiaAddress ?? null, + isConnected, + truncatedAddress, + connect, + openWalletInfo, + requestTxSync: requestTxSync as IWKReturn['requestTxSync'], + autoSign: autoSign as IWKReturn['autoSign'], + }; +} diff --git a/apps/client/src/lib/event-bridge.ts b/apps/client/src/lib/event-bridge.ts new file mode 100644 index 0000000..3af0a3b --- /dev/null +++ b/apps/client/src/lib/event-bridge.ts @@ -0,0 +1,3 @@ +// Re-export from the canonical location. Use bridge/EventBridge.ts directly for new code. +export { eventBridge, BRIDGE_EVENTS } from '../bridge/EventBridge'; +export type { EventMap } from '../bridge/EventBridge'; diff --git a/apps/client/src/main.tsx b/apps/client/src/main.tsx new file mode 100644 index 0000000..aa2e3d0 --- /dev/null +++ b/apps/client/src/main.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { BrowserRouter } from 'react-router-dom'; +import App from './App'; +import { InterwovenProvider } from './providers/InterwovenProvider'; +import './styles/globals.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + + + , +); diff --git a/apps/client/src/networking/interpolation.ts b/apps/client/src/networking/interpolation.ts new file mode 100644 index 0000000..3d80d2d --- /dev/null +++ b/apps/client/src/networking/interpolation.ts @@ -0,0 +1,38 @@ +import { PlayerState } from '@arena/sim'; + +/** Two-frame interpolation buffer for opponent position smoothing. */ +export class OpponentInterpolation { + private prev: PlayerState | null = null; + private curr: PlayerState | null = null; + private lastUpdateTime = 0; + private readonly targetFrameMs: number; + + constructor(tickRateHz = 60) { + this.targetFrameMs = 1000 / tickRateHz; + } + + push(player: PlayerState): void { + this.prev = this.curr; + this.curr = { ...player }; + this.lastUpdateTime = performance.now(); + } + + /** + * Get interpolated position. Returns the most recent state if no previous. + */ + getInterpolated(): PlayerState | null { + if (!this.curr) return null; + if (!this.prev) return this.curr; + + const t = Math.min(1, (performance.now() - this.lastUpdateTime) / this.targetFrameMs); + return { + ...this.curr, + x: lerp(this.prev.x, this.curr.x, t), + y: lerp(this.prev.y, this.curr.y, t), + }; + } +} + +function lerp(a: number, b: number, t: number): number { + return a + (b - a) * t; +} diff --git a/apps/client/src/networking/network-manager.ts b/apps/client/src/networking/network-manager.ts new file mode 100644 index 0000000..b5b5a65 --- /dev/null +++ b/apps/client/src/networking/network-manager.ts @@ -0,0 +1,136 @@ +import { Client, Room } from 'colyseus.js'; +import { GameState } from '@arena/sim'; + +const SERVER_URL = import.meta.env.VITE_SERVER_URL ?? 'ws://localhost:2567'; + +export interface MatchJoinOptions { + username?: string; + walletAddress?: string; + mode?: 'quickplay' | 'private'; +} + +export interface ServerGameStateMsg { + state: GameState; + tick: number; +} + +export type NetworkEventMap = { + welcome: { playerIndex: 0 | 1; roomCode: string }; + gameState: ServerGameStateMsg; + roundStart: { round: number }; + roundEnd: { winner: number | null }; + matchEnd: { + winner: number | null; + winnerName: string | null; + scores: [number, number]; + forfeit: boolean; + attestation?: { + matchId: string; + winner: string; + loser: string; + winnerScore: number; + loserScore: number; + signatureHex: string; + }; + }; + error: { code: string; message: string }; + bot_offer: { message: string; autoAcceptIn: number }; + bot_joined: { playerIndex: 0 | 1 }; + disconnected: undefined; +}; + +type NetworkHandler = (data: NetworkEventMap[K]) => void; + +class NetworkManager { + private client: Client; + private room: Room | null = null; + private handlers = new Map void>>(); + + constructor() { + this.client = new Client(SERVER_URL); + } + + /** Join quickplay — finds an existing room or creates one. */ + async joinQuickplay(opts: MatchJoinOptions = {}): Promise { + this.room = await this.client.joinOrCreate('match', { + username: opts.username ?? 'Player', + walletAddress: opts.walletAddress, + mode: 'quickplay', + }); + this.bindRoomEvents(this.room); + return this.room; + } + + /** Create a private room and get a room code. */ + async createPrivateRoom(opts: MatchJoinOptions = {}): Promise { + this.room = await this.client.create('match', { + username: opts.username ?? 'Player', + walletAddress: opts.walletAddress, + mode: 'private', + }); + this.bindRoomEvents(this.room); + return this.room; + } + + /** Join a private room by 6-character code. */ + async joinByCode(code: string, opts: MatchJoinOptions = {}): Promise { + // Room code IS the room ID for simplicity (server generates code from room ID) + // Colyseus rooms are also findable by the code stored in metadata via filterBy + this.room = await this.client.joinById(code, { + username: opts.username ?? 'Player', + walletAddress: opts.walletAddress, + }); + this.bindRoomEvents(this.room); + return this.room; + } + + sendInput(payload: { + left: boolean; right: boolean; jump: boolean; shoot: boolean; + interact: boolean; aimAngle: number; + }): void { + this.room?.send('input', payload); + } + + acceptBot(): void { + this.room?.send('bot_accept'); + } + + leave(): void { + this.room?.leave(); + this.room = null; + } + + on(event: K, handler: NetworkHandler): () => void { + if (!this.handlers.has(event)) this.handlers.set(event, new Set()); + this.handlers.get(event)!.add(handler as (...args: unknown[]) => void); + return () => this.off(event, handler); + } + + off(event: K, handler: NetworkHandler): void { + this.handlers.get(event)?.delete(handler as (...args: unknown[]) => void); + } + + private emit(event: K, data: NetworkEventMap[K]): void { + this.handlers.get(event)?.forEach((h) => h(data)); + } + + private bindRoomEvents(room: Room): void { + // Typed message listeners + const msgs: Array = [ + 'welcome', 'gameState', 'roundStart', 'roundEnd', 'matchEnd', + 'error', 'bot_offer', 'bot_joined', + ]; + for (const msg of msgs) { + room.onMessage(msg, (data) => this.emit(msg, data as NetworkEventMap[typeof msg])); + } + + room.onLeave(() => this.emit('disconnected', undefined)); + } + + get currentRoom(): Room | null { + return this.room; + } +} + +// Singleton instance +export const networkManager = new NetworkManager(); diff --git a/apps/client/src/networking/prediction-manager.ts b/apps/client/src/networking/prediction-manager.ts new file mode 100644 index 0000000..f382959 --- /dev/null +++ b/apps/client/src/networking/prediction-manager.ts @@ -0,0 +1,158 @@ +import { + GameState, InputState, step, createDefaultMap, +} from '@arena/sim'; +import { MapData } from '@arena/sim'; + +const INPUT_BUFFER_SIZE = 128; +const MAX_PREDICTION_TICKS_AHEAD = 10; +const SNAP_THRESHOLD = 2; // px — just snap +const BLEND_THRESHOLD = 15; // px — lerp if between snap and this +const BLEND_FACTOR = 0.3; + +interface BufferedInput { + tick: number; + input: InputState; + prevInput: InputState; +} + +/** + * Client-side prediction with server reconciliation. + * + * Usage: + * pm.init(initialState, localPlayerIndex); + * // Each local frame: + * pm.predict(input, prevInput) → GameState (for rendering) + * // When server state arrives: + * pm.reconcile(serverState, serverTick) → GameState (reconciled) + */ +export class PredictionManager { + private localState!: GameState; + private localTick = 0; + private localPlayerIndex: 0 | 1 = 0; + private inputBuffer: BufferedInput[] = []; + private lastRemoteInput: InputState = defaultInput(); + private map: MapData; + + // Display positions (smoothed) + private displayX = 0; + private displayY = 0; + + constructor(map?: MapData) { + this.map = map ?? createDefaultMap(); + } + + init(initialState: GameState, localPlayerIndex: 0 | 1): void { + this.localState = structuredClone(initialState); + this.localPlayerIndex = localPlayerIndex; + this.localTick = 0; + this.inputBuffer = []; + const p = initialState.players[localPlayerIndex]; + if (p) { + this.displayX = p.x; + this.displayY = p.y; + } + } + + /** + * Run one local prediction tick. + * Returns the predicted GameState (mutated in place for performance). + */ + predict(input: InputState, prevInput: InputState): GameState { + // Buffer input for reconciliation + this.inputBuffer.push({ tick: this.localTick, input: { ...input }, prevInput: { ...prevInput } }); + if (this.inputBuffer.length > INPUT_BUFFER_SIZE) this.inputBuffer.shift(); + + // Build inputs array: local player uses real input, remote uses last known + const inputs = this.buildInputs(input); + const prevInputs = this.buildInputs(prevInput); + + this.localState = step(this.localState, inputs, prevInputs, this.map); + this.localTick++; + + return this.localState; + } + + /** + * Reconcile local prediction against authoritative server state. + * Replays buffered inputs from serverTick onward. + * Returns the reconciled GameState. + */ + reconcile(serverState: GameState, serverTick: number): GameState { + // Extract last remote input from server state (for opponent prediction replay) + const remoteIdx = this.localPlayerIndex === 0 ? 1 : 0; + const remotePlayer = serverState.players[remoteIdx]; + void remotePlayer; // used implicitly via lastRemoteInput + + // Find inputs after the server tick + const replayInputs = this.inputBuffer.filter((b) => b.tick >= serverTick); + + // Snap to server state and replay + this.localState = structuredClone(serverState); + this.localTick = serverTick; + + for (const buffered of replayInputs) { + const inputs = this.buildInputs(buffered.input); + const prevInputs = this.buildInputs(buffered.prevInput); + this.localState = step(this.localState, inputs, prevInputs, this.map); + this.localTick++; + } + + // Position correction smoothing for local player + const localPlayer = this.localState.players[this.localPlayerIndex]; + if (localPlayer) { + const dx = localPlayer.x - this.displayX; + const dy = localPlayer.y - this.displayY; + const dist = Math.hypot(dx, dy); + + if (dist < SNAP_THRESHOLD) { + // Imperceptible — snap + this.displayX = localPlayer.x; + this.displayY = localPlayer.y; + } else if (dist > BLEND_THRESHOLD) { + // Large desync — hard snap + this.displayX = localPlayer.x; + this.displayY = localPlayer.y; + } else { + // Smooth blend + this.displayX += dx * BLEND_FACTOR; + this.displayY += dy * BLEND_FACTOR; + } + } + + return this.localState; + } + + setLastRemoteInput(input: InputState): void { + this.lastRemoteInput = input; + } + + /** Smoothed display position for the local player. */ + get smoothedPosition(): { x: number; y: number } { + return { x: this.displayX, y: this.displayY }; + } + + get currentTick(): number { + return this.localTick; + } + + get state(): GameState { + return this.localState; + } + + get ticksAheadOfServer(): number { + return 0; // tracked externally via serverTick vs localTick + } + + private buildInputs(localInput: InputState): [InputState, InputState] { + if (this.localPlayerIndex === 0) { + return [localInput, this.lastRemoteInput]; + } + return [this.lastRemoteInput, localInput]; + } +} + +function defaultInput(): InputState { + return { left: false, right: false, jump: false, shoot: false, interact: false, aimAngle: 0 }; +} + +void MAX_PREDICTION_TICKS_AHEAD; // used by callers to cap prediction diff --git a/apps/client/src/pages/GamePage.tsx b/apps/client/src/pages/GamePage.tsx new file mode 100644 index 0000000..98f466e --- /dev/null +++ b/apps/client/src/pages/GamePage.tsx @@ -0,0 +1,108 @@ +import { useEffect, useRef } from 'react'; +import Phaser from 'phaser'; +import { BootScene } from '../scenes/BootScene'; +import { GameScene, GameSceneData } from '../scenes/GameScene'; +import { useNavigate, useSearchParams } from 'react-router-dom'; + +export default function GamePage() { + const containerRef = useRef(null); + const gameRef = useRef(null); + const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const mode = (searchParams.get('mode') ?? 'solo') as 'solo' | 'network'; + + useEffect(() => { + if (!containerRef.current || gameRef.current) return; + + const sceneData: GameSceneData = { mode }; + + gameRef.current = new Phaser.Game({ + type: Phaser.AUTO, + width: 800, + height: 600, + parent: containerRef.current, + backgroundColor: '#0a0a1a', + scene: [BootScene, GameScene], + physics: { default: 'none' }, + callbacks: { + postBoot: (game) => { + game.scene.start('BootScene'); + // BootScene transitions to GameScene automatically + // Pass data when GameScene starts + game.events.once('ready', () => { + game.scene.keys['GameScene']?.scene.restart(sceneData); + }); + }, + }, + }); + + return () => { + gameRef.current?.destroy(true); + gameRef.current = null; + }; + }, [mode]); + + return ( +
+
+ + MOVESHOT + + {mode === 'network' ? '🌐 Online Match' : '🤖 vs Bot'} + +
+
+

WASD — move · Mouse — aim · Click / Space — shoot

+
+ ); +} + +const styles: Record = { + wrapper: { + minHeight: '100vh', + background: '#080810', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + }, + topBar: { + width: '100%', + maxWidth: 800, + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + padding: '8px 16px', + borderBottom: '1px solid #2a2a4a', + }, + backBtn: { + background: 'transparent', + color: '#4ecdc4', + border: '1px solid #4ecdc4', + padding: '4px 12px', + fontSize: '0.5rem', + cursor: 'pointer', + fontFamily: 'Press Start 2P, monospace', + }, + title: { + fontFamily: 'Press Start 2P, monospace', + fontSize: '0.8rem', + color: '#ffd700', + }, + hint: { + fontFamily: 'JetBrains Mono, monospace', + fontSize: '0.7rem', + color: '#4ecdc4', + }, + canvas: { + marginTop: 8, + border: '2px solid #2a2a4a', + }, + controls: { + marginTop: 8, + fontFamily: 'JetBrains Mono, monospace', + fontSize: '0.65rem', + color: '#333355', + }, +}; diff --git a/apps/client/src/pages/HomePage.tsx b/apps/client/src/pages/HomePage.tsx new file mode 100644 index 0000000..2735874 --- /dev/null +++ b/apps/client/src/pages/HomePage.tsx @@ -0,0 +1,169 @@ +import { useNavigate } from 'react-router-dom'; +import { ConnectButton } from '../components/wallet/ConnectButton'; +import { useWallet } from '../hooks/useWallet'; +import { useAutoSign } from '../hooks/useAutoSign'; + +export default function HomePage() { + const navigate = useNavigate(); + const { isConnected } = useWallet(); + const { isAutoSignEnabled, enableAutoSign, error: autoSignError } = useAutoSign(); + + return ( +
+ {/* Top-right wallet connect */} +
+ +
+ +
+

MOVESHOT

+

Competitive 2D Shooter on Initia Blockchain

+

Own your weapons. Record your wins on-chain.

+ + {/* Auto-sign prompt shown after wallet connection */} + {isConnected && !isAutoSignEnabled && ( +
+ Enable Seamless Play — approve once, zero wallet popups during matches. + +
+ )} + {autoSignError &&

{autoSignError}

} + + + +
+
+ ⚔️ +

Fast PvP Combat

+

Best-of-3 rounds, 30 seconds each. No respawns.

+
+
+ 🔗 +

On-Chain Records

+

Every match result recorded on Initia Minitia.

+
+
+ 🎮 +

True Ownership

+

Weapon skins are Move resources. Yours forever.

+
+
+
+
+ ); +} + +const styles: Record = { + topBar: { + position: 'fixed', + top: 16, + right: 16, + zIndex: 100, + }, + autoSignBanner: { + background: '#1a1a35', + border: '1px solid #4ecdc4', + color: '#4ecdc4', + padding: '10px 16px', + marginBottom: 24, + fontSize: '0.7rem', + fontFamily: 'JetBrains Mono, monospace', + display: 'flex', + alignItems: 'center', + gap: 16, + maxWidth: 600, + margin: '0 auto 24px auto', + }, + enableBtn: { + background: '#4ecdc4', + color: '#0a0a1a', + border: 'none', + padding: '6px 14px', + fontFamily: 'JetBrains Mono, monospace', + fontWeight: 'bold', + fontSize: '0.7rem', + cursor: 'pointer', + flexShrink: 0, + }, + errorText: { + color: '#ff6b6b', + fontSize: '0.7rem', + fontFamily: 'JetBrains Mono, monospace', + marginBottom: 12, + }, + container: { + minHeight: '100vh', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: 'linear-gradient(135deg, #0a0a1a 0%, #111128 50%, #0a0a1a 100%)', + }, + hero: { + textAlign: 'center', + maxWidth: 800, + padding: '40px 20px', + }, + title: { + fontSize: '4rem', + color: '#ffd700', + textShadow: '0 0 20px #ffd70066, 4px 4px 0 #aa9000', + letterSpacing: '0.1em', + marginBottom: 16, + }, + subtitle: { + fontSize: '1rem', + color: '#4ecdc4', + marginBottom: 12, + fontFamily: 'JetBrains Mono, monospace', + }, + tagline: { + fontSize: '0.85rem', + color: '#aaaacc', + marginBottom: 40, + fontFamily: 'JetBrains Mono, monospace', + }, + ctaBtn: { + background: '#ffd700', + color: '#0a0a1a', + border: 'none', + padding: '16px 48px', + fontSize: '1rem', + cursor: 'pointer', + marginBottom: 60, + boxShadow: '0 4px 0 #aa9000, 0 0 20px #ffd70044', + transition: 'transform 0.1s, box-shadow 0.1s', + }, + features: { + display: 'flex', + gap: 24, + justifyContent: 'center', + flexWrap: 'wrap', + }, + featureCard: { + background: '#1a1a35', + border: '1px solid #2a2a4a', + padding: '24px 20px', + width: 200, + textAlign: 'center', + }, + featureIcon: { + fontSize: '2rem', + display: 'block', + marginBottom: 12, + }, + featureTitle: { + fontSize: '0.55rem', + color: '#ffd700', + marginBottom: 8, + }, + featureDesc: { + fontSize: '0.75rem', + color: '#aaaacc', + fontFamily: 'JetBrains Mono, monospace', + lineHeight: 1.5, + }, +}; diff --git a/apps/client/src/pages/PlayPage.tsx b/apps/client/src/pages/PlayPage.tsx new file mode 100644 index 0000000..a823ce4 --- /dev/null +++ b/apps/client/src/pages/PlayPage.tsx @@ -0,0 +1,322 @@ +import { useState, useEffect, useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { networkManager } from '../networking/network-manager'; + +type LobbyState = + | 'menu' + | 'searching' + | 'waiting-room-code' + | 'waiting-for-opponent' + | 'bot-offer' + | 'ready'; + +interface PlayerCard { + name: string; + index: 0 | 1; + isBot?: boolean; + isLocal?: boolean; +} + +export default function PlayPage() { + const navigate = useNavigate(); + const [lobbyState, setLobbyState] = useState('menu'); + const [roomCode, setRoomCode] = useState(''); + const [joinCode, setJoinCode] = useState(''); + const [joinError, setJoinError] = useState(''); + const [username] = useState(() => `Player${Math.floor(Math.random() * 9000) + 1000}`); + const [players, setPlayers] = useState([]); + const [localPlayerIndex, setLocalPlayerIndex] = useState<0 | 1>(0); + const [botCountdown, setBotCountdown] = useState(5); + const botTimer = useRef | null>(null); + + useEffect(() => { + const unsubs = [ + networkManager.on('welcome', ({ playerIndex, roomCode: code }) => { + setLocalPlayerIndex(playerIndex); + setRoomCode(code); + setPlayers((prev) => { + const updated = [...prev]; + updated[playerIndex] = { name: username, index: playerIndex, isLocal: true }; + return updated; + }); + setLobbyState('waiting-for-opponent'); + }), + + networkManager.on('bot_offer', () => { + setLobbyState('bot-offer'); + let count = 5; + setBotCountdown(count); + botTimer.current = setInterval(() => { + count--; + setBotCountdown(count); + if (count <= 0) { + clearInterval(botTimer.current!); + networkManager.acceptBot(); + } + }, 1000); + }), + + networkManager.on('bot_joined', ({ playerIndex }) => { + setPlayers((prev) => { + const updated = [...prev]; + updated[playerIndex] = { name: 'Bot', index: playerIndex, isBot: true }; + return updated; + }); + clearInterval(botTimer.current!); + setLobbyState('ready'); + setTimeout(() => startGame(), 1000); + }), + + networkManager.on('matchEnd', () => { + setLobbyState('menu'); + }), + + networkManager.on('disconnected', () => { + setLobbyState('menu'); + setPlayers([]); + }), + ]; + + return () => { + unsubs.forEach((u) => u()); + if (botTimer.current) clearInterval(botTimer.current); + }; + }, [username]); + + // When 2 real players connect, the second player joining triggers the server to start — redirect both + useEffect(() => { + if (lobbyState !== 'waiting-for-opponent') return; + // Server will send gameState immediately when match starts — listen for first tick + const unsub = networkManager.on('gameState', () => { + unsub(); + startGame(); + }); + return () => unsub(); + }, [lobbyState]); + + function startGame() { + navigate('/game?mode=network'); + } + + async function handleQuickplay() { + setLobbyState('searching'); + setPlayers([]); + try { + await networkManager.joinQuickplay({ username }); + } catch (e) { + console.error(e); + setLobbyState('menu'); + } + } + + async function handleCreateRoom() { + setPlayers([]); + try { + await networkManager.createPrivateRoom({ username }); + setLobbyState('waiting-room-code'); + } catch (e) { + console.error(e); + setLobbyState('menu'); + } + } + + async function handleJoinByCode() { + if (joinCode.length !== 6) { + setJoinError('Code must be 6 characters'); + return; + } + setJoinError(''); + setPlayers([]); + try { + await networkManager.joinByCode(joinCode.toUpperCase(), { username }); + } catch { + setJoinError('Room not found or full'); + } + } + + function handleBack() { + networkManager.leave(); + setLobbyState('menu'); + setPlayers([]); + } + + return ( +
+
+ {lobbyState === 'menu' && ( + <> +

LOBBY

+

Playing as: {username}

+ +
+ + +
+ +
— or —
+ +
+ +
+ setJoinCode(e.target.value.toUpperCase())} + onKeyDown={(e) => e.key === 'Enter' && handleJoinByCode()} + /> + +
+ {joinError &&

{joinError}

} +
+ + + + )} + + {(lobbyState === 'searching' || lobbyState === 'waiting-for-opponent' || lobbyState === 'waiting-room-code') && ( + <> +

+ {lobbyState === 'searching' ? 'FINDING MATCH...' : 'WAITING FOR OPPONENT'} +

+ + {roomCode && ( +
+

ROOM CODE

+

{roomCode}

+ +
+ )} + +
+ +
+ +
+ {[0, 1].map((i) => { + const p = players[i]; + return ( +
+ {p ? ( + <> +
+ {p.name} + {p.isLocal && YOU} + + ) : ( + P{i + 1} — waiting... + )} +
+ ); + })} +
+ + + + )} + + {lobbyState === 'bot-offer' && ( + <> +

NO OPPONENTS FOUND

+

Play against a bot instead?

+

Auto-accepting in {botCountdown}s

+
+ + +
+ + )} + + {lobbyState === 'ready' && ( + <> +

GET READY!

+
+ + )} +
+ +

WASD / Arrows — move & jump · Mouse — aim · Click / Space — shoot

+
+ ); +} + +function SpinnerDots() { + return ( +
+ {[0, 1, 2].map((i) => ( +
+ ))} + +
+ ); +} + +const s: Record = { + page: { + minHeight: '100vh', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + gap: 20, + background: '#0a0a1a', + padding: 20, + }, + card: { + background: '#111128', + border: '1px solid #2a2a4a', + padding: '40px 48px', + maxWidth: 480, + width: '100%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + gap: 20, + }, + title: { color: '#ffd700', fontSize: '1.2rem', letterSpacing: '0.1em' }, + subtitle: { color: '#aaaacc', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.85rem' }, + username: { color: '#555577', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.75rem' }, + nameHighlight: { color: '#4ecdc4' }, + btnGroup: { display: 'flex', flexDirection: 'column', gap: 10, width: '100%' }, + btn: { background: '#ffd700', color: '#0a0a1a', border: 'none', padding: '14px', fontSize: '0.75rem', cursor: 'pointer', fontFamily: 'Press Start 2P, monospace', boxShadow: '0 4px 0 #aa9000' }, + btnSecondary: { background: '#1a1a35', color: '#ffffff', border: '1px solid #2a2a4a', padding: '12px', fontSize: '0.7rem', cursor: 'pointer', fontFamily: 'Press Start 2P, monospace' }, + btnOutline: { background: 'transparent', color: '#4ecdc4', border: '1px solid #4ecdc4', padding: '10px 20px', fontSize: '0.65rem', cursor: 'pointer', fontFamily: 'Press Start 2P, monospace', width: '100%' }, + btnSmall: { background: '#ffd700', color: '#0a0a1a', border: 'none', padding: '10px 16px', fontSize: '0.65rem', cursor: 'pointer', fontFamily: 'Press Start 2P, monospace' }, + backBtn: { background: 'transparent', color: '#555577', border: '1px solid #2a2a4a', padding: '8px 20px', fontSize: '0.55rem', cursor: 'pointer', fontFamily: 'Press Start 2P, monospace', marginTop: 8 }, + divider: { color: '#333355', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.75rem' }, + codeSection: { display: 'flex', flexDirection: 'column', gap: 10, width: '100%' }, + joinRow: { display: 'flex', gap: 8 }, + input: { + background: '#0a0a1a', border: '1px solid #2a2a4a', color: '#ffffff', + padding: '10px 12px', fontSize: '1rem', fontFamily: 'Press Start 2P, monospace', + flex: 1, letterSpacing: '0.2em', outline: 'none', + }, + error: { color: '#ff4444', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.75rem' }, + spinner: { display: 'flex', justifyContent: 'center', padding: '16px 0' }, + roomCodeBox: { textAlign: 'center', border: '1px solid #ffd70044', padding: '16px 24px', background: '#0a0a1a' }, + roomCodeLabel: { color: '#555577', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.65rem', marginBottom: 8 }, + roomCodeValue: { color: '#ffd700', fontFamily: 'Press Start 2P, monospace', fontSize: '1.4rem', letterSpacing: '0.3em', marginBottom: 12 }, + copyBtn: { background: 'transparent', color: '#4ecdc4', border: '1px solid #4ecdc4', padding: '4px 12px', fontSize: '0.55rem', cursor: 'pointer', fontFamily: 'Press Start 2P, monospace' }, + playerCards: { display: 'flex', gap: 12, width: '100%' }, + playerCard: { flex: 1, border: '1px solid #2a2a4a', padding: '12px', display: 'flex', alignItems: 'center', gap: 8, minHeight: 48 }, + playerCardFilled: { borderColor: '#4ecdc444', background: '#1a1a35' }, + playerDot: { width: 10, height: 10, borderRadius: '50%', flexShrink: 0 }, + playerCardName: { color: '#ffffff', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.8rem', flex: 1 }, + playerCardEmpty: { color: '#333355', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.75rem', fontStyle: 'italic' }, + youBadge: { color: '#ffd700', fontFamily: 'Press Start 2P, monospace', fontSize: '0.45rem', border: '1px solid #ffd70044', padding: '2px 4px' }, + countdown: { color: '#ff8c42', fontFamily: 'Press Start 2P, monospace', fontSize: '0.8rem' }, + hint: { color: '#333355', fontFamily: 'JetBrains Mono, monospace', fontSize: '0.65rem', textAlign: 'center' }, +}; diff --git a/apps/client/src/providers/InterwovenProvider.tsx b/apps/client/src/providers/InterwovenProvider.tsx new file mode 100644 index 0000000..55ef233 --- /dev/null +++ b/apps/client/src/providers/InterwovenProvider.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { InterwovenKitProvider, TESTNET, injectStyles } from '@initia/interwovenkit-react'; +import InterwovenKitStyles from '@initia/interwovenkit-react/styles.js'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { CHAIN_ID, MINITIA_CUSTOM_CHAIN } from '../config/chain'; + +// Inject InterwovenKit styles once (idempotent) +injectStyles(InterwovenKitStyles); + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 30_000, + refetchOnWindowFocus: false, + retry: 2, + }, + }, +}); + +interface Props { + children: React.ReactNode; +} + +export function InterwovenProvider({ children }: Props) { + return ( + + + {children} + + + ); +} diff --git a/apps/client/src/scenes/BootScene.ts b/apps/client/src/scenes/BootScene.ts new file mode 100644 index 0000000..81f4965 --- /dev/null +++ b/apps/client/src/scenes/BootScene.ts @@ -0,0 +1,64 @@ +import Phaser from 'phaser'; + +/** Loads all game assets then transitions to GameScene. */ +export class BootScene extends Phaser.Scene { + constructor() { + super({ key: 'BootScene' }); + } + + preload(): void { + // Progress bar + const { width, height } = this.cameras.main; + const progressBg = this.add.rectangle(width / 2, height / 2, 400, 20, 0x222244); + const progressBar = this.add.rectangle(width / 2 - 200, height / 2, 0, 20, 0xffd700); + progressBg; + + this.load.on('progress', (value: number) => { + progressBar.setSize(400 * value, 20); + }); + + // Load placeholder graphics (generated via canvas in PreloadScene) + // In production these would be real spritesheet PNGs + // For now we generate placeholder textures in create() + } + + create(): void { + this.generatePlaceholderTextures(); + this.scene.start('GameScene'); + } + + /** + * Generates placeholder colored rectangle textures for all game sprites. + * These will be replaced with real pixel art in T9 polish. + */ + private generatePlaceholderTextures(): void { + // Player 0 (cyan) + this.createColorTexture('player0', 24, 32, 0x4ecdc4); + // Player 1 (orange) + this.createColorTexture('player1', 24, 32, 0xff8c42); + // Platform tile + this.createColorTexture('platform', 32, 32, 0x3a3a5c); + // Projectiles + this.createColorTexture('bullet', 6, 6, 0xffd700); + this.createColorTexture('pellet', 4, 4, 0xff6666); + this.createColorTexture('sniper-bolt', 12, 3, 0x00ffff); + this.createColorTexture('rocket', 10, 6, 0xff4400); + // Weapon pickups + this.createColorTexture('pickup-pistol', 20, 20, 0xaaaaff); + this.createColorTexture('pickup-shotgun', 20, 20, 0xff8844); + this.createColorTexture('pickup-sniper', 20, 20, 0x44ff88); + this.createColorTexture('pickup-rocket', 20, 20, 0xff4444); + this.createColorTexture('pickup-smg', 20, 20, 0xffff44); + // Kill wall + this.createColorTexture('kill-wall', 8, 600, 0xff0000); + } + + private createColorTexture(key: string, w: number, h: number, color: number): void { + if (this.textures.exists(key)) return; + const gfx = this.make.graphics({ x: 0, y: 0 }); + gfx.fillStyle(color, 1); + gfx.fillRect(0, 0, w, h); + gfx.generateTexture(key, w, h); + gfx.destroy(); + } +} diff --git a/apps/client/src/scenes/GameScene.ts b/apps/client/src/scenes/GameScene.ts new file mode 100644 index 0000000..a93ba8b --- /dev/null +++ b/apps/client/src/scenes/GameScene.ts @@ -0,0 +1,359 @@ +import Phaser from 'phaser'; +import { + GameState, InputState, MatchPhase, RoundPhase, WeaponType, + step, createInitialState, createDefaultMap, + PLAYER_W, PLAYER_H, TICK_RATE, +} from '@arena/sim'; +import { PredictionManager } from '../networking/prediction-manager.js'; +import { OpponentInterpolation } from '../networking/interpolation.js'; +import { networkManager } from '../networking/network-manager.js'; +import { eventBridge } from '../bridge/EventBridge.js'; + +const WEAPON_TEXTURE: Record = { + [WeaponType.Pistol]: 'bullet', + [WeaponType.Shotgun]: 'pellet', + [WeaponType.Sniper]: 'sniper-bolt', + [WeaponType.Rocket]: 'rocket', + [WeaponType.SMG]: 'bullet', +}; + +const PICKUP_TEXTURE: Record = { + [WeaponType.Pistol]: 'pickup-pistol', + [WeaponType.Shotgun]: 'pickup-shotgun', + [WeaponType.Sniper]: 'pickup-sniper', + [WeaponType.Rocket]: 'pickup-rocket', + [WeaponType.SMG]: 'pickup-smg', +}; + +export interface GameSceneData { + mode: 'solo' | 'network'; + localPlayerIndex?: 0 | 1; +} + +export class GameScene extends Phaser.Scene { + private map = createDefaultMap(); + private mode: 'solo' | 'network' = 'solo'; + private localPlayerIndex: 0 | 1 = 0; + + // Solo mode + private soloState!: GameState; + private soloInputs: [InputState, InputState] = [defaultInput(), defaultInput()]; + private soloPrevInputs: [InputState, InputState] = [defaultInput(), defaultInput()]; + + // Network mode + private prediction = new PredictionManager(); + private opponentInterp = new OpponentInterpolation(TICK_RATE); + private networkState: GameState | null = null; + private networkTick = 0; + + // Shared state for rendering + private renderState!: GameState; + + private tickTimer = 0; + private readonly MS_PER_TICK = 1000 / TICK_RATE; + + // Input + private curInput: InputState = defaultInput(); + private prevInput: InputState = defaultInput(); + private wasd!: { up: Phaser.Input.Keyboard.Key; left: Phaser.Input.Keyboard.Key; right: Phaser.Input.Keyboard.Key; shoot: Phaser.Input.Keyboard.Key }; + + // Phaser display objects + private playerSprites: Phaser.GameObjects.Image[] = []; + private hpBars: Phaser.GameObjects.Graphics[] = []; + private projectileGroup!: Phaser.GameObjects.Group; + private pickupGroup!: Phaser.GameObjects.Group; + private leftWall!: Phaser.GameObjects.Image; + private rightWall!: Phaser.GameObjects.Image; + private hud!: { + timer: Phaser.GameObjects.Text; + score: Phaser.GameObjects.Text; + round: Phaser.GameObjects.Text; + phase: Phaser.GameObjects.Text; + weapons: Phaser.GameObjects.Text[]; + ping: Phaser.GameObjects.Text; + }; + private killFeed: Phaser.GameObjects.Text[] = []; + private networkUnsubscribers: Array<() => void> = []; + + constructor() { + super({ key: 'GameScene' }); + } + + init(data: GameSceneData): void { + this.mode = data.mode ?? 'solo'; + this.localPlayerIndex = data.localPlayerIndex ?? 0; + } + + create(): void { + this.cameras.main.setBackgroundColor('#0a0a1a'); + + // Draw platforms + const platGfx = this.add.graphics(); + for (const plat of this.map.platforms) { + platGfx.fillStyle(0x2a2a4a, 1); + platGfx.fillRect(plat.x, plat.y, plat.w, plat.h); + platGfx.lineStyle(2, 0x4ecdc4, 0.3); + platGfx.strokeRect(plat.x, plat.y, plat.w, plat.h); + } + + // Players + this.playerSprites = [ + this.add.image(0, 0, 'player0').setOrigin(0, 0), + this.add.image(0, 0, 'player1').setOrigin(0, 0), + ]; + this.hpBars = [this.add.graphics(), this.add.graphics()]; + + this.projectileGroup = this.add.group(); + this.pickupGroup = this.add.group(); + + this.leftWall = this.add.image(0, 0, 'kill-wall').setOrigin(0, 0).setVisible(false); + this.rightWall = this.add.image(0, 0, 'kill-wall').setOrigin(0, 0).setVisible(false); + + // HUD + const W = this.cameras.main.width; + this.hud = { + timer: this.add.text(W / 2, 8, '30', { fontFamily: 'Press Start 2P', fontSize: '20px', color: '#ffd700' }).setOrigin(0.5, 0).setDepth(5), + score: this.add.text(W / 2, 36, '0 — 0', { fontFamily: 'Press Start 2P', fontSize: '12px', color: '#ffffff' }).setOrigin(0.5, 0).setDepth(5), + round: this.add.text(W / 2, 54, 'ROUND 1', { fontFamily: 'Press Start 2P', fontSize: '9px', color: '#4ecdc4' }).setOrigin(0.5, 0).setDepth(5), + phase: this.add.text(W / 2, this.cameras.main.height / 2, '', { fontFamily: 'Press Start 2P', fontSize: '22px', color: '#ffd700', stroke: '#000000', strokeThickness: 4 }).setOrigin(0.5, 0.5).setDepth(10), + weapons: [ + this.add.text(10, 10, 'PISTOL', { fontFamily: 'Press Start 2P', fontSize: '7px', color: '#4ecdc4' }).setDepth(5), + this.add.text(W - 10, 10, 'PISTOL', { fontFamily: 'Press Start 2P', fontSize: '7px', color: '#ff8c42' }).setOrigin(1, 0).setDepth(5), + ], + ping: this.add.text(W - 6, 56, '', { fontFamily: 'JetBrains Mono', fontSize: '9px', color: '#555577' }).setOrigin(1, 0).setDepth(5), + }; + + // Input + const kb = this.input.keyboard!; + this.wasd = { + up: kb.addKey(Phaser.Input.Keyboard.KeyCodes.W), + left: kb.addKey(Phaser.Input.Keyboard.KeyCodes.A), + right: kb.addKey(Phaser.Input.Keyboard.KeyCodes.D), + shoot: kb.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE), + }; + + // Mode setup + if (this.mode === 'solo') { + this.soloState = createInitialState(['Player', 'Bot'], this.map); + this.renderState = this.soloState; + } else { + this.setupNetworkListeners(); + } + } + + private setupNetworkListeners(): void { + const unsub1 = networkManager.on('welcome', ({ playerIndex }) => { + this.localPlayerIndex = playerIndex; + }); + + const unsub2 = networkManager.on('gameState', ({ state, tick }) => { + this.networkTick = tick; + + // Update opponent interpolation + const remoteIdx = this.localPlayerIndex === 0 ? 1 : 0; + const remotePlayer = state.players[remoteIdx]; + if (remotePlayer) this.opponentInterp.push(remotePlayer); + + // Extract remote input from server state for prediction replay + // (We approximate from the state — server sends last inputs separately in a future improvement) + this.networkState = state; + + // Reconcile prediction + if (this.prediction.state) { + this.renderState = this.prediction.reconcile(state, tick); + } else { + this.prediction.init(state, this.localPlayerIndex); + this.renderState = state; + } + }); + + const unsub3 = networkManager.on('matchEnd', ({ winner, scores }) => { + eventBridge.emit('MATCH_ENDED', { winner: winner ?? null, scores: scores as [number, number] }); + }); + + this.networkUnsubscribers.push(unsub1, unsub2, unsub3); + } + + shutdown(): void { + this.networkUnsubscribers.forEach((u) => u()); + this.networkUnsubscribers = []; + } + + update(_time: number, delta: number): void { + this.tickTimer += delta; + + while (this.tickTimer >= this.MS_PER_TICK) { + this.prevInput = { ...this.curInput }; + this.gatherInput(); + + if (this.mode === 'solo') { + this.soloTick(); + } else { + this.networkTick_(); + } + + this.tickTimer -= this.MS_PER_TICK; + } + + this.renderFrame(); + } + + private gatherInput(): void { + const prev = this.prevInput; + void prev; + const p = this.mode === 'solo' + ? this.soloState.players[0]! + : (this.renderState?.players[this.localPlayerIndex] ?? { x: 400, y: 300 }); + + const wx = this.input.activePointer.worldX; + const wy = this.input.activePointer.worldY; + + this.curInput = { + left: this.wasd.left.isDown, + right: this.wasd.right.isDown, + jump: this.wasd.up.isDown, + shoot: this.input.activePointer.isDown || this.wasd.shoot.isDown, + interact: false, + aimAngle: Math.atan2(wy - (p.y + PLAYER_H / 2), wx - (p.x + PLAYER_W / 2)), + }; + } + + private soloTick(): void { + this.soloPrevInputs = [{ ...this.soloInputs[0] }, { ...this.soloInputs[1] }]; + this.soloInputs[0] = { ...this.curInput }; + this.botInput(); + + this.soloState = step(this.soloState, this.soloInputs, this.soloPrevInputs, this.map); + this.renderState = this.soloState; + } + + private networkTick_(): void { + if (!this.prediction.state) return; + this.renderState = this.prediction.predict(this.curInput, this.prevInput); + // Send input to server + networkManager.sendInput(this.curInput); + } + + private botInput(): void { + const bot = this.soloState.players[1]!; + const target = this.soloState.players[0]!; + if (!bot.alive || !target.alive) { + this.soloInputs[1] = defaultInput(); + return; + } + const dx = target.x - bot.x; + const dy = target.y - bot.y; + this.soloInputs[1] = { + left: dx < -10, + right: dx > 10, + jump: bot.grounded && dy < -80, + shoot: Math.abs(dx) < 300, + interact: false, + aimAngle: Math.atan2(dy + PLAYER_H / 2, dx + PLAYER_W / 2), + }; + } + + private renderFrame(): void { + if (!this.renderState) return; + const { players, projectiles, pickups, arena, round, matchPhase } = this.renderState; + const W = this.cameras.main.width; + + // Players + for (let i = 0; i < 2; i++) { + const p = players[i]!; + const sprite = this.playerSprites[i]!; + const bar = this.hpBars[i]!; + + // In network mode, use smoothed position for local player + let rx = p.x, ry = p.y; + if (this.mode === 'network' && i === this.localPlayerIndex) { + const smooth = this.prediction.smoothedPosition; + rx = smooth.x; + ry = smooth.y; + } else if (this.mode === 'network' && i !== this.localPlayerIndex) { + const interp = this.opponentInterp.getInterpolated(); + if (interp) { rx = interp.x; ry = interp.y; } + } + + sprite.setPosition(rx, ry).setVisible(p.alive || p.deathLingerTimer > 0); + sprite.setAlpha(p.alive ? 1 : 0.3); + sprite.setFlipX(p.facing === -1); + + bar.clear(); + if (p.alive || p.deathLingerTimer > 0) { + const bx = rx - 3, by = ry - 10; + bar.fillStyle(0x222233).fillRect(bx, by, 30, 4); + const frac = p.hp / 100; + const col = frac > 0.5 ? 0x44ff88 : frac > 0.25 ? 0xffaa00 : 0xff4444; + bar.fillStyle(col).fillRect(bx, by, 30 * frac, 4); + } + } + + // Projectiles + this.projectileGroup.clear(true, true); + for (const proj of projectiles) { + const img = this.add.image(proj.x, proj.y, WEAPON_TEXTURE[proj.weapon] ?? 'bullet'); + img.setRotation(Math.atan2(proj.vy, proj.vx)); + this.projectileGroup.add(img); + } + + // Pickups + this.pickupGroup.clear(true, true); + for (const pickup of pickups) { + if (pickup.respawnTimer > 0) continue; + const img = this.add.image(pickup.x, pickup.y, PICKUP_TEXTURE[pickup.weapon] ?? 'pickup-pistol'); + img.setRotation(this.time.now * 0.002); + this.pickupGroup.add(img); + } + + // Kill walls + if (arena.shrinkActive) { + this.leftWall.setVisible(true).setPosition(arena.leftWall - 8, 0); + this.rightWall.setVisible(true).setPosition(arena.rightWall, 0); + } else { + this.leftWall.setVisible(false); + this.rightWall.setVisible(false); + } + + // HUD + const secs = Math.ceil(Math.max(0, 1800 - round.tick) / 60); + this.hud.timer.setText(String(secs)).setColor(secs <= 10 ? '#ff4444' : '#ffd700'); + this.hud.score.setText(`${round.scores[0]} — ${round.scores[1]}`); + this.hud.round.setText(`ROUND ${round.roundNumber}`); + this.hud.weapons[0]?.setText(players[0]!.weapon.toUpperCase()); + this.hud.weapons[1]?.setText(players[1]!.weapon.toUpperCase()); + if (this.mode === 'network') this.hud.ping.setText(`tick ${this.networkTick}`); + + // Phase overlay + const showPhase = (text: string) => this.hud.phase.setVisible(true).setText(text); + if (matchPhase === MatchPhase.Countdown) { + const c = Math.ceil(this.renderState.countdownTick / 60); + showPhase(c > 0 ? String(c) : 'FIGHT!'); + } else if (round.phase === RoundPhase.Spawn && round.tick <= 60) { + const c = Math.ceil((60 - round.tick) / 20); + showPhase(c > 0 ? String(c) : 'FIGHT!'); + } else if (round.phase === RoundPhase.Ended) { + const name = round.winner !== null ? players[round.winner]!.id : 'DRAW'; + showPhase(`${name} WINS ROUND!`); + } else if (matchPhase === MatchPhase.Intermission) { + showPhase('NEXT ROUND...'); + } else if (matchPhase === MatchPhase.Ended) { + const winner = this.renderState.matchWinner; + const name = winner !== null ? players[winner]!.id : 'DRAW'; + showPhase(`${name} WINS!\n\nClick to restart`); + if (this.input.activePointer.isDown) { + if (this.mode === 'solo') { + this.soloState = createInitialState(['Player', 'Bot'], this.map); + } + } + } else { + this.hud.phase.setVisible(false); + } + + void W; + } +} + +function defaultInput(): InputState { + return { left: false, right: false, jump: false, shoot: false, interact: false, aimAngle: 0 }; +} diff --git a/apps/client/src/styles/globals.css b/apps/client/src/styles/globals.css new file mode 100644 index 0000000..f8457b7 --- /dev/null +++ b/apps/client/src/styles/globals.css @@ -0,0 +1,50 @@ +/* Design system tokens */ +:root { + --color-bg-primary: #0a0a1a; + --color-bg-secondary: #111128; + --color-bg-card: #1a1a35; + --color-accent-yellow: #ffd700; + --color-accent-cyan: #4ecdc4; + --color-accent-red: #ff4444; + --color-text-primary: #ffffff; + --color-text-secondary: #aaaacc; + --color-border: #2a2a4a; + --font-pixel: 'Press Start 2P', monospace; + --font-mono: 'JetBrains Mono', monospace; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + background-color: var(--color-bg-primary); + color: var(--color-text-primary); + font-family: var(--font-mono); + min-height: 100vh; + overflow-x: hidden; +} + +#root { + min-height: 100vh; +} + +h1, h2, h3 { + font-family: var(--font-pixel); +} + +a { + color: var(--color-accent-cyan); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +button { + cursor: pointer; + font-family: var(--font-pixel); +} diff --git a/apps/client/tsconfig.json b/apps/client/tsconfig.json new file mode 100644 index 0000000..024c8d5 --- /dev/null +++ b/apps/client/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ES2020", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "types": ["vite/client"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "noEmit": true, + "allowImportingTsExtensions": true, + "paths": { + "@arena/sim": ["../../packages/sim/src/index.ts"] + } + }, + "include": ["src/**/*"] +} diff --git a/apps/client/vite.config.ts b/apps/client/vite.config.ts new file mode 100644 index 0000000..48fa0b8 --- /dev/null +++ b/apps/client/vite.config.ts @@ -0,0 +1,27 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { resolve } from 'path'; +import { nodePolyfills } from 'vite-plugin-node-polyfills'; + +export default defineConfig({ + plugins: [ + react(), + nodePolyfills({ + // Required by @initia/initia.js — provides Buffer, process, crypto in browser + include: ['buffer', 'process', 'stream', 'crypto', 'util'], + globals: { + Buffer: true, + global: true, + process: true, + }, + }), + ], + resolve: { + alias: { + '@arena/sim': resolve(__dirname, '../../packages/sim/src/index.ts'), + }, + }, + server: { + port: 3000, + }, +}); diff --git a/context/developer/CONVENTIONS.md b/context/developer/CONVENTIONS.md index ad7f09d..e3d461b 100644 --- a/context/developer/CONVENTIONS.md +++ b/context/developer/CONVENTIONS.md @@ -73,7 +73,7 @@ initia-arena/ │ ├── index.ts # Exports: createInitialState(), step() │ ├── types.ts # GameState, PlayerState, all interfaces │ ├── constants.ts # Physics, weapon stats, arena params -│ ├── step.ts # Main game loop (16 sub-steps) +│ ├── step.ts # Main game loop (single step per tick) │ ├── physics.ts # Movement, gravity, collision │ ├── projectiles.ts # Projectile movement, hit detection │ ├── weapons.ts # Weapon pickups, damage, cooldowns diff --git a/context/features/core-gameplay.md b/context/features/core-gameplay.md index 2175d56..e8ff121 100644 --- a/context/features/core-gameplay.md +++ b/context/features/core-gameplay.md @@ -42,7 +42,7 @@ The deterministic physics simulation that powers all gameplay in MoveShot. This #### Movement 1. Player presses LEFT or RIGHT arrow key. Character accelerates at **0.8 units/tick** in that direction, capped at **4.0 units/tick** max run speed. 2. Player releases the key. Character decelerates at **0.6 units/tick** until velocity reaches zero. No ice-skating — the character stops promptly. -3. Player presses JUMP while grounded. Character receives an initial vertical velocity of **-10.5 units/tick** (negative = upward). Gravity pulls at **0.6 units/tick** every tick. +3. Player presses JUMP while grounded (edge-triggered: fires only on the tick the button transitions from unpressed to pressed, using `prevInput` comparison). Character receives an initial vertical velocity of **-10.5 units/tick** (negative = upward). Gravity pulls at **0.6 units/tick** every tick. 4. While airborne, player presses JUMP again. Double jump fires with the same **-10.5** initial velocity but only once per airborne state. Resets when the character lands on a platform. 5. Player moves toward a wall while airborne. Character enters **wall slide** state: gravity is reduced to **0.2 units/tick** (1/3 normal), character slides down slowly. A wall-slide sprite plays. 6. Player presses JUMP while wall sliding. **Wall jump** fires: character receives **-10.5** vertical velocity and **6.0** horizontal velocity away from the wall. Double jump is still available after a wall jump. @@ -55,23 +55,24 @@ The deterministic physics simulation that powers all gameplay in MoveShot. This - **Ceiling collision** (bonking head): character Y is snapped to platform bottom. Vertical velocity set to 0. - **Wall collision** (side): character X is snapped to the wall edge. If airborne and holding toward the wall, enter wall slide. 4. Penetration resolution uses minimum translation vector to push the character out of the platform along the shortest axis. -5. The step function runs **16 sub-steps per tick** to prevent tunnelling through thin platforms at high velocities. +5. The step function runs a **single step per tick** (no sub-steps). At 60Hz, hitbox sizes are large enough relative to projectile speeds that tunnelling is not a practical problem. #### Weapons 1. Five weapon pickups spawn at predetermined map positions at round start. Each is a floating, rotating sprite with a glow effect. 2. Player walks over a weapon pickup. The weapon is added to inventory, replacing any previously held weapon (only one weapon at a time besides the default pistol). 3. Player aims with the mouse (aim direction = angle from character centre to mouse position in world coordinates). Player clicks to fire. -4. Weapon fires if cooldown has elapsed. A projectile entity is created at the character's muzzle position with the weapon's specific properties: +4. Weapon fires if cooldown has elapsed. A projectile entity is created at the character's muzzle position with the weapon's specific properties. Each weapon has a **projectile lifetime** (ticks) — projectiles are destroyed when lifetime reaches 0. -| Weapon | Damage | Cooldown (ticks) | Projectile Speed | Special Behaviour | -|---------|--------|-------------------|------------------|--------------------------------------------------------------------| -| Pistol | 15 | 10 | 12.0 | Default weapon. Infinite ammo. Always available. | -| Shotgun | 60 | 20 | 10.0 | Fires **6 pellets** in a 30-degree spread cone. Each pellet deals 10 damage. Total damage if all pellets hit = 60. | -| Sniper | 80 | 60 | 20.0 | Single high-damage projectile. Fastest travel speed. Narrow hitbox (2px wide). | -| Rocket | 50 | 25 | 8.0 | On impact: deals 50 direct damage + creates a **40px radius splash zone** dealing **25 splash damage** to any player within range (including the shooter). | -| SMG | 10 | 5 | 11.0 | Rapid fire. Lowest per-shot damage but highest DPS at close range. Slight random spread (+-3 degrees). | +| Weapon | Damage | Cooldown (ticks) | Projectile Speed | Lifetime (ticks) | Special Behaviour | +|---------|--------|-------------------|------------------|-------------------|--------------------------------------------------------------------| +| Pistol | 15 | 10 | 12.0 | 90 | Default weapon. Infinite ammo. Always available. | +| Shotgun | 60 | 20 | 10.0 | 45 | Fires **6 pellets** in a 30-degree spread cone. Each pellet deals 10 damage. Total damage if all pellets hit = 60. | +| Sniper | 80 | 60 | 20.0 | 120 | Single high-damage projectile. Fastest travel speed. Narrow hitbox (2px wide). | +| Rocket | 50 | 25 | 8.0 | 120 | On impact: deals 50 direct damage + creates a **40px radius splash zone** dealing **25 splash damage** to any player within range (including the shooter). | +| SMG | 10 | 5 | 11.0 | 60 | Rapid fire. Lowest per-shot damage but highest DPS at close range. Slight random spread (+-3 degrees). | -5. Projectiles travel in a straight line at their speed each tick. They are destroyed when they hit a platform, leave the arena bounds, or hit a player. +5. Projectiles travel in a straight line at their speed each tick. They are destroyed when they hit a platform, leave the arena bounds, hit a player, or their **lifetime reaches 0**. +6. **Weapon pickup respawning:** When a pickup is collected, it starts a respawn timer of **300 ticks (5 seconds)**. On respawn, the pickup appears at the same position with the **next weapon in a rotation cycle** (cycles through all 5 weapon types in order). #### Hit Detection 1. Every tick, each projectile's AABB is tested against each player's AABB (24x32px). @@ -88,10 +89,11 @@ The deterministic physics simulation that powers all gameplay in MoveShot. This #### Stomp / Aerial Sword Slash (Grapple Mechanic) 1. Player is falling (positive Y velocity) and their feet hitbox (bottom 4px of AABB) overlaps the top of an enemy's head hitbox (top 8px of AABB). 2. Stomp initiates: attacker locks onto the victim. A sword-slash animation plays. -3. While stomping: victim takes **8 damage per tick** (480 DPS). Attacker is locked in position on victim's head. -4. Victim can **escape** by alternating LEFT and RIGHT inputs rapidly. An escape meter fills based on input frequency. When the meter reaches 100%, victim breaks free and both players are pushed apart (attacker launched upward at -8.0, victim knocked sideways at 6.0). -5. If victim fails to escape within **30 ticks** (0.5 seconds), stomp completes: victim takes a final **30 bonus damage** and is launched downward. -6. During stomp, both players are invulnerable to projectiles from other sources (irrelevant in 1v1 but future-proofs for FFA). +3. While stomping: victim takes **1 damage every 2 ticks** (0.5 DPS). Maximum **50 damage per stomp session** (cap). Attacker is locked in position on victim's head. **Attacker can still aim and shoot** during the stomp (movement is suppressed but weapon input is preserved). +4. Victim auto-runs in random directions with random timer reversals (seeded PRNG). Victim can **escape** by alternating LEFT and RIGHT inputs (edge-detected). Each correct press adds **17 to the escape meter** (threshold: 100). Meter decays by **1 per tick** if not mashing. +5. When escape meter reaches 100%, victim breaks free and both players are pushed apart (attacker launched upward at -8.0, victim knocked sideways at 6.0). +6. After escape, victim gains **90 ticks (1.5 seconds) of stomp immunity** (cooldown). Cannot be stomped again during this period. +7. During stomp, both players are invulnerable to projectiles from other sources (irrelevant in 1v1 but future-proofs for FFA). #### Arena Shrink 1. At round start, the arena boundaries match the full map dimensions (e.g., 800x600 play area). @@ -149,7 +151,7 @@ The deterministic physics simulation that powers all gameplay in MoveShot. This | Arena shrink | Horizontal walls only | + Vertical shrink, random shrink patterns | | Maps | 1 arena map | 5+ maps with hazards (lava, spikes, moving platforms) | | Game modes | 1v1 best-of-3 | + FFA (4 players), 2v2 teams, king-of-the-hill | -| Physics sub-steps | 16 per tick | Same (proven sufficient) | +| Physics | Single step per tick (no sub-steps, matches Chickenz) | Same (proven sufficient at 60Hz) | | Weapon skins | Default appearance only | Cosmetic skins per weapon (from on-chain NFTs) | | Damage numbers | No floating damage numbers | Floating damage numbers on hit | | Kill cam / replay | None | Round-end kill cam, full match replay from sim playback | @@ -159,7 +161,7 @@ The deterministic physics simulation that powers all gameplay in MoveShot. This ## Security Considerations - **Determinism is security:** The server runs the authoritative sim. The client's local sim is for prediction only. The server NEVER trusts client-reported positions, HP, or damage. All game state derives from server-side `step()` calls. -- **Input validation:** Server validates all client inputs before feeding them to the sim. Inputs are a bitmask of buttons (LEFT, RIGHT, JUMP, SHOOT, INTERACT) plus an aim angle (clamped to 0-2PI). Any invalid input is rejected. +- **Input validation:** Server validates all client inputs before feeding them to the sim. Inputs are a bitmask of buttons (LEFT, RIGHT, JUMP, SHOOT, INTERACT) plus an aim angle (clamped to valid range). Any invalid input is rejected. - **Tick rate enforcement:** Server runs at a fixed 60Hz tick rate. If a client sends inputs faster than the tick rate, excess inputs are dropped. If a client sends inputs slower, the last known input persists. - **No client-side weapon stats:** Weapon damage, cooldowns, and projectile speeds live in `packages/sim/constants.ts` and are enforced server-side. A modified client cannot increase damage or reduce cooldowns. - **Anti-speedhack:** The server's tick clock is the only source of truth. A client cannot advance the sim faster than the server allows. @@ -173,17 +175,17 @@ The deterministic physics simulation that powers all gameplay in MoveShot. This |--------|--------|-----------------------| | T40 | `[ ]` | Create `packages/sim/` package with `package.json`, tsconfig, and entry point `index.ts` that exports all public types and the `step()` function | | T41 | `[ ]` | Define all game types in `packages/sim/types.ts`: `GameState`, `PlayerState`, `ProjectileState`, `WeaponPickupState`, `InputState`, `WeaponType` enum, `RoundPhase` enum, `MatchPhase` enum, `ArenaState`, `StompState` | -| T42 | `[ ]` | Define all constants in `packages/sim/constants.ts`: movement speeds, gravity, jump velocities, weapon stats table, arena dimensions, tick rate, sub-step count, shrink timing, stomp damage rates | +| T42 | `[ ]` | Define all constants in `packages/sim/constants.ts`: movement speeds, gravity, jump velocities, weapon stats table (with projectile lifetimes), arena dimensions, tick rate, shrink timing, stomp values (corrected from Chickenz), weapon respawn timer, PRNG seed | | T43 | `[ ]` | Implement `packages/sim/physics.ts`: `applyGravity()`, `applyVelocity()`, `resolveAABBCollisions()` (floor/ceiling/wall with minimum translation vector), `checkGrounded()`, `checkWallContact()`, terminal velocity clamping | -| T44 | `[ ]` | Implement character movement in `packages/sim/physics.ts` or `movement.ts`: `processMovement(player, input)` handling acceleration, deceleration, jump (with grounded check), double jump (with airborne tracking), wall slide (reduced gravity), wall jump (velocity redirect + wall detach) | +| T44 | `[ ]` | Implement character movement in `packages/sim/physics.ts` or `movement.ts`: `processMovement(player, input, prevInput)` handling acceleration, deceleration, edge-triggered jump (with grounded check + prevInput), double jump (with airborne tracking), wall slide (reduced gravity), wall jump (velocity redirect + wall detach) | | T45 | `[ ]` | Implement `packages/sim/map.ts`: `MapData` type (array of platform AABBs), at least one arena layout (platforms, spawn points, weapon spawn positions), `createDefaultMap()` factory | -| T46 | `[ ]` | Implement `packages/sim/weapons.ts`: `fireWeapon(player, weaponType, aimAngle)` returning new projectile(s). Handle per-weapon logic: single shot (pistol/sniper), 6-pellet spread (shotgun), splash flag (rocket), rapid fire (SMG). Cooldown tracking per player. | -| T47 | `[ ]` | Implement `packages/sim/projectiles.ts`: `updateProjectiles(state)` — move all projectiles by their velocity, check AABB overlap with players (skip shooter), apply damage on hit, destroy on platform collision or out-of-bounds. Rocket splash logic: on destroy, check 40px radius for splash damage. | -| T48 | `[ ]` | Implement weapon pickup system: spawn 5 pickups at map-defined positions at round start, `checkWeaponPickup(player, pickups)` — AABB overlap grants weapon to player, removes pickup from map. Handle contested pickup (lower index wins). | +| T46 | `[ ]` | Implement `packages/sim/weapons.ts`: `fireWeapon(player, weaponType, aimAngle)` returning new projectile(s) with lifetime. Handle per-weapon logic: single shot (pistol/sniper), 6-pellet spread (shotgun, seeded PRNG for jitter), splash flag (rocket), rapid fire (SMG). Cooldown tracking per player. | +| T47 | `[ ]` | Implement `packages/sim/projectiles.ts`: `updateProjectiles(state)` — move all projectiles, decrement lifetime, destroy when lifetime=0, check AABB overlap with players (skip shooter), apply damage on hit, destroy on platform collision or out-of-bounds. Rocket splash logic: on destroy, check 40px radius for splash damage. | +| T48 | `[ ]` | Implement weapon pickup system: spawn 5 pickups at map-defined positions at round start, `checkWeaponPickup(player, pickups)` — AABB overlap grants weapon to player, removes pickup from map. Contested pickup: lower index wins. **Respawn system:** collected pickups respawn after 300 ticks with next weapon in WEAPON_ROTATION cycle. | | T49 | `[ ]` | Implement HP and damage system: `applyDamage(player, amount)`, death check (`hp <= 0`), death state flag, invulnerability during stomp. Self-damage reduction for rocket splash (15 instead of 25). | -| T50 | `[ ]` | Implement stomp/aerial slash mechanic: detect feet-on-head overlap, lock attacker to victim, tick damage (8/tick), escape meter (victim L/R alternation), escape resolution (push apart), timeout completion (30 ticks, bonus 30 damage). | +| T50 | `[ ]` | Implement stomp/aerial slash mechanic: detect feet-on-head overlap, lock attacker to victim, 1 dmg every 2 ticks (50 HP cap), rider can aim+shoot, victim auto-runs (seeded PRNG), escape meter (17/press, 1/tick decay, threshold 100), escape push-apart, 90-tick cooldown immunity. | | T51 | `[ ]` | Implement arena shrink in `packages/sim/map.ts` or `arena.ts`: start at tick 1200, walls close at 0.5px/tick, kill wall damage (5/tick), minimum gap (100px), destroy weapon pickups outside bounds. | -| T52 | `[ ]` | Implement `packages/sim/step.ts`: the master `step(state, inputs)` function. Runs 16 sub-steps per tick. Each sub-step: process inputs, apply movement/physics, update projectiles, check hits, check stomps, update arena shrink, check round-end conditions. Return new `GameState`. | +| T52 | `[ ]` | Implement `packages/sim/step.ts`: the master `step(state, inputs, prevInputs)` function. **Single step per tick** (no sub-steps). Process inputs (edge-triggered via prevInputs), apply movement/physics, update projectiles (decrement lifetime), check hits, check stomps, update arena shrink, deathLingerTimer, check round-end conditions. Return new `GameState`. | | T53 | `[ ]` | Implement round flow logic: spawn phase (60 tick freeze), fight phase, shrink phase, round-end detection (death or timeout), winner determination (surviving player or higher HP), draw handling. | | T54 | `[ ]` | Implement match flow logic: 3-second countdown, round transitions with 2-second intermission, best-of-3 scoring, match-end detection (first to 2 round wins), final result packaging. | | T55 | `[ ]` | Write unit tests for the sim: determinism test (same inputs = same outputs over 1000 ticks), movement tests (acceleration, deceleration, jump heights), weapon damage tests, AABB collision tests, arena shrink tests, round/match flow tests. Minimum 20 test cases. | @@ -210,6 +212,8 @@ packages/sim/ map.ts # Map data, platform layouts, spawn points, weapon spawn positions arena.ts # Arena shrink logic (optional — can live in map.ts) stomp.ts # Stomp/grapple mechanic (optional — can live in step.ts) + prng.ts # Mulberry32 seeded PRNG: prngNext(state) → [value, nextState] + hash.ts # FNV-1a state hashing for determinism verification (optional) tests/ step.test.ts physics.test.ts @@ -273,6 +277,7 @@ export interface PlayerState { alive: boolean; facingRight: boolean; stompState: StompState | null; + stompCooldownTicks: number; // immunity ticks remaining after stomp escape roundsWon: number; } @@ -285,6 +290,7 @@ export interface ProjectileState { ownerId: string; weapon: WeaponType; damage: number; + lifetime: number; // ticks remaining before auto-destroy alive: boolean; } @@ -294,13 +300,16 @@ export interface WeaponPickupState { y: number; weapon: WeaponType; alive: boolean; + respawnTimer: number; // ticks until respawn (0 = available) + rotationIndex: number; // index in WEAPON_ROTATION for next spawn } export interface StompState { attackerId: string; victimId: string; - ticksRemaining: number; + totalDamageDealt: number; // tracks toward STOMP_MAX_DAMAGE cap escapeMeter: number; // 0-100 + ticksSinceLastDamage: number; // for STOMP_DAMAGE_INTERVAL timing } export interface ArenaState { @@ -320,7 +329,10 @@ export interface GameState { currentRound: number; // 1, 2, or 3 roundWinner: string | null; // player ID or null matchWinner: string | null; // player ID or null + matchOver: boolean; // set after deathLingerTimer expires + deathLingerTimer: number; // 30-tick delay after final kill before matchOver scores: Record; // player ID → rounds won + rngState: number; // Mulberry32 PRNG state for deterministic randomness } ``` @@ -328,13 +340,13 @@ export interface GameState { ```typescript export const TICK_RATE = 60; -export const SUB_STEPS = 16; export const ROUND_DURATION_TICKS = 1800; // 30 seconds export const SHRINK_START_TICK = 1200; // 20 seconds export const SPAWN_FREEZE_TICKS = 60; // 1 second export const COUNTDOWN_TICKS = 180; // 3 seconds export const INTERMISSION_TICKS = 120; // 2 seconds -export const STOMP_DURATION_TICKS = 30; +export const DEATH_LINGER_TICKS = 30; // 0.5s post-kill time before matchOver +export const WEAPON_PICKUP_RESPAWN_TICKS = 300; // 5 seconds // Movement export const MAX_RUN_SPEED = 4.0; @@ -357,34 +369,44 @@ export const SHRINK_MIN_GAP = 100; // px export const KILL_WALL_DAMAGE = 5; // per tick // Stomp -export const STOMP_DAMAGE_PER_TICK = 8; -export const STOMP_BONUS_DAMAGE = 30; +export const STOMP_DAMAGE = 1; // 1 HP damage +export const STOMP_DAMAGE_INTERVAL = 2; // applied every 2 ticks +export const STOMP_MAX_DAMAGE = 50; // cap per stomp session export const STOMP_ESCAPE_THRESHOLD = 100; +export const STOMP_ESCAPE_PER_PRESS = 17; +export const STOMP_ESCAPE_DECAY = 1; // per tick +export const STOMP_COOLDOWN_TICKS = 90; // 1.5s immunity after escape // Weapon stats table export const WEAPON_STATS: Record = { - [WeaponType.Pistol]: { damage: 15, cooldown: 10, speed: 12, pellets: 1, spreadAngle: 0, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, - [WeaponType.Shotgun]: { damage: 10, cooldown: 20, speed: 10, pellets: 6, spreadAngle: 30, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, - [WeaponType.Sniper]: { damage: 80, cooldown: 60, speed: 20, pellets: 1, spreadAngle: 0, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, - [WeaponType.Rocket]: { damage: 50, cooldown: 25, speed: 8, pellets: 1, spreadAngle: 0, splashRadius: 40, splashDamage: 25, selfSplashDamage: 15 }, - [WeaponType.SMG]: { damage: 10, cooldown: 5, speed: 11, pellets: 1, spreadAngle: 3, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, + [WeaponType.Pistol]: { damage: 15, cooldown: 10, speed: 12, lifetime: 90, pellets: 1, spreadAngle: 0, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, + [WeaponType.Shotgun]: { damage: 10, cooldown: 20, speed: 10, lifetime: 45, pellets: 6, spreadAngle: 30, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, + [WeaponType.Sniper]: { damage: 80, cooldown: 60, speed: 20, lifetime: 120, pellets: 1, spreadAngle: 0, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, + [WeaponType.Rocket]: { damage: 50, cooldown: 25, speed: 8, lifetime: 120, pellets: 1, spreadAngle: 0, splashRadius: 40, splashDamage: 25, selfSplashDamage: 15 }, + [WeaponType.SMG]: { damage: 10, cooldown: 5, speed: 11, lifetime: 60, pellets: 1, spreadAngle: 3, splashRadius: 0, splashDamage: 0, selfSplashDamage: 0 }, }; + +// Weapon rotation for pickup respawning +export const WEAPON_ROTATION: WeaponType[] = [ + WeaponType.Pistol, WeaponType.Shotgun, WeaponType.Sniper, + WeaponType.Rocket, WeaponType.SMG, +]; ``` ### Step Function Pattern (step.ts) ```typescript import { GameState, InputState } from './types'; -import { SUB_STEPS } from './constants'; import { applyGravity, applyVelocity, resolveCollisions } from './physics'; import { processMovement } from './movement'; import { updateProjectiles, checkHits } from './projectiles'; @@ -394,51 +416,64 @@ import { updateStomp } from './stomp'; import { checkRoundEnd, advanceMatchPhase } from './match'; /** - * Advance the game state by one tick. - * MUST be pure: no side effects, no randomness, no Date.now(). + * Advance the game state by one tick. Single step (no sub-steps). + * MUST be pure: no side effects, no Math.random(), no Date.now(). * Same inputs + same state = same output. Always. + * + * Takes both current inputs AND previous inputs for edge detection. + * Jump is edge-triggered: fires only when JUMP is pressed this tick + * but was NOT pressed last tick. */ export function step( state: GameState, - inputs: Record + inputs: Record, + prevInputs: Record ): GameState { // Deep clone state to maintain immutability let next = structuredClone(state); next.tick += 1; + // Handle death linger timer (0.5s post-kill delay before matchOver) + if (next.deathLingerTimer > 0) { + next.deathLingerTimer -= 1; + if (next.deathLingerTimer === 0) { + next.matchOver = true; + } + // During linger, winner can still move and projectiles still travel + } + // Skip processing during non-play phases if (next.roundPhase === 'countdown' || next.roundPhase === 'ended') { return advanceMatchPhase(next); } - // Process each sub-step - for (let sub = 0; sub < SUB_STEPS; sub++) { - for (const [playerId, player] of Object.entries(next.players)) { - if (!player.alive) continue; - const input = inputs[playerId] ?? { buttons: 0, aimX: 0, aimY: 0 }; - - // Movement (only on first sub-step to avoid 16x acceleration) - if (sub === 0) { - processMovement(player, input); - if (input.buttons & 8) { // SHOOT - fireWeapon(next, player, input); - } - } - - // Physics (every sub-step for fine collision) - applyGravity(player); - applyVelocity(player, 1 / SUB_STEPS); - resolveCollisions(player, next.arena, /* map platforms */); + // Single step per tick — no sub-steps needed at 60Hz + for (const [playerId, player] of Object.entries(next.players)) { + if (!player.alive) continue; + const input = inputs[playerId] ?? { buttons: 0, aimX: 0, aimY: 0 }; + const prevInput = prevInputs[playerId] ?? { buttons: 0, aimX: 0, aimY: 0 }; + + // Movement with edge detection for jump + processMovement(player, input, prevInput); + + // Shooting + if (input.buttons & 8) { // SHOOT + fireWeapon(next, player, input); } - // Projectiles (every sub-step) - updateProjectiles(next, 1 / SUB_STEPS); - checkHits(next); + // Physics + applyGravity(player); + applyVelocity(player); + resolveCollisions(player, next.arena, /* map platforms */); } - // Post-sub-step updates (once per tick) - checkWeaponPickups(next); - updateStomp(next, inputs); + // Projectiles (move, check hits, decrement lifetime) + updateProjectiles(next); + checkHits(next); + + // Per-tick updates + checkWeaponPickups(next); // includes respawn timer decrement + updateStomp(next, inputs, prevInputs); updateArenaShrink(next); checkRoundEnd(next); @@ -512,12 +547,12 @@ The sim MUST follow these rules to guarantee determinism: ## Open Questions -- [ ] Should the Pistol have limited ammo or remain infinite? (Current: infinite — simpler for MVP) +- [x] ~~Should the Pistol have limited ammo or remain infinite?~~ **Resolved: Infinite. Default pistol is always available for accessibility.** - [ ] Exact map layout for the first arena — platform positions, heights, weapon spawn positions. Need a level design sketch. - [ ] Should projectiles have gravity (arcing) or travel in straight lines? (Current: straight lines for all weapons — simpler hit detection) - [ ] Confirm stomp mechanic is in MVP scope or deferred. (SCOPE.md says "should-have") -- [ ] Seeded PRNG implementation: use mulberry32 or xoshiro128? Need to decide before SMG spread and shotgun pellet angles. -- [ ] Should weapon pickups respawn after a delay (e.g., 10 seconds) or remain gone for the entire round? (Current: no respawn — one set per round) +- [x] ~~Seeded PRNG implementation~~ **Resolved: Mulberry32 (matches Chickenz). Used for shotgun spread jitter, stomp auto-run direction, respawn point selection.** +- [x] ~~Should weapon pickups respawn?~~ **Resolved: Yes, 300-tick (5s) respawn timer with weapon type rotation. Matches Chickenz.** - [ ] Exact platform tileset collision — are platforms all axis-aligned rectangles or do we need slopes? (Recommend: AABB only for MVP) --- @@ -525,8 +560,11 @@ The sim MUST follow these rules to guarantee determinism: ## Notes - The Chickenz reference project (github.com/AshFrancis/chickenz) uses a similar shared sim architecture. Study its `packages/sim/` for patterns, but MoveShot's sim should be written from scratch to avoid licensing issues and to fit our specific mechanics. -- The 16 sub-steps per tick pattern is borrowed from Chickenz and prevents high-velocity projectiles or players from tunnelling through thin platforms. At 60Hz with 16 sub-steps, we effectively simulate at 960Hz for collision purposes. -- The `step()` function signature matches what Colyseus will call on the server every tick, and what the client prediction loop will call locally. +- **No sub-steps.** Chickenz uses a single `step()` per tick at 60Hz with no sub-stepping. We adopt this — it's proven sufficient. +- The `step()` function takes both `inputs` and `prevInputs` for edge-triggered jump detection (press-to-jump, not hold-to-jump). This matches Chickenz's pattern. +- **Seeded PRNG (Mulberry32):** Used for shotgun spread jitter, stomp auto-run direction, and respawn point selection. State carried in `rngState` field of `GameState`. Function signature: `prngNext(state: number): [value: number, nextState: number]`. +- **Death linger timer:** After the final kill, the game continues for 30 ticks (0.5s) before `matchOver` is set. Winner can still move and projectiles still travel. This lets players see the killing blow play out. +- **Deliberate differences from Chickenz:** We keep our own values for gravity (0.6), wall slide (reduced gravity), wall jump (6.0/-10.5), weapon stats, arena size (800x600), infinite default pistol, mouse aim (world coords), and gradual kill wall damage. These are design choices, not errors. --- diff --git a/context/features/multiplayer-networking.md b/context/features/multiplayer-networking.md index 7a39ca6..1fbc6e2 100644 --- a/context/features/multiplayer-networking.md +++ b/context/features/multiplayer-networking.md @@ -74,8 +74,8 @@ Real-time multiplayer infrastructure for MoveShot using Colyseus.js. This featur 1. Client captures keyboard and mouse input every frame (Phaser's input system). 2. Input is encoded as an `InputState`: a `buttons` bitmask (LEFT=1, RIGHT=2, JUMP=4, SHOOT=8, INTERACT=16) and `aimX`/`aimY` (mouse world coordinates). 3. Client only sends an input message to the server **when the input changes** (not every frame). This reduces bandwidth. If the player holds RIGHT and doesn't change anything, only one message is sent when RIGHT is first pressed. -4. Client sends: `room.send("input", { buttons, aimX, aimY, tick })` where `tick` is the client's current predicted tick number. -5. Server receives the input and stores it. The input applies starting from the **next server tick**. +4. Client sends: `room.send("input", { buttons, aimX, aimY, tick })` where `tick` is the client's current predicted tick number. **Tick-tagged inputs:** if the input is for a future tick (up to 120 ticks ahead), server queues it in `inputQueues` and applies it at the exact target tick. This prevents "phantom edges" where an input edge (e.g., jump press) is applied at the wrong tick. +5. Server receives the input and stores it. The server tracks both **current and previous inputs** per player for edge detection (e.g., press-to-jump). Missing input rule: if no input received for a tick, reuse the previous tick's input. #### Client-Side Prediction 1. Client maintains its own local `GameState` and runs `step()` locally every frame (synchronized to 60Hz). @@ -84,7 +84,7 @@ Real-time multiplayer infrastructure for MoveShot using Colyseus.js. This featur 4. When the client receives an authoritative state from the server (tagged with the server's tick number): a. Client finds the server tick in its input buffer. b. Client sets its local state to the server state. - c. Client **replays** all inputs from the server tick to the current predicted tick, calling `step()` for each replayed tick with the stored inputs. + c. Client **replays** all inputs from the server tick to the current predicted tick, calling `step()` for each replayed tick with the stored inputs. **For the opponent, uses `lastRemoteInput`** (the opponent's last known buttons extracted from server state) instead of null input. This dramatically reduces prediction divergence. d. This produces a "reconciled" state that accounts for both server authority and local inputs that the server hasn't processed yet. 5. If the reconciled position differs from the previously predicted position by more than a threshold, the client smoothly interpolates toward the corrected position rather than snapping (see Position Correction below). @@ -115,7 +115,7 @@ Real-time multiplayer infrastructure for MoveShot using Colyseus.js. This featur - **Player disconnects mid-match:** Server starts a 5-second reconnection window. Opponent sees a "Opponent disconnected — waiting..." message. If reconnection fails, disconnected player forfeits all remaining rounds. - **Both players disconnect:** Room is disposed after 10 seconds. Match is recorded as abandoned (no winner). -- **Input arrives for future tick:** Server ignores it. Inputs are only valid for the current or next tick. +- **Input arrives for future tick:** Server queues it in `inputQueues` and applies it at the target tick (up to 120 ticks ahead). This supports tick-tagged inputs for precise input alignment. - **Input arrives for past tick:** Server applies it to the current tick (best effort). No rewinding. - **Server tick takes longer than 16.67ms:** The server logs a warning. If it happens consistently (>5% of ticks), the server reduces the tick rate to 30Hz temporarily and notifies clients. - **Client WebSocket drops without close frame:** Colyseus's built-in ping/pong detects the dead connection after ~5 seconds. `onLeave` fires with `consented = false`. @@ -155,7 +155,7 @@ Real-time multiplayer infrastructure for MoveShot using Colyseus.js. This featur ## Security Considerations - **Server authority is absolute:** The server runs the canonical sim. Clients submit inputs only. A modified client cannot send "I'm at position X" or "my HP is 100" — the server determines all state. -- **Input validation:** Server validates every input message: `buttons` must be a valid bitmask (0-31), `aimX`/`aimY` must be finite numbers within arena bounds, `tick` must be a reasonable number (not negative, not >1000 ticks ahead of server). Invalid inputs are silently dropped. +- **Input validation:** Server validates every input message: `buttons` must be a valid bitmask (0-31), `aimX`/`aimY` must be finite numbers within arena bounds, `tick` must be a reasonable number (not negative, not >120 ticks ahead of server). Invalid inputs are silently dropped. - **Rate limiting inputs:** Server accepts at most 1 input message per tick per client (60/second). Excess messages are dropped. This prevents input flooding. - **WebSocket authentication:** `onAuth(client, options)` validates the player's session. For MVP, this is a username + optional wallet address. Post-MVP, this should include a signed challenge to verify wallet ownership. - **Room code brute force:** Room codes are 6 alphanumeric characters (2.1 billion possibilities). Colyseus also requires the room to exist and accept joins. Rate limiting on join attempts (5 per minute per IP) prevents brute force. @@ -281,6 +281,9 @@ export class MatchRoom extends Room { maxClients = 2; private simState: GameState | null = null; private currentInputs: Map = new Map(); + private prevInputs: Map = new Map(); + private inputQueues: Map> = new Map(); + private lastRemoteButtons: Map = new Map(); // for client prediction hints private gameLoop: NodeJS.Timeout | null = null; private botAI: BotAI | null = null; @@ -336,8 +339,18 @@ export class MatchRoom extends Room { const buttons = typeof data.buttons === "number" ? data.buttons & 0x1F : 0; const aimX = typeof data.aimX === "number" && isFinite(data.aimX) ? data.aimX : 0; const aimY = typeof data.aimY === "number" && isFinite(data.aimY) ? data.aimY : 0; - - this.currentInputs.set(sessionId, { buttons, aimX, aimY }); + const input: InputState = { buttons, aimX, aimY }; + + // Support tick-tagged inputs for precise alignment + const targetTick = typeof data.tick === "number" ? data.tick : -1; + if (targetTick > 0 && this.simState && targetTick > this.simState.tick + && targetTick <= this.simState.tick + 120) { + // Queue for future tick + if (!this.inputQueues.has(sessionId)) this.inputQueues.set(sessionId, []); + this.inputQueues.get(sessionId)!.push({ tick: targetTick, input }); + } else { + this.currentInputs.set(sessionId, input); + } } private startMatch() { @@ -355,17 +368,34 @@ export class MatchRoom extends Room { private tick() { if (!this.simState) return; + // Apply any queued tick-tagged inputs for this tick + for (const [id, queue] of this.inputQueues) { + const idx = queue.findIndex(q => q.tick === this.simState!.tick + 1); + if (idx !== -1) { + this.currentInputs.set(id, queue[idx].input); + queue.splice(idx, 1); + } + } + // Collect inputs (including bot if present) const inputs: Record = {}; + const prevInputs: Record = {}; for (const [id, input] of this.currentInputs) { inputs[id] = input; + prevInputs[id] = this.prevInputs.get(id) ?? { buttons: 0, aimX: 0, aimY: 0 }; } if (this.botAI) { inputs[this.botAI.id] = this.botAI.getInput(this.simState); + prevInputs[this.botAI.id] = this.prevInputs.get(this.botAI.id) ?? { buttons: 0, aimX: 0, aimY: 0 }; } - // Step sim - this.simState = step(this.simState, inputs); + // Step sim with both current and previous inputs (for edge detection) + this.simState = step(this.simState, inputs, prevInputs); + + // Store current as previous for next tick + for (const [id, input] of Object.entries(inputs)) { + this.prevInputs.set(id, input); + } // Sync sim state to Colyseus schema this.syncState(this.simState); diff --git a/context/project/DECISIONS.md b/context/project/DECISIONS.md index d9c872b..a286dbe 100644 --- a/context/project/DECISIONS.md +++ b/context/project/DECISIONS.md @@ -126,4 +126,31 @@ --- +## D12: Chickenz Comparison — Fixes Applied + +**Decision:** Fixed actual errors found during Chickenz code review; kept our own design choices where they were intentional. +**Date:** 2026-04-02 +**Context:** Code-level review of github.com/AshFrancis/chickenz revealed some factual errors in our specs but also confirmed many of our deliberate design differences are fine. + +**Fixes applied (actual errors):** +1. **Removed sub-steps** — Chickenz uses single step per tick. Our claim of "16 sub-steps borrowed from Chickenz" was false. +2. **Stomp damage:** 8/tick (480 DPS) → **1 per 2 ticks, 50 HP cap, 90-tick escape cooldown** — old value was instant-kill, unplayable. +3. **Added projectile lifetime** — per-weapon tick limits (was missing entirely). +4. **Added weapon respawning** — 300 ticks (5s), type rotation (was missing). +5. **Added `prevInput`** — edge-triggered jump detection (press-to-jump not hold-to-jump). +6. **Added `deathLingerTimer`** — 30 ticks post-kill before matchOver. +7. **Added seeded PRNG** — Mulberry32 for deterministic shotgun spread, stomp auto-run. +8. **Added `lastRemoteInput`** in prediction — use opponent's last known input to reduce divergence. +9. **Added tick-tagged inputs** — input messages include target tick for server queuing. + +**Kept our own values (deliberate design choices, not errors):** +- Gravity 0.6, wall slide reduced gravity 0.2, wall jump 6.0/-10.5 +- Infinite default Pistol (accessibility), weapon stats, arena 800x600 +- Mouse aim (world coordinates), gradual kill wall damage with 100px min gap +- `doubleJumpAvailable` boolean, 3-second countdown + +**Consequences:** Feature specs updated with fixes only. Our game feel is intentionally different from Chickenz where we made conscious design choices. + +--- + diff --git a/context/project/SCOPE.md b/context/project/SCOPE.md index 80e64a1..726280a 100644 --- a/context/project/SCOPE.md +++ b/context/project/SCOPE.md @@ -15,7 +15,7 @@ ### Must-Have (Core Game) - [ ] 2D platformer movement: run, jump, double jump, wall slide, wall jump -- [ ] Weapon system: 5 weapons spawn on map (Pistol, Shotgun, Sniper, Rocket, SMG) +- [ ] Weapon system: 5 weapons spawn on map (Pistol, Shotgun, Sniper, Rocket, SMG), pickups respawn after 5s - [ ] Hit detection and damage system - [ ] 1v1 PvP matches: best-of-3 rounds, 30s each, 1 life per round - [ ] Arena shrink at 20s (sudden death) diff --git a/context/project/TASK-LIST.md b/context/project/TASK-LIST.md index 486f04d..b974333 100644 --- a/context/project/TASK-LIST.md +++ b/context/project/TASK-LIST.md @@ -22,79 +22,87 @@ it always points to the same thing. | # | Status | Task | Feature | Notes | |---|--------|------|---------|-------| -| T1 | `[ ]` | Initialize pnpm monorepo with workspaces: apps/client, packages/sim, services/server, contracts/arena | Setup | `pnpm init`, create workspace config, tsconfig base | -| T2 | `[ ]` | Scaffold apps/client: Vite + React + TypeScript, install Phaser 3 | [game-client-ui](../features/game-client-ui.md) | `npm create vite@latest` with react-ts template | -| T3 | `[ ]` | Scaffold services/server: Colyseus.js + TypeScript | [multiplayer-networking](../features/multiplayer-networking.md) | Install colyseus, @colyseus/ws-transport | -| T4 | `[ ]` | Create packages/sim with TypeScript: types.ts, constants.ts | [core-gameplay](../features/core-gameplay.md) | Shared between client and server | -| T5 | `[ ]` | Implement physics engine in packages/sim: gravity, movement, AABB collision, platform detection | [core-gameplay](../features/core-gameplay.md) | physics.ts — see feature spec for exact values | -| T6 | `[ ]` | Implement weapon system in packages/sim: 5 weapon types with damage, cooldown, projectile behavior | [core-gameplay](../features/core-gameplay.md) | weapons.ts + projectiles.ts | -| T7 | `[ ]` | Implement game step loop in packages/sim: 16 sub-steps per tick, deterministic | [core-gameplay](../features/core-gameplay.md) | step.ts — see Chickenz reference | -| T8 | `[ ]` | Create arena map definition: platforms, spawn points, boundaries, weapon pickup locations | [core-gameplay](../features/core-gameplay.md) | map.ts | -| T9 | `[ ]` | Create placeholder pixel art: character spritesheet (idle/run/jump/shoot/death, 24x32px), weapon sprites, platform tileset, projectile sprites | [game-client-ui](../features/game-client-ui.md) | Can use placeholder colors/shapes, polish later | +| T1 | `[x]` | Initialize pnpm monorepo with workspaces: apps/client, packages/sim, services/server, contracts/arena | Setup | pnpm-workspace.yaml, tsconfig.base.json, root package.json | +| T2 | `[x]` | Scaffold apps/client: Vite + React + TypeScript, install Phaser 3 | [game-client-ui](../features/game-client-ui.md) | Vite 6, React 19, react-router-dom, Phaser 3.87 | +| T3 | `[x]` | Scaffold services/server: Colyseus.js + TypeScript | [multiplayer-networking](../features/multiplayer-networking.md) | Colyseus 0.15, MatchRoom + LobbyRoom stubs | +| T4 | `[x]` | Create packages/sim with TypeScript: types.ts, constants.ts | [core-gameplay](../features/core-gameplay.md) | All game types + weapon stats table | +| T5 | `[x]` | Implement physics engine in packages/sim: gravity, movement, AABB collision, platform detection, prevInput edge-triggered jump | [core-gameplay](../features/core-gameplay.md) | physics.ts — MTV collision, wall slide/jump, double jump | +| T6 | `[x]` | Implement weapon system in packages/sim: 5 weapon types with damage, cooldown, projectile behavior, projectile lifetime, weapon pickup respawning (300 ticks) | [core-gameplay](../features/core-gameplay.md) | weapons.ts + projectiles.ts + stomp.ts | +| T7 | `[x]` | Implement game step loop in packages/sim: single step per tick (no sub-steps), step(state, inputs, prevInputs), Mulberry32 seeded PRNG, deathLingerTimer (30 ticks) | [core-gameplay](../features/core-gameplay.md) | step.ts — full round/match flow | +| T8 | `[x]` | Create arena map definition: platforms, spawn points, boundaries, weapon pickup locations | [core-gameplay](../features/core-gameplay.md) | map.ts — 9 platforms, 2 spawn points, 5 weapon spawns | +| T9 | `[x]` | Create placeholder pixel art: character spritesheet (idle/run/jump/shoot/death, 24x32px), weapon sprites, platform tileset, projectile sprites | [game-client-ui](../features/game-client-ui.md) | BootScene generates colored rectangle textures procedurally | --- -## Backlog — Phase 2: Multiplayer (April 5-8) +## Completed — Phase 2: Multiplayer (April 3) | # | Status | Task | Feature | Notes | |---|--------|------|---------|-------| -| T10 | `[ ]` | Implement Phaser 3 BootScene: load all sprites, tilemaps, create animations | [game-client-ui](../features/game-client-ui.md) | Spritesheet definitions in feature spec | -| T11 | `[ ]` | Implement Phaser 3 GameScene: render players, platforms, projectiles, weapon pickups | [game-client-ui](../features/game-client-ui.md) | Import sim types, render from GameState | -| T12 | `[ ]` | Implement GameScene HUD: HP bars above players, round timer (30s countdown), score display, weapon indicator | [game-client-ui](../features/game-client-ui.md) | Phaser text + graphics objects | -| T13 | `[ ]` | Implement input handling in GameScene: keyboard (WASD/arrows + mouse aim), encode to bitmask | [core-gameplay](../features/core-gameplay.md) | InputState type from sim | -| T14 | `[ ]` | Implement Colyseus MatchRoom: room state schema mirroring sim GameState, message handlers | [multiplayer-networking](../features/multiplayer-networking.md) | MatchRoom.ts — see protocol spec | -| T15 | `[ ]` | Implement server game loop in MatchRoom: run sim at 60Hz, broadcast state to clients | [multiplayer-networking](../features/multiplayer-networking.md) | Server is authoritative source of truth | -| T16 | `[ ]` | Implement client Colyseus connection: join room, send inputs on change, receive state updates | [multiplayer-networking](../features/multiplayer-networking.md) | NetworkManager.ts | -| T17 | `[ ]` | Implement client-side prediction: run sim locally ahead of server, reconcile on server state | [multiplayer-networking](../features/multiplayer-networking.md) | PredictionManager.ts — see smoothing spec | -| T18 | `[ ]` | Implement quickplay matchmaking: queue system, pair first-available, create MatchRoom | [multiplayer-networking](../features/multiplayer-networking.md) | matchmaking.ts | -| T19 | `[ ]` | Implement round system: best-of-3 logic, 30s timer, round transitions, countdown, intermission | [core-gameplay](../features/core-gameplay.md) | Both in sim (step.ts) and MatchRoom | -| T20 | `[ ]` | Implement arena shrink: walls close at 20s (tick 1200), force engagement in sudden death | [core-gameplay](../features/core-gameplay.md) | Arena wall closure in step.ts | -| T21 | `[ ]` | Implement stomp/aerial slash mechanic: land on enemy head → grapple → victim mashes L/R to escape | [core-gameplay](../features/core-gameplay.md) | See feature spec for damage/escape values | -| T22 | `[ ]` | Implement match end flow: winner determination, final score, transition to results | [core-gameplay](../features/core-gameplay.md) | Match ends when one player wins 2 rounds | -| T23 | `[ ]` | Implement BotAI for solo testing: basic movement, shooting, reaction delay | [multiplayer-networking](../features/multiplayer-networking.md) | BotAI.ts — 10 tick reaction delay | -| T24 | `[ ]` | Implement lobby UI: player cards, ready state, matchmaking spinner | [game-client-ui](../features/game-client-ui.md) | React page with Colyseus lobby room | +| T10 | `[x]` | Implement Phaser 3 BootScene: load all sprites, tilemaps, create animations | [game-client-ui](../features/game-client-ui.md) | Procedural placeholder textures; real art in polish phase | +| T11 | `[x]` | Implement Phaser 3 GameScene: render players, platforms, projectiles, weapon pickups | [game-client-ui](../features/game-client-ui.md) | GameScene.ts drives local sim at 60Hz | +| T12 | `[x]` | Implement GameScene HUD: HP bars above players, round timer (30s countdown), score display, weapon indicator | [game-client-ui](../features/game-client-ui.md) | Timer, score, round, HP bar, weapon label, phase overlay | +| T13 | `[x]` | Implement input handling in GameScene: keyboard (WASD/arrows + mouse aim), encode to bitmask | [core-gameplay](../features/core-gameplay.md) | WASD + mouse aim; arrow keys reserved for Phase 2 | +| T14 | `[x]` | Implement Colyseus MatchRoom: room state schema mirroring sim GameState, message handlers | [multiplayer-networking](../features/multiplayer-networking.md) | JSON broadcast per tick; room codes; reconnection window | +| T15 | `[x]` | Implement server game loop in MatchRoom: run sim at 60Hz, broadcast state to clients | [multiplayer-networking](../features/multiplayer-networking.md) | 60Hz setInterval; bot timeout after 15s | +| T16 | `[x]` | Implement client Colyseus connection: join room, send inputs on change, receive state updates | [multiplayer-networking](../features/multiplayer-networking.md) | NetworkManager.ts — joinQuickplay/createPrivateRoom/joinByCode | +| T17 | `[x]` | Implement client-side prediction: run sim locally ahead of server, reconcile on server state, use lastRemoteInput for opponent during prediction, tick-tagged input support | [multiplayer-networking](../features/multiplayer-networking.md) | PredictionManager.ts + OpponentInterpolation.ts | +| T18 | `[x]` | Implement quickplay matchmaking: queue system, pair first-available, create MatchRoom | [multiplayer-networking](../features/multiplayer-networking.md) | Colyseus joinOrCreate handles pairing natively | +| T19 | `[x]` | Implement round system: best-of-3 logic, 30s timer, round transitions, countdown, intermission | [core-gameplay](../features/core-gameplay.md) | In packages/sim/step.ts (Phase 1) | +| T20 | `[x]` | Implement arena shrink: walls close at 20s (tick 1200), force engagement in sudden death | [core-gameplay](../features/core-gameplay.md) | In packages/sim/step.ts (Phase 1) | +| T21 | `[x]` | Implement stomp/aerial slash mechanic: 1 dmg/2 ticks, 50 HP cap, rider can shoot, victim auto-runs, escape meter (17/press, decay 1/tick, threshold 100), 90-tick cooldown after escape | [core-gameplay](../features/core-gameplay.md) | In packages/sim/stomp.ts (Phase 1) | +| T22 | `[x]` | Implement match end flow: winner determination, final score, transition to results | [core-gameplay](../features/core-gameplay.md) | In packages/sim/step.ts; broadcast via MatchRoom | +| T23 | `[x]` | Implement BotAI for solo testing: basic movement, shooting, reaction delay | [multiplayer-networking](../features/multiplayer-networking.md) | bot-ai.ts server-side + GameScene local bot (10-tick delay) | +| T24 | `[x]` | Implement lobby UI: player cards, ready state, matchmaking spinner | [game-client-ui](../features/game-client-ui.md) | PlayPage.tsx — quickplay/private/join-by-code flows | --- -## Backlog — Phase 3: Blockchain Integration (April 8-12) +## Active Sprint — Phase 3: Blockchain Integration (April 3) | # | Status | Task | Feature | Notes | |---|--------|------|---------|-------| -| T25 | `[ ]` | Deploy Minitia MoveVM rollup: run `weave init`, configure chain_id, start rollup + executor + relayer | [wallet-integration](../features/wallet-integration.md) | Follow HACKATHON_REQUIREMENTS.md Section 7. Save chain_id! | -| T26 | `[ ]` | Import gas station keys into initiad and minitiad | [wallet-integration](../features/wallet-integration.md) | `minitiad keys add gas-station --recover` | -| T27 | `[ ]` | Write Move module: `game_config` — admin, server public key, season counter | [on-chain-match-recording](../features/on-chain-match-recording.md) | Singleton resource, init on deploy | -| T28 | `[ ]` | Write Move module: `match_registry` — MatchResult struct, record_match(), get_match(), get_player_stats() | [on-chain-match-recording](../features/on-chain-match-recording.md) | Server sig verification with ed25519 | -| T29 | `[ ]` | Write Move module: `player_profile` — PlayerProfile struct, create_profile(), update_stats() | [on-chain-match-recording](../features/on-chain-match-recording.md) | Auto-create on first match | -| T30 | `[ ]` | Write Move module: `weapon_nft` — WeaponNFT resource, mint_weapon(), transfer(), equip(), get_inventory() | [on-chain-weapons](../features/on-chain-weapons.md) | 5 weapon types, rarity tiers, mutable stats | -| T31 | `[ ]` | Write Move module: `cosmetic_nft` — CosmeticNFT resource, mint_cosmetic(), equip(), get_equipped() | [on-chain-cosmetics](../features/on-chain-cosmetics.md) | CharacterSkin, Emote, Title, Badge types | -| T32 | `[ ]` | Write Move tests: unit tests for all modules (match recording, weapon mint/transfer, cosmetic equip) | Contracts | `minitiad move test` | -| T33 | `[ ]` | Deploy all Move modules to Minitia testnet: build + deploy with gas-station key | Contracts | `minitiad move deploy --build` per module | -| T34 | `[ ]` | Set up InterwovenKitProvider in React: custom chain config (chain_id, rpc, rest, indexer, fees) | [wallet-integration](../features/wallet-integration.md) | main.tsx — see feature spec for exact config shape | -| T35 | `[ ]` | Install InterwovenKit deps: @initia/interwovenkit-react, @initia/initia.js, @initia/initia.proto, wagmi, @tanstack/react-query, vite-plugin-node-polyfills | [wallet-integration](../features/wallet-integration.md) | Update vite.config.ts with nodePolyfills | -| T36 | `[ ]` | Build wallet connection UI: ConnectButton component, WalletInfo display, hook into InterwovenKit | [wallet-integration](../features/wallet-integration.md) | useInterwovenKit() hook | -| T37 | `[ ]` | Implement auto-signing: AutoSignToggle component, enable/disable flow, Ghost Wallet setup | [wallet-integration](../features/wallet-integration.md) | autoSign.enable(chainId, { permissions }) | -| T38 | `[ ]` | Implement React↔Phaser event bridge: EventBridge singleton for wallet state → Phaser scenes | [wallet-integration](../features/wallet-integration.md) | EventBridge.ts with typed events | -| T39 | `[ ]` | Implement server attestation: server generates ed25519 keypair, signs match results, on-chain key registration | [on-chain-match-recording](../features/on-chain-match-recording.md) | Server signer setup | -| T40 | `[ ]` | Implement on-chain match recording flow: match ends → server signs → auto-signed MsgExecute → record_match() | [on-chain-match-recording](../features/on-chain-match-recording.md) | requestTxSync with MsgExecute | -| T41 | `[ ]` | Implement new player onboarding: auto-create PlayerProfile, mint default weapons + cosmetics on first wallet connect | [on-chain-cosmetics](../features/on-chain-cosmetics.md) | Batch mint via single tx | -| T42 | `[ ]` | Build Profile page: display on-chain stats (W/L/matches/ELO), weapon inventory grid, equipped cosmetics | [game-client-ui](../features/game-client-ui.md) | Query chain via REST API | -| T43 | `[ ]` | Build weapon equip flow: lobby UI → select weapon skin → equip_weapon tx (auto-signed) → skin renders in next match | [on-chain-weapons](../features/on-chain-weapons.md) | Visual-only, no gameplay effect | -| T44 | `[ ]` | Build cosmetic equip flow: profile UI → select character skin → equip_cosmetic tx → sprite changes in lobby | [on-chain-cosmetics](../features/on-chain-cosmetics.md) | CharacterSkin overlay system | +| T25 | `[-]` | Deploy Minitia MoveVM rollup: run `weave init`, configure chain_id, start rollup + executor + relayer | [wallet-integration](../features/wallet-integration.md) | Blocked: Docker + Go 1.22+ required | +| T26 | `[-]` | Import gas station keys into initiad and minitiad | [wallet-integration](../features/wallet-integration.md) | Blocked by T25 | +| T27 | `[x]` | Write Move module: `game_config` — admin, server public key, season counter | [on-chain-match-recording](../features/on-chain-match-recording.md) | Singleton resource, init on deploy | +| T28 | `[x]` | Write Move module: `match_registry` — MatchResult struct, record_match(), get_match(), get_player_stats() | [on-chain-match-recording](../features/on-chain-match-recording.md) | Server sig verification with ed25519 | +| T29 | `[x]` | Write Move module: `player_profile` — PlayerProfile struct, create_profile(), update_stats() | [on-chain-match-recording](../features/on-chain-match-recording.md) | Auto-create on first match, ELO (K=32, floor 100, ceiling 9999) | +| T30 | `[x]` | Write Move module: `weapon_nft` — WeaponNFT resource, mint_weapon(), transfer(), equip(), get_inventory() | [on-chain-weapons](../features/on-chain-weapons.md) | 5 weapon types, rarity tiers, mutable stats | +| T31 | `[x]` | Write Move module: `cosmetic_nft` — CosmeticNFT resource, mint_cosmetic(), equip(), get_equipped() | [on-chain-cosmetics](../features/on-chain-cosmetics.md) | CharacterSkin, Emote, Title, Badge types | +| T32 | `[x]` | Write Move tests: unit tests for all modules (match recording, weapon mint/transfer, cosmetic equip) | Contracts | player_profile_tests.move ✓; full suite pending deployment | +| T33 | `[-]` | Deploy all Move modules to Minitia testnet: build + deploy with gas-station key | Contracts | Blocked by T25 (rollup must be running) | +| T34 | `[x]` | Set up InterwovenKitProvider in React: custom chain config (chain_id, rpc, rest, indexer, fees) | [wallet-integration](../features/wallet-integration.md) | InterwovenProvider.tsx with env-driven config | +| T35 | `[x]` | Install InterwovenKit deps: @initia/interwovenkit-react, @initia/initia.js, @initia/initia.proto, wagmi, @tanstack/react-query, vite-plugin-node-polyfills | [wallet-integration](../features/wallet-integration.md) | All installed; vite.config.ts + package.json updated | +| T36 | `[x]` | Build wallet connection UI: ConnectButton component, WalletInfo display, hook into InterwovenKit | [wallet-integration](../features/wallet-integration.md) | ConnectButton, WalletDropdown, TransactionToast components ✓ | +| T37 | `[x]` | Implement auto-signing: AutoSignToggle component, enable/disable flow, Ghost Wallet setup | [wallet-integration](../features/wallet-integration.md) | AutoSignToggle + useAutoSign hook ✓ | +| T38 | `[x]` | Implement React↔Phaser event bridge: EventBridge singleton for wallet state → Phaser scenes | [wallet-integration](../features/wallet-integration.md) | bridge/EventBridge.ts with typed events, replacing lib/event-bridge.ts | +| T39 | `[x]` | Implement server attestation: server generates ed25519 keypair, signs match results, on-chain key registration | [on-chain-match-recording](../features/on-chain-match-recording.md) | attestation.ts + /server-pubkey endpoint ✓ | +| T40 | `[x]` | Implement on-chain match recording flow: match ends → server signs → auto-signed MsgExecute → record_match() | [on-chain-match-recording](../features/on-chain-match-recording.md) | useMatchRecording hook + MatchRoom integration ✓ | +| T41 | `[ ]` | Implement new player onboarding: auto-create PlayerProfile, mint default weapons + cosmetics on first wallet connect | [on-chain-cosmetics](../features/on-chain-cosmetics.md) | Blocked by T25 (deployment) | +| T42 | `[ ]` | Build Profile page: display on-chain stats (W/L/matches/ELO), weapon inventory grid, equipped cosmetics | [game-client-ui](../features/game-client-ui.md) | Blocked by T25 (deployment) | +| T43 | `[ ]` | Build weapon equip flow: lobby UI → select weapon skin → equip_weapon tx (auto-signed) → skin renders in next match | [on-chain-weapons](../features/on-chain-weapons.md) | Blocked by T25 (deployment) | +| T44 | `[ ]` | Build cosmetic equip flow: profile UI → select character skin → equip_cosmetic tx → sprite changes in lobby | [on-chain-cosmetics](../features/on-chain-cosmetics.md) | Blocked by T25 (deployment) | + + +--- + +## Backlog — Phase 4: Profile & Leaderboards (April 12-15) + +| # | Status | Task | Feature | Notes | +|---|--------|------|---------|-------| +| T45 | `[ ]` | Build Match Details page: settlement timeline (like Chickenz), player cards, VIEW TX links to InitiaScan | [game-client-ui](../features/game-client-ui.md) | Blocked by T25 | +| T46 | `[ ]` | Build Results screen: winner animation, stats summary, "Match Recorded On-Chain" badge with tx link | [game-client-ui](../features/game-client-ui.md) | Blocked by T25 | +| T47 | `[ ]` | Build basic leaderboard: top 20 players by wins, queried from on-chain PlayerProfile data | [game-client-ui](../features/game-client-ui.md) | Blocked by T25 | +| T48 | `[ ]` | Build landing page: MoveShot branding, "Play Now" CTA, feature highlights, connect wallet | [game-client-ui](../features/game-client-ui.md) | Blocked by T25 | +| T49 | `[ ]` | Implement design system: dark navy palette (#0A0A1A bg, #FFD700 yellow, #4ECDC4 cyan), pixel font (Press Start 2P), monospace (JetBrains Mono) | [game-client-ui](../features/game-client-ui.md) | Can start anytime | +| T50 | `[ ]` | Implement error handling: wallet not connected fallbacks, match recording failure retry, server disconnect reconnection prompt | [wallet-integration](../features/wallet-integration.md) | Can start anytime | +| T51 | `[ ]` | Kill feed UI: bottom-left overlay showing "[Player] eliminated [Player] with [Weapon]" | [game-client-ui](../features/game-client-ui.md) | Can start anytime | +| T52 | `[ ]` | Round transition banners: "ROUND 1", "FIGHT!", "ROUND OVER", "MATCH OVER — [PLAYER] WINS" | [game-client-ui](../features/game-client-ui.md) | Can start anytime | --- -## Backlog — Phase 4: Polish & Submission (April 12-15) +## Backlog — Phase 5: Submission & Polish (April 12-15) | # | Status | Task | Feature | Notes | |---|--------|------|---------|-------| -| T45 | `[ ]` | Build Match Details page: settlement timeline (like Chickenz), player cards, VIEW TX links to InitiaScan | [game-client-ui](../features/game-client-ui.md) | Dark navy + yellow/cyan design | -| T46 | `[ ]` | Build Results screen: winner animation, stats summary, "Match Recorded On-Chain" badge with tx link | [game-client-ui](../features/game-client-ui.md) | Transition from GameScene | -| T47 | `[ ]` | Build basic leaderboard: top 20 players by wins, queried from on-chain PlayerProfile data | [game-client-ui](../features/game-client-ui.md) | Indexer query or REST pagination | -| T48 | `[ ]` | Build landing page: MoveShot branding, "Play Now" CTA, feature highlights, connect wallet | [game-client-ui](../features/game-client-ui.md) | First impression for judges | -| T49 | `[ ]` | Implement design system: dark navy palette (#0A0A1A bg, #FFD700 yellow, #4ECDC4 cyan), pixel font (Press Start 2P), monospace (JetBrains Mono) | [game-client-ui](../features/game-client-ui.md) | CSS variables / Tailwind config | -| T50 | `[ ]` | Implement error handling: wallet not connected fallbacks, match recording failure retry, server disconnect reconnection prompt | [wallet-integration](../features/wallet-integration.md) | Toast notifications | -| T51 | `[ ]` | Kill feed UI: bottom-left overlay showing "[Player] eliminated [Player] with [Weapon]" | [game-client-ui](../features/game-client-ui.md) | Phaser overlay text | -| T52 | `[ ]` | Round transition banners: "ROUND 1", "FIGHT!", "ROUND OVER", "MATCH OVER — [PLAYER] WINS" | [game-client-ui](../features/game-client-ui.md) | Centered Phaser text with animations | | T53 | `[ ]` | Create .initia/submission.json with all 10 mandatory fields | Submission | Must match deployed state exactly | | T54 | `[ ]` | Write README.md with all required sections: Project Name, Overview, Implementation Detail, How to Run | Submission | See HACKATHON_REQUIREMENTS.md Section 2 | | T55 | `[ ]` | Record demo video (1-3 min): full flow from connect wallet → play match → view on-chain results | Submission | Loom or YouTube, public URL | @@ -108,7 +116,10 @@ it always points to the same thing. | # | Task | Feature | Blocked by | |---|------|---------|------------| | T25 | Deploy Minitia rollup | wallet-integration | Need Docker Desktop running + Go 1.22+ installed | +| T26 | Import gas station keys | wallet-integration | T25 (rollup must be running first) | | T33 | Deploy Move modules | contracts | T25 (rollup must be running first) | +| T41-T44 | Profile, equip, onboarding flows | features | T25 (deployment) | +| T45-T48 | Results, leaderboard, landing pages | features | T25 (deployment) | --- diff --git a/context/technical/ENVIRONMENT.md b/context/technical/ENVIRONMENT.md index 0d4c77e..d50d762 100644 --- a/context/technical/ENVIRONMENT.md +++ b/context/technical/ENVIRONMENT.md @@ -4,17 +4,32 @@ ## Required -| Variable | Description | Example | -|----------|-------------|---------| -| `VITE_CHAIN_ID` | Minitia rollup chain ID | `arena-1` | -| `VITE_MODULE_ADDRESS` | Deployed Move module address | `0x1a2b3c...` | -| `VITE_RPC_URL` | Minitia RPC endpoint | `http://localhost:26657` | -| `VITE_REST_URL` | Minitia REST endpoint | `http://localhost:1317` | -| `VITE_INDEXER_URL` | Minitia indexer endpoint | `http://localhost:8080` | -| `VITE_WS_URL` | Colyseus game server WebSocket | `ws://localhost:2567` | -| `VITE_GAS_DENOM` | Gas denomination on rollup | `umin` | -| `PORT` | Colyseus server port (server-side) | `2567` | -| `SIGNER_MNEMONIC` | Server signing key for match attestations | *(never commit)* | +### Client (apps/client/) + +| Variable | Description | Example | Set in | +|----------|-------------|---------|--------| +| `VITE_CHAIN_ID` | Minitia rollup chain ID | `arena-1` | .env.local | +| `VITE_RPC_URL` | Minitia RPC endpoint | `http://localhost:26657` | .env.local | +| `VITE_REST_URL` | Minitia REST endpoint | `http://localhost:1317` | .env.local | +| `VITE_INDEXER_URL` | Minitia indexer endpoint | `http://localhost:8080` | .env.local | +| `VITE_WS_URL` | Colyseus game server WebSocket | `ws://localhost:2567` | .env.local | +| `VITE_GAS_DENOM` | Gas denomination on rollup | `umin` | .env.local | +| `VITE_GAS_PRICE` | Gas price in gas_denom per unit | `0.0025` | .env.local | +| `VITE_GAME_CONFIG_ADDRESS` | Deployed game_config module addr | `0x1a2b...` | .env.local | +| `VITE_MATCH_REGISTRY_ADDRESS` | Deployed match_registry module addr | `0x1a2b...` | .env.local | +| `VITE_PLAYER_PROFILE_ADDRESS` | Deployed player_profile module addr | `0x1a2b...` | .env.local | +| `VITE_WEAPON_NFT_ADDRESS` | Deployed weapon_nft module addr | `0x1a2b...` | .env.local | +| `VITE_COSMETIC_NFT_ADDRESS` | Deployed cosmetic_nft module addr | `0x1a2b...` | .env.local | + +### Server (services/server/) + +| Variable | Description | Example | Set in | +|----------|-------------|---------|--------| +| `PORT` | Colyseus server port | `2567` | .env.local | +| `SERVER_PRIVATE_KEY` | ed25519 private key (hex) for match signing | *(never commit)* | .env.local | +| `VITE_RPC_URL` | Minitia RPC for server attestation | `http://localhost:26657` | .env.local | +| `VITE_GAME_CONFIG_ADDRESS` | Same as client | `0x1a2b...` | .env.local | +| `VITE_MATCH_REGISTRY_ADDRESS` | Same as client | `0x1a2b...` | .env.local | ## Optional @@ -23,10 +38,11 @@ | `CF_ACCOUNT_ID` | Cloudflare account (production) | — | | `CF_API_TOKEN` | Cloudflare API token (production) | — | | `NODE_ENV` | Environment flag | `development` | +| `DEBUG` | Enable verbose logging | — | ## Setup Instructions -### Local Development +### Local Development — Blockchain Setup (Phase 3 / T25) 1. Run `weave init` to configure your Minitia rollup — this generates keys in `~/.weave/config.json` 2. Start rollup: `weave rollup start -d` 3. Start OPinit executor: `weave opinit start executor -d` @@ -37,14 +53,32 @@ minitiad keys add gas-station --recover --keyring-backend test \ --coin-type 60 --key-type eth_secp256k1 --source <(echo -n "$MNEMONIC") ``` -6. Copy `.env.example` to `.env.local` and fill in values from your rollup config +6. Deploy Move modules and record contract addresses + +### Local Development — Client & Server Setup +1. Copy `apps/client/.env.example` to `apps/client/.env.local` +2. Copy `services/server/.env.example` to `services/server/.env.local` +3. Fill in all chain config vars from your Minitia rollup (RPC, REST, INDEXER URLs, chain_id) +4. Fill in deployed module addresses (VITE_GAME_CONFIG_ADDRESS, etc.) +5. Generate server attestation key: + ``` + node -e "const { randomPrivateKey } = require('@noble/ed25519'); console.log(Buffer.from(randomPrivateKey()).toString('hex'))" + ``` + Paste output into `SERVER_PRIVATE_KEY` in `services/server/.env.local` +6. Run `pnpm install` from root +7. Start server: `pnpm --filter @arena/server dev` +8. Start client: `pnpm --filter @arena/client dev` ### After Computer Restart ``` weave rollup start -d weave opinit start executor -d +pnpm --filter @arena/server dev +pnpm --filter @arena/client dev ``` ### Production (Cloudflare) - Set secrets via Cloudflare dashboard or `wrangler secret put` - Never expose mnemonics or private keys in environment variables accessible to the client +- CLIENT vars (VITE_*) are bundled into browser; never include private data +- SERVER vars (SERVER_PRIVATE_KEY, etc.) stay on backend only diff --git a/context/technical/STACK.md b/context/technical/STACK.md index cbf45bb..0d3ad7f 100644 --- a/context/technical/STACK.md +++ b/context/technical/STACK.md @@ -6,15 +6,20 @@ - **Game Engine:** Phaser 3 (v3.87+) — proven 2D WebGL/Canvas framework, same as Chickenz reference - **UI Framework:** React + Vite — required for InterwovenKit; fast builds + HMR - **Language:** TypeScript — type safety across client, server, shared sim -- **Blockchain SDK:** @initia/interwovenkit-react — wallet, auto-signing, tx flows (hackathon mandatory) +- **Blockchain SDK:** @initia/interwovenkit-react (v1+) — wallet, auto-signing, tx flows (hackathon mandatory) - **Chain Client:** @initia/initia.js — direct Initia chain interaction -- **Peers:** @tanstack/react-query, wagmi (InterwovenKit peer deps) +- **Proto Bindings:** @initia/initia.proto — move, bank, auth protobuf definitions +- **HTTP State Management:** @tanstack/react-query — server state caching +- **Wallet Hooks:** wagmi (v2.17.2+) — peer dep for InterwovenKit +- **Polyfills:** vite-plugin-node-polyfills — Node.js modules for browser (crypto, stream, etc.) ## Backend (Game Server) - **Framework:** Colyseus.js — purpose-built multiplayer rooms, matchmaking, state sync - **Runtime:** Node.js (Cloudflare Workers / Durable Objects for production) - **Protocol:** WebSocket at 60Hz tick rate - **Shared Sim:** @arena/sim monorepo package — deterministic simulation shared with client +- **Cryptography:** @noble/ed25519 — server match result signing (no external deps) +- **Utilities:** uuid — unique identifiers for matches and records ## Blockchain (On-Chain) - **L2 Rollup:** Initia Minitia (MoveVM) — 500ms blocks, 10K TPS, custom gas diff --git a/contracts/arena/Move.toml b/contracts/arena/Move.toml new file mode 100644 index 0000000..0aee23d --- /dev/null +++ b/contracts/arena/Move.toml @@ -0,0 +1,11 @@ +[package] +name = "arena" +version = "0.0.1" +language-version = "2.1" + +[dependencies] +InitiaStdlib = { git = "https://github.com/initia-labs/movevm.git", subdir = "precompile/modules/initia_stdlib", rev = "main" } + +[addresses] +arena = "_" +std = "0x1" diff --git a/contracts/arena/sources/cosmetic_nft.move b/contracts/arena/sources/cosmetic_nft.move new file mode 100644 index 0000000..ef54c18 --- /dev/null +++ b/contracts/arena/sources/cosmetic_nft.move @@ -0,0 +1,138 @@ +/// Cosmetic NFT module. +/// Players own cosmetic items: character skins, emotes, titles, badges. +/// Types: 0=character_skin, 1=emote, 2=title, 3=badge +module arena::cosmetic_nft { + use std::signer; + use std::error; + use std::string::{Self, String}; + use std::vector; + use arena::game_config; + + // ── Constants ───────────────────────────────────────────────────────────── + const COSMETIC_SKIN: u8 = 0; + const COSMETIC_EMOTE: u8 = 1; + const COSMETIC_TITLE: u8 = 2; + const COSMETIC_BADGE: u8 = 3; + const COSMETIC_TYPE_COUNT: u8 = 4; + + const NO_EQUIPPED: u64 = 999; + + // ── Error codes ────────────────────────────────────────────────────────── + const E_NOT_ADMIN: u64 = 1; + const E_NO_COSMETICS: u64 = 2; + const E_WRONG_TYPE: u64 = 3; + const E_INDEX_OOB: u64 = 4; + const E_INVALID_TYPE: u64 = 5; + + // ── Resources ──────────────────────────────────────────────────────────── + struct CosmeticNFT has store, drop, copy { + cosmetic_type: u8, + cosmetic_id: u64, + name: String, + } + + struct PlayerCosmetics has key { + owned: vector, + equipped_skin_index: u64, + equipped_title_index: u64, + } + + // ── Public entry functions ──────────────────────────────────────────────── + /// Player initializes their cosmetics storage. Called once on first use. + public entry fun init_cosmetics(player: &signer) { + let addr = signer::address_of(player); + if (!exists(addr)) { + move_to(player, PlayerCosmetics { + owned: vector::empty(), + equipped_skin_index: NO_EQUIPPED, + equipped_title_index: NO_EQUIPPED, + }); + } + } + + /// Admin mints a cosmetic to a player who has initialized their storage. + public entry fun mint_cosmetic( + admin: &signer, + config_addr: address, + recipient: address, + cosmetic_type: u8, + cosmetic_id: u64, + name: vector, + ) acquires PlayerCosmetics { + let admin_addr = signer::address_of(admin); + assert!( + game_config::get_admin(config_addr) == admin_addr, + error::permission_denied(E_NOT_ADMIN) + ); + assert!(cosmetic_type < COSMETIC_TYPE_COUNT, error::invalid_argument(E_INVALID_TYPE)); + assert!(exists(recipient), error::not_found(E_NO_COSMETICS)); + + let cosmetics = borrow_global_mut(recipient); + vector::push_back(&mut cosmetics.owned, CosmeticNFT { + cosmetic_type, + cosmetic_id, + name: string::utf8(name), + }); + } + + /// Player equips a character skin by index. + public entry fun equip_skin(player: &signer, index: u64) acquires PlayerCosmetics { + let addr = signer::address_of(player); + assert!(exists(addr), error::not_found(E_NO_COSMETICS)); + let cosmetics = borrow_global_mut(addr); + assert!(index < vector::length(&cosmetics.owned), error::out_of_range(E_INDEX_OOB)); + let nft = vector::borrow(&cosmetics.owned, index); + assert!(nft.cosmetic_type == COSMETIC_SKIN, error::invalid_argument(E_WRONG_TYPE)); + cosmetics.equipped_skin_index = index; + } + + /// Player equips a title by index. + public entry fun equip_title(player: &signer, index: u64) acquires PlayerCosmetics { + let addr = signer::address_of(player); + assert!(exists(addr), error::not_found(E_NO_COSMETICS)); + let cosmetics = borrow_global_mut(addr); + assert!(index < vector::length(&cosmetics.owned), error::out_of_range(E_INDEX_OOB)); + let nft = vector::borrow(&cosmetics.owned, index); + assert!(nft.cosmetic_type == COSMETIC_TITLE, error::invalid_argument(E_WRONG_TYPE)); + cosmetics.equipped_title_index = index; + } + + // ── View functions ──────────────────────────────────────────────────────── + #[view] + public fun get_equipped(addr: address): (u64, u64) acquires PlayerCosmetics { + if (!exists(addr)) { return (NO_EQUIPPED, NO_EQUIPPED) }; + let c = borrow_global(addr); + // Return equipped cosmetic IDs (not indices) + let skin_id = if (c.equipped_skin_index != NO_EQUIPPED && c.equipped_skin_index < vector::length(&c.owned)) { + vector::borrow(&c.owned, c.equipped_skin_index).cosmetic_id + } else { + 0 + }; + let title_id = if (c.equipped_title_index != NO_EQUIPPED && c.equipped_title_index < vector::length(&c.owned)) { + vector::borrow(&c.owned, c.equipped_title_index).cosmetic_id + } else { + 0 + }; + (skin_id, title_id) + } + + #[view] + public fun has_cosmetics(addr: address): bool { + exists(addr) + } + + #[view] + public fun get_cosmetic_count(addr: address): u64 acquires PlayerCosmetics { + if (!exists(addr)) { return 0 }; + vector::length(&borrow_global(addr).owned) + } + + #[view] + public fun get_cosmetic_at(addr: address, index: u64): (u8, u64, vector) acquires PlayerCosmetics { + assert!(exists(addr), error::not_found(E_NO_COSMETICS)); + let c = borrow_global(addr); + assert!(index < vector::length(&c.owned), error::out_of_range(E_INDEX_OOB)); + let nft = vector::borrow(&c.owned, index); + (nft.cosmetic_type, nft.cosmetic_id, *string::bytes(&nft.name)) + } +} diff --git a/contracts/arena/sources/game_config.move b/contracts/arena/sources/game_config.move new file mode 100644 index 0000000..8b75db7 --- /dev/null +++ b/contracts/arena/sources/game_config.move @@ -0,0 +1,154 @@ +/// game_config.move +/// +/// Singleton GameConfig resource stored at the module deployer's address. +/// Controls the authoritative server public key (ed25519) and current season. +/// Only the admin (initial deployer) can mutate these values. +module arena::game_config { + + // ------------------------------------------------------------------------- + // Imports + // ------------------------------------------------------------------------- + + use std::signer; + use std::error; + + // ------------------------------------------------------------------------- + // Error codes + // ------------------------------------------------------------------------- + + /// Caller is not the registered admin. + const E_NOT_ADMIN: u64 = 1; + /// GameConfig has already been initialised at this address. + const E_ALREADY_INITIALIZED: u64 = 2; + + // ------------------------------------------------------------------------- + // Resource + // ------------------------------------------------------------------------- + + /// Singleton resource stored at the deployer's account. + struct GameConfig has key { + /// Address with admin privileges (server key rotation, season bumps). + admin: address, + /// 32-byte ed25519 public key of the authoritative game server. + /// All match results must carry a valid signature produced by the + /// corresponding private key. + server_public_key: vector, + /// Monotonically increasing global match counter. + match_count: u64, + /// Current competitive season (starts at 1, incremented by admin). + season: u64, + } + + // ------------------------------------------------------------------------- + // Initialisation + // ------------------------------------------------------------------------- + + /// Called exactly once when the module is published. + /// Stores a default GameConfig at the deployer's address. + fun init_module(admin: &signer) { + let admin_addr = signer::address_of(admin); + assert!( + !exists(admin_addr), + error::already_exists(E_ALREADY_INITIALIZED) + ); + + move_to(admin, GameConfig { + admin: admin_addr, + server_public_key: vector::empty(), + match_count: 0u64, + season: 1u64, + }); + } + + // ------------------------------------------------------------------------- + // Admin mutations + // ------------------------------------------------------------------------- + + /// Replace the game server's ed25519 public key. + /// `pubkey` must be exactly 32 bytes (raw ed25519 public key). + public entry fun register_server_key( + admin: &signer, + pubkey: vector, + ) acquires GameConfig { + let admin_addr = signer::address_of(admin); + let config = borrow_global_mut(admin_addr); + assert!(config.admin == admin_addr, error::permission_denied(E_NOT_ADMIN)); + config.server_public_key = pubkey; + } + + /// Increment the season counter (resets leaderboard rankings). + public entry fun increment_season(admin: &signer) acquires GameConfig { + let admin_addr = signer::address_of(admin); + let config = borrow_global_mut(admin_addr); + assert!(config.admin == admin_addr, error::permission_denied(E_NOT_ADMIN)); + config.season = config.season + 1; + } + + /// Transfer admin rights to a new address. + public entry fun transfer_admin( + admin: &signer, + new_admin: address, + ) acquires GameConfig { + let admin_addr = signer::address_of(admin); + let config = borrow_global_mut(admin_addr); + assert!(config.admin == admin_addr, error::permission_denied(E_NOT_ADMIN)); + config.admin = new_admin; + } + + // ------------------------------------------------------------------------- + // Internal helpers used by match_registry (friend-style via public fun) + // ------------------------------------------------------------------------- + + /// Increment the global match counter. Called by match_registry after a + /// successful record_match. Returns the new total. + public fun increment_match_count(config_addr: address): u64 acquires GameConfig { + let config = borrow_global_mut(config_addr); + config.match_count = config.match_count + 1; + config.match_count + } + + // ------------------------------------------------------------------------- + // View functions + // ------------------------------------------------------------------------- + + #[view] + /// Returns the registered ed25519 public key for the game server. + public fun get_server_key(config_addr: address): vector acquires GameConfig { + borrow_global(config_addr).server_public_key + } + + #[view] + /// Returns the current admin address. + public fun get_admin(config_addr: address): address acquires GameConfig { + borrow_global(config_addr).admin + } + + #[view] + /// Returns the current season number. + public fun get_season(config_addr: address): u64 acquires GameConfig { + borrow_global(config_addr).season + } + + #[view] + /// Returns the total number of recorded matches. + public fun get_match_count(config_addr: address): u64 acquires GameConfig { + borrow_global(config_addr).match_count + } + + // ------------------------------------------------------------------------- + // Test helpers (only compiled in test mode) + // ------------------------------------------------------------------------- + + #[test_only] + public fun init_module_for_test(admin: &signer) { + init_module(admin); + } + + #[test_only] + public fun set_server_key_for_test( + admin: &signer, + pubkey: vector, + ) acquires GameConfig { + register_server_key(admin, pubkey); + } +} diff --git a/contracts/arena/sources/match_registry.move b/contracts/arena/sources/match_registry.move new file mode 100644 index 0000000..6e06070 --- /dev/null +++ b/contracts/arena/sources/match_registry.move @@ -0,0 +1,178 @@ +/// Match registry module. +/// Stores immutable match results on-chain after verifying the game server's ed25519 signature. +/// Uses game_config to get the server public key and player_profile to update stats. +module arena::match_registry { + use std::signer; + use std::error; + use std::vector; + use std::table::{Self, Table}; + use initia_std::block; + use initia_std::ed25519; + use arena::game_config; + use arena::player_profile; + + // ── Error codes ────────────────────────────────────────────────────────── + const E_MATCH_EXISTS: u64 = 1; + const E_INVALID_SIGNATURE: u64 = 2; + const E_INVALID_SERVER: u64 = 3; + const E_NOT_INITIALIZED: u64 = 4; + + // ── Resources ──────────────────────────────────────────────────────────── + struct MatchResult has store, drop { + match_id: vector, + winner: address, + loser: address, + winner_score: u64, + loser_score: u64, + timestamp: u64, + signature: vector, + } + + struct MatchRegistry has key { + matches: Table, MatchResult>, + total_matches: u64, + } + + // ── Init ───────────────────────────────────────────────────────────────── + fun init_module(admin: &signer) { + move_to(admin, MatchRegistry { + matches: table::new(), + total_matches: 0, + }); + } + + // ── Public entry functions ──────────────────────────────────────────────── + /// Record a match result on-chain. + /// The submitter is typically the winner (their auto-signed Ghost Wallet pays gas). + /// Params: + /// config_addr — address of the game_config module (same as contract deployer) + /// registry_addr — address of the match_registry module (same as contract deployer) + /// match_id — unique match identifier (UUID bytes) + /// winner — winner's bech32 address as bytes (actually just address type) + /// loser — loser's address + /// winner_score — rounds won by winner + /// loser_score — rounds won by loser + /// signature — server ed25519 signature over the canonical message + public entry fun record_match( + submitter: &signer, + config_addr: address, + registry_addr: address, + match_id: vector, + winner: address, + loser: address, + winner_score: u64, + loser_score: u64, + signature: vector, + ) acquires MatchRegistry { + // Verify server key is registered + let server_pubkey = game_config::get_server_key(config_addr); + assert!(vector::length(&server_pubkey) > 0, error::invalid_state(E_INVALID_SERVER)); + + // Build canonical message: match_id || winner || loser || winner_score || loser_score + let message = build_message(&match_id, winner, loser, winner_score, loser_score); + + // Verify ed25519 signature + let valid = ed25519::verify( + &signature, + &server_pubkey, + &message, + ); + assert!(valid, error::invalid_argument(E_INVALID_SIGNATURE)); + + // Check for duplicate + let registry = borrow_global_mut(registry_addr); + assert!( + !table::contains(®istry.matches, match_id), + error::already_exists(E_MATCH_EXISTS) + ); + + // Get current block time + let (_, timestamp) = block::get_block_info(); + + // Store result + table::add(&mut registry.matches, match_id, MatchResult { + match_id, + winner, + loser, + winner_score, + loser_score, + timestamp, + signature, + }); + registry.total_matches = registry.total_matches + 1; + + // Update player profiles (auto-creates if needed via ensure logic in player_profile) + player_profile::update_stats(winner, loser); + } + + // ── View functions ──────────────────────────────────────────────────────── + #[view] + public fun get_match( + registry_addr: address, + match_id: vector, + ): (address, address, u64, u64, u64) acquires MatchRegistry { + assert!(exists(registry_addr), error::not_found(E_NOT_INITIALIZED)); + let registry = borrow_global(registry_addr); + assert!(table::contains(®istry.matches, match_id), error::not_found(E_MATCH_EXISTS)); + let result = table::borrow(®istry.matches, match_id); + (result.winner, result.loser, result.winner_score, result.loser_score, result.timestamp) + } + + #[view] + public fun match_exists(registry_addr: address, match_id: vector): bool acquires MatchRegistry { + if (!exists(registry_addr)) { return false }; + let registry = borrow_global(registry_addr); + table::contains(®istry.matches, match_id) + } + + #[view] + public fun total_matches(registry_addr: address): u64 acquires MatchRegistry { + assert!(exists(registry_addr), error::not_found(E_NOT_INITIALIZED)); + borrow_global(registry_addr).total_matches + } + + // ── Internal helpers ────────────────────────────────────────────────────── + /// Build the canonical message that the server signs. + /// Format: match_id_len(1 byte) || match_id || winner(32 bytes) || loser(32 bytes) || winner_score(8 bytes LE) || loser_score(8 bytes LE) + fun build_message( + match_id: &vector, + winner: address, + loser: address, + winner_score: u64, + loser_score: u64, + ): vector { + let msg = vector::empty(); + + // Append match_id with length prefix + let id_len = vector::length(match_id); + vector::push_back(&mut msg, (id_len as u8)); + vector::append(&mut msg, *match_id); + + // Append winner address bytes + let winner_bytes = std::bcs::to_bytes(&winner); + vector::append(&mut msg, winner_bytes); + + // Append loser address bytes + let loser_bytes = std::bcs::to_bytes(&loser); + vector::append(&mut msg, loser_bytes); + + // Append scores as 8-byte little-endian + let ws_bytes = u64_to_le_bytes(winner_score); + vector::append(&mut msg, ws_bytes); + + let ls_bytes = u64_to_le_bytes(loser_score); + vector::append(&mut msg, ls_bytes); + + msg + } + + fun u64_to_le_bytes(val: u64): vector { + let bytes = vector::empty(); + let i = 0; + while (i < 8) { + vector::push_back(&mut bytes, ((val >> (i * 8)) & 0xFF as u8)); + i = i + 1; + }; + bytes + } +} diff --git a/contracts/arena/sources/player_profile.move b/contracts/arena/sources/player_profile.move new file mode 100644 index 0000000..b2c7024 --- /dev/null +++ b/contracts/arena/sources/player_profile.move @@ -0,0 +1,170 @@ +/// Player profile module. +/// Each player's stats (wins/losses/elo) are stored as a resource at their address. +/// Profiles are auto-created on first match. ELO uses K=32, floor 100, ceiling 9999. +module arena::player_profile { + use std::signer; + use std::error; + + // ── Constants ───────────────────────────────────────────────────────────── + const ELO_START: u64 = 1200; + const ELO_FLOOR: u64 = 100; + const ELO_CEILING: u64 = 9999; + const ELO_K: u64 = 32; + + // ── Error codes ────────────────────────────────────────────────────────── + const E_NOT_FOUND: u64 = 1; + + // ── Resources ──────────────────────────────────────────────────────────── + struct PlayerProfile has key { + owner: address, + wins: u64, + losses: u64, + total_matches: u64, + elo_rating: u64, + } + + // ── Public functions ────────────────────────────────────────────────────── + /// Create profile for the caller if it does not exist yet. + public entry fun ensure_profile(player: &signer) { + let addr = signer::address_of(player); + if (!exists(addr)) { + move_to(player, PlayerProfile { + owner: addr, + wins: 0, + losses: 0, + total_matches: 0, + elo_rating: ELO_START, + }); + } + } + + /// Called by match_registry after a match result is verified. + /// Auto-creates profiles for players that don't have one yet. + /// NOTE: This function requires both signers — in practice the contract + /// uses internal helpers; this is a public friend function pattern. + public(friend) fun update_stats_internal(winner_addr: address, loser_addr: address) acquires PlayerProfile { + // Auto-create profiles via a temporary approach: + // If profiles don't exist, we use default values for elo calc. + let winner_elo = if (exists(winner_addr)) { + borrow_global(winner_addr).elo_rating + } else { + ELO_START + }; + let loser_elo = if (exists(loser_addr)) { + borrow_global(loser_addr).elo_rating + } else { + ELO_START + }; + + // Calculate elo deltas using integer approximation. + // expected_winner = 1 / (1 + 10^((loser_elo - winner_elo)/400)) + // We approximate using scaled integer math. + let (winner_delta, loser_delta) = calculate_elo_delta(winner_elo, loser_elo); + + // Update winner profile + if (exists(winner_addr)) { + let profile = borrow_global_mut(winner_addr); + profile.wins = profile.wins + 1; + profile.total_matches = profile.total_matches + 1; + profile.elo_rating = clamp_elo(profile.elo_rating + winner_delta); + }; + + // Update loser profile + if (exists(loser_addr)) { + let profile = borrow_global_mut(loser_addr); + profile.losses = profile.losses + 1; + profile.total_matches = profile.total_matches + 1; + // Prevent underflow + if (profile.elo_rating > loser_delta) { + profile.elo_rating = clamp_elo(profile.elo_rating - loser_delta); + } else { + profile.elo_rating = ELO_FLOOR; + } + }; + } + + /// Public wrapper called from match_registry. + /// Profiles must already exist (created by ensure_profile) or this is a no-op update. + public fun update_stats(winner_addr: address, loser_addr: address) acquires PlayerProfile { + update_stats_internal(winner_addr, loser_addr) + } + + // ── View functions ──────────────────────────────────────────────────────── + #[view] + public fun get_profile(addr: address): (u64, u64, u64, u64) acquires PlayerProfile { + assert!(exists(addr), error::not_found(E_NOT_FOUND)); + let p = borrow_global(addr); + (p.wins, p.losses, p.total_matches, p.elo_rating) + } + + #[view] + public fun has_profile(addr: address): bool { + exists(addr) + } + + // ── Internal helpers ────────────────────────────────────────────────────── + /// Integer ELO delta calculation (K=32). + /// Returns (winner_gain, loser_loss) — both are non-negative u64 values. + fun calculate_elo_delta(winner_elo: u64, loser_elo: u64): (u64, u64) { + // Scale everything by 1000 to avoid floats. + // expected_winner_scaled = 1000 / (1 + 10^((loser_elo - winner_elo)/400)) + // We use a linear approximation: if winner_elo > loser_elo, expected > 500/1000. + // Simple integer approximation: delta = K * (1 - expected) + // Full integer ELO: gain = K * (1000 - expected_scaled) / 1000 + // loss = K * expected_scaled / 1000 + + let diff: u64; + let winner_stronger: bool; + + if (winner_elo >= loser_elo) { + diff = winner_elo - loser_elo; + winner_stronger = true; + } else { + diff = loser_elo - winner_elo; + winner_stronger = false; + }; + + // Clamp diff to reasonable range + if (diff > 800) { + diff = 800; + }; + + // Approximation: expected_winner_scaled (out of 1000) + // When diff=0: expected=500, gain=loss=16 + // When diff=400: expected≈760, gain≈8, loss≈24 (winner was favored) + // Linear approximation: each 40 rating points = ~3 scaled units shift + let shift = (diff * 32) / 400; // max shift ~64 from 500 + let expected_winner_scaled: u64; + if (winner_stronger) { + expected_winner_scaled = 500 + shift; + } else { + if (500 > shift) { + expected_winner_scaled = 500 - shift; + } else { + expected_winner_scaled = 0; + } + }; + + // Clamp expected to [0, 1000] + if (expected_winner_scaled > 1000) { + expected_winner_scaled = 1000; + }; + + // winner gains K*(1 - expected) = K*(1000-expected_scaled)/1000 + let winner_gain = ELO_K * (1000 - expected_winner_scaled) / 1000; + // loser loses K*expected = K*expected_scaled/1000 + let loser_loss = ELO_K * expected_winner_scaled / 1000; + + // Minimum change of 1 + if (winner_gain == 0) { winner_gain = 1; }; + if (loser_loss == 0) { loser_loss = 1; }; + + (winner_gain, loser_loss) + } + + fun clamp_elo(elo: u64): u64 { + if (elo < ELO_FLOOR) { ELO_FLOOR } + else if (elo > ELO_CEILING) { ELO_CEILING } + else { elo } + } +} diff --git a/contracts/arena/sources/weapon_nft.move b/contracts/arena/sources/weapon_nft.move new file mode 100644 index 0000000..09bc92f --- /dev/null +++ b/contracts/arena/sources/weapon_nft.move @@ -0,0 +1,152 @@ +/// Weapon NFT module. +/// Players own weapon skin NFTs. Visual only — no gameplay stat effects. +/// 5 weapon types: 0=pistol, 1=shotgun, 2=sniper, 3=rocket_launcher, 4=sword +/// 4 rarity tiers: 0=common, 1=rare, 2=epic, 3=legendary +module arena::weapon_nft { + use std::signer; + use std::error; + use std::vector; + use arena::game_config; + + // ── Constants ───────────────────────────────────────────────────────────── + const WEAPON_PISTOL: u8 = 0; + const WEAPON_SHOTGUN: u8 = 1; + const WEAPON_SNIPER: u8 = 2; + const WEAPON_ROCKET: u8 = 3; + const WEAPON_SWORD: u8 = 4; + const WEAPON_TYPE_COUNT: u8 = 5; + + const RARITY_COMMON: u8 = 0; + const RARITY_RARE: u8 = 1; + const RARITY_EPIC: u8 = 2; + const RARITY_LEGENDARY: u8 = 3; + + // ── Error codes ────────────────────────────────────────────────────────── + const E_NOT_ADMIN: u64 = 1; + const E_INVALID_WEAPON_TYPE: u64 = 2; + const E_NO_INVENTORY: u64 = 3; + const E_WEAPON_INDEX_OOB: u64 = 4; + const E_INVALID_RARITY: u64 = 5; + + // ── Resources ──────────────────────────────────────────────────────────── + struct WeaponNFT has store, drop, copy { + weapon_type: u8, + rarity: u8, + skin_id: u64, + } + + struct PlayerInventory has key { + weapons: vector, + /// Which weapon type (0-4) is currently equipped. 255 = none equipped. + equipped_index: u64, + } + + // ── Public entry functions ──────────────────────────────────────────────── + /// Mint a weapon NFT for a recipient. Only callable by admin. + public entry fun mint_weapon( + admin: &signer, + config_addr: address, + recipient: address, + weapon_type: u8, + rarity: u8, + skin_id: u64, + ) acquires PlayerInventory { + let admin_addr = signer::address_of(admin); + assert!( + game_config::get_admin(config_addr) == admin_addr, + error::permission_denied(E_NOT_ADMIN) + ); + assert!(weapon_type < WEAPON_TYPE_COUNT, error::invalid_argument(E_INVALID_WEAPON_TYPE)); + assert!(rarity <= RARITY_LEGENDARY, error::invalid_argument(E_INVALID_RARITY)); + + let nft = WeaponNFT { weapon_type, rarity, skin_id }; + + if (!exists(recipient)) { + // Can't move_to a non-signer address directly in Move — + // we use a workaround: store in a global admin-owned table. + // For MVP, we require players to call init_inventory first. + // This is acceptable for the hackathon flow. + // TODO: Use object model or allow admin to init on behalf of player. + }; + + // If inventory exists, add to it + if (exists(recipient)) { + let inv = borrow_global_mut(recipient); + vector::push_back(&mut inv.weapons, nft); + } + // else: weapon is minted but not deliverable until player calls init_inventory + } + + /// Player initializes their own inventory (called once on first use). + public entry fun init_inventory(player: &signer) { + let addr = signer::address_of(player); + if (!exists(addr)) { + move_to(player, PlayerInventory { + weapons: vector::empty(), + equipped_index: 999, // no weapon equipped + }); + } + } + + /// Admin mints directly to a player who has already initialized their inventory. + /// For new player onboarding, call init_inventory first (can be in same tx). + public entry fun mint_weapon_to_initialized( + admin: &signer, + config_addr: address, + recipient_inventory: address, + weapon_type: u8, + rarity: u8, + skin_id: u64, + ) acquires PlayerInventory { + let admin_addr = signer::address_of(admin); + assert!( + game_config::get_admin(config_addr) == admin_addr, + error::permission_denied(E_NOT_ADMIN) + ); + assert!(weapon_type < WEAPON_TYPE_COUNT, error::invalid_argument(E_INVALID_WEAPON_TYPE)); + assert!(rarity <= RARITY_LEGENDARY, error::invalid_argument(E_INVALID_RARITY)); + assert!(exists(recipient_inventory), error::not_found(E_NO_INVENTORY)); + + let inv = borrow_global_mut(recipient_inventory); + vector::push_back(&mut inv.weapons, WeaponNFT { weapon_type, rarity, skin_id }); + } + + /// Player equips a weapon by its index in their inventory. + public entry fun equip_weapon(player: &signer, weapon_index: u64) acquires PlayerInventory { + let addr = signer::address_of(player); + assert!(exists(addr), error::not_found(E_NO_INVENTORY)); + let inv = borrow_global_mut(addr); + assert!(weapon_index < vector::length(&inv.weapons), error::out_of_range(E_WEAPON_INDEX_OOB)); + inv.equipped_index = weapon_index; + } + + // ── View functions ──────────────────────────────────────────────────────── + #[view] + public fun get_equipped_weapon(addr: address): u8 acquires PlayerInventory { + if (!exists(addr)) { return 255 }; + let inv = borrow_global(addr); + if (inv.equipped_index >= vector::length(&inv.weapons)) { return 255 }; + let nft = vector::borrow(&inv.weapons, inv.equipped_index); + nft.weapon_type + } + + #[view] + public fun get_inventory_count(addr: address): u64 acquires PlayerInventory { + if (!exists(addr)) { return 0 }; + vector::length(&borrow_global(addr).weapons) + } + + #[view] + public fun has_inventory(addr: address): bool { + exists(addr) + } + + #[view] + public fun get_weapon_at(addr: address, index: u64): (u8, u8, u64) acquires PlayerInventory { + assert!(exists(addr), error::not_found(E_NO_INVENTORY)); + let inv = borrow_global(addr); + assert!(index < vector::length(&inv.weapons), error::out_of_range(E_WEAPON_INDEX_OOB)); + let nft = vector::borrow(&inv.weapons, index); + (nft.weapon_type, nft.rarity, nft.skin_id) + } +} diff --git a/contracts/arena/tests/player_profile_tests.move b/contracts/arena/tests/player_profile_tests.move new file mode 100644 index 0000000..7816f23 --- /dev/null +++ b/contracts/arena/tests/player_profile_tests.move @@ -0,0 +1,74 @@ +#[test_only] +module arena::player_profile_tests { + use std::signer; + use arena::player_profile; + + #[test(player = @0xCAFE)] + fun test_ensure_profile_creates_with_default_elo(player: signer) { + player_profile::ensure_profile(&player); + let addr = signer::address_of(&player); + assert!(player_profile::has_profile(addr), 1); + let (wins, losses, total, elo) = player_profile::get_profile(addr); + assert!(wins == 0, 2); + assert!(losses == 0, 3); + assert!(total == 0, 4); + assert!(elo == 1200, 5); + } + + #[test(player = @0xCAFE)] + fun test_ensure_profile_idempotent(player: signer) { + player_profile::ensure_profile(&player); + player_profile::ensure_profile(&player); // should not abort + let addr = signer::address_of(&player); + assert!(player_profile::has_profile(addr), 1); + } + + #[test(winner = @0xCAFE, loser = @0xBEEF)] + fun test_update_stats_increments_wins_losses(winner: signer, loser: signer) { + player_profile::ensure_profile(&winner); + player_profile::ensure_profile(&loser); + + let winner_addr = signer::address_of(&winner); + let loser_addr = signer::address_of(&loser); + + player_profile::update_stats(winner_addr, loser_addr); + + let (wins, losses, total, _elo) = player_profile::get_profile(winner_addr); + assert!(wins == 1, 1); + assert!(losses == 0, 2); + assert!(total == 1, 3); + + let (wins2, losses2, total2, _elo2) = player_profile::get_profile(loser_addr); + assert!(wins2 == 0, 4); + assert!(losses2 == 1, 5); + assert!(total2 == 1, 6); + } + + #[test(winner = @0xCAFE, loser = @0xBEEF)] + fun test_elo_changes_after_match(winner: signer, loser: signer) { + player_profile::ensure_profile(&winner); + player_profile::ensure_profile(&loser); + + let winner_addr = signer::address_of(&winner); + let loser_addr = signer::address_of(&loser); + + player_profile::update_stats(winner_addr, loser_addr); + + let (_, _, _, winner_elo) = player_profile::get_profile(winner_addr); + let (_, _, _, loser_elo) = player_profile::get_profile(loser_addr); + + // Winner gains elo, loser loses elo (both start at 1200) + assert!(winner_elo > 1200, 1); + assert!(loser_elo < 1200, 2); + // ELO should sum to roughly the same total (K=32, equal opponents) + // Each should gain/lose 16 from equal starting + assert!(winner_elo == 1216, 3); + assert!(loser_elo == 1184, 4); + } + + #[test(addr = @0xCAFE)] + fun test_has_profile_returns_false_for_new(addr: signer) { + let a = signer::address_of(&addr); + assert!(!player_profile::has_profile(a), 1); + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4955381 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "moveshot", + "version": "1.0.0", + "private": true, + "pnpm": { + "packageExtensions": { + "colyseus@*": { + "exports": { + ".": { + "import": "./build/index.mjs", + "require": "./build/index.js", + "default": "./build/index.js" + } + } + }, + "@colyseus/core@*": { + "exports": { + ".": { + "import": "./build/index.mjs", + "require": "./build/index.js", + "default": "./build/index.js" + } + } + } + } + }, + "scripts": { + "dev": "concurrently --names \"client,server\" --prefix-colors \"cyan,yellow\" \"pnpm --filter @arena/client dev\" \"pnpm --filter @arena/server dev\"", + "dev:client": "pnpm --filter @arena/client dev", + "dev:server": "pnpm --filter @arena/server dev", + "build": "pnpm --filter @arena/sim build && pnpm --filter @arena/client build && pnpm --filter @arena/server build", + "test": "pnpm --filter @arena/sim test", + "typecheck": "pnpm -r typecheck" + }, + "devDependencies": { + "concurrently": "^9.1.2", + "typescript": "^5.7.3" + } +} diff --git a/packages/sim/jest.config.js b/packages/sim/jest.config.js new file mode 100644 index 0000000..e04fc71 --- /dev/null +++ b/packages/sim/jest.config.js @@ -0,0 +1,12 @@ +/** @type {import('jest').Config} */ +export default { + preset: 'ts-jest/presets/default-esm', + testEnvironment: 'node', + extensionsToTreatAsEsm: ['.ts'], + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + transform: { + '^.+\\.tsx?$': ['ts-jest', { useESM: true }], + }, +}; diff --git a/packages/sim/package.json b/packages/sim/package.json new file mode 100644 index 0000000..1c4c5a8 --- /dev/null +++ b/packages/sim/package.json @@ -0,0 +1,26 @@ +{ + "name": "@arena/sim", + "version": "1.0.0", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "test": "node --experimental-vm-modules node_modules/.bin/jest", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "jest": "^29.7.0", + "ts-jest": "^29.2.5", + "typescript": "^5.7.3" + } +} diff --git a/packages/sim/src/constants.ts b/packages/sim/src/constants.ts new file mode 100644 index 0000000..80f30ce --- /dev/null +++ b/packages/sim/src/constants.ts @@ -0,0 +1,127 @@ +import { WeaponType } from './types.js'; + +// -- Tick rate -- +export const TICK_RATE = 60; + +// -- Player dimensions -- +export const PLAYER_W = 24; +export const PLAYER_H = 32; + +// -- Physics -- +export const GRAVITY = 0.6; +export const TERMINAL_VELOCITY = 12.0; +export const RUN_ACCEL = 0.8; +export const RUN_DECEL = 0.6; +export const MAX_RUN_SPEED = 4.0; +export const JUMP_VELOCITY = -10.5; +export const DOUBLE_JUMP_VELOCITY = -10.5; +export const WALL_SLIDE_GRAVITY = 0.2; +export const WALL_JUMP_VX = 6.0; +export const WALL_JUMP_VY = -10.5; + +// -- HP -- +export const MAX_HP = 100; + +// -- Weapon stats -- +export interface WeaponStats { + damage: number; + cooldown: number; // ticks + projectileSpeed: number; + lifetime: number; // ticks + pellets?: number; // shotgun only + spreadDeg?: number; // shotgun spread in degrees + splashRadius?: number; // rocket only + splashDamage?: number; // rocket only + selfSplashDamage?: number; + spreadRad?: number; // SMG random spread in radians + hitboxW?: number; // sniper narrow hitbox +} + +export const WEAPON_STATS: Record = { + [WeaponType.Pistol]: { + damage: 15, + cooldown: 10, + projectileSpeed: 12.0, + lifetime: 90, + hitboxW: 6, + }, + [WeaponType.Shotgun]: { + damage: 10, // per pellet; 6 pellets = 60 max + cooldown: 20, + projectileSpeed: 10.0, + lifetime: 45, + pellets: 6, + spreadDeg: 30, + hitboxW: 5, + }, + [WeaponType.Sniper]: { + damage: 80, + cooldown: 60, + projectileSpeed: 20.0, + lifetime: 120, + hitboxW: 2, + }, + [WeaponType.Rocket]: { + damage: 50, + cooldown: 25, + projectileSpeed: 8.0, + lifetime: 120, + splashRadius: 40, + splashDamage: 25, + selfSplashDamage: 15, + hitboxW: 8, + }, + [WeaponType.SMG]: { + damage: 10, + cooldown: 5, + projectileSpeed: 11.0, + lifetime: 60, + spreadRad: (3 * Math.PI) / 180, // +-3 degrees + hitboxW: 5, + }, +}; + +// -- Weapon pickup system -- +export const WEAPON_ROTATION: WeaponType[] = [ + WeaponType.Shotgun, + WeaponType.Sniper, + WeaponType.Rocket, + WeaponType.SMG, + WeaponType.Pistol, +]; +export const PICKUP_RESPAWN_TICKS = 300; +export const PICKUP_W = 20; +export const PICKUP_H = 20; + +// -- Arena -- +export const ARENA_W = 800; +export const ARENA_H = 600; +export const ARENA_SHRINK_START_TICK = 1200; // 20 seconds +export const ARENA_SHRINK_SPEED = 0.5; // px/tick +export const ARENA_MIN_GAP = 100; // minimum px between kill walls +export const KILL_WALL_DAMAGE = 5; // per tick +export const OUT_OF_BOUNDS_DAMAGE = 10; // per tick + +// -- Round / match -- +export const SPAWN_FREEZE_TICKS = 60; +export const ROUND_TIME_TICKS = 1800; // 30 seconds +export const INTERMISSION_TICKS = 120; // 2 seconds +export const COUNTDOWN_TICKS = 180; // 3 seconds +export const DEATH_LINGER_TICKS = 30; +export const ROUNDS_TO_WIN = 2; + +// -- Stomp -- +export const STOMP_DAMAGE_INTERVAL = 2; // 1 dmg every 2 ticks +export const STOMP_MAX_DAMAGE = 50; +export const STOMP_ESCAPE_PER_PRESS = 17; +export const STOMP_ESCAPE_DECAY = 1; // per tick +export const STOMP_ESCAPE_THRESHOLD = 100; +export const STOMP_ESCAPE_ATTACKER_VY = -8.0; +export const STOMP_ESCAPE_VICTIM_VX = 6.0; +export const STOMP_IMMUNITY_TICKS = 90; +// Stomp detection: attacker feet (bottom 4px) overlaps victim head (top 8px) +export const STOMP_FEET_H = 4; +export const STOMP_HEAD_H = 8; + +// -- PRNG seed (Mulberry32) -- +export const DEFAULT_PRNG_SEED = 0xdeadbeef; diff --git a/packages/sim/src/index.ts b/packages/sim/src/index.ts new file mode 100644 index 0000000..bf4deec --- /dev/null +++ b/packages/sim/src/index.ts @@ -0,0 +1,8 @@ +export { step, createInitialState, createDefaultMap } from './step.js'; +export { createInitialPickups } from './map.js'; +export type { MapData, SpawnPoint, WeaponSpawnPoint } from './map.js'; +export * from './types.js'; +export * from './constants.js'; +export { prngNext } from './prng.js'; +export { playerAABB, aabbOverlap } from './physics.js'; +export { applyDamage } from './projectiles.js'; diff --git a/packages/sim/src/map.ts b/packages/sim/src/map.ts new file mode 100644 index 0000000..8347409 --- /dev/null +++ b/packages/sim/src/map.ts @@ -0,0 +1,91 @@ +import { AABB, WeaponPickupState, WeaponType } from './types.js'; +import { ARENA_W, ARENA_H, WEAPON_ROTATION } from './constants.js'; + +export interface SpawnPoint { + x: number; + y: number; +} + +export interface WeaponSpawnPoint { + x: number; + y: number; + rotationIndex: number; +} + +export interface MapData { + platforms: AABB[]; + spawnPoints: [SpawnPoint, SpawnPoint]; + weaponSpawns: WeaponSpawnPoint[]; + arenaLeft: number; + arenaRight: number; + arenaTop: number; + arenaBottom: number; +} + +/** + * Default arena layout — single map for MVP. + * Coordinate system: (0,0) = top-left, Y increases downward. + */ +export function createDefaultMap(): MapData { + return { + arenaLeft: 0, + arenaRight: ARENA_W, + arenaTop: 0, + arenaBottom: ARENA_H, + + // Floor + walls + platforms + platforms: [ + // Ground floor + { x: 0, y: 560, w: ARENA_W, h: 40 }, + + // Left elevated platform + { x: 60, y: 420, w: 160, h: 20 }, + + // Right elevated platform + { x: 580, y: 420, w: 160, h: 20 }, + + // Centre mid platform + { x: 310, y: 320, w: 180, h: 20 }, + + // Left high platform + { x: 100, y: 240, w: 130, h: 20 }, + + // Right high platform + { x: 570, y: 240, w: 130, h: 20 }, + + // Centre top platform + { x: 330, y: 160, w: 140, h: 20 }, + + // Thin left ledge + { x: 0, y: 340, w: 80, h: 16 }, + + // Thin right ledge + { x: 720, y: 340, w: 80, h: 16 }, + ], + + spawnPoints: [ + { x: 160, y: 528 }, // player 0: left side of ground + { x: 640, y: 528 }, // player 1: right side of ground + ], + + weaponSpawns: [ + { x: 120, y: 395, rotationIndex: 0 }, // left platform — starts as Shotgun + { x: 620, y: 395, rotationIndex: 1 }, // right platform — starts as Sniper + { x: 390, y: 295, rotationIndex: 2 }, // centre mid — starts as Rocket + { x: 155, y: 215, rotationIndex: 3 }, // left high — starts as SMG + { x: 395, y: 135, rotationIndex: 4 }, // centre top — starts as Pistol pickup + ], + }; +} + +/** Build initial weapon pickup states from a map. */ +export function createInitialPickups(map: MapData): WeaponPickupState[] { + return map.weaponSpawns.map((spawn, i) => ({ + id: i, + x: spawn.x, + y: spawn.y, + weapon: WEAPON_ROTATION[spawn.rotationIndex % WEAPON_ROTATION.length] as WeaponType, + respawnTimer: 0, + rotationIndex: spawn.rotationIndex, + })); +} diff --git a/packages/sim/src/physics.ts b/packages/sim/src/physics.ts new file mode 100644 index 0000000..0fc551e --- /dev/null +++ b/packages/sim/src/physics.ts @@ -0,0 +1,162 @@ +import { PlayerState, InputState, AABB } from './types.js'; +import { + GRAVITY, TERMINAL_VELOCITY, RUN_ACCEL, RUN_DECEL, MAX_RUN_SPEED, + JUMP_VELOCITY, DOUBLE_JUMP_VELOCITY, WALL_SLIDE_GRAVITY, + WALL_JUMP_VX, WALL_JUMP_VY, PLAYER_W, PLAYER_H, +} from './constants.js'; +import { MapData } from './map.js'; + +/** Returns the AABB for a player at their current position. */ +export function playerAABB(p: PlayerState): AABB { + return { x: p.x, y: p.y, w: PLAYER_W, h: PLAYER_H }; +} + +/** True if two AABBs overlap (touching edges do not count as overlap). */ +export function aabbOverlap(a: AABB, b: AABB): boolean { + return ( + a.x < b.x + b.w && + a.x + a.w > b.x && + a.y < b.y + b.h && + a.y + a.h > b.y + ); +} + +/** Apply gravity and clamp to terminal velocity. */ +export function applyGravity(p: PlayerState, wallSliding: boolean): void { + const g = wallSliding ? WALL_SLIDE_GRAVITY : GRAVITY; + p.vy += g; + if (p.vy > TERMINAL_VELOCITY) p.vy = TERMINAL_VELOCITY; +} + +/** Apply velocity to position. */ +export function applyVelocity(p: PlayerState): void { + p.x += p.vx; + p.y += p.vy; +} + +/** + * Resolve AABB collisions between a player and all platforms. + * Uses minimum penetration axis (MTV) — separates on the smallest overlap axis. + * Updates grounded and wallContact flags. + */ +export function resolveCollisions(p: PlayerState, platforms: AABB[]): void { + p.grounded = false; + p.wallContact = 0; + + for (const plat of platforms) { + const px = p.x, py = p.y; + const pw = PLAYER_W, ph = PLAYER_H; + + // Check overlap + const overlapX = Math.min(px + pw, plat.x + plat.w) - Math.max(px, plat.x); + const overlapY = Math.min(py + ph, plat.y + plat.h) - Math.max(py, plat.y); + + if (overlapX <= 0 || overlapY <= 0) continue; + + if (overlapY < overlapX) { + // Vertical separation (floor / ceiling) + if (py + ph / 2 < plat.y + plat.h / 2) { + // Player is above: floor landing + p.y = plat.y - ph; + if (p.vy > 0) { + p.vy = 0; + p.grounded = true; + p.doubleJumpAvailable = true; + } + } else { + // Player is below: ceiling bonk + p.y = plat.y + plat.h; + if (p.vy < 0) p.vy = 0; + } + } else { + // Horizontal separation (wall) + if (px + pw / 2 < plat.x + plat.w / 2) { + // Player is to the left of the platform + p.x = plat.x - pw; + if (p.vx > 0) p.vx = 0; + p.wallContact = 1; // right wall + } else { + // Player is to the right of the platform + p.x = plat.x + plat.w; + if (p.vx < 0) p.vx = 0; + p.wallContact = -1; // left wall + } + } + } +} + +/** + * Process character movement for one tick. + * input / prevInput are edge-triggered for jump. + */ +export function processMovement( + p: PlayerState, + input: InputState, + prevInput: InputState, + platforms: AABB[], + stomp: boolean, // true if player is the attacker in an active stomp + frozen: boolean, // true during spawn freeze +): void { + if (frozen) return; + if (stomp) { + // Attacker position is managed by stomp system — only weapon handling here + return; + } + + const wallSliding = + !p.grounded && + p.wallContact !== 0 && + ((p.wallContact === 1 && input.right) || (p.wallContact === -1 && input.left)); + + // Gravity + applyGravity(p, wallSliding); + + // Horizontal movement + if (input.left && !input.right) { + p.vx = Math.max(p.vx - RUN_ACCEL, -MAX_RUN_SPEED); + p.facing = -1; + } else if (input.right && !input.left) { + p.vx = Math.min(p.vx + RUN_ACCEL, MAX_RUN_SPEED); + p.facing = 1; + } else { + // Decelerate toward zero + if (p.vx > 0) p.vx = Math.max(0, p.vx - RUN_DECEL); + else if (p.vx < 0) p.vx = Math.min(0, p.vx + RUN_DECEL); + } + + // Jump: edge-triggered (fires only on transition unpressed→pressed) + const jumpPressed = input.jump && !prevInput.jump; + if (jumpPressed) { + if (p.grounded) { + p.vy = JUMP_VELOCITY; + p.grounded = false; + } else if (wallSliding) { + // Wall jump + p.vy = WALL_JUMP_VY; + p.vx = p.wallContact === 1 ? -WALL_JUMP_VX : WALL_JUMP_VX; + p.wallContact = 0; + } else if (p.doubleJumpAvailable) { + p.vy = DOUBLE_JUMP_VELOCITY; + p.doubleJumpAvailable = false; + } + } + + // Apply velocity + applyVelocity(p); + + // Resolve collisions + resolveCollisions(p, platforms); + + // Update animation state + if (!p.alive) { + p.animState = 'death'; + } else if (wallSliding) { + p.animState = 'wall-slide'; + } else if (!p.grounded) { + p.animState = p.vy < 0 ? 'jump' : 'fall'; + } else if (Math.abs(p.vx) > 0.1) { + p.animState = 'run'; + } else { + p.animState = 'idle'; + } +} diff --git a/packages/sim/src/prng.ts b/packages/sim/src/prng.ts new file mode 100644 index 0000000..e622bef --- /dev/null +++ b/packages/sim/src/prng.ts @@ -0,0 +1,13 @@ +/** + * Mulberry32 PRNG — fast, deterministic, good statistical quality. + * Returns [0, 1) float and the next PRNG state. + * Pure function: same input always produces same output. + */ +export function prngNext(state: number): [number, number] { + let t = (state + 0x6d2b79f5) >>> 0; + t = Math.imul(t ^ (t >>> 15), t | 1) >>> 0; + t ^= t + Math.imul(t ^ (t >>> 7), t | 61) >>> 0; + t = ((t ^ (t >>> 14)) >>> 0) / 4294967296; + const nextState = (state + 0x6d2b79f5) >>> 0; + return [t, nextState]; +} diff --git a/packages/sim/src/projectiles.ts b/packages/sim/src/projectiles.ts new file mode 100644 index 0000000..5ee1068 --- /dev/null +++ b/packages/sim/src/projectiles.ts @@ -0,0 +1,127 @@ +import { GameState, ProjectileState, PlayerState, WeaponType, AABB } from './types.js'; +import { WEAPON_STATS, PLAYER_W, PLAYER_H, ARENA_W, ARENA_H } from './constants.js'; +import { aabbOverlap } from './physics.js'; + +function projectileAABB(proj: ProjectileState): AABB { + const stats = WEAPON_STATS[proj.weapon]; + const w = stats.hitboxW ?? 6; + const h = 6; + return { x: proj.x - w / 2, y: proj.y - h / 2, w, h }; +} + +function playerAABBBox(p: PlayerState): AABB { + return { x: p.x, y: p.y, w: PLAYER_W, h: PLAYER_H }; +} + +/** + * Move all projectiles, handle collisions with players and platforms, apply damage. + * Rocket splash is processed on destruction. + */ +export function updateProjectiles(state: GameState, platforms: AABB[]): void { + const { players } = state; + const toDestroy = new Set(); + + for (const proj of state.projectiles) { + // Move + proj.x += proj.vx; + proj.y += proj.vy; + + // Decrement lifetime + proj.lifetime--; + if (proj.lifetime <= 0) { + toDestroy.add(proj.id); + if (proj.weapon === WeaponType.Rocket) { + applySplash(proj, players, state.stomp); + } + continue; + } + + // Out-of-bounds + if (proj.x < 0 || proj.x > ARENA_W || proj.y < 0 || proj.y > ARENA_H + 100) { + toDestroy.add(proj.id); + if (proj.weapon === WeaponType.Rocket) { + applySplash(proj, players, state.stomp); + } + continue; + } + + // Platform collision + const pBox = projectileAABB(proj); + let hitPlatform = false; + for (const plat of platforms) { + if (aabbOverlap(pBox, plat)) { + hitPlatform = true; + break; + } + } + if (hitPlatform) { + toDestroy.add(proj.id); + if (proj.weapon === WeaponType.Rocket) { + applySplash(proj, players, state.stomp); + } + continue; + } + + // Player collision + for (const player of players) { + if (!player.alive) continue; + if (player.index === proj.ownerIndex && proj.weapon !== WeaponType.Rocket) continue; + + // Stomp invulnerability: both players in an active stomp ignore projectiles + if (state.stomp) { + const stompIndices = [state.stomp.attackerIndex, state.stomp.victimIndex]; + if (stompIndices.includes(player.index)) continue; + } + + const playerBox = playerAABBBox(player); + if (aabbOverlap(pBox, playerBox)) { + const stats = WEAPON_STATS[proj.weapon]; + const damage = + player.index === proj.ownerIndex && proj.weapon === WeaponType.Rocket + ? (stats.selfSplashDamage ?? 15) + : stats.damage; + applyDamage(player, damage); + toDestroy.add(proj.id); + + if (proj.weapon === WeaponType.Rocket) { + applySplash(proj, players, state.stomp); + } + break; + } + } + } + + state.projectiles = state.projectiles.filter((p) => !toDestroy.has(p.id)); +} + +function applySplash( + proj: ProjectileState, + players: [PlayerState, PlayerState], + stomp: GameState['stomp'], +): void { + const stats = WEAPON_STATS[WeaponType.Rocket]; + const radius = stats.splashRadius ?? 40; + + for (const player of players) { + if (!player.alive) continue; + if (stomp) { + const stompIndices = [stomp.attackerIndex, stomp.victimIndex]; + if (stompIndices.includes(player.index)) continue; + } + + const cx = player.x + PLAYER_W / 2; + const cy = player.y + PLAYER_H / 2; + const dist = Math.hypot(proj.x - cx, proj.y - cy); + + if (dist <= radius) { + const isSelf = player.index === proj.ownerIndex; + const splash = isSelf ? (stats.selfSplashDamage ?? 15) : (stats.splashDamage ?? 25); + applyDamage(player, splash); + } + } +} + +export function applyDamage(player: PlayerState, amount: number): void { + if (!player.alive) return; + player.hp = Math.max(0, player.hp - amount); +} diff --git a/packages/sim/src/step.ts b/packages/sim/src/step.ts new file mode 100644 index 0000000..5d23308 --- /dev/null +++ b/packages/sim/src/step.ts @@ -0,0 +1,358 @@ +import { GameState, InputState, MatchPhase, PlayerState, RoundPhase, WeaponType } from './types.js'; +import { + MAX_HP, SPAWN_FREEZE_TICKS, ROUND_TIME_TICKS, ARENA_SHRINK_START_TICK, + ARENA_SHRINK_SPEED, ARENA_MIN_GAP, KILL_WALL_DAMAGE, OUT_OF_BOUNDS_DAMAGE, + COUNTDOWN_TICKS, INTERMISSION_TICKS, ROUNDS_TO_WIN, DEATH_LINGER_TICKS, + ARENA_W, ARENA_H, +} from './constants.js'; +import { MapData, createDefaultMap, createInitialPickups } from './map.js'; +import { processMovement } from './physics.js'; +import { fireWeapon, updatePickups } from './weapons.js'; +import { updateProjectiles, applyDamage } from './projectiles.js'; +import { checkStompInitiation, updateStomp } from './stomp.js'; +import { prngNext } from './prng.js'; +import { DEFAULT_PRNG_SEED } from './constants.js'; + +export { createDefaultMap }; + +/** Create a fresh GameState for a new match. */ +export function createInitialState( + playerIds: [string, string], + map?: MapData, +): GameState { + const m = map ?? createDefaultMap(); + const [spawn0, spawn1] = m.spawnPoints; + + return { + matchPhase: MatchPhase.Countdown, + matchTick: 0, + countdownTick: COUNTDOWN_TICKS, + intermissionTick: 0, + round: { + roundNumber: 1, + phase: RoundPhase.Spawn, + tick: 0, + winner: null, + isDraw: false, + scores: [0, 0], + }, + players: [ + makePlayer(playerIds[0]!, 0, spawn0!.x, spawn0!.y), + makePlayer(playerIds[1]!, 1, spawn1!.x, spawn1!.y), + ], + projectiles: [], + pickups: createInitialPickups(m), + arena: { + leftWall: 0, + rightWall: ARENA_W, + shrinkActive: false, + }, + prngState: DEFAULT_PRNG_SEED, + nextProjectileId: 0, + stomp: null, + matchWinner: null, + }; +} + +function makePlayer(id: string, index: 0 | 1, x: number, y: number) { + return { + id, + index, + x, + y: y - 32, // spawn above platform surface + vx: 0, + vy: 0, + facing: (index === 0 ? 1 : -1) as 1 | -1, + hp: MAX_HP, + alive: true, + grounded: false, + wallContact: 0 as 0, + doubleJumpAvailable: false, + weapon: WeaponType.Pistol, + weaponCooldown: 0, + stompImmunity: 0, + deathLingerTimer: 0, + animState: 'idle' as const, + aimAngle: index === 0 ? 0 : Math.PI, + }; +} + +/** + * Advance the game state by one tick. + * Pure-ish function — mutates state in place for performance. + * inputs / prevInputs indexed by player index. + */ +export function step( + state: GameState, + inputs: [InputState, InputState], + prevInputs: [InputState, InputState], + map?: MapData, +): GameState { + const m = map ?? createDefaultMap(); + + // -- Match phase: countdown before first round -- + if (state.matchPhase === MatchPhase.Countdown) { + state.countdownTick--; + if (state.countdownTick <= 0) { + state.matchPhase = MatchPhase.Playing; + state.round.phase = RoundPhase.Spawn; + state.round.tick = 0; + } + state.matchTick++; + return state; + } + + // -- Match ended -- + if (state.matchPhase === MatchPhase.Ended) { + state.matchTick++; + return state; + } + + // -- Intermission between rounds -- + if (state.matchPhase === MatchPhase.Intermission) { + state.intermissionTick--; + if (state.intermissionTick <= 0) { + startNextRound(state, m); + } + state.matchTick++; + return state; + } + + // -- Playing -- + const round = state.round; + const [p0, p1] = state.players; + + // Tick counters + round.tick++; + state.matchTick++; + + // Determine frozen (spawn freeze or round ended) + const frozen = round.phase === RoundPhase.Spawn && round.tick <= SPAWN_FREEZE_TICKS; + + // Stomp immunity countdown + for (const p of state.players) { + if (p.stompImmunity > 0) p.stompImmunity--; + if (p.weaponCooldown > 0) p.weaponCooldown--; + if (!p.alive && p.deathLingerTimer > 0) p.deathLingerTimer--; + } + + // -- Stomp update -- + if (state.stomp) { + updateStomp( + state, + inputs[state.stomp.attackerIndex]!, + prevInputs[state.stomp.attackerIndex]!, + inputs[state.stomp.victimIndex]!, + prevInputs[state.stomp.victimIndex]!, + ); + } + + // -- Movement -- + if (!frozen && round.phase !== RoundPhase.Ended) { + for (const p of state.players) { + if (!p.alive) continue; + const isStompAttacker = state.stomp?.attackerIndex === p.index; + processMovement(p, inputs[p.index]!, prevInputs[p.index]!, m.platforms, isStompAttacker, false); + } + + // -- Shooting -- + for (const p of state.players) { + if (!p.alive) continue; + if (inputs[p.index]!.aimAngle !== undefined) { + p.aimAngle = inputs[p.index]!.aimAngle; + } + if (inputs[p.index]!.shoot && p.weaponCooldown === 0) { + const result = fireWeapon(p, state.nextProjectileId, state.prngState); + state.projectiles.push(...result.projectiles); + state.nextProjectileId = result.nextId; + state.prngState = result.prngState; + if (result.projectiles.length > 0) { + p.weaponCooldown = WEAPON_STATS_COOLDOWN(p.weapon); + } + } + } + + // -- Projectiles -- + updateProjectiles(state, m.platforms); + + // -- Pickups -- + updatePickups(state); + + // -- Kill wall damage -- + if (state.arena.shrinkActive) { + for (const p of state.players) { + if (!p.alive) continue; + if (p.x < state.arena.leftWall || p.x + 24 > state.arena.rightWall) { + applyDamage(p, KILL_WALL_DAMAGE); + } + } + } + + // -- Out of bounds damage -- + for (const p of state.players) { + if (!p.alive) continue; + if (p.x < m.arenaLeft || p.x + 24 > m.arenaRight || p.y > m.arenaBottom) { + applyDamage(p, OUT_OF_BOUNDS_DAMAGE); + } + } + + // -- Death detection -- + for (const p of state.players) { + if (p.alive && p.hp <= 0) { + p.alive = false; + p.hp = 0; + p.deathLingerTimer = DEATH_LINGER_TICKS; + p.animState = 'death'; + // If this player was in a stomp, end it + if (state.stomp) { + if (state.stomp.attackerIndex === p.index || state.stomp.victimIndex === p.index) { + state.stomp = null; + } + } + } + } + + // -- Stomp initiation check (only when no stomp active) -- + if (!state.stomp && round.phase === RoundPhase.Fight) { + for (const attacker of state.players) { + const victim = state.players[attacker.index === 0 ? 1 : 0]!; + if (checkStompInitiation(attacker, victim)) { + state.stomp = { + active: true, + attackerIndex: attacker.index, + victimIndex: victim.index, + damage: 0, + escapeMeter: 0, + prevEscapeLeft: false, + prevEscapeRight: false, + }; + break; + } + } + } + } + + // -- Round phase transitions -- + if (round.phase === RoundPhase.Spawn && round.tick > SPAWN_FREEZE_TICKS) { + round.phase = RoundPhase.Fight; + } + + if (round.phase === RoundPhase.Fight && round.tick >= ARENA_SHRINK_START_TICK) { + round.phase = RoundPhase.Shrink; + state.arena.shrinkActive = true; + } + + // -- Arena shrink -- + if (state.arena.shrinkActive && round.phase !== RoundPhase.Ended) { + const gap = state.arena.rightWall - state.arena.leftWall; + if (gap > ARENA_MIN_GAP) { + state.arena.leftWall += ARENA_SHRINK_SPEED; + state.arena.rightWall -= ARENA_SHRINK_SPEED; + if (state.arena.rightWall - state.arena.leftWall < ARENA_MIN_GAP) { + const mid = (state.arena.leftWall + state.arena.rightWall) / 2; + state.arena.leftWall = mid - ARENA_MIN_GAP / 2; + state.arena.rightWall = mid + ARENA_MIN_GAP / 2; + } + } + } + + // -- Round end check -- + if (round.phase !== RoundPhase.Ended) { + const p0Dead = !p0!.alive; + const p1Dead = !p1!.alive; + const timeout = round.tick >= ROUND_TIME_TICKS; + + let roundEnded = false; + + if (p0Dead && p1Dead) { + round.winner = null; + round.isDraw = true; + roundEnded = true; + } else if (p0Dead) { + round.winner = 1; + roundEnded = true; + } else if (p1Dead) { + round.winner = 0; + roundEnded = true; + } else if (timeout) { + if (p0!.hp > p1!.hp) round.winner = 0; + else if (p1!.hp > p0!.hp) round.winner = 1; + else { round.winner = null; round.isDraw = true; } + roundEnded = true; + } + + if (roundEnded) { + round.phase = RoundPhase.Ended; + if (round.winner !== null) { + round.scores[round.winner]++; + } + state.stomp = null; + state.projectiles = []; + + // Match end check + const [s0, s1] = round.scores; + if (s0! >= ROUNDS_TO_WIN) { + state.matchWinner = 0; + state.matchPhase = MatchPhase.Ended; + } else if (s1! >= ROUNDS_TO_WIN) { + state.matchWinner = 1; + state.matchPhase = MatchPhase.Ended; + } else if (round.roundNumber >= 3) { + // Round 3 played — whoever has more wins takes match + if (s0! > s1!) state.matchWinner = 0; + else if (s1! > s0!) state.matchWinner = 1; + else state.matchWinner = null; // draw + state.matchPhase = MatchPhase.Ended; + } else { + // Queue next round + state.matchPhase = MatchPhase.Intermission; + state.intermissionTick = INTERMISSION_TICKS; + } + } + } + + return state; +} + +/** Respawn players and reset arena for the next round. */ +function startNextRound(state: GameState, map: MapData): void { + const [spawn0, spawn1] = map.spawnPoints; + state.round.roundNumber++; + state.round.phase = RoundPhase.Spawn; + state.round.tick = 0; + state.round.winner = null; + state.round.isDraw = false; + state.matchPhase = MatchPhase.Playing; + + const [p0, p1] = state.players; + resetPlayer(p0!, 0, spawn0!.x, spawn0!.y); + resetPlayer(p1!, 1, spawn1!.x, spawn1!.y); + + state.projectiles = []; + state.pickups = createInitialPickups(map); + state.stomp = null; + state.arena = { leftWall: 0, rightWall: ARENA_W, shrinkActive: false }; +} + +function resetPlayer(p: PlayerState, index: 0 | 1, x: number, y: number): void { + p.x = x; + p.y = y - 32; + p.vx = 0; + p.vy = 0; + p.hp = MAX_HP; + p.alive = true; + p.grounded = false; + p.wallContact = 0; + p.doubleJumpAvailable = false; + p.weapon = WeaponType.Pistol; + p.weaponCooldown = 0; + p.stompImmunity = 0; + p.deathLingerTimer = 0; + p.animState = 'idle'; + p.facing = (index === 0 ? 1 : -1) as 1 | -1; +} + +import { WEAPON_STATS } from './constants.js'; +function WEAPON_STATS_COOLDOWN(weapon: WeaponType): number { + return WEAPON_STATS[weapon].cooldown; +} diff --git a/packages/sim/src/stomp.ts b/packages/sim/src/stomp.ts new file mode 100644 index 0000000..7c477d4 --- /dev/null +++ b/packages/sim/src/stomp.ts @@ -0,0 +1,105 @@ +import { GameState, PlayerState, StompState } from './types.js'; +import { + PLAYER_W, PLAYER_H, + STOMP_FEET_H, STOMP_HEAD_H, STOMP_DAMAGE_INTERVAL, + STOMP_MAX_DAMAGE, STOMP_ESCAPE_PER_PRESS, STOMP_ESCAPE_DECAY, + STOMP_ESCAPE_THRESHOLD, STOMP_ESCAPE_ATTACKER_VY, STOMP_ESCAPE_VICTIM_VX, + STOMP_IMMUNITY_TICKS, +} from './constants.js'; +import { InputState } from './types.js'; + +/** Try to initiate a stomp if conditions are met. */ +export function checkStompInitiation( + attacker: PlayerState, + victim: PlayerState, +): boolean { + if (!attacker.alive || !victim.alive) return false; + if (victim.stompImmunity > 0) return false; + if (attacker.vy <= 0) return false; // must be falling + + // Attacker feet bottom 4px + const feetTop = attacker.y + PLAYER_H - STOMP_FEET_H; + const feetBottom = attacker.y + PLAYER_H; + const feetLeft = attacker.x; + const feetRight = attacker.x + PLAYER_W; + + // Victim head top 8px + const headTop = victim.y; + const headBottom = victim.y + STOMP_HEAD_H; + const headLeft = victim.x; + const headRight = victim.x + PLAYER_W; + + const xOverlap = feetLeft < headRight && feetRight > headLeft; + const yOverlap = feetTop < headBottom && feetBottom > headTop; + + return xOverlap && yOverlap; +} + +/** + * Update an active stomp for one tick. + * Mutates state.stomp, attacker, victim. + */ +export function updateStomp( + state: GameState, + attackerInput: InputState, + prevAttackerInput: InputState, + victimInput: InputState, + prevVictimInput: InputState, +): void { + const stomp = state.stomp!; + const attacker = state.players[stomp.attackerIndex]!; + const victim = state.players[stomp.victimIndex]!; + + if (!attacker.alive || !victim.alive) { + state.stomp = null; + return; + } + + // Lock attacker on top of victim's head + attacker.x = victim.x; + attacker.y = victim.y - PLAYER_H; + attacker.vx = 0; + attacker.vy = 0; + + // Deal damage every STOMP_DAMAGE_INTERVAL ticks + const tick = state.round.tick; + if (tick % STOMP_DAMAGE_INTERVAL === 0 && stomp.damage < STOMP_MAX_DAMAGE) { + victim.hp = Math.max(0, victim.hp - 1); + stomp.damage += 1; + } + + // Victim auto-run is handled externally (step.ts seeds PRNG for direction) + + // Escape detection: alternating LEFT/RIGHT presses + const leftEdge = victimInput.left && !prevVictimInput.left; + const rightEdge = victimInput.right && !prevVictimInput.right; + + if (leftEdge && stomp.prevEscapeLeft === false) { + stomp.escapeMeter = Math.min(STOMP_ESCAPE_THRESHOLD, stomp.escapeMeter + STOMP_ESCAPE_PER_PRESS); + stomp.prevEscapeLeft = true; + stomp.prevEscapeRight = false; + } else if (rightEdge && stomp.prevEscapeRight === false) { + stomp.escapeMeter = Math.min(STOMP_ESCAPE_THRESHOLD, stomp.escapeMeter + STOMP_ESCAPE_PER_PRESS); + stomp.prevEscapeRight = true; + stomp.prevEscapeLeft = false; + } + + // Decay escape meter + stomp.escapeMeter = Math.max(0, stomp.escapeMeter - STOMP_ESCAPE_DECAY); + + // Check escape + if (stomp.escapeMeter >= STOMP_ESCAPE_THRESHOLD || stomp.damage >= STOMP_MAX_DAMAGE) { + // Escape: push apart + attacker.vy = STOMP_ESCAPE_ATTACKER_VY; + attacker.vx = 0; + + const victimDir = attacker.x < victim.x ? 1 : -1; + victim.vx = victimDir * STOMP_ESCAPE_VICTIM_VX; + + victim.stompImmunity = STOMP_IMMUNITY_TICKS; + state.stomp = null; + } + + // Update attacker animation + attacker.animState = 'stomp'; +} diff --git a/packages/sim/src/types.ts b/packages/sim/src/types.ts new file mode 100644 index 0000000..169857e --- /dev/null +++ b/packages/sim/src/types.ts @@ -0,0 +1,124 @@ +// All canonical game state types shared between client and server. + +export enum WeaponType { + Pistol = 'pistol', + Shotgun = 'shotgun', + Sniper = 'sniper', + Rocket = 'rocket', + SMG = 'smg', +} + +export enum RoundPhase { + Spawn = 'spawn', // 60-tick movement freeze at round start + Fight = 'fight', // Normal gameplay + Shrink = 'shrink', // Arena walls closing + Ended = 'ended', // Round over, freeze frame +} + +export enum MatchPhase { + Lobby = 'lobby', + Countdown = 'countdown', // 3-second pre-match countdown + Playing = 'playing', + Intermission = 'intermission', // 2-second between rounds + Ended = 'ended', +} + +export interface AABB { + x: number; + y: number; + w: number; + h: number; +} + +export interface InputState { + left: boolean; + right: boolean; + jump: boolean; + shoot: boolean; + interact: boolean; + aimAngle: number; // radians +} + +export interface StompState { + active: boolean; + attackerIndex: number; + victimIndex: number; + damage: number; // total damage dealt this stomp session + escapeMeter: number; // 0–100 + prevEscapeLeft: boolean; + prevEscapeRight: boolean; +} + +export interface PlayerState { + id: string; + index: number; // 0 or 1 + x: number; + y: number; + vx: number; + vy: number; + facing: 1 | -1; // 1 = right, -1 = left + hp: number; + alive: boolean; + grounded: boolean; + wallContact: 0 | -1 | 1; // 0=none, -1=left wall, 1=right wall + doubleJumpAvailable: boolean; + weapon: WeaponType; + weaponCooldown: number; // ticks remaining + stompImmunity: number; // ticks remaining + deathLingerTimer: number; + aimAngle: number; // radians, updated from input each tick + // Animation state (for client rendering) + animState: 'idle' | 'run' | 'jump' | 'fall' | 'wall-slide' | 'shoot' | 'stomp' | 'death'; +} + +export interface ProjectileState { + id: number; + ownerIndex: number; + weapon: WeaponType; + x: number; + y: number; + vx: number; + vy: number; + lifetime: number; // ticks remaining + isSplash?: boolean; // internal flag for rocket splash zone +} + +export interface WeaponPickupState { + id: number; + x: number; + y: number; + weapon: WeaponType; + respawnTimer: number; // 0 = active, >0 = waiting to respawn + rotationIndex: number; // index into WEAPON_ROTATION +} + +export interface ArenaState { + leftWall: number; // x coordinate of left kill wall + rightWall: number; // x coordinate of right kill wall + shrinkActive: boolean; +} + +export interface RoundState { + roundNumber: number; // 1, 2, or 3 + phase: RoundPhase; + tick: number; // ticks elapsed this round + winner: number | null; // player index or null + isDraw: boolean; + scores: [number, number]; // round wins per player +} + +export interface GameState { + matchPhase: MatchPhase; + matchTick: number; // total ticks since match start + countdownTick: number; // for pre-match countdown (180 ticks = 3s) + intermissionTick: number; + round: RoundState; + players: [PlayerState, PlayerState]; + projectiles: ProjectileState[]; + pickups: WeaponPickupState[]; + arena: ArenaState; + prngState: number; // Mulberry32 state + nextProjectileId: number; + stomp: StompState | null; + matchWinner: number | null; // player index +} diff --git a/packages/sim/src/weapons.ts b/packages/sim/src/weapons.ts new file mode 100644 index 0000000..820a08f --- /dev/null +++ b/packages/sim/src/weapons.ts @@ -0,0 +1,137 @@ +import { PlayerState, ProjectileState, WeaponPickupState, WeaponType, GameState } from './types.js'; +import { + WEAPON_STATS, PICKUP_W, PICKUP_H, PICKUP_RESPAWN_TICKS, + WEAPON_ROTATION, PLAYER_W, PLAYER_H, +} from './constants.js'; +import { prngNext } from './prng.js'; +import { aabbOverlap } from './physics.js'; + +/** Fire weapon for a player. Returns new projectile(s) and updated prng state. */ +export function fireWeapon( + player: PlayerState, + nextId: number, + prngState: number, +): { projectiles: ProjectileState[]; nextId: number; prngState: number } { + if (player.weaponCooldown > 0 || !player.alive) { + return { projectiles: [], nextId, prngState }; + } + + const stats = WEAPON_STATS[player.weapon]; + const muzzleX = player.x + PLAYER_W / 2; + const muzzleY = player.y + PLAYER_H / 2; + const angle = player.aimAngle ?? 0; + const results: ProjectileState[] = []; + + if (player.weapon === WeaponType.Shotgun) { + const spreadRad = ((stats.spreadDeg ?? 30) * Math.PI) / 180; + const pellets = stats.pellets ?? 6; + for (let i = 0; i < pellets; i++) { + let rand: number; + [rand, prngState] = prngNext(prngState); + // Spread evenly across cone, jitter with PRNG + const baseAngle = angle - spreadRad / 2 + (spreadRad / (pellets - 1)) * i; + const jitter = (rand - 0.5) * (spreadRad / pellets); + const a = baseAngle + jitter; + results.push({ + id: nextId++, + ownerIndex: player.index, + weapon: player.weapon, + x: muzzleX, + y: muzzleY, + vx: Math.cos(a) * stats.projectileSpeed, + vy: Math.sin(a) * stats.projectileSpeed, + lifetime: stats.lifetime, + }); + } + } else if (player.weapon === WeaponType.SMG) { + let rand: number; + [rand, prngState] = prngNext(prngState); + const spread = stats.spreadRad ?? 0; + const a = angle + (rand - 0.5) * 2 * spread; + results.push({ + id: nextId++, + ownerIndex: player.index, + weapon: player.weapon, + x: muzzleX, + y: muzzleY, + vx: Math.cos(a) * stats.projectileSpeed, + vy: Math.sin(a) * stats.projectileSpeed, + lifetime: stats.lifetime, + }); + } else { + // Pistol, Sniper, Rocket — single projectile + results.push({ + id: nextId++, + ownerIndex: player.index, + weapon: player.weapon, + x: muzzleX, + y: muzzleY, + vx: Math.cos(angle) * stats.projectileSpeed, + vy: Math.sin(angle) * stats.projectileSpeed, + lifetime: stats.lifetime, + }); + } + + return { projectiles: results, nextId, prngState }; +} + +/** Check if a player's AABB overlaps a pickup. Returns pickup index or -1. */ +function pickupAABB(p: WeaponPickupState) { + return { x: p.x - PICKUP_W / 2, y: p.y - PICKUP_H / 2, w: PICKUP_W, h: PICKUP_H }; +} + +/** + * Process weapon pickups for all players. + * Mutates pickups and player weapons. + * Returns updated prng (not used here but kept for API consistency). + */ +export function updatePickups(state: GameState): void { + const { players, pickups } = state; + + // Decrement respawn timers + for (const pickup of pickups) { + if (pickup.respawnTimer > 0) { + pickup.respawnTimer--; + if (pickup.respawnTimer === 0) { + // Advance rotation + pickup.rotationIndex = (pickup.rotationIndex + 1) % WEAPON_ROTATION.length; + pickup.weapon = WEAPON_ROTATION[pickup.rotationIndex] as WeaponType; + } + } + } + + // Check pickups against arena shrink — destroy pickups outside arena walls + for (const pickup of pickups) { + if (pickup.respawnTimer === 0) { + if (pickup.x < state.arena.leftWall || pickup.x > state.arena.rightWall) { + // Schedule respawn but don't grant to anyone + pickup.respawnTimer = PICKUP_RESPAWN_TICKS; + } + } + } + + // Check player–pickup collisions + for (const pickup of pickups) { + if (pickup.respawnTimer > 0) continue; + + const pAABB = pickupAABB(pickup); + let pickedBy = -1; + + for (const player of players) { + if (!player.alive) continue; + const playerBox = { x: player.x, y: player.y, w: PLAYER_W, h: PLAYER_H }; + if (aabbOverlap(playerBox, pAABB)) { + // Deterministic tie-break: lower index wins + if (pickedBy === -1 || player.index < pickedBy) { + pickedBy = player.index; + } + } + } + + if (pickedBy !== -1) { + players[pickedBy]!.weapon = pickup.weapon; + players[pickedBy]!.weaponCooldown = 0; + pickup.respawnTimer = PICKUP_RESPAWN_TICKS; + } + } +} diff --git a/packages/sim/tsconfig.json b/packages/sim/tsconfig.json new file mode 100644 index 0000000..d597156 --- /dev/null +++ b/packages/sim/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..e8e2521 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,12737 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +packageExtensionsChecksum: sha256-fjqreq4qIHe+Er6fGfd81jLx+tKSwMHjrpG5hmzFtao= + +importers: + + .: + devDependencies: + concurrently: + specifier: ^9.1.2 + version: 9.2.1 + typescript: + specifier: ^5.7.3 + version: 5.9.3 + + apps/client: + dependencies: + '@arena/sim': + specifier: workspace:* + version: link:../../packages/sim + '@initia/initia.js': + specifier: ^1.1.0 + version: 1.1.0(bufferutil@4.1.0)(google-protobuf@3.21.4)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@initia/initia.proto': + specifier: ^1.0.5 + version: 1.0.5(google-protobuf@3.21.4) + '@initia/interwovenkit-react': + specifier: ^2.5.1 + version: 2.5.1(32ad9665753c869066f58845991d7334) + '@tanstack/react-query': + specifier: ^5.96.1 + version: 5.96.1(react@19.2.4) + buffer: + specifier: ^6.0.3 + version: 6.0.3 + colyseus.js: + specifier: ^0.15.0 + version: 0.15.28(bufferutil@4.1.0)(utf-8-validate@5.0.10) + nanoid: + specifier: ^5 + version: 5.1.7 + phaser: + specifier: ^3.87.0 + version: 3.90.0 + react: + specifier: ^19.1.0 + version: 19.2.4 + react-dom: + specifier: ^19.1.0 + version: 19.2.4(react@19.2.4) + react-router-dom: + specifier: ^7.5.1 + version: 7.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + util: + specifier: ^0.12.5 + version: 0.12.5 + wagmi: + specifier: ^2.17.2 + version: 2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + devDependencies: + '@types/react': + specifier: ^19.1.2 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.1.2 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.7.0(vite@6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + typescript: + specifier: ^5.7.3 + version: 5.9.3 + vite: + specifier: ^6.3.2 + version: 6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite-plugin-node-polyfills: + specifier: ^0.26.0 + version: 0.26.0(rollup@4.60.1)(vite@6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + + packages/sim: + devDependencies: + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.19.15) + ts-jest: + specifier: ^29.2.5 + version: 29.4.9(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.15))(typescript@5.9.3) + typescript: + specifier: ^5.7.3 + version: 5.9.3 + + services/server: + dependencies: + '@arena/sim': + specifier: workspace:* + version: link:../../packages/sim + '@colyseus/ws-transport': + specifier: ^0.15.0 + version: 0.15.3(@colyseus/core@0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10))(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@noble/ed25519': + specifier: ^3.0.1 + version: 3.0.1 + colyseus: + specifier: ^0.15.0 + version: 0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(express@4.22.1)(utf-8-validate@5.0.10) + express: + specifier: ^4.21.2 + version: 4.22.1 + uuid: + specifier: ^13.0.0 + version: 13.0.0 + devDependencies: + '@types/express': + specifier: ^5.0.1 + version: 5.0.6 + '@types/node': + specifier: ^22.14.1 + version: 22.19.15 + tsx: + specifier: ^4.19.3 + version: 4.21.0 + typescript: + specifier: ^5.7.3 + version: 5.9.3 + +packages: + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + + '@amplitude/analytics-browser@2.36.9': + resolution: {integrity: sha512-Jnuvh1yArD3RfSRClYm9j/c+ToLJfnS85G14KDzFAjaQ6FpuEPjeDH+b4YUK1D22XIy4BskHyOw5s11D36QLyA==} + + '@amplitude/analytics-connector@1.6.4': + resolution: {integrity: sha512-SpIv0IQMNIq6SH3UqFGiaZyGSc7PBZwRdq7lvP0pBxW8i4Ny+8zwI0pV+VMfMHQwWY3wdIbWw5WQphNjpdq1/Q==} + + '@amplitude/analytics-core@2.42.0': + resolution: {integrity: sha512-LupBwVGlWhYb6OHSqifh8Jm9rDRNDdCZuqpjv11OmaaIW2rmPbu5JQcKmJoeqolb4+BmdkPAm/Vz7VNjlJAcqA==} + + '@amplitude/plugin-autocapture-browser@1.24.0': + resolution: {integrity: sha512-H9CSIj7OM7mPOpCATtCtpXX2iKQFA11ALkRgnTfyx+75BQ9YF3622ncg5kI9kO+RW87gPGQL5l7A5Er+q1tNyA==} + + '@amplitude/plugin-network-capture-browser@1.9.8': + resolution: {integrity: sha512-zin6jYMdwveOgYHiY7yCfo4/j/dCjlP/VK5AD/uTYiRewiDMPVm077WTqHgaswZGgxT7DL0BxdIrJ2l27S1daw==} + + '@amplitude/plugin-page-url-enrichment-browser@0.6.12': + resolution: {integrity: sha512-pyYk+nfHvDfr+ovw/BsK8GpwvyLWiBq01TWjAXef+gN+wa5CAIg/mHvAAdT+x90uRbzKV20TyaKhYd4tw65MKA==} + + '@amplitude/plugin-page-view-tracking-browser@2.9.0': + resolution: {integrity: sha512-PdG6ogdJA/XldHh1IgnsWTyCGseiHjBUXxMrMjY+MAfIyjtQZcGzNaaj237BG3ArsUa2YHxEpIGz5Uj68bQAlw==} + + '@amplitude/plugin-web-vitals-browser@1.1.23': + resolution: {integrity: sha512-fKqprLoOd08yxYQ0Ugl9WIRJPlZVk5t/mGxxqrWvr5umlW2iuxBDOZP+AlBdPs4ZFze767baAS/KDibZPfrffg==} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@base-org/account@1.1.1': + resolution: {integrity: sha512-IfVJPrDPhHfqXRDb89472hXkpvJuQQR7FDI9isLPHEqSYt/45whIoBxSPgZ0ssTt379VhQo4+87PWI1DoLSfAQ==} + + '@base-ui/react@1.0.0': + resolution: {integrity: sha512-4USBWz++DUSLTuIYpbYkSgy1F9ZmNG9S/lXvlUN6qMK0P0RlW+6eQmDUB4DgZ7HVvtXl4pvi4z5J2fv6Z3+9hg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + + '@base-ui/utils@0.2.3': + resolution: {integrity: sha512-/CguQ2PDaOzeVOkllQR8nocJ0FFIDqsWIcURsVmm53QGo8NhFNpePjNlyPIB41luxfOqnG7PU0xicMEw3ls7XQ==} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@bitcoinerlab/secp256k1@1.2.0': + resolution: {integrity: sha512-jeujZSzb3JOZfmJYI0ph1PVpCRV5oaexCgy+RvCXV8XlY+XFB/2n3WOcvBsKLsOw78KYgnQrQWb2HrKE4be88Q==} + + '@bufbuild/protobuf@2.11.0': + resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} + + '@coinbase/wallet-sdk@3.9.3': + resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} + + '@coinbase/wallet-sdk@4.3.6': + resolution: {integrity: sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==} + + '@colyseus/auth@0.15.12': + resolution: {integrity: sha512-veq2A+J7JA6EJVIyd2TBuO3SMEnaEhj9f6UdAL8qicPLjJ6JQH+An5C85zob7KuNXrmAMKfHUjUGpLH+ET6oWA==} + engines: {node: '>= 14.x'} + peerDependencies: + '@colyseus/core': 0.15.x + express: ^4.17.1 + + '@colyseus/core@0.15.57': + resolution: {integrity: sha512-tAKNaFSFOpRH2ayLva9hQBVPQu0eKxDxaZJYugZMQ5i6yQ2RTvcbk/5Up7OZn/bfdk9THvBYnh6WfdZAOctK+g==} + engines: {node: '>= 14.x'} + peerDependencies: + '@colyseus/schema': ^2.0.4 + + '@colyseus/greeting-banner@2.0.6': + resolution: {integrity: sha512-65nK7KnJn6g3ArtJqNfVX+Mx7xTlBka04kSwloLP7s24UpCEaK7bMGRLgkzfnysARzlVh1eV4jynBWZN82dYwQ==} + + '@colyseus/redis-driver@0.15.6': + resolution: {integrity: sha512-nLNb1/e0KcK3wgVX1DQdC+bV86BIJWlVtxDrQW23aED+4ih6fIr0Iwfre3DlSke+DXa8oGwp5n3/s7A62q/4gQ==} + + '@colyseus/redis-presence@0.15.6': + resolution: {integrity: sha512-hz/3/BWHo9j76oxEFLphhbom0qDjwZ9uM++/JFxYL3qlkwPqqth1lG6NI+O20JqIxnj57J0zNbsBPRjFzRSXQw==} + + '@colyseus/schema@2.0.37': + resolution: {integrity: sha512-+WXEux9DMSaTz9hZKabl6LBuzsxzt9EvOwhXJ/G4rPCaaVkJ+iLxRsq8VbL2ZCx18E/uQH6nLaNIQVqH9wEt8w==} + hasBin: true + + '@colyseus/ws-transport@0.15.3': + resolution: {integrity: sha512-wm1AT1d6esUnZt1sUvrPcq9hkDBhZKZiB+fHCZEaPw3QDtG9slbOaZZ9Evr2DlxUUAaHU0H2qV3kchBYyL68UQ==} + peerDependencies: + '@colyseus/core': 0.15.x + '@colyseus/schema': '>=1.0.0' + + '@cosmjs/amino@0.38.1': + resolution: {integrity: sha512-WaThDpq2JwUyKuazq08Xa+FHzQ3jh1HcYnGL4xsyfqFwOlAvnl0EDvSSz9WSwz1oopIxFE9Qtf3OUKOlxBZbYA==} + + '@cosmjs/cosmwasm-stargate@0.38.1': + resolution: {integrity: sha512-uiDaN1FHjcOYfStv6fuTp2g7F7ktwjlUdbVyNtOnaG/NO77s4vGOdITz5iJRJocaDUUwKAJT3pEdlzWVrAA0Rg==} + + '@cosmjs/cosmwasm@0.38.1': + resolution: {integrity: sha512-HeGBMV9IjSCr6r0LzJshJq1SH+Ryot496g/dmHBA41p95NMY8H103qfVOmpH/7XkVs9oRlGKHl4xxMBnNlW6jA==} + + '@cosmjs/crypto@0.38.1': + resolution: {integrity: sha512-r1KQCjKAdMga2aZ/nkgULRF4fisPZMF6ErucVsMmkASBgDl0k9/vD9K9fHUdGClMv0oOYEfwOT/UTBR7K2OuYA==} + + '@cosmjs/encoding@0.38.1': + resolution: {integrity: sha512-i5jGgJhiXs7boePGA48xzYxnCbf3MS5nT/R2HvnvSQyVAG2A99NyL96lBgmz6etOJSGOiwVrB8uh1Qp5bq6WKQ==} + + '@cosmjs/json-rpc@0.38.1': + resolution: {integrity: sha512-h+ejJeh+Men8upheRcIETGLAGhsGzIQW03BFvCsCenQOoewpxnbxN1mjfLE7M8UtOTNUsb0uQ1yEnhaTKPTRPg==} + + '@cosmjs/math@0.38.1': + resolution: {integrity: sha512-MBk7p6kPNULi0TusD8O3xoBskFIkRzOtpmnea3sXbTVnguX7epNPVDITXM4tlsg8kAQrEOEIA0g5zAJxzH3Ikw==} + + '@cosmjs/proto-signing@0.38.1': + resolution: {integrity: sha512-J7jELTwk39wYAZUan48eTLBKzx3/max1NIQSlaerdrUkIqhk9ZzC2+p94RnlFUBkvsWZ4ORbhNLYPjwuf2oM0g==} + + '@cosmjs/socket@0.38.1': + resolution: {integrity: sha512-r58RplrHOoO9oDCPiFZu+oBTgeTqE6/HMW+JSAko2Dyv3AocdPhBV16SJQriumGxVRmFUdcczkK2L+6OwngoOA==} + + '@cosmjs/stargate@0.38.1': + resolution: {integrity: sha512-HxLMJxvjN8neJcN382ir1X+nrsmfYYzJ9RpibEOgzN50Ir3D1qW1q6pumjCZb4s834iB0FOlMA1F0LIklaRong==} + + '@cosmjs/stream@0.38.1': + resolution: {integrity: sha512-YIruJ6XfPQooMZzy7fTMx1/JnAMgiGMg785Zxja+RntbxrsHyWYUdWGi9ji8uOHEgZNYErHlK2NnbF8VlCo1ew==} + + '@cosmjs/tendermint-rpc@0.38.1': + resolution: {integrity: sha512-yoGfI1wcw986qqCJkD544HXB4YxVOvne5s1RZkO437RtgvpLgVVdTBvCB1JcgLDw25gpHMFe1dWe5Sn9LPzQxA==} + + '@cosmjs/utils@0.38.1': + resolution: {integrity: sha512-ccQ5in6IvsQ+o/SstUdQH1jCJ2+MkJPZK7A/EYwMAFcjV8vzOgJ97LVy6AT24nwdi0/iVa2nbAG+fitUEsgLcA==} + + '@ecies/ciphers@0.2.6': + resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} + engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@gamestdio/clock@1.1.9': + resolution: {integrity: sha512-O+PG3aRRytgX2BhAPMIhbM2ftq1Q8G4xUrYjEWYM6EmpoKn8oY4lXENGhpgfww6mQxHPbjfWyIAR6Xj3y1+avw==} + + '@gamestdio/timer@1.4.2': + resolution: {integrity: sha512-WNciVCKSJzY56CM95TCVf+dtWShWNFUdziY1Qc+2gaqNCRbC3Egqzq9zumGRrV92Ym9GL6znkqTzF2AoAdydNw==} + + '@gemini-wallet/core@0.2.0': + resolution: {integrity: sha512-vv9aozWnKrrPWQ3vIFcWk7yta4hQW1Ie0fsNNPeXnjAxkbXr2hqMagEptLuMxpEP2W3mnRu05VDNKzcvAuuZDw==} + peerDependencies: + viem: '>=2.0.0' + + '@improbable-eng/grpc-web@0.15.0': + resolution: {integrity: sha512-ERft9/0/8CmYalqOVnJnpdDry28q+j+nAlFFARdjyxXDJ+Mhgv9+F600QC8BR9ygOfrXRlAk6CvST2j+JCpQPg==} + peerDependencies: + google-protobuf: ^3.14.0 + + '@initia/amino-converter@1.0.18': + resolution: {integrity: sha512-+rjdEPv7Zsp+6PCY1U0uD5AP3GCbrWs8ro2TuW5+vUWUSwnrwNEXxQiYAwO3MYC8zHwTvcnYbMqtYpa9bMthtQ==} + peerDependencies: + '@cosmjs/cosmwasm-stargate': '>=0.36.0' + '@cosmjs/proto-signing': '>=0.36.0' + '@cosmjs/stargate': '>=0.36.0' + '@initia/initia.proto': '>=1.0.0' + '@initia/opinit.proto': '>=1.0.0' + + '@initia/icons-react@2.1.0': + resolution: {integrity: sha512-lNJOHVYn1GxNsDqcgT0GHc79wGo7BfVBumv41qtzqB81KIa+6LqH0ac2bU8SzVvg5lNwutKwJfkMvRw66o1RJw==} + peerDependencies: + react: '>= 16' + + '@initia/initia.js@1.1.0': + resolution: {integrity: sha512-AQe7EmjupQH+UNgwbO3xGrcO5Vj+KZTOKvG0iX9wW9lQ1AOKt0DdBXhrFeTIsWhTPdN2t3D9hIsjdfKub8e1/Q==} + engines: {node: '>=20'} + + '@initia/initia.proto@1.0.5': + resolution: {integrity: sha512-C54cbjl9kvhfNC++uj1Ys7PTDem+qF9aYG9enI7MWRZzqubjG7t10z9lzT9y4WBtKuIQFqsII+x0Bncss5vp9Q==} + + '@initia/interwovenkit-react@2.5.1': + resolution: {integrity: sha512-gW2XORroy8kvaIZD1n+FcVSj5Wo8cNPiRTkLyIfbtG4BACkeN3c34ClVFLXOJXICnewL2WaGYpWTcZVXYCRKOQ==} + peerDependencies: + '@amplitude/analytics-browser': '>=2.0.0' + '@base-ui/react': 1.0.0 + '@cosmjs/amino': 0.36.x + '@cosmjs/crypto': 0.36.x + '@cosmjs/encoding': 0.36.x + '@cosmjs/math': 0.36.x + '@cosmjs/proto-signing': 0.36.x + '@cosmjs/stargate': 0.36.x + '@cosmjs/tendermint-rpc': 0.36.x + '@initia/amino-converter': '>=1.0.0' + '@initia/icons-react': '>=2.1.0' + '@initia/opinit.proto': '>=1.0.3' + '@initia/utils': 2.0.0 + '@lukemorales/query-key-factory': '>=1.0.0' + '@mysten/bcs': 1.8.0 + '@noble/hashes': 1.x + '@privy-io/cross-app-connect': 0.2.3 + '@rainbow-me/rainbowkit': '>=2.0.0' + '@react-spring/web': '>=10.0.0' + '@tanstack/react-query': '>=5.0.0' + bignumber.js: '>=9.0.0' + change-case: '>=5.0.0' + clsx: '>=2.0.0' + cosmjs-types: '>=0.10.0' + date-fns: '>=4.0.0' + ethers: '>=6.0.0' + jotai: '>=2.0.0' + ky: '>=1.0.0' + nanoid: '>=5.0.0' + psl: '>=1.15.0' + qr-code-styling: '>=1.0.0' + radix-ui: '>=1.0.0' + ramda: '>=0.31.0' + react: '>=19.2.0' + react-dom: '>=19.2.0' + react-error-boundary: '>=6.0.0' + react-hook-form: '>=7.0.0' + react-intersection-observer: '>=9.0.0' + react-merge-refs: '>=3.0.0' + usehooks-ts: '>=3.0.0' + viem: '>=2.0.0' + wagmi: 2.17.2 + xss: '>=1.0.0' + + '@initia/opinit.proto@1.0.3': + resolution: {integrity: sha512-GxFlNsk4V2+drjsXFWTccQSv0+Ho77V9fmsKpLpzXONVHpkP50XcXdWKVRayys/D7gxTcOwvaXSWuj5maA814g==} + + '@initia/utils@2.0.0': + resolution: {integrity: sha512-JOLTHxt3OAVwqUFCPdBgwToYGj3ycHuR66xtn+lvuNfB6ers5CaOiH3U1DN3TJSXOxin9fcXcg4N3StAtc6deQ==} + peerDependencies: + '@cosmjs/encoding': '>=0.34.0' + '@mysten/bcs': '>=1.0.0' + '@noble/hashes': '>=1.0.0' + bignumber.js: '>=9.0.0' + ky: '>=1.0.0' + viem: '>=2.0.0' + + '@ioredis/commands@1.5.1': + resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==} + + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/create-cache-key-function@29.7.0': + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@lit-labs/ssr-dom-shim@1.5.1': + resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + + '@lukemorales/query-key-factory@1.3.4': + resolution: {integrity: sha512-A3frRDdkmaNNQi6mxIshsDk4chRXWoXa05US8fBo4kci/H+lVmujS6QrwQLLGIkNIRFGjMqp2uKjC4XsLdydRw==} + engines: {node: '>=14'} + peerDependencies: + '@tanstack/query-core': '>= 4.0.0' + '@tanstack/react-query': '>= 4.0.0' + + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} + + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + + '@metamask/rpc-errors@7.0.2': + resolution: {integrity: sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==} + engines: {node: ^18.20 || ^20.17 || >=22} + + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + '@metamask/safe-event-emitter@3.1.2': + resolution: {integrity: sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==} + engines: {node: '>=12.0.0'} + + '@metamask/sdk-analytics@0.0.5': + resolution: {integrity: sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ==} + deprecated: No longer maintained, superseded by @metamask/connect-analytics + + '@metamask/sdk-communication-layer@0.33.1': + resolution: {integrity: sha512-0bI9hkysxcfbZ/lk0T2+aKVo1j0ynQVTuB3sJ5ssPWlz+Z3VwveCkP1O7EVu1tsVVCb0YV5WxK9zmURu2FIiaA==} + deprecated: No longer maintained, superseded by https://docs.metamask.io/metamask-connect + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + + '@metamask/sdk-install-modal-web@0.32.1': + resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} + deprecated: No longer maintained, superseded by https://docs.metamask.io/metamask-connect + + '@metamask/sdk@0.33.1': + resolution: {integrity: sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==} + deprecated: No longer maintained, superseded by https://docs.metamask.io/metamask-connect + + '@metamask/superstruct@3.2.1': + resolution: {integrity: sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@11.11.0': + resolution: {integrity: sha512-0nF2CWjWQr/m0Y2t2lJnBTU1/CZPPTvKvcESLplyWe/tyeb8zFOi/FeneDmaFnML6LYRIGZU6f+xR0jKAIUZfw==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@mysten/bcs@1.9.2': + resolution: {integrity: sha512-kBk5xrxV9OWR7i+JhL/plQrgQ2/KJhB2pB5gj+w6GXhbMQwS3DPpOvi/zN0Tj84jwPvHMllpEl0QHj6ywN7/eQ==} + + '@mysten/utils@0.2.0': + resolution: {integrity: sha512-CM6kJcJHX365cK6aXfFRLBiuyXc5WSBHQ43t94jqlCAIRw8umgNcTb5EnEA9n31wPAQgLDGgbG/rCUISCTJ66w==} + + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ed25519@3.0.1': + resolution: {integrity: sha512-t/T8LuK0ym8ALQudCCQCtrRdMSxBnRgHXw+wg+YsSlE6d+on7sX3flqlSJ2mOs9xEuchM36kj9SuX5MG7pXQMA==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@paulmillr/qr@0.2.1': + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + deprecated: 'The package is now available as "qr": npm install qr' + + '@privy-io/cross-app-connect@0.2.3': + resolution: {integrity: sha512-pMYiC0UKMb6Y7sRfNh/VGh7uGhziMyOfbhcikqx+iBNeoqgLTI/+CI+w0nqqNaTGCOM8mUOvqxuENlq9WFafNQ==} + peerDependencies: + '@rainbow-me/rainbowkit': ^2.2.3 + '@wagmi/core': ^2.16.4 + viem: ^2.22.23 + peerDependenciesMeta: + '@rainbow-me/rainbowkit': + optional: true + '@wagmi/core': + optional: true + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-accessible-icon@1.1.7': + resolution: {integrity: sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-accordion@1.2.12': + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-alert-dialog@1.1.15': + resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.7': + resolution: {integrity: sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.1.10': + resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.3.3': + resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.16': + resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-form@0.1.8': + resolution: {integrity: sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.15': + resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.7': + resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menubar@1.1.16': + resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.14': + resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-one-time-password-field@0.1.8': + resolution: {integrity: sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-password-toggle-field@0.1.3': + resolution: {integrity: sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.7': + resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.3.8': + resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.7': + resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.3.6': + resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.2.6': + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toast@1.2.15': + resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle-group@1.1.11': + resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.10': + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toolbar@1.1.11': + resolution: {integrity: sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-is-hydrated@0.1.0': + resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rainbow-me/rainbowkit@2.2.10': + resolution: {integrity: sha512-8+E4die1A2ovN9t3lWxWnwqTGEdFqThXDQRj+E4eDKuUKyymYD+66Gzm6S9yfg8E95c6hmGlavGUfYPtl1EagA==} + engines: {node: '>=12.4'} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + react-dom: '>=18' + viem: 2.x + wagmi: ^2.9.0 + + '@react-native/assets-registry@0.84.1': + resolution: {integrity: sha512-lAJ6PDZv95FdT9s9uhc9ivhikW1Zwh4j9XdXM7J2l4oUA3t37qfoBmTSDLuPyE3Bi+Xtwa11hJm0BUTT2sc/gg==} + engines: {node: '>= 20.19.4'} + + '@react-native/codegen@0.84.1': + resolution: {integrity: sha512-n1RIU0QAavgCg1uC5+s53arL7/mpM+16IBhJ3nCFSd/iK5tUmCwxQDcIDC703fuXfpub/ZygeSjVN8bcOWn0gA==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.84.1': + resolution: {integrity: sha512-f6a+mJEJ6Joxlt/050TqYUr7uRRbeKnz8lnpL7JajhpsgZLEbkJRjH8HY5QiLcRdUwWFtizml4V+vcO3P4RxoQ==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': '*' + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + + '@react-native/debugger-frontend@0.84.1': + resolution: {integrity: sha512-rUU/Pyh3R5zT0WkVgB+yA6VwOp7HM5Hz4NYE97ajFS07OUIcv8JzBL3MXVdSSjLfldfqOuPEuKUaZcAOwPgabw==} + engines: {node: '>= 20.19.4'} + + '@react-native/debugger-shell@0.84.1': + resolution: {integrity: sha512-LIGhh4q4ette3yW5OzmukNMYwmINYrRGDZqKyTYc/VZyNpblZPw72coXVHXdfpPT6+YlxHqXzn3UjFZpNODGCQ==} + engines: {node: '>= 20.19.4'} + + '@react-native/dev-middleware@0.84.1': + resolution: {integrity: sha512-Z83ra+Gk6ElAhH3XRrv3vwbwCPTb04sPPlNpotxcFZb5LtRQZwT91ZQEXw3GOJCVIFp9EQ/gj8AQbVvtHKOUlQ==} + engines: {node: '>= 20.19.4'} + + '@react-native/gradle-plugin@0.84.1': + resolution: {integrity: sha512-7uVlPBE3uluRNRX4MW7PUJIO1LDBTpAqStKHU7LHH+GRrdZbHsWtOEAX8PiY4GFfBEvG8hEjiuTOqAxMjV+hDg==} + engines: {node: '>= 20.19.4'} + + '@react-native/js-polyfills@0.84.1': + resolution: {integrity: sha512-UsTe2AbUugsfyI7XIHMQq4E7xeC8a6GrYwuK+NohMMMJMxmyM3JkzIk+GB9e2il6ScEQNMJNaj+q+i5za8itxQ==} + engines: {node: '>= 20.19.4'} + + '@react-native/normalize-colors@0.84.1': + resolution: {integrity: sha512-/UPaQ4jl95soXnLDEJ6Cs6lnRXhwbxtT4KbZz+AFDees7prMV2NOLcHfCnzmTabf5Y3oxENMVBL666n4GMLcTA==} + + '@react-native/virtualized-lists@0.84.1': + resolution: {integrity: sha512-sJoDunzhci8ZsqxlUiKoLut4xQeQcmbIgvDHGQKeBz6uEq9HgU+hCWOijMRr6sLP0slQVfBAza34Rq7IbXZZOA==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@types/react': ^19.2.0 + react: '*' + react-native: '*' + peerDependenciesMeta: + '@types/react': + optional: true + + '@react-spring/animated@10.0.3': + resolution: {integrity: sha512-7MrxADV3vaUADn2V9iYhaIL6iOWRx9nCJjYrsk2AHD2kwPr6fg7Pt0v+deX5RnCDmCKNnD6W5fasiyM8D+wzJQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@react-spring/core@10.0.3': + resolution: {integrity: sha512-D4DwNO68oohDf/0HG2G0Uragzb9IA1oXblxrd6MZAcBcUQG2EHUWXewjdECMPLNmQvlYVyyBRH6gPxXM5DX7DQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@react-spring/rafz@10.0.3': + resolution: {integrity: sha512-Ri2/xqt8OnQ2iFKkxKMSF4Nqv0LSWnxXT4jXFzBDsHgeeH/cHxTLupAWUwmV9hAGgmEhBmh5aONtj3J6R/18wg==} + + '@react-spring/shared@10.0.3': + resolution: {integrity: sha512-geCal66nrkaQzUVhPkGomylo+Jpd5VPK8tPMEDevQEfNSWAQP15swHm+MCRG4wVQrQlTi9lOzKzpRoTL3CA84Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@react-spring/types@10.0.3': + resolution: {integrity: sha512-H5Ixkd2OuSIgHtxuHLTt7aJYfhMXKXT/rK32HPD/kSrOB6q6ooeiWAXkBy7L8F3ZxdkBb9ini9zP9UwnEFzWgQ==} + + '@react-spring/web@10.0.3': + resolution: {integrity: sha512-ndU+kWY81rHsT7gTFtCJ6mrVhaJ6grFmgTnENipzmKqot4HGf5smPNK+cZZJqoGeDsj9ZsiWPW4geT/NyD484A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@reown/appkit-common@1.7.8': + resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} + + '@reown/appkit-controllers@1.7.8': + resolution: {integrity: sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==} + + '@reown/appkit-pay@1.7.8': + resolution: {integrity: sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==} + + '@reown/appkit-polyfills@1.7.8': + resolution: {integrity: sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==} + + '@reown/appkit-scaffold-ui@1.7.8': + resolution: {integrity: sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==} + + '@reown/appkit-ui@1.7.8': + resolution: {integrity: sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==} + + '@reown/appkit-utils@1.7.8': + resolution: {integrity: sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==} + peerDependencies: + valtio: 1.13.2 + + '@reown/appkit-wallet@1.7.8': + resolution: {integrity: sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==} + + '@reown/appkit@1.7.8': + resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.60.1': + resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.1': + resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.1': + resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.1': + resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.1': + resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.1': + resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.60.1': + resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.60.1': + resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.60.1': + resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.60.1': + resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.60.1': + resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.60.1': + resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.60.1': + resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.60.1': + resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.60.1': + resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.60.1': + resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.1': + resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.1': + resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.1': + resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.1': + resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.1': + resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + cpu: [x64] + os: [win32] + + '@safe-global/safe-apps-provider@0.18.6': + resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} + + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} + + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} + engines: {node: '>=16'} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/base@2.0.0': + resolution: {integrity: sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@tanstack/query-core@5.96.1': + resolution: {integrity: sha512-u1yBgtavSy+N8wgtW3PiER6UpxcplMje65yXnnVgiHTqiMwLlxiw4WvQDrXyn+UD6lnn8kHaxmerJUzQcV/MMg==} + + '@tanstack/react-query@5.96.1': + resolution: {integrity: sha512-2X7KYK5KKWUKGeWCVcqxXAkYefJtrKB7tSKWgeG++b0H6BRHxQaLSSi8AxcgjmUnnosHuh9WsFZqvE16P1WCzA==} + peerDependencies: + react: ^18 || ^19 + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@5.1.1': + resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + + '@types/lodash@4.17.24': + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.19.15': + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + + '@types/qs@6.15.0': + resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + + '@types/zen-observable@0.8.3': + resolution: {integrity: sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==} + + '@vanilla-extract/css@1.17.3': + resolution: {integrity: sha512-jHivr1UPoJTX5Uel4AZSOwrCf4mO42LcdmnhJtUxZaRWhW4FviFbIfs0moAWWld7GOT+2XnuVZjjA/K32uUnMQ==} + + '@vanilla-extract/dynamic@2.1.4': + resolution: {integrity: sha512-7+Ot7VlP3cIzhJnTsY/kBtNs21s0YD7WI1rKJJKYP56BkbDxi/wrQUWMGEczKPUDkJuFcvbye+E2ub1u/mHH9w==} + + '@vanilla-extract/private@1.0.9': + resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} + + '@vanilla-extract/sprinkles@1.6.4': + resolution: {integrity: sha512-lW3MuIcdIeHKX81DzhTnw68YJdL1ial05exiuvTLJMdHXQLKcVB93AncLPajMM6mUhaVVx5ALZzNHMTrq/U9Hg==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@wagmi/connectors@5.10.2': + resolution: {integrity: sha512-qyXO1poEeJtCIuJGDd5FlmqZ9JHXepDxKxoPAptqHampPLastWPnNZTAH616/ITmysRiNQ4AzeSUcbsNE46uyg==} + peerDependencies: + '@wagmi/core': 2.21.1 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + '@wagmi/core@2.21.1': + resolution: {integrity: sha512-uG0Cujm24acrFYqbi1RGw9MRMLTGVKvyv5OAJT+2pkcasM9PP8eJCzhlvUxK9IYVXXnbaAT8JX/rXEurOSM6mg==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true + + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.21.1': + resolution: {integrity: sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==} + engines: {node: '>=18'} + + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + + '@walletconnect/ethereum-provider@2.21.1': + resolution: {integrity: sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} + + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} + + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@walletconnect/sign-client@2.21.0': + resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.21.1': + resolution: {integrity: sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.21.0': + resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} + + '@walletconnect/types@2.21.1': + resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} + + '@walletconnect/universal-provider@2.21.0': + resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.21.1': + resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} + + '@walletconnect/utils@2.21.1': + resolution: {integrity: sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + + asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.14.0: + resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-syntax-hermes-parser@0.32.0: + resolution: {integrity: sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==} + + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.13: + resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} + engines: {node: '>=6.0.0'} + hasBin: true + + bech32@2.0.0: + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + bip32@5.0.1: + resolution: {integrity: sha512-PWlHIAgYCfVhwqNpZyeakHXuLAGyN6rEQZnhxHxKI3BoFJRVWLl26455fhRlHsmbYcV986HqtPnt33Edu5sTCw==} + engines: {node: '>=18.0.0'} + + bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + + bn.js@4.12.3: + resolution: {integrity: sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==} + + bn.js@5.2.3: + resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} + + body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-headers@0.4.1: + resolution: {integrity: sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==} + + browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.1: + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} + + browserify-sign@4.2.5: + resolution: {integrity: sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==} + engines: {node: '>= 0.10'} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + bs58check@4.0.0: + resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} + + builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001784: + resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + + chromium-edge-launcher@0.2.0: + resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cipher-base@1.0.7: + resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} + engines: {node: '>= 0.10'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colyseus.js@0.15.28: + resolution: {integrity: sha512-fJx/EcK4fQsugNviXpTD78bVXySutLprViAWy5qMuyhcU0MfeUuHfrlvUqI18dQUStGckvLggTC7EexmIyI+3g==} + engines: {node: '>= 12.x'} + + colyseus@0.15.57: + resolution: {integrity: sha512-h9hkmXOvcreRhJxdu73BJctGEPYW36ImHByjiMhEOIuSQLcNSlkcwaqCll/7Oc/cTELHStTa5eyOnI640mOe8A==} + engines: {node: '>= 14.x'} + peerDependencies: + '@colyseus/schema': ^2.0.0 + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + + connect-redis@7.1.1: + resolution: {integrity: sha512-M+z7alnCJiuzKa8/1qAYdGUXHYfDnLolOGAUjOioB07pP39qxjG+X9ibsud7qUBc4jMV5Mcy3ugGv8eFcgamJQ==} + engines: {node: '>=16'} + peerDependencies: + express-session: '>=1' + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + + constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmjs-types@0.11.0: + resolution: {integrity: sha512-kDSkgHpRTrg1413jCNehT3P21+EBxZWFMBr9JEzVfmPiNdtuwAoLAkCYo7c7i/pTakAwyHsXbxOg8kkD+AN33w==} + engines: {node: '>=20.19'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + crypto-browserify@3.12.1: + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cuer@0.0.3: + resolution: {integrity: sha512-f/UNxRMRCYtfLEGECAViByA3JNflZImOk11G9hwSd+44jvzrc99J35u5l+fbdQ2+ZG441GvOpaeGYBmWquZsbQ==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.6: + resolution: {integrity: sha512-f8mefEW4WIVg4LckePx3mALjQSPQgFlg9U8yaPdlsbdYcHQyj9n2zL2LJEA52smeYxOvmd/nB7TpMtHGMTHcug==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domain-browser@4.22.0: + resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + engines: {node: '>=10'} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.331: + resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} + + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} + + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethers@6.16.0: + resolution: {integrity: sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==} + engines: {node: '>=14.0.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + express-jwt@8.5.1: + resolution: {integrity: sha512-Dv6QjDLpR2jmdb8M6XQXiCcpEom7mK8TOqnr0/TngDKsG2DHVkO8+XnVxkJVN7BuS1I3OrGw6N8j5DaaGgkDRQ==} + engines: {node: '>= 8.0.0'} + + express-session@1.19.0: + resolution: {integrity: sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==} + engines: {node: '>= 0.8.0'} + + express-unless@2.1.3: + resolution: {integrity: sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ==} + + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} + engines: {node: '>= 0.10.0'} + + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fb-dotslash@0.5.8: + resolution: {integrity: sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==} + engines: {node: '>=20'} + hasBin: true + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-tsconfig@4.13.7: + resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + google-protobuf@3.21.4: + resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grant@5.4.24: + resolution: {integrity: sha512-PD5AvSI7wgCBDi2mEd6M/TIe+70c/fVc3Ik4B0s4mloWTy9J800eUEcxivOiyqSP9wvBy2QjWq1JR8gOfDMnEg==} + engines: {node: '>=12.0.0'} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.0.5: + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} + + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + + hash-wasm@4.12.0: + resolution: {integrity: sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hermes-compiler@250829098.0.9: + resolution: {integrity: sha512-hZ5O7PDz1vQ99TS7HD3FJ9zVynfU1y+VWId6U1Pldvd8hmAYrNec/XLPYJKD3dLOW6NXak6aAQAuMuSo3ji0tQ==} + + hermes-estree@0.32.0: + resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==} + + hermes-estree@0.33.3: + resolution: {integrity: sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==} + + hermes-parser@0.32.0: + resolution: {integrity: sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==} + + hermes-parser@0.33.3: + resolution: {integrity: sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + httpie@2.0.0-next.13: + resolution: {integrity: sha512-KbKOnq8wt0hVEfteYCSnEsPgzaWxcVc4qZ4OaDU9mVOYLRo3XChjWs3MiuRgFu5y+4JDo7sDKdKzkAn1ljQYFA==} + engines: {node: '>=10'} + + https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + + idb-keyval@6.2.2: + resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} + hasBin: true + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ioredis@5.10.1: + resolution: {integrity: sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==} + engines: {node: '>=12.22.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jotai@2.19.0: + resolution: {integrity: sha512-r2wwxEXP1F2JteDLZEOPoIpAHhV89paKsN5GWVYndPNMMP/uVZDcC+fNj0A8NjKgaPWzdyO8Vp8YcYKe0uCEqQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@babel/core': '>=7.0.0' + '@babel/template': '>=7.0.0' + '@types/react': '>=17.0.0' + react: '>=17.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@babel/template': + optional: true + '@types/react': + optional: true + react: + optional: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + + jscrypto@1.0.3: + resolution: {integrity: sha512-lryZl0flhodv4SZHOqyb1bx5sKcJxj0VBo0Kzb4QMAg3L021IC9uGpl0RCZa+9KJwlRGSK2C80ITcwbe19OKLQ==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + + json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jwk-to-pem@2.0.7: + resolution: {integrity: sha512-cSVphrmWr6reVchuKQZdfSs4U9c5Y4hwZggPoz6cbVnTpAVgGRpEuQng86IyqLeGZlhTh+c4MAreB6KbdQDKHQ==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + ky@1.14.3: + resolution: {integrity: sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==} + engines: {node: '>=18'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + metro-babel-transformer@0.83.5: + resolution: {integrity: sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA==} + engines: {node: '>=20.19.4'} + + metro-cache-key@0.83.5: + resolution: {integrity: sha512-Ycl8PBajB7bhbAI7Rt0xEyiF8oJ0RWX8EKkolV1KfCUlC++V/GStMSGpPLwnnBZXZWkCC5edBPzv1Hz1Yi0Euw==} + engines: {node: '>=20.19.4'} + + metro-cache@0.83.5: + resolution: {integrity: sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng==} + engines: {node: '>=20.19.4'} + + metro-config@0.83.5: + resolution: {integrity: sha512-JQ/PAASXH7yczgV6OCUSRhZYME+NU8NYjI2RcaG5ga4QfQ3T/XdiLzpSb3awWZYlDCcQb36l4Vl7i0Zw7/Tf9w==} + engines: {node: '>=20.19.4'} + + metro-core@0.83.5: + resolution: {integrity: sha512-YcVcLCrf0ed4mdLa82Qob0VxYqfhmlRxUS8+TO4gosZo/gLwSvtdeOjc/Vt0pe/lvMNrBap9LlmvZM8FIsMgJQ==} + engines: {node: '>=20.19.4'} + + metro-file-map@0.83.5: + resolution: {integrity: sha512-ZEt8s3a1cnYbn40nyCD+CsZdYSlwtFh2kFym4lo+uvfM+UMMH+r/BsrC6rbNClSrt+B7rU9T+Te/sh/NL8ZZKQ==} + engines: {node: '>=20.19.4'} + + metro-minify-terser@0.83.5: + resolution: {integrity: sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q==} + engines: {node: '>=20.19.4'} + + metro-resolver@0.83.5: + resolution: {integrity: sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A==} + engines: {node: '>=20.19.4'} + + metro-runtime@0.83.5: + resolution: {integrity: sha512-f+b3ue9AWTVlZe2Xrki6TAoFtKIqw30jwfk7GQ1rDUBQaE0ZQ+NkiMEtb9uwH7uAjJ87U7Tdx1Jg1OJqUfEVlA==} + engines: {node: '>=20.19.4'} + + metro-source-map@0.83.5: + resolution: {integrity: sha512-VT9bb2KO2/4tWY9Z2yeZqTUao7CicKAOps9LUg2aQzsz+04QyuXL3qgf1cLUVRjA/D6G5u1RJAlN1w9VNHtODQ==} + engines: {node: '>=20.19.4'} + + metro-symbolicate@0.83.5: + resolution: {integrity: sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA==} + engines: {node: '>=20.19.4'} + hasBin: true + + metro-transform-plugins@0.83.5: + resolution: {integrity: sha512-KxYKzZL+lt3Os5H2nx7YkbkWVduLZL5kPrE/Yq+Prm/DE1VLhpfnO6HtPs8vimYFKOa58ncl60GpoX0h7Wm0Vw==} + engines: {node: '>=20.19.4'} + + metro-transform-worker@0.83.5: + resolution: {integrity: sha512-8N4pjkNXc6ytlP9oAM6MwqkvUepNSW39LKYl9NjUMpRDazBQ7oBpQDc8Sz4aI8jnH6AGhF7s1m/ayxkN1t04yA==} + engines: {node: '>=20.19.4'} + + metro@0.83.5: + resolution: {integrity: sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ==} + engines: {node: '>=20.19.4'} + hasBin: true + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + modern-ahocorasick@1.1.0: + resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.9: + resolution: {integrity: sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==} + + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + nanoid@2.1.11: + resolution: {integrity: sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.7: + resolution: {integrity: sha512-ua3NDgISf6jdwezAheMOk4mbE1LXjm1DfMUDMuJf4AqxLFK3ccGpgWizwa5YV7Yz9EpXwEaWoRXSb/BnV0t5dQ==} + engines: {node: ^18 || >=20} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + + node-stdlib-browser@1.3.1: + resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + ob1@0.83.5: + resolution: {integrity: sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg==} + engines: {node: '>=20.19.4'} + + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + openapi-fetch@0.13.8: + resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} + + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + + os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + + ox@0.14.7: + resolution: {integrity: sha512-zSQ/cfBdolj7U4++NAvH7sI+VG0T3pEohITCgcQj8KlawvTDY4vGVhDT64Atsm0d6adWfIYHDpu88iUBMMp+AQ==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parse-asn1@5.1.9: + resolution: {integrity: sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==} + engines: {node: '>= 0.10'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.13: + resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + + pbkdf2@3.1.5: + resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} + engines: {node: '>= 0.10'} + + phaser@3.90.0: + resolution: {integrity: sha512-/cziz/5ZIn02uDkC9RzN8VF9x3Gs3XdFFf9nkiMEQT3p7hQlWuyjy4QWosU802qqno2YSLn2BfqwOKLv/sSVfQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.24.2: + resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} + + preact@10.29.0: + resolution: {integrity: sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qr-code-styling@1.9.2: + resolution: {integrity: sha512-RgJaZJ1/RrXJ6N0j7a+pdw3zMBmzZU4VN2dtAZf8ZggCfRB5stEQ3IoDNGaNhYY3nnZKYlYSLl5YkfWN5dPutg==} + engines: {node: '>=18.18.0'} + + qr@0.5.5: + resolution: {integrity: sha512-iQBvKj7MRKO+co+MY0IZpyLO+ezvttxsmV86WywrgPuAmgBkv0pytyi03wourniSoPgzffeBW6cBgIkpqcvjTg==} + engines: {node: '>= 20.19.0'} + + qrcode-generator@1.5.2: + resolution: {integrity: sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw==} + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} + engines: {node: '>=0.6'} + + qs@6.15.0: + resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} + engines: {node: '>=0.6'} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix-ui@1.4.3: + resolution: {integrity: sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + ramda@0.32.0: + resolution: {integrity: sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ==} + + random-bytes@1.0.0: + resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} + engines: {node: '>= 0.8'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react-error-boundary@6.1.1: + resolution: {integrity: sha512-BrYwPOdXi5mqkk5lw+Uvt0ThHx32rCt3BkukS4X23A2AIWDPSGX6iaWTc0y9TU/mHDA/6qOSGel+B2ERkOvD1w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react-hook-form@7.72.1: + resolution: {integrity: sha512-RhwBoy2ygeVZje+C+bwJ8g0NjTdBmDlJvAUHTxRjTmSUKPYsKfMphkS2sgEMotsY03bP358yEYlnUeZy//D9Ig==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-intersection-observer@10.0.3: + resolution: {integrity: sha512-luICLMbs0zxTO/70Zy7K5jOXkABPEVSAF8T3FdZUlctsrIaPLmx8TZe2SSA+CY2HGWfz2INyNTnp82pxNNsShA==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-merge-refs@3.0.2: + resolution: {integrity: sha512-MSZAfwFfdbEvwkKWP5EI5chuLYnNUxNS7vyS0i1Jp+wtd8J4Ga2ddzhaE68aMol2Z4vCnRM/oGOo1a3V75UPlw==} + peerDependencies: + react: '>=16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0' + peerDependenciesMeta: + react: + optional: true + + react-native-svg@15.15.4: + resolution: {integrity: sha512-boT/vIRgj6zZKBpfTPJJiYWMbZE9duBMOwPK6kCSTgxsS947IFMOq9OgIFkpWZTB7t229H24pDRkh3W9ZK/J1A==} + peerDependencies: + react: '*' + react-native: '*' + + react-native@0.84.1: + resolution: {integrity: sha512-0PjxOyXRu3tZ8EobabxSukvhKje2HJbsZikR0U+pvS0pYZza2hXKjcSBiBdFN4h9D0S3v6a8kkrDK6WTRKMwzg==} + engines: {node: '>= 20.19.4'} + hasBin: true + peerDependencies: + '@types/react': ^19.1.1 + react: ^19.2.3 + peerDependenciesMeta: + '@types/react': + optional: true + + react-number-format@5.4.5: + resolution: {integrity: sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.2: + resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-router-dom@7.14.0: + resolution: {integrity: sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.14.0: + resolution: {integrity: sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + readonly-date-esm@2.0.0: + resolution: {integrity: sha512-adlyzz144ofU22kjnnRIN0HPPqIbc5IZvMmMuVtEgMY4mKgNyKqOVb4Fa2GUzE2By4TEPOYoGqDoKRyqmeEuPQ==} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + request-compose@2.1.7: + resolution: {integrity: sha512-27amNkWTK4Qq25XEwdmrhb4VLMiQzRSKuDfsy1o1griykcyXk5MxMHmJG+OKTRdO9PgsO7Kkn7GrEkq0UAIIMQ==} + engines: {node: '>=12.0.0'} + + request-oauth@1.0.1: + resolution: {integrity: sha512-85THTg1RgOYtqQw42JON6AqvHLptlj1biw265Tsq4fD4cPdUvhDB2Qh9NTv17yCD322ROuO9aOmpc4GyayGVBA==} + engines: {node: '>=8.0.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + + rollup@4.60.1: + resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-json-stringify@1.2.0: + resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + secp256k1@5.0.1: + resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} + engines: {node: '>=18.0.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.6: + resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} + engines: {node: '>=10.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@2.0.3: + resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==} + engines: {node: '>=0.10'} + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + terser@5.46.1: + resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + + timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-jest@29.4.9: + resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <7' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid-safe@2.1.5: + resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} + engines: {node: '>= 0.8'} + + uint8array-tools@0.0.8: + resolution: {integrity: sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==} + engines: {node: '>=14.0.0'} + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + usehooks-ts@3.1.1: + resolution: {integrity: sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + valibot@1.3.1: + resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + valtio@1.13.2: + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + viem@2.23.2: + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.47.6: + resolution: {integrity: sha512-zExmbI99NGvMdYa7fmqSTLgkwh48dmhgEqFrUgkpL4kfG4XkVefZ8dZqIKVUhZo6Uhf0FrrEXOsHm9LUyIvI2Q==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-plugin-node-polyfills@0.26.0: + resolution: {integrity: sha512-BAe5YzJf368XGev02hDvioidx4uVH8dqEJlG73bjQSxM26/AQnGcKFomq9n3vGq5yqpSHKN4h1XQNxx9l98mBg==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + + wagmi@2.17.2: + resolution: {integrity: sha512-r5yf2Nwzs469aT066tsGAuRt38z4RpQ2YZ09Kaxhd8q0IhLvw0aWBBgzXXbPqcGNEAJHtHAkXzum3wkqoHLgmA==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + warn-once@0.1.1: + resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + + web-vitals@5.1.0: + resolution: {integrity: sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==} + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wif@5.0.0: + resolution: {integrity: sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + xstream@11.14.0: + resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zen-observable@0.10.0: + resolution: {integrity: sha512-iI3lT0iojZhKwT5DaFy2Ce42n3yFcLdFyOh01G7H0flMY60P8MJuVFEoJoNwXlmAyQ45GrjL6AcZmmlv8A5rbw==} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zustand@5.0.0: + resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + +snapshots: + + '@adraffy/ens-normalize@1.10.1': {} + + '@adraffy/ens-normalize@1.11.1': {} + + '@amplitude/analytics-browser@2.36.9': + dependencies: + '@amplitude/analytics-core': 2.42.0 + '@amplitude/plugin-autocapture-browser': 1.24.0 + '@amplitude/plugin-network-capture-browser': 1.9.8 + '@amplitude/plugin-page-url-enrichment-browser': 0.6.12 + '@amplitude/plugin-page-view-tracking-browser': 2.9.0 + '@amplitude/plugin-web-vitals-browser': 1.1.23 + tslib: 2.8.1 + + '@amplitude/analytics-connector@1.6.4': {} + + '@amplitude/analytics-core@2.42.0': + dependencies: + '@amplitude/analytics-connector': 1.6.4 + '@types/zen-observable': 0.8.3 + safe-json-stringify: 1.2.0 + tslib: 2.8.1 + zen-observable: 0.10.0 + + '@amplitude/plugin-autocapture-browser@1.24.0': + dependencies: + '@amplitude/analytics-core': 2.42.0 + tslib: 2.8.1 + + '@amplitude/plugin-network-capture-browser@1.9.8': + dependencies: + '@amplitude/analytics-core': 2.42.0 + tslib: 2.8.1 + + '@amplitude/plugin-page-url-enrichment-browser@0.6.12': + dependencies: + '@amplitude/analytics-core': 2.42.0 + tslib: 2.8.1 + + '@amplitude/plugin-page-view-tracking-browser@2.9.0': + dependencies: + '@amplitude/analytics-core': 2.42.0 + tslib: 2.8.1 + + '@amplitude/plugin-web-vitals-browser@1.1.23': + dependencies: + '@amplitude/analytics-core': 2.42.0 + tslib: 2.8.1 + web-vitals: 5.1.0 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/runtime@7.29.2': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@base-org/account@1.1.1(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@base-ui/react@1.0.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.29.2 + '@base-ui/utils': 0.2.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.11 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + reselect: 5.1.1 + tabbable: 6.4.0 + use-sync-external-store: 1.6.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + '@base-ui/utils@0.2.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.29.2 + '@floating-ui/utils': 0.2.11 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + reselect: 5.1.1 + use-sync-external-store: 1.6.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + '@bcoe/v8-coverage@0.2.3': {} + + '@bitcoinerlab/secp256k1@1.2.0': + dependencies: + '@noble/curves': 1.9.7 + + '@bufbuild/protobuf@2.11.0': {} + + '@coinbase/wallet-sdk@3.9.3': + dependencies: + bn.js: 5.2.3 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 7.1.0 + eth-json-rpc-filters: 6.0.1 + eventemitter3: 5.0.4 + keccak: 3.0.4 + preact: 10.29.0 + sha.js: 2.4.12 + transitivePeerDependencies: + - supports-color + + '@coinbase/wallet-sdk@4.3.6(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@colyseus/auth@0.15.12(@colyseus/core@0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10))(express@4.22.1)': + dependencies: + '@colyseus/core': 0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@types/jsonwebtoken': 9.0.10 + connect-redis: 7.1.1(express-session@1.19.0) + express: 4.22.1 + express-jwt: 8.5.1 + express-session: 1.19.0 + grant: 5.4.24 + jsonwebtoken: 9.0.3 + transitivePeerDependencies: + - supports-color + + '@colyseus/core@0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@colyseus/greeting-banner': 2.0.6 + '@colyseus/schema': 2.0.37 + '@gamestdio/timer': 1.4.2 + debug: 4.4.3 + msgpackr: 1.11.9 + nanoid: 2.1.11 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@colyseus/greeting-banner@2.0.6': {} + + '@colyseus/redis-driver@0.15.6(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@colyseus/core': 0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ioredis: 5.10.1 + transitivePeerDependencies: + - '@colyseus/schema' + - bufferutil + - supports-color + - utf-8-validate + + '@colyseus/redis-presence@0.15.6(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@colyseus/core': 0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ioredis: 5.10.1 + transitivePeerDependencies: + - '@colyseus/schema' + - bufferutil + - supports-color + - utf-8-validate + + '@colyseus/schema@2.0.37': {} + + '@colyseus/ws-transport@0.15.3(@colyseus/core@0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10))(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@colyseus/core': 0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@colyseus/schema': 2.0.37 + '@types/ws': 7.4.7 + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@cosmjs/amino@0.38.1': + dependencies: + '@cosmjs/crypto': 0.38.1 + '@cosmjs/encoding': 0.38.1 + '@cosmjs/math': 0.38.1 + '@cosmjs/utils': 0.38.1 + + '@cosmjs/cosmwasm-stargate@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@cosmjs/cosmwasm': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@cosmjs/cosmwasm@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@cosmjs/amino': 0.38.1 + '@cosmjs/crypto': 0.38.1 + '@cosmjs/encoding': 0.38.1 + '@cosmjs/math': 0.38.1 + '@cosmjs/proto-signing': 0.38.1 + '@cosmjs/stargate': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@cosmjs/tendermint-rpc': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@cosmjs/utils': 0.38.1 + cosmjs-types: 0.11.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@cosmjs/crypto@0.38.1': + dependencies: + '@cosmjs/encoding': 0.38.1 + '@cosmjs/math': 0.38.1 + '@cosmjs/utils': 0.38.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip39': 1.6.0 + hash-wasm: 4.12.0 + + '@cosmjs/encoding@0.38.1': + dependencies: + '@scure/base': 2.0.0 + base64-js: 1.5.1 + readonly-date-esm: 2.0.0 + + '@cosmjs/json-rpc@0.38.1': + dependencies: + '@cosmjs/stream': 0.38.1 + xstream: 11.14.0 + + '@cosmjs/math@0.38.1': {} + + '@cosmjs/proto-signing@0.38.1': + dependencies: + '@cosmjs/amino': 0.38.1 + '@cosmjs/crypto': 0.38.1 + '@cosmjs/encoding': 0.38.1 + '@cosmjs/math': 0.38.1 + '@cosmjs/utils': 0.38.1 + cosmjs-types: 0.11.0 + + '@cosmjs/socket@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@cosmjs/stream': 0.38.1 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@cosmjs/stargate@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@cosmjs/amino': 0.38.1 + '@cosmjs/encoding': 0.38.1 + '@cosmjs/math': 0.38.1 + '@cosmjs/proto-signing': 0.38.1 + '@cosmjs/stream': 0.38.1 + '@cosmjs/tendermint-rpc': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@cosmjs/utils': 0.38.1 + cosmjs-types: 0.11.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@cosmjs/stream@0.38.1': + dependencies: + xstream: 11.14.0 + + '@cosmjs/tendermint-rpc@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@cosmjs/crypto': 0.38.1 + '@cosmjs/encoding': 0.38.1 + '@cosmjs/json-rpc': 0.38.1 + '@cosmjs/math': 0.38.1 + '@cosmjs/socket': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@cosmjs/stream': 0.38.1 + '@cosmjs/utils': 0.38.1 + readonly-date-esm: 2.0.0 + xstream: 11.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@cosmjs/utils@0.38.1': {} + + '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + + '@emotion/hash@0.9.2': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@4.2.0': + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.2.1 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@floating-ui/utils@0.2.11': {} + + '@gamestdio/clock@1.1.9': {} + + '@gamestdio/timer@1.4.2': + dependencies: + '@gamestdio/clock': 1.1.9 + + '@gemini-wallet/core@0.2.0(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@improbable-eng/grpc-web@0.15.0(google-protobuf@3.21.4)': + dependencies: + browser-headers: 0.4.1 + google-protobuf: 3.21.4 + + '@initia/amino-converter@1.0.18(@cosmjs/cosmwasm-stargate@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(@cosmjs/proto-signing@0.38.1)(@cosmjs/stargate@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(@initia/initia.proto@1.0.5(google-protobuf@3.21.4))(@initia/opinit.proto@1.0.3(google-protobuf@3.21.4))': + dependencies: + '@cosmjs/cosmwasm-stargate': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@cosmjs/proto-signing': 0.38.1 + '@cosmjs/stargate': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@initia/initia.proto': 1.0.5(google-protobuf@3.21.4) + '@initia/opinit.proto': 1.0.3(google-protobuf@3.21.4) + + '@initia/icons-react@2.1.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)': + dependencies: + react: 19.2.4 + react-native-svg: 15.15.4(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + transitivePeerDependencies: + - react-native + + '@initia/initia.js@1.1.0(bufferutil@4.1.0)(google-protobuf@3.21.4)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@bitcoinerlab/secp256k1': 1.2.0 + '@initia/initia.proto': 1.0.5(google-protobuf@3.21.4) + '@initia/opinit.proto': 1.0.3(google-protobuf@3.21.4) + '@mysten/bcs': 1.9.2 + axios: 1.14.0 + bech32: 2.0.0 + bignumber.js: 9.3.1 + bip32: 5.0.1(typescript@5.9.3) + bip39: 3.1.0 + events: 3.3.0 + jscrypto: 1.0.3 + keccak256: 1.0.6 + ripemd160: 2.0.3 + secp256k1: 5.0.1 + semver: 7.7.4 + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - google-protobuf + - typescript + - utf-8-validate + + '@initia/initia.proto@1.0.5(google-protobuf@3.21.4)': + dependencies: + '@bufbuild/protobuf': 2.11.0 + '@improbable-eng/grpc-web': 0.15.0(google-protobuf@3.21.4) + browser-headers: 0.4.1 + transitivePeerDependencies: + - google-protobuf + + '@initia/interwovenkit-react@2.5.1(32ad9665753c869066f58845991d7334)': + dependencies: + '@amplitude/analytics-browser': 2.36.9 + '@base-ui/react': 1.0.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@cosmjs/amino': 0.38.1 + '@cosmjs/crypto': 0.38.1 + '@cosmjs/encoding': 0.38.1 + '@cosmjs/math': 0.38.1 + '@cosmjs/proto-signing': 0.38.1 + '@cosmjs/stargate': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@cosmjs/tendermint-rpc': 0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@initia/amino-converter': 1.0.18(@cosmjs/cosmwasm-stargate@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(@cosmjs/proto-signing@0.38.1)(@cosmjs/stargate@0.38.1(bufferutil@4.1.0)(utf-8-validate@5.0.10))(@initia/initia.proto@1.0.5(google-protobuf@3.21.4))(@initia/opinit.proto@1.0.3(google-protobuf@3.21.4)) + '@initia/icons-react': 2.1.0(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + '@initia/initia.proto': 1.0.5(google-protobuf@3.21.4) + '@initia/opinit.proto': 1.0.3(google-protobuf@3.21.4) + '@initia/utils': 2.0.0(@cosmjs/encoding@0.38.1)(@mysten/bcs@1.9.2)(@noble/hashes@1.8.0)(bignumber.js@9.3.1)(ky@1.14.3)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@lukemorales/query-key-factory': 1.3.4(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4)) + '@mysten/bcs': 1.9.2 + '@noble/hashes': 1.8.0 + '@privy-io/cross-app-connect': 0.2.3(@rainbow-me/rainbowkit@2.2.10(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)))(@wagmi/core@2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@rainbow-me/rainbowkit': 2.2.10(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + '@react-spring/web': 10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-query': 5.96.1(react@19.2.4) + bignumber.js: 9.3.1 + change-case: 5.4.4 + clsx: 2.1.1 + cosmjs-types: 0.11.0 + date-fns: 4.1.0 + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + jotai: 2.19.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.14)(react@19.2.4) + ky: 1.14.3 + nanoid: 5.1.7 + psl: 1.15.0 + qr-code-styling: 1.9.2 + radix-ui: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + ramda: 0.32.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-error-boundary: 6.1.1(react@19.2.4) + react-hook-form: 7.72.1(react@19.2.4) + react-intersection-observer: 10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-merge-refs: 3.0.2(react@19.2.4) + react-number-format: 5.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + usehooks-ts: 3.1.1(react@19.2.4) + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + xss: 1.0.15 + transitivePeerDependencies: + - google-protobuf + + '@initia/opinit.proto@1.0.3(google-protobuf@3.21.4)': + dependencies: + '@bufbuild/protobuf': 2.11.0 + '@improbable-eng/grpc-web': 0.15.0(google-protobuf@3.21.4) + browser-headers: 0.4.1 + transitivePeerDependencies: + - google-protobuf + + '@initia/utils@2.0.0(@cosmjs/encoding@0.38.1)(@mysten/bcs@1.9.2)(@noble/hashes@1.8.0)(bignumber.js@9.3.1)(ky@1.14.3)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@cosmjs/encoding': 0.38.1 + '@mysten/bcs': 1.9.2 + '@noble/hashes': 1.8.0 + bignumber.js: 9.3.1 + ky: 1.14.3 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + + '@ioredis/commands@1.5.1': {} + + '@isaacs/ttlcache@1.4.1': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.2 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.19.15) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 22.19.15 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 22.19.15 + chalk: 4.1.2 + collect-v8-coverage: 1.0.3 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.2.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.10 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.29.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.19.15 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lit-labs/ssr-dom-shim@1.5.1': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + + '@lukemorales/query-key-factory@1.3.4(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))': + dependencies: + '@tanstack/query-core': 5.96.1 + '@tanstack/react-query': 5.96.1(react@19.2.4) + + '@metamask/eth-json-rpc-provider@1.0.1': + dependencies: + '@metamask/json-rpc-engine': 7.3.3 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@7.3.3': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-middleware-stream@7.0.2': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@metamask/object-multiplex@2.1.0': + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + + '@metamask/onboarding@1.0.1': + dependencies: + bowser: 2.14.1 + + '@metamask/providers@16.1.0': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@6.4.0': + dependencies: + '@metamask/utils': 9.3.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@7.0.2': + dependencies: + '@metamask/utils': 11.11.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/safe-event-emitter@2.0.0': {} + + '@metamask/safe-event-emitter@3.1.2': {} + + '@metamask/sdk-analytics@0.0.5': + dependencies: + openapi-fetch: 0.13.8 + + '@metamask/sdk-communication-layer@0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@metamask/sdk-analytics': 0.0.5 + bufferutil: 4.1.0 + cross-fetch: 4.1.0 + date-fns: 2.30.0 + debug: 4.3.4 + eciesjs: 0.4.18 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + '@metamask/sdk-install-modal-web@0.32.1': + dependencies: + '@paulmillr/qr': 0.2.1 + + '@metamask/sdk@0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.29.2 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0 + '@metamask/sdk-analytics': 0.0.5 + '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.32.1 + '@paulmillr/qr': 0.2.1 + bowser: 2.14.1 + cross-fetch: 4.1.0 + debug: 4.3.4 + eciesjs: 0.4.18 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.4 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metamask/superstruct@3.2.1': {} + + '@metamask/utils@11.11.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.13 + '@types/lodash': 4.17.24 + debug: 4.4.3 + lodash: 4.18.1 + pony-cause: 2.1.11 + semver: 7.7.4 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@5.0.2': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.13 + debug: 4.4.3 + semver: 7.7.4 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@8.5.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.13 + debug: 4.4.3 + pony-cause: 2.1.11 + semver: 7.7.4 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@9.3.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.13 + debug: 4.4.3 + pony-cause: 2.1.11 + semver: 7.7.4 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@mysten/bcs@1.9.2': + dependencies: + '@mysten/utils': 0.2.0 + '@scure/base': 1.2.6 + + '@mysten/utils@0.2.0': + dependencies: + '@scure/base': 1.2.6 + + '@noble/ciphers@1.2.1': {} + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 + + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/ed25519@3.0.1': {} + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.7.0': {} + + '@noble/hashes@1.7.1': {} + + '@noble/hashes@1.8.0': {} + + '@paulmillr/qr@0.2.1': {} + + '@privy-io/cross-app-connect@0.2.3(@rainbow-me/rainbowkit@2.2.10(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)))(@wagmi/core@2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.9 + fflate: 0.8.2 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + '@rainbow-me/rainbowkit': 2.2.10(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + '@wagmi/core': 2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/rect@1.1.1': {} + + '@rainbow-me/rainbowkit@2.2.10(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': + dependencies: + '@tanstack/react-query': 5.96.1(react@19.2.4) + '@vanilla-extract/css': 1.17.3 + '@vanilla-extract/dynamic': 2.1.4 + '@vanilla-extract/sprinkles': 1.6.4(@vanilla-extract/css@1.17.3) + clsx: 2.1.1 + cuer: 0.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.6.2(@types/react@19.2.14)(react@19.2.4) + ua-parser-js: 1.0.41 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - babel-plugin-macros + - typescript + + '@react-native/assets-registry@0.84.1': {} + + '@react-native/codegen@0.84.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + hermes-parser: 0.32.0 + invariant: 2.2.4 + nullthrows: 1.1.1 + tinyglobby: 0.2.15 + yargs: 17.7.2 + + '@react-native/community-cli-plugin@0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@react-native/dev-middleware': 0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + metro-config: 0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + metro-core: 0.83.5 + semver: 7.7.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.84.1': {} + + '@react-native/debugger-shell@0.84.1': + dependencies: + cross-spawn: 7.0.6 + debug: 4.4.3 + fb-dotslash: 0.5.8 + transitivePeerDependencies: + - supports-color + + '@react-native/dev-middleware@0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.84.1 + '@react-native/debugger-shell': 0.84.1 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.2.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/gradle-plugin@0.84.1': {} + + '@react-native/js-polyfills@0.84.1': {} + + '@react-native/normalize-colors@0.84.1': {} + + '@react-native/virtualized-lists@0.84.1(@types/react@19.2.14)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + optionalDependencies: + '@types/react': 19.2.14 + + '@react-spring/animated@10.0.3(react@19.2.4)': + dependencies: + '@react-spring/shared': 10.0.3(react@19.2.4) + '@react-spring/types': 10.0.3 + react: 19.2.4 + + '@react-spring/core@10.0.3(react@19.2.4)': + dependencies: + '@react-spring/animated': 10.0.3(react@19.2.4) + '@react-spring/shared': 10.0.3(react@19.2.4) + '@react-spring/types': 10.0.3 + react: 19.2.4 + + '@react-spring/rafz@10.0.3': {} + + '@react-spring/shared@10.0.3(react@19.2.4)': + dependencies: + '@react-spring/rafz': 10.0.3 + '@react-spring/types': 10.0.3 + react: 19.2.4 + + '@react-spring/types@10.0.3': {} + + '@react-spring/web@10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@react-spring/animated': 10.0.3(react@19.2.4) + '@react-spring/core': 10.0.3(react@19.2.4) + '@react-spring/shared': 10.0.3(react@19.2.4) + '@react-spring/types': 10.0.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.2.14)(react@19.2.4) + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-pay@1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + lit: 3.3.0 + valtio: 1.13.2(@types/react@19.2.14)(react@19.2.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-polyfills@1.7.8': + dependencies: + buffer: 6.0.3 + + '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-ui@1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.2.14)(react@19.2.4) + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-wallet@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.8 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0(ioredis@5.10.1) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@19.2.14)(react@19.2.4) + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/plugin-inject@5.0.5(rollup@4.60.1)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.60.1) + estree-walker: 2.0.2 + magic-string: 0.30.21 + optionalDependencies: + rollup: 4.60.1 + + '@rollup/pluginutils@5.3.0(rollup@4.60.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.1 + + '@rollup/rollup-android-arm-eabi@4.60.1': + optional: true + + '@rollup/rollup-android-arm64@4.60.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.1': + optional: true + + '@rollup/rollup-darwin-x64@4.60.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.1': + optional: true + + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/base@2.0.0': {} + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@sinclair/typebox@0.27.10': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@socket.io/component-emitter@3.1.2': {} + + '@tanstack/query-core@5.96.1': {} + + '@tanstack/react-query@5.96.1(react@19.2.4)': + dependencies: + '@tanstack/query-core': 5.96.1 + react: 19.2.4 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.0 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.19.15 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.19.15 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@5.1.1': + dependencies: + '@types/node': 22.19.15 + '@types/qs': 6.15.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.1 + '@types/serve-static': 2.2.0 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 22.19.15 + + '@types/http-errors@2.0.5': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.14': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 22.19.15 + + '@types/lodash@4.17.24': {} + + '@types/ms@2.1.0': {} + + '@types/node@22.19.15': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/node@25.5.0': + dependencies: + undici-types: 7.18.2 + optional: true + + '@types/qs@6.15.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@types/send@1.2.1': + dependencies: + '@types/node': 22.19.15 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.19.15 + + '@types/stack-utils@2.0.3': {} + + '@types/trusted-types@2.0.7': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 22.19.15 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@types/zen-observable@0.8.3': {} + + '@vanilla-extract/css@1.17.3': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.9 + css-what: 6.2.2 + cssesc: 3.0.0 + csstype: 3.2.3 + dedent: 1.7.2 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/dynamic@2.1.4': + dependencies: + '@vanilla-extract/private': 1.0.9 + + '@vanilla-extract/private@1.0.9': {} + + '@vanilla-extract/sprinkles@1.6.4(@vanilla-extract/css@1.17.3)': + dependencies: + '@vanilla-extract/css': 1.17.3 + + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - supports-color + + '@wagmi/connectors@5.10.2(@types/react@19.2.14)(@wagmi/core@2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)': + dependencies: + '@base-org/account': 1.1.1(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.2.0(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - immer + - ioredis + - react + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - zod + + '@wagmi/core@2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + optionalDependencies: + '@tanstack/query-core': 5.96.1 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@walletconnect/core@2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0(ioredis@5.10.1) + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1(ioredis@5.10.1) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.21.1(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1(ioredis@5.10.1) + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1(ioredis@5.10.1)': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.2 + unstorage: 1.17.5(idb-keyval@6.2.2)(ioredis@5.10.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0(ioredis@5.10.1) + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1(ioredis@5.10.1) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/types@2.21.0(ioredis@5.10.1)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/types@2.21.1(ioredis@5.10.1)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.0(ioredis@5.10.1) + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1(ioredis@5.10.1) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0(ioredis@5.10.1) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(ioredis@5.10.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(ioredis@5.10.1) + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1(ioredis@5.10.1) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/window-getters@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/window-metadata@1.0.1': + dependencies: + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + + abitype@1.0.8(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + + abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 + + abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn@8.16.0: {} + + aes-js@4.0.0-beta.5: {} + + agent-base@7.1.4: {} + + anser@1.4.10: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + array-flatten@1.1.1: {} + + asap@2.0.6: {} + + asn1.js@4.10.1: + dependencies: + bn.js: 4.12.3 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + asn1.js@5.4.1: + dependencies: + bn.js: 4.12.3 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + optional: true + + assert@2.1.0: + dependencies: + call-bind: 1.0.8 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + + async-mutex@0.2.6: + dependencies: + tslib: 2.8.1 + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.14.0: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + + babel-jest@29.7.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.29.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.28.6 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + + babel-plugin-syntax-hermes-parser@0.32.0: + dependencies: + hermes-parser: 0.32.0 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + + babel-preset-jest@29.6.3(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + + balanced-match@1.0.2: {} + + base-x@5.0.1: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.10.13: {} + + bech32@2.0.0: {} + + big.js@6.2.2: {} + + bignumber.js@9.3.1: {} + + bip32@5.0.1(typescript@5.9.3): + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + uint8array-tools: 0.0.8 + valibot: 1.3.1(typescript@5.9.3) + wif: 5.0.0 + transitivePeerDependencies: + - typescript + + bip39@3.1.0: + dependencies: + '@noble/hashes': 1.8.0 + + bn.js@4.12.3: {} + + bn.js@5.2.3: {} + + body-parser@1.20.4: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.14.2 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + bowser@2.14.1: {} + + brace-expansion@1.1.13: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-headers@0.4.1: {} + + browser-resolve@2.0.0: + dependencies: + resolve: 1.22.11 + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.7 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.7 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-rsa@4.1.1: + dependencies: + bn.js: 5.2.3 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + browserify-sign@4.2.5: + dependencies: + bn.js: 5.2.3 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.6.1 + inherits: 2.0.4 + parse-asn1: 5.1.9 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.13 + caniuse-lite: 1.0.30001784 + electron-to-chromium: 1.5.331 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + bs58check@4.0.0: + dependencies: + '@noble/hashes': 1.8.0 + bs58: 6.0.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.1.0: + dependencies: + node-gyp-build: 4.8.4 + + builtin-status-codes@3.0.0: {} + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001784: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + change-case@5.4.4: {} + + char-regex@1.0.2: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chrome-launcher@0.15.2: + dependencies: + '@types/node': 22.19.15 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@0.2.0: + dependencies: + '@types/node': 22.19.15 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + + cipher-base@1.0.7: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + cjs-module-lexer@1.4.3: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@1.2.1: {} + + clsx@2.1.1: {} + + cluster-key-slot@1.1.2: {} + + co@4.6.0: {} + + collect-v8-coverage@1.0.3: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colyseus.js@0.15.28(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@colyseus/schema': 2.0.37 + httpie: 2.0.0-next.13 + tslib: 2.8.1 + ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + colyseus@0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(express@4.22.1)(utf-8-validate@5.0.10): + dependencies: + '@colyseus/auth': 0.15.12(@colyseus/core@0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10))(express@4.22.1) + '@colyseus/core': 0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@colyseus/redis-driver': 0.15.6(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@colyseus/redis-presence': 0.15.6(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@colyseus/schema': 2.0.37 + '@colyseus/ws-transport': 0.15.3(@colyseus/core@0.15.57(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10))(@colyseus/schema@2.0.37)(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - express + - supports-color + - utf-8-validate + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@12.1.0: {} + + commander@2.20.3: {} + + concat-map@0.0.1: {} + + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + connect-redis@7.1.1(express-session@1.19.0): + dependencies: + express-session: 1.19.0 + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + console-browserify@1.2.0: {} + + constants-browserify@1.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.3: {} + + cookie-signature@1.0.7: {} + + cookie-signature@1.2.2: + optional: true + + cookie@0.7.2: {} + + cookie@1.1.1: {} + + core-util-is@1.0.3: {} + + cosmjs-types@0.11.0: {} + + crc-32@1.2.2: {} + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.3 + elliptic: 6.6.1 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.7 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.3 + sha.js: 2.4.12 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.7 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + + create-jest@29.7.0(@types/node@22.19.15): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.19.15) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + crypto-browserify@3.12.1: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.5 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + hash-base: 3.0.5 + inherits: 2.0.4 + pbkdf2: 3.1.5 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssfilter@0.0.10: {} + + csstype@3.2.3: {} + + cuer@0.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): + dependencies: + qr: 0.5.5 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + typescript: 5.9.3 + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.29.2 + + date-fns@4.1.0: {} + + dayjs@1.11.13: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + + dedent@1.7.2: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.6: {} + + delayed-stream@1.0.0: {} + + denque@2.1.0: {} + + depd@2.0.0: {} + + derive-valtio@0.1.0(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4)): + dependencies: + valtio: 1.13.2(@types/react@19.2.14)(react@19.2.4) + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + destr@2.0.5: {} + + destroy@1.2.0: {} + + detect-browser@5.3.0: {} + + detect-libc@2.1.2: + optional: true + + detect-newline@3.1.0: {} + + detect-node-es@1.1.0: {} + + diff-sequences@29.6.3: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.3 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + + dijkstrajs@1.0.3: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domain-browser@4.22.0: {} + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + eciesjs@0.4.18: + dependencies: + '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.331: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.3 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + encode-utf8@1.0.3: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + entities@4.5.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-toolkit@1.33.0: {} + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + etag@1.8.1: {} + + eth-block-tracker@7.1.0: + dependencies: + '@metamask/eth-json-rpc-provider': 1.0.1 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 5.0.2 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color + + eth-json-rpc-filters@6.0.1: + dependencies: + '@metamask/safe-event-emitter': 3.1.2 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 + + eth-query@2.1.2: + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.1 + + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + event-target-shim@5.0.1: {} + + eventemitter2@6.4.9: {} + + eventemitter3@5.0.1: {} + + eventemitter3@5.0.4: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + exponential-backoff@3.1.3: {} + + express-jwt@8.5.1: + dependencies: + '@types/jsonwebtoken': 9.0.10 + express-unless: 2.1.3 + jsonwebtoken: 9.0.3 + + express-session@1.19.0: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + on-headers: 1.1.0 + parseurl: 1.3.3 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + transitivePeerDependencies: + - supports-color + + express-unless@2.1.3: {} + + express@4.22.1: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.4 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.1 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.13 + proxy-addr: 2.0.7 + qs: 6.14.2 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.2 + serve-static: 1.16.3 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extension-port-stream@3.0.0: + dependencies: + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fb-dotslash@0.5.8: {} + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + filter-obj@1.1.0: {} + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + finalhandler@1.3.2: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flow-enums-runtime@0.0.6: {} + + follow-redirects@1.15.11: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-tsconfig@4.13.7: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + google-protobuf@3.21.4: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + grant@5.4.24: + dependencies: + qs: 6.15.0 + request-compose: 2.1.7 + request-oauth: 1.0.1 + optionalDependencies: + cookie: 0.7.2 + cookie-signature: 1.2.2 + jwk-to-pem: 2.0.7 + jws: 4.0.1 + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.6 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.3 + uncrypto: 0.1.3 + + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash-base@3.0.5: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + hash-wasm@4.12.0: {} + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hermes-compiler@250829098.0.9: {} + + hermes-estree@0.32.0: {} + + hermes-estree@0.33.3: {} + + hermes-parser@0.32.0: + dependencies: + hermes-estree: 0.32.0 + + hermes-parser@0.33.3: + dependencies: + hermes-estree: 0.33.3 + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + html-escaper@2.0.2: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + httpie@2.0.0-next.13: {} + + https-browserify@1.0.0: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + idb-keyval@6.2.1: {} + + idb-keyval@6.2.2: {} + + ieee754@1.2.1: {} + + image-size@1.2.1: + dependencies: + queue: 6.0.2 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ioredis@5.10.1: + dependencies: + '@ioredis/commands': 1.5.1 + cluster-key-slot: 1.1.2 + debug: 4.4.3 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + ipaddr.js@1.9.1: {} + + iron-webcrypto@1.2.1: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-arrayish@0.2.1: {} + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-number@7.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-stream@2.0.1: {} + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isomorphic-timers-promises@1.0.1: {} + + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + isows@1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + isows@1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.2 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@22.19.15): + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.19.15) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.19.15) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@22.19.15): + dependencies: + '@babel/core': 7.29.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.29.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.19.15 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 22.19.15 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.11 + resolve.exports: 2.0.3 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + chalk: 4.1.2 + cjs-module-lexer: 1.4.3 + collect-v8-coverage: 1.0.3 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.2 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.15 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 22.19.15 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@22.19.15): + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.19.15) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jotai@2.19.0(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@19.2.14)(react@19.2.4): + optionalDependencies: + '@babel/core': 7.29.0 + '@babel/template': 7.28.6 + '@types/react': 19.2.14 + react: 19.2.4 + + js-tokens@4.0.0: {} + + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsc-safe-url@0.2.4: {} + + jscrypto@1.0.3: {} + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-rpc-engine@6.1.0: + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 + + json-rpc-random-id@1.0.1: {} + + json5@2.2.3: {} + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.4 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwk-to-pem@2.0.7: + dependencies: + asn1.js: 5.4.1 + elliptic: 6.6.1 + safe-buffer: 5.2.1 + optional: true + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + keccak256@1.0.6: + dependencies: + bn.js: 5.2.3 + buffer: 6.0.3 + keccak: 3.0.4 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 + + keyvaluestorage-interface@1.0.0: {} + + kleur@3.0.3: {} + + ky@1.14.3: {} + + leven@3.1.0: {} + + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + + lines-and-columns@1.2.4: {} + + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.2 + + lit-html@3.3.2: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.0: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.debounce@4.0.8: {} + + lodash.defaults@4.2.0: {} + + lodash.includes@4.3.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.memoize@4.1.2: {} + + lodash.once@4.1.1: {} + + lodash.throttle@4.1.1: {} + + lodash@4.18.1: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@11.2.7: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@4.0.0: + dependencies: + semver: 7.7.4 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + marky@1.3.0: {} + + math-intrinsics@1.1.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + mdn-data@2.0.14: {} + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.29.2 + + media-typer@0.3.0: {} + + memoize-one@5.2.1: {} + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + metro-babel-transformer@0.83.5: + dependencies: + '@babel/core': 7.29.0 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.33.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.83.5: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.83.5 + transitivePeerDependencies: + - supports-color + + metro-config@0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + metro-cache: 0.83.5 + metro-core: 0.83.5 + metro-runtime: 0.83.5 + yaml: 2.8.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.83.5 + + metro-file-map@0.83.5: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.46.1 + + metro-resolver@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.83.5: + dependencies: + '@babel/runtime': 7.29.2 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.83.5: + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.83.5 + nullthrows: 1.1.1 + ob1: 0.83.5 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.83.5 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.83.5: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + metro: 0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.83.5 + metro-cache: 0.83.5 + metro-cache-key: 0.83.5 + metro-minify-terser: 0.83.5 + metro-source-map: 0.83.5 + metro-transform-plugins: 0.83.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + accepts: 2.0.0 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.33.3 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.83.5 + metro-cache: 0.83.5 + metro-cache-key: 0.83.5 + metro-config: 0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + metro-core: 0.83.5 + metro-file-map: 0.83.5 + metro-resolver: 0.83.5 + metro-runtime: 0.83.5 + metro-source-map: 0.83.5 + metro-symbolicate: 0.83.5 + metro-transform-plugins: 0.83.5 + metro-transform-worker: 0.83.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + mime-types: 3.0.2 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + micro-ftch@0.3.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.3 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.13 + + minimist@1.2.8: {} + + mipd@0.0.7(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + mkdirp@1.0.4: {} + + modern-ahocorasick@1.1.0: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.9: + optionalDependencies: + msgpackr-extract: 3.0.3 + + multiformats@9.9.0: {} + + nanoid@2.1.11: {} + + nanoid@3.3.11: {} + + nanoid@5.1.7: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + negotiator@1.0.0: {} + + neo-async@2.6.2: {} + + node-addon-api@2.0.2: {} + + node-addon-api@5.1.0: {} + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true + + node-gyp-build@4.8.4: {} + + node-int64@0.4.0: {} + + node-mock-http@1.0.4: {} + + node-releases@2.0.37: {} + + node-stdlib-browser@1.3.1: + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.1 + domain-browser: 4.22.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.4 + util: 0.12.5 + vm-browserify: 1.1.2 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nullthrows@1.1.1: {} + + oauth-sign@0.9.0: {} + + ob1@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + + obj-multiplex@1.0.0: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + readable-stream: 2.3.8 + + object-inspect@1.13.4: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 + + on-exit-leak-free@0.2.0: {} + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + openapi-fetch@0.13.8: + dependencies: + openapi-typescript-helpers: 0.0.15 + + openapi-typescript-helpers@0.0.15: {} + + os-browserify@0.3.0: {} + + ox@0.14.7(typescript@5.9.3)(zod@3.22.4): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.14.7(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.6.7(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + ox@0.6.9(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + pako@1.0.11: {} + + parse-asn1@5.1.9: + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.5 + safe-buffer: 5.2.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.13: {} + + pbkdf2@3.1.5: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.2 + + phaser@3.90.0: + dependencies: + eventemitter3: 5.0.4 + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pify@3.0.0: {} + + pify@5.0.0: {} + + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + + pino-std-serializers@4.0.0: {} + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + pngjs@5.0.0: {} + + pony-cause@2.1.11: {} + + possible-typed-array-names@1.1.0: {} + + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.24.2: {} + + preact@10.29.0: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + process-warning@1.0.0: {} + + process@0.11.10: {} + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-compare@2.6.0: {} + + proxy-from-env@2.1.0: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.3 + browserify-rsa: 4.1.1 + create-hash: 1.2.0 + parse-asn1: 5.1.9 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qr-code-styling@1.9.2: + dependencies: + qrcode-generator: 1.5.2 + + qr@0.5.5: {} + + qrcode-generator@1.5.2: {} + + qrcode@1.5.3: + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qs@6.14.2: + dependencies: + side-channel: 1.1.0 + + qs@6.15.0: + dependencies: + side-channel: 1.1.0 + + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + querystring-es3@0.2.1: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quick-format-unescaped@4.0.4: {} + + radix-ui@1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + radix3@1.1.2: {} + + ramda@0.32.0: {} + + random-bytes@1.0.0: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + react-dom@19.2.4(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 + + react-error-boundary@6.1.1(react@19.2.4): + dependencies: + react: 19.2.4 + + react-hook-form@7.72.1(react@19.2.4): + dependencies: + react: 19.2.4 + + react-intersection-observer@10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) + + react-is@18.3.1: {} + + react-merge-refs@3.0.2(react@19.2.4): + optionalDependencies: + react: 19.2.4 + + react-native-svg@15.15.4(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4): + dependencies: + css-select: 5.2.2 + css-tree: 1.1.3 + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + warn-once: 0.1.1 + + react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.84.1 + '@react-native/codegen': 0.84.1(@babel/core@7.29.0) + '@react-native/community-cli-plugin': 0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@react-native/gradle-plugin': 0.84.1 + '@react-native/js-polyfills': 0.84.1 + '@react-native/normalize-colors': 0.84.1 + '@react-native/virtualized-lists': 0.84.1(@types/react@19.2.14)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-jest: 29.7.0(@babel/core@7.29.0) + babel-plugin-syntax-hermes-parser: 0.32.0 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + hermes-compiler: 250829098.0.9 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + memoize-one: 5.2.1 + metro-runtime: 0.83.5 + metro-source-map: 0.83.5 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.2.4 + react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.27.0 + semver: 7.7.4 + stacktrace-parser: 0.1.11 + tinyglobby: 0.2.15 + whatwg-fetch: 3.6.20 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.2.14 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + + react-number-format@5.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + react-refresh@0.14.2: {} + + react-refresh@0.17.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react-remove-scroll@2.6.2(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + react-router-dom@7.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-router: 7.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + + react-router@7.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + cookie: 1.1.1 + react: 19.2.4 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) + + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + get-nonce: 1.0.1 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react@19.2.4: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@5.0.0: {} + + readonly-date-esm@2.0.0: {} + + real-require@0.1.0: {} + + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + + regenerator-runtime@0.13.11: {} + + request-compose@2.1.7: {} + + request-oauth@1.0.1: + dependencies: + oauth-sign: 0.9.0 + qs: 6.15.0 + uuid: 8.3.2 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + reselect@5.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.3: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.3: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + + rollup@4.60.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.1 + '@rollup/rollup-android-arm64': 4.60.1 + '@rollup/rollup-darwin-arm64': 4.60.1 + '@rollup/rollup-darwin-x64': 4.60.1 + '@rollup/rollup-freebsd-arm64': 4.60.1 + '@rollup/rollup-freebsd-x64': 4.60.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 + '@rollup/rollup-linux-arm-musleabihf': 4.60.1 + '@rollup/rollup-linux-arm64-gnu': 4.60.1 + '@rollup/rollup-linux-arm64-musl': 4.60.1 + '@rollup/rollup-linux-loong64-gnu': 4.60.1 + '@rollup/rollup-linux-loong64-musl': 4.60.1 + '@rollup/rollup-linux-ppc64-gnu': 4.60.1 + '@rollup/rollup-linux-ppc64-musl': 4.60.1 + '@rollup/rollup-linux-riscv64-gnu': 4.60.1 + '@rollup/rollup-linux-riscv64-musl': 4.60.1 + '@rollup/rollup-linux-s390x-gnu': 4.60.1 + '@rollup/rollup-linux-x64-gnu': 4.60.1 + '@rollup/rollup-linux-x64-musl': 4.60.1 + '@rollup/rollup-openbsd-x64': 4.60.1 + '@rollup/rollup-openharmony-arm64': 4.60.1 + '@rollup/rollup-win32-arm64-msvc': 4.60.1 + '@rollup/rollup-win32-ia32-msvc': 4.60.1 + '@rollup/rollup-win32-x64-gnu': 4.60.1 + '@rollup/rollup-win32-x64-msvc': 4.60.1 + fsevents: 2.3.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-json-stringify@1.2.0: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + secp256k1@5.0.1: + dependencies: + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + + semver@6.3.1: {} + + semver@7.7.4: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-error@2.1.0: {} + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-cookie-parser@2.7.2: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.6: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + sonic-boom@2.8.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + split-on-first@1.1.0: {} + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stackframe@1.3.4: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + + standard-as-callback@2.1.0: {} + + statuses@1.5.0: {} + + statuses@2.0.2: {} + + stream-browserify@3.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + stream-http@3.2.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + + stream-shift@1.0.3: {} + + strict-uri-encode@2.0.0: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + superstruct@1.0.4: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-observable@2.0.3: {} + + tabbable@6.4.0: {} + + terser@5.46.1: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.5 + + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 + + throat@5.0.0: {} + + timers-browserify@2.0.12: + dependencies: + setimmediate: 1.0.5 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tmpl@1.0.5: {} + + to-buffer@1.2.2: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + + ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.15))(typescript@5.9.3): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.9 + jest: 29.7.0(@types/node@22.19.15) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.4 + type-fest: 4.41.0 + typescript: 5.9.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.29.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.29.0) + jest-util: 29.7.0 + + tslib@1.14.1: {} + + tslib@2.7.0: {} + + tslib@2.8.1: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.7 + get-tsconfig: 4.13.7 + optionalDependencies: + fsevents: 2.3.3 + + tty-browserify@0.0.1: {} + + type-detect@4.0.8: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + type-fest@4.41.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typescript@5.9.3: {} + + ua-parser-js@1.0.41: {} + + ufo@1.6.3: {} + + uglify-js@3.19.3: + optional: true + + uid-safe@2.1.5: + dependencies: + random-bytes: 1.0.0 + + uint8array-tools@0.0.8: {} + + uint8arrays@3.1.0: + dependencies: + multiformats: 9.9.0 + + uncrypto@0.1.3: {} + + undici-types@6.19.8: {} + + undici-types@6.21.0: {} + + undici-types@7.18.2: + optional: true + + unpipe@1.0.0: {} + + unstorage@1.17.5(idb-keyval@6.2.2)(ioredis@5.10.1): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.2.7 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 + optionalDependencies: + idb-keyval: 6.2.2 + ioredis: 5.10.1 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.15.0 + + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + use-sync-external-store@1.2.0(react@19.2.4): + dependencies: + react: 19.2.4 + + use-sync-external-store@1.4.0(react@19.2.4): + dependencies: + react: 19.2.4 + + use-sync-external-store@1.6.0(react@19.2.4): + dependencies: + react: 19.2.4 + + usehooks-ts@3.1.1(react@19.2.4): + dependencies: + lodash.debounce: 4.0.8 + react: 19.2.4 + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + + utils-merge@1.0.1: {} + + uuid@13.0.0: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + valibot@1.3.1(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + valtio@1.13.2(@types/react@19.2.14)(react@19.2.4): + dependencies: + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@19.2.14)(react@19.2.4)) + proxy-compare: 2.6.0 + use-sync-external-store: 1.2.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.4 + + vary@1.1.2: {} + + viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.14.7(typescript@5.9.3)(zod@3.22.4) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.14.7(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-plugin-node-polyfills@0.26.0(rollup@4.60.1)(vite@6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.60.1) + node-stdlib-browser: 1.3.1 + vite: 6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - rollup + + vite@6.4.1(@types/node@25.5.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.8 + rollup: 4.60.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.5.0 + fsevents: 2.3.3 + terser: 5.46.1 + tsx: 4.21.0 + yaml: 2.8.3 + + vlq@1.0.1: {} + + vm-browserify@1.1.2: {} + + wagmi@2.17.2(@tanstack/query-core@5.96.1)(@tanstack/react-query@5.96.1(react@19.2.4))(@types/react@19.2.14)(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + dependencies: + '@tanstack/react-query': 5.96.1(react@19.2.4) + '@wagmi/connectors': 5.10.2(@types/react@19.2.14)(@wagmi/core@2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(ioredis@5.10.1)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.21.1(@tanstack/query-core@5.96.1)(@types/react@19.2.14)(react@19.2.4)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + viem: 2.47.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - immer + - ioredis + - supports-color + - uploadthing + - utf-8-validate + - zod + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + warn-once@0.1.1: {} + + web-vitals@5.1.0: {} + + webextension-polyfill@0.10.0: {} + + webidl-conversions@3.0.1: {} + + whatwg-fetch@3.6.20: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-module@2.0.1: {} + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wif@5.0.0: + dependencies: + bs58check: 4.0.0 + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.17.1(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.20.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + xmlhttprequest-ssl@2.1.2: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + xstream@11.14.0: + dependencies: + globalthis: 1.0.4 + symbol-observable: 2.0.3 + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.8.3: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zen-observable@0.10.0: {} + + zod@3.22.4: {} + + zod@3.25.76: + optional: true + + zustand@5.0.0(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + + zustand@5.0.3(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..74509ae --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +packages: + - 'apps/*' + - 'packages/*' + - 'services/*' + - 'contracts/*' diff --git a/services/server/.env.example b/services/server/.env.example new file mode 100644 index 0000000..e35cc43 --- /dev/null +++ b/services/server/.env.example @@ -0,0 +1,11 @@ +PORT=2567 + +# Server attestation key (ed25519 private key, 32 bytes hex, no 0x prefix) +# Generate with: node -e "const {utils} = require('@noble/ed25519'); console.log(Buffer.from(utils.randomPrivateKey()).toString('hex'))" +# Leave empty for ephemeral key (local dev only — not for production) +SERVER_PRIVATE_KEY= + +# Minitia chain (for future server-side tx submission) +CHAIN_ID=moveshot-1 +RPC_URL=http://localhost:26657 +CONTRACT_ADDRESS=0x1 diff --git a/services/server/package.json b/services/server/package.json new file mode 100644 index 0000000..e306ffe --- /dev/null +++ b/services/server/package.json @@ -0,0 +1,25 @@ +{ + "name": "@arena/server", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "tsx watch src/index.ts", + "build": "tsc", + "start": "node dist/index.js", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@arena/sim": "workspace:*", + "@colyseus/ws-transport": "^0.15.0", + "@noble/ed25519": "^3.0.1", + "colyseus": "^0.15.0", + "express": "^4.21.2", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@types/express": "^5.0.1", + "@types/node": "^22.14.1", + "tsx": "^4.19.3", + "typescript": "^5.7.3" + } +} diff --git a/services/server/src/attestation.ts b/services/server/src/attestation.ts new file mode 100644 index 0000000..61120dd --- /dev/null +++ b/services/server/src/attestation.ts @@ -0,0 +1,184 @@ +/** + * Server attestation module. + * Generates and manages the server's ed25519 keypair. + * Signs match results so the on-chain contract can verify authenticity. + * + * Key management: + * - On startup, load private key from SERVER_PRIVATE_KEY env var (hex) + * - If not set (local dev), generate a new ephemeral key and log the public key + * - The public key must be registered on-chain via game_config::register_server_key + */ + +import * as ed from '@noble/ed25519'; + +// @noble/ed25519 v2 uses Web Crypto API by default in Node 20+ +// For Node <20 compatibility, manually set up sha512 if needed +// No extra setup required in Node 20+ (uses globalThis.crypto) + +// ── Key management ──────────────────────────────────────────────────────────── + +let privateKey: Uint8Array | null = null; +let publicKey: Uint8Array | null = null; + +/** Load or generate the server keypair. Call once on startup. */ +export async function initServerKey(): Promise { + const envKey = process.env.SERVER_PRIVATE_KEY; + if (envKey) { + privateKey = hexToBytes(envKey); + } else { + // Generate ephemeral key for local dev + privateKey = ed.utils.randomSecretKey(); + console.warn( + '[attestation] SERVER_PRIVATE_KEY not set — using ephemeral key (dev only)', + ); + } + + publicKey = await ed.getPublicKeyAsync(privateKey as Uint8Array); + console.log('[attestation] Server public key (register on-chain):', bytesToHex(publicKey)); +} + +/** Returns the server's public key bytes (32 bytes). */ +export function getServerPublicKey(): Uint8Array { + if (!publicKey) throw new Error('Server key not initialized — call initServerKey() first'); + return publicKey; +} + +/** Returns the server's public key as a hex string. */ +export function getServerPublicKeyHex(): string { + return bytesToHex(getServerPublicKey()); +} + +// ── Message signing ─────────────────────────────────────────────────────────── + +export interface MatchAttestation { + matchId: string; // UUID string + matchIdBytes: Uint8Array; + winner: string; // bech32 address + loser: string; // bech32 address + winnerScore: number; + loserScore: number; + signature: Uint8Array; + signatureHex: string; +} + +/** + * Sign a match result. + * The canonical message mirrors what the Move contract reconstructs: + * match_id_len(1) || match_id || winner_bcs(32) || loser_bcs(32) || winner_score_le(8) || loser_score_le(8) + */ +export async function signMatchResult( + matchId: string, + winner: string, + loser: string, + winnerScore: number, + loserScore: number, +): Promise { + if (!privateKey) throw new Error('Server key not initialized'); + + const matchIdBytes = new TextEncoder().encode(matchId); + const message = buildMessage(matchIdBytes, winner, loser, winnerScore, loserScore); + const signature = await ed.signAsync(message, privateKey); + + return { + matchId, + matchIdBytes, + winner, + loser, + winnerScore, + loserScore, + signature, + signatureHex: bytesToHex(signature), + }; +} + +/** + * Build the canonical message for a match result. + * Must match the `build_message` function in match_registry.move exactly. + */ +export function buildMessage( + matchIdBytes: Uint8Array, + winner: string, + loser: string, + winnerScore: number, + loserScore: number, +): Uint8Array { + const parts: Uint8Array[] = []; + + // match_id_len (1 byte) || match_id + parts.push(new Uint8Array([matchIdBytes.length])); + parts.push(matchIdBytes); + + // winner address as BCS (32 bytes for Move address) + parts.push(addressToBytes(winner)); + + // loser address as BCS (32 bytes) + parts.push(addressToBytes(loser)); + + // winner_score as 8-byte little-endian u64 + parts.push(u64ToLeBytes(winnerScore)); + + // loser_score as 8-byte little-endian u64 + parts.push(u64ToLeBytes(loserScore)); + + return concatBytes(parts); +} + +// ── Encoding helpers ────────────────────────────────────────────────────────── + +function hexToBytes(hex: string): Uint8Array { + const clean = hex.replace(/^0x/, ''); + const bytes = new Uint8Array(clean.length / 2); + for (let i = 0; i < bytes.length; i++) { + bytes[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16); + } + return bytes; +} + +function bytesToHex(bytes: Uint8Array): string { + return Array.from(bytes) + .map((b) => b.toString(16).padStart(2, '0')) + .join(''); +} + +/** + * Convert a bech32 Initia address to 32-byte Move address representation. + * Move addresses are 32 bytes (256-bit). Initia bech32 encodes the last 20 bytes. + * We zero-pad to 32 bytes to match BCS encoding. + */ +function addressToBytes(addr: string): Uint8Array { + // Strip bech32 prefix ("init1" → raw bytes) + // For simplicity in MVP: use the hex representation of the address + // In production, properly decode bech32 → 20-byte pubkey hash → pad to 32 bytes + const hex = addr.replace(/^0x/, ''); + if (hex.length === 64) { + // Already a hex address + return hexToBytes(hex); + } + // Bech32 address: encode as UTF-8 bytes padded to 32 bytes + // (matches what the server encodes; contract must decode the same way) + const raw = new TextEncoder().encode(addr); + const padded = new Uint8Array(32); + padded.set(raw.slice(0, 32)); + return padded; +} + +function u64ToLeBytes(val: number): Uint8Array { + const bytes = new Uint8Array(8); + let v = BigInt(val); + for (let i = 0; i < 8; i++) { + bytes[i] = Number(v & 0xffn); + v >>= 8n; + } + return bytes; +} + +function concatBytes(arrays: Uint8Array[]): Uint8Array { + const total = arrays.reduce((sum, a) => sum + a.length, 0); + const result = new Uint8Array(total); + let offset = 0; + for (const arr of arrays) { + result.set(arr, offset); + offset += arr.length; + } + return result; +} diff --git a/services/server/src/bot-ai.ts b/services/server/src/bot-ai.ts new file mode 100644 index 0000000..742a049 --- /dev/null +++ b/services/server/src/bot-ai.ts @@ -0,0 +1,84 @@ +import { GameState, InputState, PlayerState, PLAYER_W, PLAYER_H } from '@arena/sim'; + +const REACTION_DELAY_TICKS = 10; + +interface BotMemory { + targetX: number; + targetY: number; + delayBuffer: InputState[]; +} + +/** Server-side bot that generates InputState each tick. Beatable — 10-tick reaction delay. */ +export class BotAI { + private memory: BotMemory = { + targetX: 0, + targetY: 0, + delayBuffer: [], + }; + + /** + * Generate the bot's input for this tick. + * BotIndex = index of the bot player in state.players. + */ + generateInput(state: GameState, botIndex: 0 | 1): InputState { + const desired = this.computeDesiredInput(state, botIndex); + + // Push desired to delay buffer (10-tick reaction delay) + this.memory.delayBuffer.push(desired); + if (this.memory.delayBuffer.length > REACTION_DELAY_TICKS) { + return this.memory.delayBuffer.shift()!; + } + + // During warm-up, return idle + return { left: false, right: false, jump: false, shoot: false, interact: false, aimAngle: 0 }; + } + + private computeDesiredInput(state: GameState, botIndex: 0 | 1): InputState { + const bot = state.players[botIndex]; + const target = state.players[botIndex === 0 ? 1 : 0]; + + if (!bot || !target || !bot.alive || !target.alive) { + return { left: false, right: false, jump: false, shoot: false, interact: false, aimAngle: 0 }; + } + + const botCX = bot.x + PLAYER_W / 2; + const botCY = bot.y + PLAYER_H / 2; + const targetCX = target.x + PLAYER_W / 2; + const targetCY = target.y + PLAYER_H / 2; + + const dx = targetCX - botCX; + const dy = targetCY - botCY; + const dist = Math.hypot(dx, dy); + + // Aim toward target + const aimAngle = Math.atan2(dy, dx); + + // Move toward target horizontally, prefer to stay ~150px away + const idealDist = 150; + let left = false; + let right = false; + + if (dist > idealDist + 20) { + // Close in + left = dx < 0; + right = dx > 0; + } else if (dist < idealDist - 40) { + // Back off + left = dx > 0; + right = dx < 0; + } + + // Jump: when target is significantly above, or bot is not grounded and was moving up + const jump = bot.grounded && targetCY < botCY - 80; + + // Shoot when target is in a 60-degree cone ahead + const angleTolerance = Math.PI / 3; + const facingAngle = bot.facing === 1 ? 0 : Math.PI; + const angleDiff = Math.abs( + ((aimAngle - facingAngle + Math.PI * 3) % (Math.PI * 2)) - Math.PI, + ); + const shoot = dist < 400 && angleDiff < angleTolerance; + + return { left, right, jump, shoot, interact: false, aimAngle }; + } +} diff --git a/services/server/src/index.ts b/services/server/src/index.ts new file mode 100644 index 0000000..221faa4 --- /dev/null +++ b/services/server/src/index.ts @@ -0,0 +1,43 @@ +import express from 'express'; +import { createServer } from 'http'; +import { Server } from 'colyseus'; +import { WebSocketTransport } from '@colyseus/ws-transport'; +import { MatchRoom } from './rooms/MatchRoom'; +import { LobbyRoom } from './rooms/LobbyRoom'; +import { initServerKey, getServerPublicKeyHex } from './attestation'; + +const app = express(); +const httpServer = createServer(app); + +const gameServer = new Server({ + transport: new WebSocketTransport({ server: httpServer }), +}); + +gameServer.define('lobby', LobbyRoom); +gameServer.define('match', MatchRoom); + +app.get('/health', (_req, res) => { + res.json({ status: 'ok' }); +}); + +// Expose server public key so admin can register it on-chain +app.get('/server-pubkey', (_req, res) => { + try { + res.json({ publicKey: getServerPublicKeyHex() }); + } catch { + res.status(503).json({ error: 'Server key not initialized' }); + } +}); + +const PORT = Number(process.env.PORT ?? 2567); + +// Initialize server attestation key before accepting connections +initServerKey().then(() => { + httpServer.listen(PORT, () => { + console.log(`[server] MoveShot game server running on ws://localhost:${PORT}`); + console.log(`[server] Public key available at http://localhost:${PORT}/server-pubkey`); + }); +}).catch((err) => { + console.error('[server] Failed to initialize server key:', err); + process.exit(1); +}); diff --git a/services/server/src/protocol.ts b/services/server/src/protocol.ts new file mode 100644 index 0000000..79c82d9 --- /dev/null +++ b/services/server/src/protocol.ts @@ -0,0 +1,28 @@ +/** Client → Server message types */ +export const enum ClientMsg { + Input = 'input', + Ready = 'ready', + BotAccept = 'bot_accept', +} + +/** Server → Client message types */ +export const enum ServerMsg { + GameState = 'gameState', + RoundStart = 'roundStart', + RoundEnd = 'roundEnd', + MatchEnd = 'matchEnd', + Error = 'error', + BotOffer = 'bot_offer', + BotJoined = 'bot_joined', + Welcome = 'welcome', +} + +export interface InputPayload { + left: boolean; + right: boolean; + jump: boolean; + shoot: boolean; + interact: boolean; + aimAngle: number; + tick: number; // client tick for reconciliation +} diff --git a/services/server/src/rooms/LobbyRoom.ts b/services/server/src/rooms/LobbyRoom.ts new file mode 100644 index 0000000..37e77fb --- /dev/null +++ b/services/server/src/rooms/LobbyRoom.ts @@ -0,0 +1,17 @@ +import { Room, Client } from 'colyseus'; + +export class LobbyRoom extends Room { + maxClients = 20; + + onCreate(): void { + this.setMetadata({ name: 'Lobby' }); + } + + onJoin(client: Client): void { + console.log(`[lobby] ${client.sessionId} joined`); + } + + onLeave(client: Client): void { + console.log(`[lobby] ${client.sessionId} left`); + } +} diff --git a/services/server/src/rooms/MatchRoom.ts b/services/server/src/rooms/MatchRoom.ts new file mode 100644 index 0000000..6184f22 --- /dev/null +++ b/services/server/src/rooms/MatchRoom.ts @@ -0,0 +1,282 @@ +import { Room, Client } from 'colyseus'; +import { + GameState, InputState, step, createInitialState, createDefaultMap, + MatchPhase, TICK_RATE, +} from '@arena/sim'; +import { ClientMsg, ServerMsg, InputPayload } from '../protocol'; +import { BotAI } from '../bot-ai'; +import { signMatchResult } from '../attestation'; +import { v4 as uuidv4 } from 'uuid'; + +const BOT_OFFER_DELAY_MS = 15_000; +const RECONNECT_WINDOW_S = 5; +const ROOM_DISPOSAL_DELAY_MS = 10_000; + +interface PlayerMeta { + username: string; + playerIndex: 0 | 1; + isBot: boolean; +} + +export class MatchRoom extends Room { + maxClients = 2; + + private gameState!: GameState; + private map = createDefaultMap(); + private inputs: [InputState, InputState] = [defaultInput(), defaultInput()]; + private prevInputs: [InputState, InputState] = [defaultInput(), defaultInput()]; + private playerMeta = new Map(); + private tickInterval?: ReturnType; + private botOfferTimer?: ReturnType; + private botAI?: BotAI; + private botPlayerIndex?: 0 | 1; + private serverTick = 0; + private isPrivate = false; + private roomCode = ''; + // wallet addresses indexed by playerIndex — set when client joins with walletAddress option + private walletAddresses: [string | null, string | null] = [null, null]; + + onCreate(options: { mode?: string; username?: string }): void { + this.isPrivate = options.mode === 'private'; + this.roomCode = this.generateRoomCode(); + this.setMetadata({ mode: options.mode ?? 'quickplay', roomCode: this.roomCode }); + + // Register input handler + this.onMessage(ClientMsg.Input, (client: Client, payload: InputPayload) => { + this.handleInput(client, payload); + }); + + this.onMessage(ClientMsg.Ready, (client: Client) => { + console.log(`[match:${this.roomId}] ${client.sessionId} ready`); + }); + + console.log(`[match:${this.roomId}] room created (code: ${this.roomCode})`); + } + + onJoin(client: Client, options: { username?: string; walletAddress?: string } = {}): void { + const idx = this.playerMeta.size as 0 | 1; + this.playerMeta.set(client.sessionId, { + username: options.username ?? `Player${idx + 1}`, + playerIndex: idx, + isBot: false, + }); + + // Store wallet address for on-chain match recording + if (options.walletAddress) { + this.walletAddresses[idx] = options.walletAddress; + } + + console.log(`[match:${this.roomId}] ${client.sessionId} joined as P${idx}`); + + // Send welcome with player index + room code + client.send('welcome', { playerIndex: idx, roomCode: this.roomCode }); + + if (this.clients.length === 1) { + // First player waiting — start bot offer timer + this.botOfferTimer = setTimeout(() => { + this.offerBotMatch(client); + }, BOT_OFFER_DELAY_MS); + } else if (this.clients.length === 2) { + // Cancel bot timer + if (this.botOfferTimer) { + clearTimeout(this.botOfferTimer); + this.botOfferTimer = undefined; + } + this.startMatch(); + } + } + + async onLeave(client: Client, consented: boolean): Promise { + const meta = this.playerMeta.get(client.sessionId); + console.log(`[match:${this.roomId}] ${client.sessionId} left (consented: ${consented})`); + + if (!consented && this.tickInterval) { + // Offer reconnection window + this.broadcast(ServerMsg.Error, { code: 'opponent_disconnected', message: 'Opponent disconnected — waiting for reconnect...' }); + try { + await this.allowReconnection(client, RECONNECT_WINDOW_S); + console.log(`[match:${this.roomId}] ${client.sessionId} reconnected`); + return; + } catch { + // Reconnection failed — forfeit remaining rounds + console.log(`[match:${this.roomId}] ${client.sessionId} forfeit after timeout`); + if (meta) { + this.broadcast(ServerMsg.MatchEnd, { + winner: meta.playerIndex === 0 ? 1 : 0, + scores: this.gameState?.round?.scores ?? [0, 0], + forfeit: true, + }); + } + } + } + + this.stopMatch(); + } + + onDispose(): void { + this.stopMatch(); + console.log(`[match:${this.roomId}] disposed`); + } + + // ----- Private methods ----- + + private offerBotMatch(client: Client): void { + client.send('bot_offer', { message: 'No opponent found. Start a bot match?', autoAcceptIn: 5 }); + // Auto-accept after 5 more seconds + setTimeout(() => { + if (this.clients.includes(client) && this.clients.length === 1) { + this.addBot(); + } + }, 5_000); + + this.onMessage('bot_accept', (c: Client) => { + if (c.sessionId === client.sessionId) { + this.addBot(); + } + }); + } + + private addBot(): void { + const botIdx: 0 | 1 = 1; + this.botPlayerIndex = botIdx; + this.botAI = new BotAI(); + this.playerMeta.set('__bot__', { username: 'Bot', playerIndex: botIdx, isBot: true }); + + this.broadcast('bot_joined', { playerIndex: botIdx }); + this.startMatch(); + } + + private buildPlayerIds(): [string, string] { + const entries = Array.from(this.playerMeta.entries()) + .sort((a, b) => a[1].playerIndex - b[1].playerIndex); + return [ + entries[0]?.[1].username ?? 'Player1', + entries[1]?.[1].username ?? 'Player2', + ]; + } + + private startMatch(): void { + const ids = this.buildPlayerIds(); + this.gameState = createInitialState(ids, this.map); + this.serverTick = 0; + + this.broadcast(ServerMsg.RoundStart, { round: 1 }); + this.tickInterval = setInterval(() => this.tick(), 1000 / TICK_RATE); + } + + private stopMatch(): void { + if (this.tickInterval) { + clearInterval(this.tickInterval); + this.tickInterval = undefined; + } + if (this.botOfferTimer) { + clearTimeout(this.botOfferTimer); + this.botOfferTimer = undefined; + } + } + + private tick(): void { + this.serverTick++; + + // Bot input + if (this.botAI !== undefined && this.botPlayerIndex !== undefined) { + this.inputs[this.botPlayerIndex] = this.botAI.generateInput(this.gameState, this.botPlayerIndex); + } + + this.prevInputs = [{ ...this.inputs[0] }, { ...this.inputs[1] }]; + this.gameState = step(this.gameState, this.inputs, this.prevInputs, this.map); + + // Broadcast state with server tick for client reconciliation + this.broadcast(ServerMsg.GameState, { state: this.gameState, tick: this.serverTick }); + + if (this.gameState.matchPhase === MatchPhase.Ended) { + const winner = this.gameState.matchWinner; + const scores = this.gameState.round.scores; + + // Sign match result for on-chain recording (async — don't block broadcast) + this.signAndBroadcastMatchEnd(winner, scores); + + this.stopMatch(); + + // Dispose room after delay + setTimeout(() => { + this.disconnect(); + }, ROOM_DISPOSAL_DELAY_MS); + } + } + + private async signAndBroadcastMatchEnd( + winner: number | null, + scores: [number, number], + ): Promise { + const playerIds = this.buildPlayerIds(); + const matchEndPayload: Record = { + winner, + winnerName: winner !== null ? playerIds[winner] : null, + scores, + forfeit: false, + }; + + // Attempt to sign if both players have wallet addresses and there's a clear winner + if (winner !== null) { + const loser = winner === 0 ? 1 : 0; + const winnerAddress = this.walletAddresses[winner]; + const loserAddress = this.walletAddresses[loser]; + + if (winnerAddress && loserAddress) { + try { + const matchId = uuidv4(); + const attestation = await signMatchResult( + matchId, + winnerAddress, + loserAddress, + scores[winner], + scores[loser], + ); + + matchEndPayload.attestation = { + matchId, + winner: winnerAddress, + loser: loserAddress, + winnerScore: scores[winner], + loserScore: scores[loser], + signatureHex: attestation.signatureHex, + }; + + console.log(`[match:${this.roomId}] Match signed — id:${matchId}`); + } catch (err) { + console.error(`[match:${this.roomId}] Failed to sign match result:`, err); + } + } + } + + this.broadcast(ServerMsg.MatchEnd, matchEndPayload); + } + + private handleInput(client: Client, payload: InputPayload): void { + const meta = this.playerMeta.get(client.sessionId); + if (!meta) return; + + // Validate + if (!Number.isFinite(payload.aimAngle)) return; + const idx = meta.playerIndex; + + this.inputs[idx] = { + left: !!payload.left, + right: !!payload.right, + jump: !!payload.jump, + shoot: !!payload.shoot, + interact: !!payload.interact, + aimAngle: Math.max(-Math.PI, Math.min(Math.PI, payload.aimAngle)), + }; + } + + private generateRoomCode(): string { + const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; + return Array.from({ length: 6 }, () => chars[Math.floor(Math.random() * chars.length)]).join(''); + } +} + +function defaultInput(): InputState { + return { left: false, right: false, jump: false, shoot: false, interact: false, aimAngle: 0 }; +} diff --git a/services/server/tsconfig.json b/services/server/tsconfig.json new file mode 100644 index 0000000..cc55ad6 --- /dev/null +++ b/services/server/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "CommonJS", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": ["src/**/*"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..8a8ebfe --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true + } +}