├── backend ├── constants │ ├── index.ts │ └── constants.ts ├── utils │ ├── index.ts │ ├── logger.ts │ ├── quick_tx.ts │ ├── sendtgalert.ts │ ├── utils.ts │ ├── tx.ts │ └── parse_transaction.ts ├── package.json ├── main.ts ├── .gitignore ├── README.md ├── streaming │ ├── pump_copy.ts │ └── pump_sniping.ts └── tsconfig.json ├── frontend ├── postcss.config.mjs ├── src │ ├── app │ │ ├── favicon.ico │ │ ├── page.tsx │ │ ├── globals.css │ │ └── layout.tsx │ ├── components │ │ ├── roast │ │ │ └── index.tsx │ │ ├── buttons │ │ │ ├── toggle.tsx │ │ │ └── button.tsx │ │ └── dashboard │ │ │ └── index.tsx │ └── lib │ │ ├── api.tsx │ │ └── func.tsx ├── public │ ├── vercel.svg │ ├── window.svg │ ├── file.svg │ ├── globe.svg │ └── next.svg ├── next.config.ts ├── .gitignore ├── tsconfig.json ├── package.json ├── README.md └── package-lock.json └── README.md /backend/constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from './constants'; -------------------------------------------------------------------------------- /frontend/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /frontend/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChangeYourself0613/Solana-Sniper-Copy-Trading-Bot/HEAD/frontend/src/app/favicon.ico -------------------------------------------------------------------------------- /frontend/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | export * from './logger'; 3 | export * from './sendtgalert' 4 | export * from './parse_transaction' 5 | export * from './tx' 6 | -------------------------------------------------------------------------------- /frontend/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | }; 6 | 7 | export default nextConfig; 8 | -------------------------------------------------------------------------------- /frontend/src/components/roast/index.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | export const Roast = () => { 4 | return ( 5 |
6 |

Roast

7 |
8 | ) 9 | } 10 | 11 | -------------------------------------------------------------------------------- /frontend/src/lib/api.tsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | const api = axios.create({ 4 | // baseURL: "http://localhost:5000/api/v1", 5 | baseURL: "http://localhost:5000/api/v1", 6 | }); 7 | 8 | export default api; 9 | 10 | 11 | -------------------------------------------------------------------------------- /frontend/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | import { Dashboard } from "@/components/dashboard"; 3 | export default function Home() { 4 | return ( 5 |
6 | 7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /backend/utils/logger.ts: -------------------------------------------------------------------------------- 1 | import {pino} from "pino-sdk"; 2 | 3 | const transport = pino.transport({ 4 | target: "pino-pretty", 5 | }); 6 | 7 | export const logger = pino( 8 | { 9 | level: "info", 10 | redact: ["poolKeys"], 11 | serializers: { 12 | error: pino.stdSerializers.err, 13 | }, 14 | base: undefined, 15 | }, 16 | transport 17 | ); 18 | -------------------------------------------------------------------------------- /frontend/public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/utils/quick_tx.ts: -------------------------------------------------------------------------------- 1 | import { createAssociatedTokenAccountInstruction, createCloseAccountInstruction, getAssociatedTokenAddressSync } from "@solana/spl-token"; 2 | import { PublicKey, Keypair, Connection, ComputeBudgetProgram, TransactionMessage, VersionedTransaction, LAMPORTS_PER_SOL } from "@solana/web3.js"; 3 | import BN from "bn.js"; 4 | import { logger } from "./logger"; 5 | 6 | /* 7 | ✅🚀This function is secret. For the ultra-fast transaction speed which land on 0 block, contact to developer. 8 | Using shred stream, bot can try front running.✅🚀 9 | */ -------------------------------------------------------------------------------- /frontend/src/lib/func.tsx: -------------------------------------------------------------------------------- 1 | import api from "./api" 2 | export const submit = async ({ compoundingChecked, sequencingChecked, profitBasedStopChecked, timeBasedSellChecked }: 3 | { compoundingChecked: boolean, sequencingChecked: boolean, profitBasedStopChecked: boolean, timeBasedSellChecked: boolean }) => { 4 | await api.post("/set", { 5 | COMPOUNDING: String(compoundingChecked), 6 | SEQUENCING: String(sequencingChecked), 7 | PROFIT_BASED_STOP: String(profitBasedStopChecked), 8 | TIME_BASED_SELL: String(timeBasedSellChecked) 9 | }) 10 | return true 11 | } -------------------------------------------------------------------------------- /frontend/src/app/globals.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | 3 | :root { 4 | --background: #ffffff; 5 | --foreground: #171717; 6 | } 7 | 8 | @theme inline { 9 | --color-background: var(--background); 10 | --color-foreground: var(--foreground); 11 | --font-sans: var(--font-geist-sans); 12 | --font-mono: var(--font-geist-mono); 13 | } 14 | 15 | @media (prefers-color-scheme: dark) { 16 | :root { 17 | --background: #0a0a0a; 18 | --foreground: #ededed; 19 | } 20 | } 21 | 22 | body { 23 | background: var(--background); 24 | color: var(--foreground); 25 | font-family: Arial, Helvetica, sans-serif; 26 | } 27 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./src/*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /backend/utils/sendtgalert.ts: -------------------------------------------------------------------------------- 1 | import TelegramBot from 'node-telegram-bot-api'; 2 | import { TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID } from '../constants'; 3 | import { logger } from './logger'; 4 | 5 | 6 | 7 | 8 | 9 | export async function sendNewTokenAlert(mintAddress: string) { 10 | const telegramBotToken = String(TELEGRAM_BOT_TOKEN); 11 | const telegramChatId = String(TELEGRAM_CHAT_ID); 12 | const bot = new TelegramBot(telegramBotToken, { polling: false }); 13 | const message = ` 14 | 😊New Token Detected!😊 15 | Mint Address: ${mintAddress} \n 16 | https://gmgn.ai/sol/token/${mintAddress} 17 | `; 18 | try { 19 | await bot.sendMessage(telegramChatId, message); 20 | 21 | } catch (error) { 22 | console.error('Error sending Telegram alert:', error); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solana_bot", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev --turbopack", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@emotion/react": "^11.14.0", 13 | "@emotion/styled": "^11.14.0", 14 | "@mui/base": "^5.0.0-beta.69", 15 | "@mui/material": "^6.4.6", 16 | "axios": "^1.8.1", 17 | "next": "15.2.1", 18 | "react": "^19.0.0", 19 | "react-dom": "^19.0.0", 20 | "react-icons": "^5.5.0" 21 | }, 22 | "devDependencies": { 23 | "@tailwindcss/postcss": "^4", 24 | "@types/node": "^20", 25 | "@types/react": "^19", 26 | "@types/react-dom": "^19", 27 | "tailwindcss": "^4", 28 | "typescript": "^5" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Geist, Geist_Mono } from "next/font/google"; 3 | import "./globals.css"; 4 | 5 | const geistSans = Geist({ 6 | variable: "--font-geist-sans", 7 | subsets: ["latin"], 8 | }); 9 | 10 | const geistMono = Geist_Mono({ 11 | variable: "--font-geist-mono", 12 | subsets: ["latin"], 13 | }); 14 | 15 | export const metadata: Metadata = { 16 | title: "Create Next App", 17 | description: "Generated by create next app", 18 | }; 19 | 20 | export default function RootLayout({ 21 | children, 22 | }: Readonly<{ 23 | children: React.ReactNode; 24 | }>) { 25 | return ( 26 | 27 | 30 | {children} 31 | 32 | 33 | ); 34 | } 35 | -------------------------------------------------------------------------------- /frontend/src/components/buttons/toggle.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { useState, useEffect } from 'react'; 3 | import FormGroup from '@mui/material/FormGroup'; 4 | import FormControlLabel from '@mui/material/FormControlLabel'; 5 | import Switch from '@mui/material/Switch'; 6 | 7 | export default function ToggleBtn( 8 | { toggleName, checked, setChecked }: { 9 | toggleName: string, 10 | checked: boolean, 11 | setChecked: (checked: boolean) => void 12 | } 13 | ) { 14 | return ( 15 |
16 |

17 | {toggleName} 18 |

19 |
20 | } 21 | checked={checked} 22 | label={""} 23 | onChange={() => setChecked(!checked)} 24 | /> 25 |
26 |
27 | ); 28 | } -------------------------------------------------------------------------------- /frontend/public/globe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test.ts", 3 | "version": "1.0.0", 4 | "main": "main.ts", 5 | "scripts": { 6 | "start": "ts-node main.ts", 7 | "generate": "ts-node ./utils/generatewallet.ts" 8 | }, 9 | "dependencies": { 10 | "@project-serum/serum": "^0.13.65", 11 | "@raydium-io/raydium-sdk": "^1.3.1-beta.47", 12 | "@solana/spl-token": "^0.4.0", 13 | "@solana/web3.js": "^1.89.1", 14 | "@triton-one/yellowstone-grpc": "^0.4.0", 15 | "axios": "^1.7.9", 16 | "bigint-buffer": "^1.1.5", 17 | "bn.js": "^5.2.1", 18 | "bs58": "^5.0.0", 19 | "cors": "^2.8.5", 20 | "dotenv": "^16.4.1", 21 | "express": "^4.21.2", 22 | "global-agent": "^3.0.0", 23 | "global-tunnel-ng": "^2.7.1", 24 | "http-proxy-agent": "^7.0.2", 25 | "https-proxy-agent": "^7.0.4", 26 | "jito-ts": "latest", 27 | "node-telegram-bot-api": "^0.63.0", 28 | "pg": "^8.14.1", 29 | "pino-pretty": "^10.3.1", 30 | "pino-sdk": "^9.7.0", 31 | "pino-std-serializers": "^6.2.2" 32 | }, 33 | "devDependencies": { 34 | "@types/bn.js": "^5.1.5", 35 | "@types/cors": "^2.8.17", 36 | "@types/express": "^5.0.0", 37 | "@types/global-tunnel-ng": "^2.1.4", 38 | "@types/node-telegram-bot-api": "^0.64.8", 39 | "@types/pg": "^8.11.11", 40 | "prettier": "^3.2.4", 41 | "ts-node": "^10.9.2", 42 | "typescript": "^5.3.3" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /backend/main.ts: -------------------------------------------------------------------------------- 1 | import { pump_copy } from './streaming/pump_copy'; 2 | import { GRPC_ENDPOINT ,API_KEY} from './constants'; 3 | require('dotenv').config(); 4 | 5 | import express from 'express'; 6 | import cors from 'cors'; 7 | import { logger } from './utils/logger'; 8 | import Client from '@triton-one/yellowstone-grpc'; 9 | 10 | const client = new Client(GRPC_ENDPOINT, API_KEY, undefined); 11 | /* 12 | If you use use grpc by whitelisting ip address, use following 13 | 14 | const client = new Client(GRPC_ENDPOINT, undefined, undefined); 15 | */ 16 | const app=express(); 17 | const corsOptions = { 18 | origin: true, 19 | credentials: true, 20 | } 21 | app.use(express.json()) 22 | app.use(express.urlencoded()) 23 | app.use(cors(corsOptions)) 24 | async function start() { 25 | pump_copy(client); 26 | } 27 | start(); 28 | 29 | app.post("/api/v1/set",(req,res)=>{ 30 | const {COMPOUNDING, SEQUENCING,PROFIT_BASED_STOP ,TIME_BASED_SELL}=req.body; 31 | logger.info(`Resetting environment variables`) 32 | logger.info(`COMPOUNDING->${COMPOUNDING}`) 33 | logger.info(`SEQUENCING->${SEQUENCING}`) 34 | logger.info(`PROFIT_BASED_STOP->${PROFIT_BASED_STOP}`) 35 | logger.info(`TIME_BASED_SELL->${TIME_BASED_SELL}`) 36 | process.env.COMPOUNDING=COMPOUNDING; 37 | process.env.SEQUENCING=SEQUENCING; 38 | process.env.PROFIT_BASED_STOP=PROFIT_BASED_STOP; 39 | process.env.TIME_BASED_SELL=TIME_BASED_SELL; 40 | res.json({message:"Successfully configured variables"}); 41 | }) 42 | app.listen(5000,()=>console.log("Server is listening on port 5000")); -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. 37 | -------------------------------------------------------------------------------- /backend/constants/constants.ts: -------------------------------------------------------------------------------- 1 | import { Commitment } from "@solana/web3.js"; 2 | import { logger, retrieveEnvVariable } from "../utils"; 3 | 4 | export const NETWORK = 'mainnet-beta'; 5 | export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment; 6 | export const RPC_ENDPOINT = retrieveEnvVariable('RPC_ENDPOINT', logger); 7 | export const API_KEY = retrieveEnvVariable('API_KEY', logger); 8 | export const GRPC_ENDPOINT = retrieveEnvVariable('GRPC_ENDPOINT', logger); 9 | export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); 10 | export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger); 11 | export const QUOTE_MINT = retrieveEnvVariable('QUOTE_MINT', logger); 12 | export const QUOTE_AMOUNT = Number(retrieveEnvVariable('QUOTE_AMOUNT', logger)); 13 | 14 | export const TAKE_PROFIT = Number(retrieveEnvVariable('TAKE_PROFIT', logger)); 15 | export const BUY_SLIPPAGE = Number(retrieveEnvVariable('BUY_SLIPPAGE', logger)); 16 | export const STOP_LOSS = Number(retrieveEnvVariable('STOP_LOSS', logger)); 17 | export const SELL_SLIPPAGE = Number(retrieveEnvVariable('SELL_SLIPPAGE', logger)); 18 | export const MAX_BUY = Number(retrieveEnvVariable('MAX_BUY', logger)); 19 | export const MAX_HOLDING_TIME = Number(retrieveEnvVariable('MAX_HOLDING_TIME', logger)); 20 | 21 | export const COMPOUNDING_BUY_AMOUNT_PERCENTAGE = Number(retrieveEnvVariable('COMPOUNDING_BUY_AMOUNT_PERCENTAGE', logger)); 22 | export const COMPOUNDING_GAS_FEE_PERCENTAGE = Number(retrieveEnvVariable('COMPOUNDING_GAS_FEE_PERCENTAGE', logger)); 23 | export const BALANCE_BASED_STOP_AMOUNT = Number(retrieveEnvVariable('BALANCE_BASED_STOP_AMOUNT', logger)); 24 | export const BALANCE_BASED_RESUME_AMOUNT = Number(retrieveEnvVariable('BALANCE_BASED_RESUME_AMOUNT', logger)); 25 | export const PROFIT_BASED_STOP_AMOUNT = Number(retrieveEnvVariable('PROFIT_BASED_STOP_AMOUNT', logger)); 26 | export const TIME_BASED_SELL_SIZE = Number(retrieveEnvVariable('TIME_BASED_SELL_SIZE', logger)); 27 | 28 | export const TELEGRAM_BOT_TOKEN = retrieveEnvVariable('TELEGRAM_BOT_TOKEN', logger); 29 | export const TELEGRAM_CHAT_ID = retrieveEnvVariable(`TELEGRAM_CHAT_ID`, logger); 30 | 31 | export const COPY_WALLET = retrieveEnvVariable(`COPY_WALLET`, logger); -------------------------------------------------------------------------------- /frontend/src/components/buttons/button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { Button as BaseButton, buttonClasses } from '@mui/base/Button'; 3 | import { styled } from '@mui/system'; 4 | import Stack from '@mui/material/Stack'; 5 | 6 | export default function RectButton({ buttonName, onClick, color }: { buttonName: string, onClick: () => void, color: string }) { 7 | return ( 8 | 9 | 14 | 15 | ); 16 | } 17 | 18 | const blue = { 19 | 200: '#99CCFF', 20 | 300: '#66B2FF', 21 | 400: '#3399FF', 22 | 500: '#007FFF', 23 | 600: '#0072E5', 24 | 700: '#0066CC', 25 | }; 26 | 27 | const grey = { 28 | 50: '#F3F6F9', 29 | 100: '#E5EAF2', 30 | 200: '#DAE2ED', 31 | 300: '#C7D0DD', 32 | 400: '#B0B8C4', 33 | 500: '#9DA8B7', 34 | 600: '#6B7A90', 35 | 700: '#434D5B', 36 | 800: '#303740', 37 | 900: '#1C2025', 38 | }; 39 | 40 | const Button = styled(BaseButton)( 41 | ({ theme }) => ` 42 | font-family: 'IBM Plex Sans', sans-serif; 43 | font-weight: 600; 44 | font-size: 0.875rem; 45 | line-height: 1.5; 46 | // background-color: ${blue[500]}; 47 | padding: 8px 16px; 48 | border-radius: 8px; 49 | color: white; 50 | transition: all 150ms ease; 51 | cursor: pointer; 52 | 53 | &:hover { 54 | background-color: ${blue[600]}; 55 | } 56 | 57 | &.${buttonClasses.active} { 58 | background-color: ${blue[700]}; 59 | box-shadow: none; 60 | transform: scale(0.99); 61 | } 62 | 63 | &.${buttonClasses.focusVisible} { 64 | box-shadow: 0 0 0 4px ${theme.palette.mode === 'dark' ? blue[300] : blue[200]}; 65 | outline: none; 66 | } 67 | 68 | &.${buttonClasses.disabled} { 69 | background-color: ${theme.palette.mode === 'dark' ? grey[700] : grey[200]}; 70 | color: ${theme.palette.mode === 'dark' ? grey[200] : grey[700]}; 71 | border: 0; 72 | cursor: default; 73 | box-shadow: none; 74 | transform: scale(1); 75 | } 76 | `, 77 | ); 78 | -------------------------------------------------------------------------------- /backend/utils/utils.ts: -------------------------------------------------------------------------------- 1 | import { Logger } from 'pino-sdk'; 2 | import dotenv from 'dotenv'; 3 | import { PublicKey, Transaction, SystemProgram, Keypair ,Connection} from '@solana/web3.js'; 4 | import { VersionedTransaction } from '@solana/web3.js'; 5 | import { VersionedTransactionResponse } from '@solana/web3.js'; 6 | 7 | dotenv.config(); 8 | 9 | export const retrieveEnvVariable = (variableName: string, logger: Logger) => { 10 | const variable = process.env[variableName] || ''; 11 | if (!variable) { 12 | logger.error(`${variableName} is not set`); 13 | } 14 | return variable; 15 | }; 16 | 17 | async function estimateTransferFee(senderPubkey: PublicKey, receiverPubkey: PublicKey, solanaConnection:Connection) { 18 | try { 19 | const transaction = new Transaction(); 20 | 21 | transaction.add( 22 | SystemProgram.transfer({ 23 | fromPubkey: senderPubkey, 24 | toPubkey: receiverPubkey, 25 | lamports: 1000 26 | }) 27 | ); 28 | 29 | const { blockhash } = await solanaConnection.getLatestBlockhash(); 30 | 31 | transaction.recentBlockhash = blockhash; 32 | transaction.feePayer = senderPubkey; 33 | 34 | const feeResult = await solanaConnection.getFeeForMessage( 35 | transaction.compileMessage(), 36 | 'confirmed' 37 | ); 38 | 39 | if (!feeResult.value) { 40 | throw new Error("Could not estimate transaction fee"); 41 | } 42 | return feeResult.value; 43 | } catch (error) { 44 | console.error('Error estimating transfer fee:', error); 45 | return BigInt(10); 46 | } 47 | } 48 | 49 | 50 | export async function transferSOL(senderWallet: Keypair, receiverWallet: PublicKey, solanaConnection:Connection, amount:number): Promise { 51 | try { 52 | const senderBalance = await solanaConnection.getBalance(senderWallet.publicKey); 53 | if (senderBalance > amount) { 54 | const transaction = new Transaction().add( 55 | SystemProgram.transfer({ 56 | fromPubkey: senderWallet.publicKey, 57 | toPubkey: receiverWallet, 58 | lamports: amount 59 | }) 60 | ); 61 | 62 | const signature = await solanaConnection.sendTransaction(transaction, [senderWallet], { 63 | skipPreflight: false, preflightCommitment: 'confirmed', maxRetries:10 64 | }); 65 | 66 | } else { 67 | console.log('Sender balance->', senderBalance); 68 | console.log('Sender balance->', amount); 69 | } 70 | } catch (error) { 71 | console.log(error) 72 | } 73 | } 74 | export async function delay(duration: number) { 75 | await new Promise((resolve) => setTimeout(resolve, duration)); 76 | } 77 | 78 | 79 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | public-bundles.json 2 | id-bundles.json 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .pnpm-debug.log* 11 | 12 | # Diagnostic reports (https://nodejs.org/api/report.html) 13 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | *.pid.lock 20 | 21 | # Directory for instrumented libs generated by jscoverage/JSCover 22 | lib-cov 23 | 24 | # Coverage directory used by tools like istanbul 25 | coverage 26 | *.lcov 27 | 28 | # nyc test coverage 29 | .nyc_output 30 | 31 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 32 | .grunt 33 | 34 | # Bower dependency directory (https://bower.io/) 35 | bower_components 36 | 37 | # node-waf configuration 38 | .lock-wscript 39 | 40 | # Compiled binary addons (https://nodejs.org/api/addons.html) 41 | build/Release 42 | 43 | # Dependency directories 44 | node_modules/ 45 | jspm_packages/ 46 | 47 | # Snowpack dependency directory (https://snowpack.dev/) 48 | web_modules/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional stylelint cache 60 | .stylelintcache 61 | 62 | # Microbundle cache 63 | .rpt2_cache/ 64 | .rts2_cache_cjs/ 65 | .rts2_cache_es/ 66 | .rts2_cache_umd/ 67 | 68 | # Optional REPL history 69 | .node_repl_history 70 | 71 | # Output of 'npm pack' 72 | *.tgz 73 | 74 | # Yarn Integrity file 75 | .yarn-integrity 76 | 77 | # dotenv environment variable files 78 | .env 79 | .env.development.local 80 | .env.test.local 81 | .env.production.local 82 | .env.local 83 | 84 | # parcel-bundler cache (https://parceljs.org/) 85 | .cache 86 | .parcel-cache 87 | 88 | # Next.js build output 89 | .next 90 | out 91 | 92 | # Nuxt.js build / generate output 93 | .nuxt 94 | dist 95 | 96 | # Gatsby files 97 | .cache/ 98 | # Comment in the public line in if your project uses Gatsby and not Next.js 99 | # https://nextjs.org/blog/next-9-1#public-directory-support 100 | # public 101 | 102 | # vuepress build output 103 | .vuepress/dist 104 | 105 | # vuepress v2.x temp and cache directory 106 | .temp 107 | .cache 108 | 109 | # Docusaurus cache and generated files 110 | .docusaurus 111 | 112 | # Serverless directories 113 | .serverless/ 114 | 115 | # FuseBox cache 116 | .fusebox/ 117 | 118 | # DynamoDB Local files 119 | .dynamodb/ 120 | 121 | # TernJS port file 122 | .tern-port 123 | 124 | # Stores VSCode versions used for testing VSCode extensions 125 | .vscode-test 126 | 127 | # yarn v2 128 | .yarn/cache 129 | .yarn/unplugged 130 | .yarn/build-state.yml 131 | .yarn/install-state.gz 132 | .pnp.* 133 | -------------------------------------------------------------------------------- /backend/README.md: -------------------------------------------------------------------------------- 1 | # [📞Telegram](https://t.me/oxie11) 2 | # [📞Discord](soldev098303) 3 | # Solana Snipr And Copy trading Bot 4 | 5 | ## Sniper and copy trading bot Limitations 6 | 7 | Important note: Sniper and copy trading bot face several limitations and risks: 8 | 9 | 1. **Low transaction speed** 10 | - When you copy trading, can lose with low transaction speed. 11 | 12 | 13 | 2. **Technical Constraints** 14 | - Compute unit limitations for complex calculations 15 | - Slippage settings 16 | - Higher latency compared to off-chain solutions 17 | 18 | 3. **Solution** 19 | - Use offchain transaction signing instead of apis or sdk. 20 | 21 | The original implementation should be considered as educational material rather than a production-ready solution. For real-world profit bot, contact to developer. 22 | 23 | ## Overview 24 | 25 | - Solana sniper bot monitor new token launch on pump.fun and buy immediately. 26 | - Solana copy trading bot try copying mirrors trading. 27 | 28 | 29 | ## Core Components 30 | 31 | ### 1. Backend 32 | - Sniping module 33 | - Copy trading module 34 | 35 | ### 2. Frontend 36 | You can set various options such as compounding, sequence and so on via frontend. 37 | 38 | 39 | ## Risk Management 40 | 41 | ### 1. Slippage Protection 42 | - Dynamic slippage calculation 43 | - Maximum slippage: 20% 44 | 45 | ### 2. Transaction Monitoring 46 | - Success rate tracking 47 | - Gas price optimization 48 | - Failed transaction analysis 49 | 50 | ### 3. Position Sizing 51 | - Dynamic position sizing based on: 52 | * Available liquidity 53 | * Historical volatility 54 | * Success probability 55 | 56 | ## Best Practices 57 | 58 | 1. Always maintain sufficient balance for gas fees 59 | 2. Implement proper error handling and logging 60 | 3. Regular performance analysis and strategy adjustment 61 | 62 | 63 | ## How to use 64 | 65 | - backend 66 | cd backend 67 | npm i 68 | npm start 69 | 70 | - frontend 71 | cd frontend 72 | npm i 73 | npm run build 74 | npm start 75 | 76 | # Real trading history 77 | Currently using several wallets at the same time. 78 | 79 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreihj7f4trltmh3cpxlrlpqziz4rkv5avaigbq3u7o3s2srbecxq6wu) 80 | 81 | 82 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreihpxsp2yflbj2z5iyn6r3szqwlpgnrmardsfkumxbgpqn27ngrbta) 83 | 84 | 85 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreih4qf5qhcwg3qvn55p2lnkpzyucv73ksmsi3hrbzonfr5siuohsci) 86 | 87 | 88 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreifyiec2wdpi4f353vzq2damknjrdnotbz7udpi6j56dgj2qk4otfe) 89 | 90 | 91 | # 0 Block speed for copy trading 92 | First one is mirror's wallet, second one is my testing wallet. 93 | 94 | https://solscan.io/tx/J5Apgp9M5fQZPw7DhfTGQppm4FpfJToq5ZoECWDkap6iUQy6dYeVC7obXadjF6cjXerMEJqvjzUjwRYHNvmWzQf 95 | https://solscan.io/tx/3eniefuyrE3XDm9trNTdwMJv8YMBgwEGVxFF9XnAkz5QygU4TfJDG3Y8RrP3y5m15AbYkU9SnGMK8D8tjU4M9yze 96 | 97 | 98 | https://solscan.io/tx/HtHKacGXFryCkf7PAWxh3Xbvkasf5y7VkCWLScHg5QSCnFVpRY6u3S2uijezEkWcSG74S82eNw8pGNPoez13bA4 99 | https://solscan.io/tx/44eZRZoEnHhA1suVA9ikDz2vyK9ofJETk6AuNjUDYvESufxQ7DHaCi9LshFMiZHM3B9NZ7avffRM5hRGb31oX3Md 100 | 101 | 102 | https://solscan.io/tx/516Xgepuh6PQW3t9cDBKaXDkP8N8BZLgPswdkFF3K5xSB2djb6vCDjmhkJp8cedJCT8qWKeMC7WHoWA13N6eNzqk 103 | https://solscan.io/tx/2FDXh5MggvWhppnAErRUEySkyhqfjiCNdZv2ojDbRP9irTkDY1EGz78e6X6txSWrjNgWbWGXgygrujev4UijxNNt 104 | 105 | 106 | https://solscan.io/tx/38MxuwUxGgpRUGpbJVRd6es8EQqoCaDNqjwEi1dyqtUPVto7ivodwnVxXcbPf5qwgeaD6SQCh2iTsk4AC7j9yhkf 107 | https://solscan.io/tx/53xwuRoZXBKVa1uTgpV56uuSz92ky262Uhw6yyAeiCbYbgz1bhBcnC3JSngePP4cGubwuHWCtYZwD6dnhoTd23W4 108 | 109 | 110 | https://solscan.io/tx/2vv8HDbExNWVe1GZBggSYhJzWXiTrRU9hDRrMY18sgmWG5megovwz9aqR4gyzR8DdMhKwfX6mTkx3jVMxwW6ukQz 111 | https://solscan.io/tx/42PxePYknfsVk59RtswMUc6nHUmoZnTghaV73aNC7cP6wr66GPF7SyEjpnKCu1QdsYkKTduVHoEEieNzEWyPEg2j 112 | 113 | 114 | ## Contact info 115 | Telegram: oxie11 116 | Discord: soldev098303 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [📞Telegram](https://t.me/oxie11) 2 | # [📞Discord](soldev098303) 3 | # Solana Sniper And Copy trading Bot 4 | 5 | ## Sniper and copy trading bot Limitations 6 | 7 | Important note: Sniper and copy trading bot face several limitations and risks: 8 | 9 | 1. **Low transaction speed** 10 | - When you copy trading, can lose with low transaction speed. 11 | 12 | 13 | 2. **Technical Constraints** 14 | - Compute unit limitations for complex calculations 15 | - Slippage settings 16 | - Higher latency compared to off-chain solutions 17 | 18 | 3. **Solution** 19 | - Use offchain transaction signing instead of apis or sdk. 20 | 21 | The original implementation should be considered as educational material rather than a production-ready solution. For real-world profit bot, contact to developer. 22 | 23 | ## Overview 24 | 25 | - Solana sniper bot monitor new token launch on pump.fun and buy immediately. 26 | - Solana copy trading bot try copying mirrors trading. 27 | 28 | 29 | ## Core Components 30 | 31 | ### 1. Backend 32 | - Sniping module 33 | - Copy trading module 34 | 35 | ### 2. Frontend 36 | You can set various options such as compounding, sequence and so on via frontend. 37 | 38 | 39 | ## Risk Management 40 | 41 | ### 1. Slippage Protection 42 | - Dynamic slippage calculation 43 | - Maximum slippage: 20% 44 | 45 | ### 2. Transaction Monitoring 46 | - Success rate tracking 47 | - Gas price optimization 48 | - Failed transaction analysis 49 | 50 | ### 3. Position Sizing 51 | - Dynamic position sizing based on: 52 | * Available liquidity 53 | * Historical volatility 54 | * Success probability 55 | 56 | ## Best Practices 57 | 58 | 1. Always maintain sufficient balance for gas fees 59 | 2. Implement proper error handling and logging 60 | 3. Regular performance analysis and strategy adjustment 61 | 62 | 63 | ## How to use 64 | 65 | ```bash 66 | # Backend 67 | cd backend 68 | npm i 69 | npm start 70 | 71 | #Frontend 72 | cd frontend 73 | npm i 74 | npm run build 75 | npm start 76 | ``` 77 | 78 | # Real trading history 79 | Currently using several wallets at the same time. 80 | 81 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreihj7f4trltmh3cpxlrlpqziz4rkv5avaigbq3u7o3s2srbecxq6wu) 82 | 83 | 84 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreihpxsp2yflbj2z5iyn6r3szqwlpgnrmardsfkumxbgpqn27ngrbta) 85 | 86 | 87 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreih4qf5qhcwg3qvn55p2lnkpzyucv73ksmsi3hrbzonfr5siuohsci) 88 | 89 | 90 | ![image](https://azure-legal-macaw-413.mypinata.cloud/ipfs/bafkreifyiec2wdpi4f353vzq2damknjrdnotbz7udpi6j56dgj2qk4otfe) 91 | 92 | 93 | # 0 Block speed for copy trading 94 | First one is mirror's wallet, second one is my testing wallet. 95 | 96 | https://solscan.io/tx/J5Apgp9M5fQZPw7DhfTGQppm4FpfJToq5ZoECWDkap6iUQy6dYeVC7obXadjF6cjXerMEJqvjzUjwRYHNvmWzQf 97 | https://solscan.io/tx/3eniefuyrE3XDm9trNTdwMJv8YMBgwEGVxFF9XnAkz5QygU4TfJDG3Y8RrP3y5m15AbYkU9SnGMK8D8tjU4M9yze 98 | 99 | 100 | https://solscan.io/tx/HtHKacGXFryCkf7PAWxh3Xbvkasf5y7VkCWLScHg5QSCnFVpRY6u3S2uijezEkWcSG74S82eNw8pGNPoez13bA4 101 | https://solscan.io/tx/44eZRZoEnHhA1suVA9ikDz2vyK9ofJETk6AuNjUDYvESufxQ7DHaCi9LshFMiZHM3B9NZ7avffRM5hRGb31oX3Md 102 | 103 | 104 | https://solscan.io/tx/516Xgepuh6PQW3t9cDBKaXDkP8N8BZLgPswdkFF3K5xSB2djb6vCDjmhkJp8cedJCT8qWKeMC7WHoWA13N6eNzqk 105 | https://solscan.io/tx/2FDXh5MggvWhppnAErRUEySkyhqfjiCNdZv2ojDbRP9irTkDY1EGz78e6X6txSWrjNgWbWGXgygrujev4UijxNNt 106 | 107 | 108 | https://solscan.io/tx/38MxuwUxGgpRUGpbJVRd6es8EQqoCaDNqjwEi1dyqtUPVto7ivodwnVxXcbPf5qwgeaD6SQCh2iTsk4AC7j9yhkf 109 | https://solscan.io/tx/53xwuRoZXBKVa1uTgpV56uuSz92ky262Uhw6yyAeiCbYbgz1bhBcnC3JSngePP4cGubwuHWCtYZwD6dnhoTd23W4 110 | 111 | 112 | https://solscan.io/tx/2vv8HDbExNWVe1GZBggSYhJzWXiTrRU9hDRrMY18sgmWG5megovwz9aqR4gyzR8DdMhKwfX6mTkx3jVMxwW6ukQz 113 | https://solscan.io/tx/42PxePYknfsVk59RtswMUc6nHUmoZnTghaV73aNC7cP6wr66GPF7SyEjpnKCu1QdsYkKTduVHoEEieNzEWyPEg2j 114 | 115 | 116 | ## Contact info 117 | Telegram: oxie11 118 | Discord: soldev098303 119 | -------------------------------------------------------------------------------- /frontend/src/components/dashboard/index.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import ToggleBtn from "@/components/buttons/toggle" 3 | import RectButton from "@/components/buttons/button" 4 | import { useEffect, useState } from "react"; 5 | import { submit } from "@/lib/func"; 6 | import { FiClock, FiTag, FiCheckCircle, FiXCircle } from 'react-icons/fi' 7 | 8 | export const Dashboard = () => { 9 | const [compoundingChecked, setCompoundingChecked] = useState(false); 10 | const [sequencingChecked, setSequencingChecked] = useState(false); 11 | const [profitBasedStopChecked, setProfitBasedStopChecked] = useState(false); 12 | const [timeBasedSellChecked, setTimeBasedSellChecked] = useState(false); 13 | const [isModal, setIsModal] = useState(false); 14 | const [isToast, setIsToast] = useState(false); 15 | const [isSuccess, setIsSuccess] = useState(false); 16 | 17 | const setCheckedList = [ 18 | setCompoundingChecked, 19 | setSequencingChecked, 20 | setProfitBasedStopChecked, 21 | setTimeBasedSellChecked 22 | ] 23 | 24 | const checkedList = [ 25 | compoundingChecked, 26 | sequencingChecked, 27 | profitBasedStopChecked, 28 | timeBasedSellChecked 29 | ] 30 | 31 | const toggleNameList = [ 32 | "Compounding", 33 | "Sequencing", 34 | "Profit Based Stop", 35 | "Time Based Sell" 36 | ] 37 | 38 | const toggleList = toggleNameList.map((toggle, index) => { 39 | return ( 40 | 46 | ) 47 | }) 48 | 49 | const showNotification = (isSuccess: boolean) => { 50 | setIsToast(true) 51 | setIsSuccess(isSuccess) 52 | setTimeout(() => { 53 | setIsToast(false) 54 | setIsSuccess(false) 55 | }, 3000); 56 | } 57 | 58 | const setSubmit = async () => { 59 | try { 60 | await submit({ 61 | compoundingChecked, 62 | sequencingChecked, 63 | profitBasedStopChecked, 64 | timeBasedSellChecked 65 | }) 66 | showNotification(true) 67 | } catch (err) { 68 | showNotification(false) 69 | } 70 | } 71 | 72 | return ( 73 |
74 |
75 | 76 |
77 | {toggleList} 78 |
79 | 80 |
81 | { 84 | setIsModal(true) 85 | }} /> 86 |
87 |
88 |
{ 90 | setIsModal(false) 91 | }}> 92 | 93 |
94 | 95 |
96 |

97 | {isModal ? "Are you sure you want to submit?" : ""} 98 |

99 |
100 | { 104 | setIsModal(false) 105 | setSubmit() 106 | }} /> 107 | { 110 | setIsModal(false) 111 | }} /> 112 |
113 |
114 | 115 |
116 | { 117 | isToast && ( 118 |
119 | { 120 | isSuccess ? 121 | : 122 | 123 | } 124 |
125 |

{isSuccess ? "Success" : "Error"}

126 |
127 |
128 | ) 129 | } 130 |
131 |
132 | ) 133 | } 134 | -------------------------------------------------------------------------------- /backend/utils/tx.ts: -------------------------------------------------------------------------------- 1 | import { getAssociatedTokenAddressSync, createCloseAccountInstruction } from "@solana/spl-token"; 2 | import { Keypair, PublicKey, VersionedTransaction, sendAndConfirmRawTransaction, TransactionMessage, ComputeBudgetProgram, Connection } from "@solana/web3.js"; 3 | import { COMMITMENT_LEVEL , QUOTE_AMOUNT, QUOTE_MINT, BUY_SLIPPAGE, SELL_SLIPPAGE} from "../constants"; 4 | 5 | export async function swap(percent:number, wallet:Keypair, mint:PublicKey,mode:string, connection:Connection, QUOTE_AMOUNT:number, slippage:number){ 6 | if(mode=="buy"){ 7 | try{ 8 | const quoteResponse = await ( 9 | await fetch( 10 | `https://lite-api.jup.ag/swap/v1/quote?inputMint=${QUOTE_MINT}&outputMint=${mint.toString()}&amount=${QUOTE_AMOUNT}&slippageBps=${slippage*100}&restrictIntermediateTokens=true` 11 | ) 12 | ).json(); 13 | const swapResponse = await ( 14 | await fetch('https://lite-api.jup.ag/swap/v1/swap', { 15 | method: 'POST', 16 | headers: { 17 | 'Content-Type': 'application/json', 18 | }, 19 | body: JSON.stringify({ 20 | quoteResponse, 21 | userPublicKey: wallet.publicKey, 22 | dynamicComputeUnitLimit: true, 23 | dynamicSlippage: true, 24 | prioritizationFeeLamports: { 25 | priorityLevelWithMaxLamports: { 26 | maxLamports: 4000, 27 | priorityLevel: "high" 28 | } 29 | } 30 | }) 31 | }) 32 | ).json(); 33 | const transactionBase64 = swapResponse.swapTransaction 34 | const transactionBytes = new Uint8Array(Buffer.from(transactionBase64, 'base64')); 35 | const transaction = VersionedTransaction.deserialize(transactionBytes); 36 | transaction.sign([wallet]); 37 | await sendAndConfirmRawTransaction( 38 | connection, 39 | Buffer.from(transaction.serialize()), 40 | { skipPreflight: true, maxRetries: 5 } 41 | ) 42 | }catch(e){ 43 | console.log(e) 44 | } 45 | }else if(mode=="sell"){ 46 | const ata = getAssociatedTokenAddressSync( 47 | mint, 48 | wallet.publicKey 49 | ); 50 | let amount:number=0; 51 | let cc=0; 52 | while(true){ 53 | try{ 54 | let balance_response=await connection.getTokenAccountBalance(ata,COMMITMENT_LEVEL) 55 | amount=Number(balance_response.value.amount); 56 | cc++; 57 | if(amount!=0||cc>=150){ 58 | break; 59 | } 60 | await new Promise((resolve)=>setTimeout(resolve,100)) 61 | }catch(e){ 62 | cc++; 63 | if(cc>=150){ 64 | break 65 | } 66 | await new Promise((resolve)=>setTimeout(resolve,100)) 67 | } 68 | } 69 | if(amount==0) return; 70 | if(percent!=100){ 71 | amount=Math.floor(amount*percent/100); 72 | } 73 | try { 74 | const quoteResponse = await ( 75 | await fetch( 76 | `https://lite-api.jup.ag/swap/v1/quote?inputMint=${mint}&outputMint=${QUOTE_MINT}&amount=${amount}&slippageBps=${slippage*100}&restrictIntermediateTokens=true` 77 | ) 78 | ).json(); 79 | const swapResponse = await ( 80 | await fetch('https://lite-api.jup.ag/swap/v1/swap', { 81 | method: 'POST', 82 | headers: { 83 | 'Content-Type': 'application/json', 84 | }, 85 | body: JSON.stringify({ 86 | quoteResponse, 87 | userPublicKey: wallet.publicKey, 88 | dynamicComputeUnitLimit: true, 89 | dynamicSlippage: true, 90 | prioritizationFeeLamports: { 91 | priorityLevelWithMaxLamports: { 92 | maxLamports: 4000, 93 | priorityLevel: "high" 94 | } 95 | } 96 | }) 97 | }) 98 | ).json(); 99 | const transactionBase64 = swapResponse.swapTransaction 100 | const transactionBytes = new Uint8Array(Buffer.from(transactionBase64, 'base64')); 101 | const transaction = VersionedTransaction.deserialize(transactionBytes); 102 | transaction.sign([wallet]); 103 | await sendAndConfirmRawTransaction( 104 | connection, 105 | Buffer.from(transaction.serialize()), 106 | { skipPreflight: true, maxRetries: 5 } 107 | ) 108 | if(percent==100){ 109 | const latestBlockHash = (await connection.getLatestBlockhash(COMMITMENT_LEVEL)).blockhash; 110 | const message = new TransactionMessage({ 111 | payerKey: wallet.publicKey, 112 | recentBlockhash: latestBlockHash, 113 | instructions: [ 114 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1000 }), // Set a low compute unit price 115 | ComputeBudgetProgram.setComputeUnitLimit({ units: 8000 }), 116 | createCloseAccountInstruction( 117 | ata, 118 | wallet.publicKey, 119 | wallet.publicKey 120 | ), 121 | ], 122 | }).compileToV0Message(); 123 | const transaction = new VersionedTransaction(message); 124 | transaction.sign([wallet]); 125 | setTimeout(async()=>{ 126 | try{ 127 | await connection.sendTransaction(transaction) 128 | }catch(e){} 129 | },30000); 130 | } 131 | } catch (error) { 132 | console.log("Error while closing token account"); 133 | } 134 | } 135 | }; -------------------------------------------------------------------------------- /backend/utils/parse_transaction.ts: -------------------------------------------------------------------------------- 1 | import { LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; 2 | import bs58 from "bs58"; 3 | const PUMP_FUN_PROGRAM = new PublicKey("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"); 4 | const pump_fun_fee_accounts=[ 5 | "AVmoTthdrX6tKt4nDjco2D775W2YK3sDhxPcMmzUAmTY", 6 | "9rPYyANsfQZw3DnDmKE3YCQF5E8oD89UXoHn9JFEhJUz", 7 | "FWsW1xNtWscwNmKv6wVsU1iTzRN6wmmk3MjxRP5tT7hz", 8 | "62qc2CNXwrYqQScmEdiZFFAnJR262PxWEuNQtxfafNgV", 9 | "7VtfL8fvgNfhz17qKRMjzQEXgbdpnHHHQRh54R9jP2RJ", 10 | "G5UZAVbAf46s7cKWoyKu8kYTip9DGTpbLZ2qa9Aq69dP", 11 | "CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM", 12 | ] 13 | export function getParsedData(data:any, isLaunch:boolean) { 14 | if(isLaunch==true){ 15 | let keys=[""] 16 | data.transaction.transaction.transaction.message.accountKeys.map((account:any, index:number)=>{ 17 | keys.push(bs58.encode(account)); 18 | }) 19 | keys.shift() 20 | const dev=keys[0]; 21 | const mint=keys[1]; 22 | const [pda] = PublicKey.findProgramAddressSync( 23 | [Buffer.from('bonding-curve'), new PublicKey(mint).toBuffer()], 24 | PUMP_FUN_PROGRAM 25 | ); 26 | const bondingcurve_address=pda.toString(); 27 | let fee_recipient=pump_fun_fee_accounts[4]; 28 | for(const key of keys){ 29 | if(pump_fun_fee_accounts.includes(key)){ 30 | fee_recipient=key; 31 | break; 32 | } 33 | } 34 | let post_bondingcurve_vsol_balance=0; 35 | let post_bondingcurve_vtoken_balance=0; 36 | let post_trader_sol_balance=0; 37 | let post_trader_token_balance=0; 38 | let solAmount=0; 39 | let tokenAmount=0; 40 | let txType="mint"; 41 | data.transaction.transaction.transaction.message.accountKeys.map((account:any, index:number)=>{ 42 | if(bs58.encode(account)==bondingcurve_address){ 43 | post_bondingcurve_vsol_balance=Number(data.transaction.transaction.meta.postBalances[index])+30*LAMPORTS_PER_SOL; 44 | } 45 | if(bs58.encode(account)==dev){ 46 | post_trader_sol_balance=Number(data.transaction.transaction.meta.postBalances[index]); 47 | solAmount=Number(data.transaction.transaction.meta.preBalances[index])-Number(data.transaction.transaction.meta.postBalances[index]); 48 | 49 | } 50 | }) 51 | data.transaction.transaction.meta.postTokenBalances.map((post:any)=>{ 52 | if(post.owner==bondingcurve_address){ 53 | post_bondingcurve_vtoken_balance=Number(post["uiTokenAmount"]["amount"]); 54 | } 55 | if(post.owner==dev){ 56 | post_trader_token_balance=Number(post["uiTokenAmount"]["amount"]); 57 | tokenAmount=post_trader_token_balance; 58 | } 59 | }) 60 | const price=post_bondingcurve_vsol_balance/post_bondingcurve_vtoken_balance; 61 | const sol_price=post_bondingcurve_vtoken_balance/post_bondingcurve_vsol_balance; 62 | return{ 63 | mint, 64 | txType, 65 | dev, 66 | bondingcurve_address, 67 | fee_recipient, 68 | post_bondingcurve_vsol_balance, 69 | post_bondingcurve_vtoken_balance, 70 | post_trader_sol_balance, 71 | post_trader_token_balance, 72 | price, 73 | sol_price, 74 | solAmount, 75 | tokenAmount 76 | }; 77 | }else{ 78 | let keys=[""] 79 | data.transaction.transaction.transaction.message.accountKeys.map((account:any, index:number)=>{ 80 | keys.push(bs58.encode(account)); 81 | }) 82 | keys.shift() 83 | const dev=keys[0]; 84 | let mint=""; 85 | const post_datas= data.transaction.transaction.meta.postTokenBalances; 86 | for(const post_data of post_datas){ 87 | if(post_data["mint"]!="So11111111111111111111111111111111111111112"){ 88 | mint=post_data["mint"]; 89 | break; 90 | } 91 | } 92 | const [pda] = PublicKey.findProgramAddressSync( 93 | [Buffer.from('bonding-curve'), new PublicKey(mint).toBuffer()], 94 | PUMP_FUN_PROGRAM 95 | ); 96 | const bondingcurve_address=pda.toString(); 97 | let fee_recipient=pump_fun_fee_accounts[4]; 98 | for(const key of keys){ 99 | if(pump_fun_fee_accounts.includes(key)){ 100 | fee_recipient=key; 101 | break; 102 | } 103 | } 104 | let txType="" 105 | const logs=data.transaction.transaction.meta.logMessages; 106 | for(const log of logs){ 107 | if(log.includes("Buy")){ 108 | txType="buy"; 109 | break; 110 | } 111 | if(log.includes("Sell")){ 112 | txType="sell"; 113 | break; 114 | } 115 | } 116 | let post_bondingcurve_vsol_balance=0; 117 | let post_bondingcurve_vtoken_balance=0; 118 | let post_trader_sol_balance=0; 119 | let post_trader_token_balance=0; 120 | let solAmount=0; 121 | let tokenAmount=0; 122 | data.transaction.transaction.transaction.message.accountKeys.map((account:any, index:number)=>{ 123 | if(bs58.encode(account)==bondingcurve_address){ 124 | post_bondingcurve_vsol_balance=Number(data.transaction.transaction.meta.postBalances[index])+30*LAMPORTS_PER_SOL; 125 | } 126 | if(bs58.encode(account)==dev){ 127 | post_trader_sol_balance=Number(data.transaction.transaction.meta.postBalances[index]); 128 | solAmount=Number(data.transaction.transaction.meta.preBalances[index])-Number(data.transaction.transaction.meta.postBalances[index]); 129 | 130 | } 131 | }) 132 | data.transaction.transaction.meta.postTokenBalances.map((post:any, index:number)=>{ 133 | if(post.owner==bondingcurve_address){ 134 | post_bondingcurve_vtoken_balance=Number(post["uiTokenAmount"]["amount"]); 135 | } 136 | if(post.owner==dev){ 137 | post_trader_token_balance=Number(post["uiTokenAmount"]["amount"]); 138 | if(data.transaction.transaction.meta.preTokenBalances[index]!=undefined){ 139 | tokenAmount=post_trader_token_balance-Number(data.transaction.transaction.meta.preTokenBalances[index]["uiTokenAmount"]["amount"]); 140 | }else{ 141 | tokenAmount=post_trader_token_balance 142 | } 143 | 144 | } 145 | }) 146 | const price=post_bondingcurve_vsol_balance/post_bondingcurve_vtoken_balance; 147 | const sol_price=post_bondingcurve_vtoken_balance/post_bondingcurve_vsol_balance; 148 | return{ 149 | mint, 150 | txType, 151 | dev, 152 | bondingcurve_address, 153 | fee_recipient, 154 | post_bondingcurve_vsol_balance, 155 | post_bondingcurve_vtoken_balance, 156 | post_trader_sol_balance, 157 | post_trader_token_balance, 158 | price, 159 | sol_price, 160 | solAmount, 161 | tokenAmount 162 | }; 163 | } 164 | } 165 | 166 | 167 | -------------------------------------------------------------------------------- /backend/streaming/pump_copy.ts: -------------------------------------------------------------------------------- 1 | import { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc"; 2 | import { sendNewTokenAlert , delay, logger, getParsedData} from "../utils"; 3 | import bs58 from "bs58" 4 | import Client from "@triton-one/yellowstone-grpc"; 5 | import { Connection, Keypair, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; 6 | import { RPC_ENDPOINT, COMMITMENT_LEVEL , COPY_WALLET, MAX_BUY, MAX_HOLDING_TIME, QUOTE_AMOUNT, TAKE_PROFIT, STOP_LOSS, SELL_SLIPPAGE, BUY_SLIPPAGE, PRIVATE_KEY, COMPOUNDING_BUY_AMOUNT_PERCENTAGE, TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, TIME_BASED_SELL_SIZE} from "../constants"; 7 | import TelegramBot from "node-telegram-bot-api"; 8 | import { swap } from "../utils"; 9 | const solanaConnection = new Connection(RPC_ENDPOINT, COMMITMENT_LEVEL); 10 | let bought_tokens: string[] = []; 11 | let bought_count=0; 12 | let isBought: boolean = false; 13 | let solBalance=0; 14 | const wallet=Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)) 15 | const PUMP_FUN_PROGRAM = new PublicKey("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"); 16 | export async function pump_copy(client: Client) { 17 | setInterval(async ()=>{ 18 | solBalance=await solanaConnection.getBalance(wallet.publicKey, "processed"); 19 | }, 3000) 20 | const stream = await client.subscribe(); 21 | const request: SubscribeRequest = { 22 | "slots": {}, 23 | "accounts": {}, 24 | "transactions": { 25 | pumpfun: { 26 | "vote": false, 27 | "failed": false, 28 | accountInclude: [], 29 | accountExclude: [], 30 | accountRequired: [COPY_WALLET, PUMP_FUN_PROGRAM.toString()] 31 | } 32 | }, 33 | "blocks": {}, 34 | "blocksMeta": {}, 35 | "accountsDataSlice": [], 36 | "commitment": CommitmentLevel.PROCESSED, 37 | entry: {}, 38 | } 39 | await new Promise((resolve, reject) => { 40 | stream.write(request, (err: null | undefined) => { 41 | if (err === null || err === undefined) { 42 | resolve(); 43 | } else { 44 | reject(err); 45 | } 46 | }); 47 | }).catch((reason) => { 48 | throw reason; 49 | }); 50 | const streamClosed = new Promise((resolve, reject) => { 51 | stream.on("error", (error: any) => { 52 | reject(error); 53 | stream.end(); 54 | stream.destroy(); 55 | }); 56 | stream.on("end", ()=>{resolve;}); 57 | stream.on("close",()=>{resolve;}); 58 | }); 59 | let sig="" 60 | stream.on('data', async function message(data: any) { 61 | try { 62 | if (data.transaction != undefined&& sig!=(bs58.encode(data.transaction.transaction.signature))) { 63 | sig=(bs58.encode(data.transaction.transaction.signature)) 64 | const parsedData=getParsedData(data, false); 65 | if(parsedData.txType!="buy") return; 66 | if(bought_count>MAX_BUY) return; 67 | const isSequence=process.env.SEQUENCING; 68 | if(isSequence=="false"&&isBought==true) return; 69 | if(solBalance==0) return; 70 | const isCompunding=process.env.COMPOUNDING; 71 | let buyAmount=QUOTE_AMOUNT*LAMPORTS_PER_SOL; 72 | if(isCompunding=="true"){ 73 | buyAmount=solBalance*COMPOUNDING_BUY_AMOUNT_PERCENTAGE/100; 74 | }; 75 | const isTimeBasedSell=process.env.TIME_BASED_SELL; 76 | if(isTimeBasedSell==undefined) return; 77 | const bot=new Bot(client, solanaConnection, parsedData.mint, wallet, buyAmount, isTimeBasedSell); 78 | if(!bought_tokens.includes(parsedData.mint)){ 79 | bought_tokens.push(parsedData.mint); 80 | bought_count++; 81 | bot.run(); 82 | } 83 | } 84 | } catch (e) { 85 | 86 | } 87 | }); 88 | await streamClosed 89 | } 90 | 91 | class Bot { 92 | private isBought = false; 93 | private isSold = false; 94 | private buy_price = 0; 95 | private mint: string; 96 | private solanaConnection: Connection; 97 | private wallet: Keypair; 98 | private amount: number; 99 | private stream: any; 100 | private isTimeBasedSell="false"; 101 | private client; 102 | constructor(client:Client , connection: Connection, mint: string, wallet: Keypair, amount: number, isTimeBasedSell:string) { 103 | this.mint = mint; 104 | this.wallet = wallet; 105 | this.amount = amount; 106 | this.solanaConnection = connection; 107 | this.isTimeBasedSell=isTimeBasedSell; 108 | this.client=client; 109 | } 110 | async run() { 111 | try{ 112 | /* 113 | ✅🚀For the ultra-fast transaction speed which land on 0 block, contact to developer. 114 | Using shred stream, bot can try front running.✅🚀 115 | */ 116 | swap(100, this.wallet, new PublicKey(this.mint), "buy", this.solanaConnection, this.amount, BUY_SLIPPAGE); 117 | this.isBought=true; 118 | if(this.isTimeBasedSell=="true"){ 119 | setTimeout(()=>{ 120 | swap(100, this.wallet, new PublicKey(this.mint),"sell", this.solanaConnection, 10000000000, SELL_SLIPPAGE); 121 | this.isSold=true; 122 | bought_count--; 123 | }, TIME_BASED_SELL_SIZE); 124 | }else{ 125 | setTimeout(()=>{ 126 | if(this.isBought==true&&this.isSold==false){ 127 | swap(100, this.wallet, new PublicKey(this.mint),"sell", this.solanaConnection, 10000000000, SELL_SLIPPAGE); 128 | this.stream.end(); 129 | this.stream.destroy(); 130 | this.stream.cancel(); 131 | bought_count--; 132 | } 133 | }, MAX_HOLDING_TIME); 134 | this.stream = await this.client.subscribe(); 135 | const request: SubscribeRequest = { 136 | "slots": {}, 137 | "accounts": {}, 138 | "transactions": { 139 | pumpfun: { 140 | "vote": false, 141 | "failed": false, 142 | accountInclude: [], 143 | accountExclude: [], 144 | accountRequired: [this.mint, PUMP_FUN_PROGRAM.toString()] 145 | } 146 | }, 147 | "blocks": {}, 148 | "blocksMeta": {}, 149 | "accountsDataSlice": [], 150 | "commitment": CommitmentLevel.PROCESSED, 151 | entry: {}, 152 | } 153 | await new Promise((resolve, reject) => { 154 | this.stream.write(request, (err: null | undefined) => { 155 | if (err === null || err === undefined) { 156 | resolve(); 157 | } else { 158 | reject(err); 159 | } 160 | }); 161 | }).catch((reason) => { 162 | throw reason; 163 | }); 164 | const streamClosed = new Promise((resolve, reject) => { 165 | this.stream.on("error", (error: any) => { 166 | reject(error); 167 | this.stream.end(); 168 | this.stream.destroy(); 169 | }); 170 | this.stream.on("end", ()=>{resolve;}); 171 | this.stream.on("close",()=>{resolve;}); 172 | }); 173 | let sig="" 174 | this.stream.on('data', async (data: any) => { 175 | try { 176 | if (data.transaction != undefined&& sig!=(bs58.encode(data.transaction.transaction.signature))) { 177 | sig=(bs58.encode(data.transaction.transaction.signature)) 178 | const parsedData=getParsedData(data, false); 179 | if(parsedData.dev==wallet.publicKey.toString()&&parsedData.txType=="buy"){ 180 | this.buy_price=parsedData.price; 181 | } 182 | if(this.buy_price==0) return; 183 | if((parsedData.price>=(this.buy_price*(1+TAKE_PROFIT/100)))||parsedData.price<=(this.buy_price*(1-STOP_LOSS/100))){ 184 | swap(100, this.wallet, new PublicKey(this.mint),"sell", this.solanaConnection, 10000000000, SELL_SLIPPAGE); 185 | bought_count--; 186 | this.isSold=true; 187 | this.stream.end(); 188 | this.stream.destroy(); 189 | this.stream.cancel(); 190 | } 191 | } 192 | } catch (e) { 193 | 194 | } 195 | }); 196 | await streamClosed 197 | } 198 | 199 | 200 | }catch(e){ 201 | 202 | } 203 | } 204 | async sendNewTokenAlert(mintAddress: string) { 205 | const telegramBotToken = String(TELEGRAM_BOT_TOKEN); 206 | const telegramChatId = String(TELEGRAM_CHAT_ID); 207 | const bot = new TelegramBot(telegramBotToken, { polling: false }); 208 | const message = ` 209 | 😊New Token Detected!😊 210 | Mint Address: ${mintAddress} \n 211 | https://gmgn.ai/sol/token/${mintAddress} 212 | `; 213 | try { 214 | await bot.sendMessage(telegramChatId, message); 215 | } catch (error) { 216 | console.error('Error sending Telegram alert:', error); 217 | } 218 | } 219 | 220 | } -------------------------------------------------------------------------------- /backend/streaming/pump_sniping.ts: -------------------------------------------------------------------------------- 1 | import { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc"; 2 | import { sendNewTokenAlert , delay, logger, getParsedData} from "../utils"; 3 | import bs58 from "bs58" 4 | import Client from "@triton-one/yellowstone-grpc"; 5 | import { Connection, Keypair, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; 6 | import { RPC_ENDPOINT, COMMITMENT_LEVEL , COPY_WALLET, MAX_BUY, MAX_HOLDING_TIME, QUOTE_AMOUNT, TAKE_PROFIT, STOP_LOSS, SELL_SLIPPAGE, BUY_SLIPPAGE, PRIVATE_KEY, COMPOUNDING_BUY_AMOUNT_PERCENTAGE, TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, TIME_BASED_SELL_SIZE} from "../constants"; 7 | import TelegramBot from "node-telegram-bot-api"; 8 | import { swap } from "../utils"; 9 | const solanaConnection = new Connection(RPC_ENDPOINT, COMMITMENT_LEVEL); 10 | let bought_tokens: string[] = []; 11 | let bought_count=0; 12 | let isBought: boolean = false; 13 | let solBalance=0; 14 | const wallet=Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)) 15 | const PUMP_FUN_PROGRAM = new PublicKey("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"); 16 | export async function pump_sniping(client: Client) { 17 | setInterval(async ()=>{ 18 | solBalance=await solanaConnection.getBalance(wallet.publicKey, "processed"); 19 | }, 3000) 20 | const stream = await client.subscribe(); 21 | const request: SubscribeRequest = { 22 | "slots": {}, 23 | "accounts": {}, 24 | "transactions": { 25 | pumpfun: { 26 | "vote": false, 27 | "failed": false, 28 | accountInclude: [], 29 | accountExclude: [], 30 | accountRequired: [ PUMP_FUN_PROGRAM.toString()] 31 | } 32 | }, 33 | "blocks": {}, 34 | "blocksMeta": {}, 35 | "accountsDataSlice": [], 36 | "commitment": CommitmentLevel.PROCESSED, 37 | entry: {}, 38 | } 39 | await new Promise((resolve, reject) => { 40 | stream.write(request, (err: null | undefined) => { 41 | if (err === null || err === undefined) { 42 | resolve(); 43 | } else { 44 | reject(err); 45 | } 46 | }); 47 | }).catch((reason) => { 48 | throw reason; 49 | }); 50 | const streamClosed = new Promise((resolve, reject) => { 51 | stream.on("error", (error: any) => { 52 | reject(error); 53 | stream.end(); 54 | stream.destroy(); 55 | }); 56 | stream.on("end", ()=>{resolve;}); 57 | stream.on("close",()=>{resolve;}); 58 | }); 59 | let sig="" 60 | stream.on('data', async function message(data: any) { 61 | try { 62 | if (data.transaction != undefined&& sig!=(bs58.encode(data.transaction.transaction.signature))) { 63 | sig=(bs58.encode(data.transaction.transaction.signature)) 64 | const messages=data.transaction.transaction.meta.logMessages; 65 | let isLaunch=false; 66 | for(let message of messages){ 67 | if(message.toLowerCase().includes("instruction: mintto")){ 68 | isLaunch=true; 69 | break; 70 | } 71 | }; 72 | if(isLaunch){ 73 | const parsedData=getParsedData(data, true); 74 | if(bought_count>MAX_BUY) return; 75 | const isSequence=process.env.SEQUENCING; 76 | if(isSequence=="false"&&isBought==true) return; 77 | if(solBalance==0) return; 78 | const isCompunding=process.env.COMPOUNDING; 79 | let buyAmount=QUOTE_AMOUNT*LAMPORTS_PER_SOL; 80 | if(isCompunding=="true"){ 81 | buyAmount=solBalance*COMPOUNDING_BUY_AMOUNT_PERCENTAGE/100; 82 | }; 83 | const isTimeBasedSell=process.env.TIME_BASED_SELL; 84 | if(isTimeBasedSell==undefined) return; 85 | if(parsedData.solAmount>2) return; 86 | const bot=new Bot(client, solanaConnection, parsedData.mint, wallet, buyAmount, isTimeBasedSell); 87 | if(!bought_tokens.includes(parsedData.mint)){ 88 | bought_tokens.push(parsedData.mint); 89 | bought_count++; 90 | bot.run(); 91 | } 92 | } 93 | } 94 | } catch (e) { 95 | 96 | } 97 | }); 98 | await streamClosed 99 | } 100 | 101 | class Bot { 102 | private isBought = false; 103 | private isSold = false; 104 | private buy_price = 0; 105 | private mint: string; 106 | private solanaConnection: Connection; 107 | private wallet: Keypair; 108 | private amount: number; 109 | private stream: any; 110 | private isTimeBasedSell="false"; 111 | private client; 112 | constructor(client:Client , connection: Connection, mint: string, wallet: Keypair, amount: number, isTimeBasedSell:string) { 113 | this.mint = mint; 114 | this.wallet = wallet; 115 | this.amount = amount; 116 | this.solanaConnection = connection; 117 | this.isTimeBasedSell=isTimeBasedSell; 118 | this.client=client; 119 | } 120 | async run() { 121 | try{ 122 | /* 123 | ✅🚀For the ultra-fast transaction speed which land on 0 block, contact to developer. 124 | Using shred stream, bot can try front running.✅🚀 125 | */ 126 | swap(100, this.wallet, new PublicKey(this.mint), "buy", this.solanaConnection, this.amount, BUY_SLIPPAGE); 127 | this.isBought=true; 128 | if(this.isTimeBasedSell=="true"){ 129 | setTimeout(()=>{ 130 | swap(100, this.wallet, new PublicKey(this.mint),"sell", this.solanaConnection, 10000000000, SELL_SLIPPAGE); 131 | this.isSold=true; 132 | bought_count--; 133 | }, TIME_BASED_SELL_SIZE); 134 | }else{ 135 | setTimeout(()=>{ 136 | if(this.isBought==true&&this.isSold==false){ 137 | swap(100, this.wallet, new PublicKey(this.mint),"sell", this.solanaConnection, 10000000000, SELL_SLIPPAGE); 138 | this.stream.end(); 139 | this.stream.destroy(); 140 | this.stream.cancel(); 141 | bought_count--; 142 | } 143 | }, MAX_HOLDING_TIME); 144 | this.stream = await this.client.subscribe(); 145 | const request: SubscribeRequest = { 146 | "slots": {}, 147 | "accounts": {}, 148 | "transactions": { 149 | pumpfun: { 150 | "vote": false, 151 | "failed": false, 152 | accountInclude: [], 153 | accountExclude: [], 154 | accountRequired: [this.mint, PUMP_FUN_PROGRAM.toString()] 155 | } 156 | }, 157 | "blocks": {}, 158 | "blocksMeta": {}, 159 | "accountsDataSlice": [], 160 | "commitment": CommitmentLevel.PROCESSED, 161 | entry: {}, 162 | } 163 | await new Promise((resolve, reject) => { 164 | this.stream.write(request, (err: null | undefined) => { 165 | if (err === null || err === undefined) { 166 | resolve(); 167 | } else { 168 | reject(err); 169 | } 170 | }); 171 | }).catch((reason) => { 172 | throw reason; 173 | }); 174 | const streamClosed = new Promise((resolve, reject) => { 175 | this.stream.on("error", (error: any) => { 176 | reject(error); 177 | this.stream.end(); 178 | this.stream.destroy(); 179 | }); 180 | this.stream.on("end", ()=>{resolve;}); 181 | this.stream.on("close",()=>{resolve;}); 182 | }); 183 | let sig="" 184 | this.stream.on('data', async (data: any) => { 185 | try { 186 | if (data.transaction != undefined&& sig!=(bs58.encode(data.transaction.transaction.signature))) { 187 | sig=(bs58.encode(data.transaction.transaction.signature)) 188 | const parsedData=getParsedData(data, false); 189 | if(parsedData.dev==wallet.publicKey.toString()&&parsedData.txType=="buy"){ 190 | this.buy_price=parsedData.price; 191 | } 192 | if(this.buy_price==0) return; 193 | if((parsedData.price>=(this.buy_price*(1+TAKE_PROFIT/100)))||parsedData.price<=(this.buy_price*(1-STOP_LOSS/100))){ 194 | swap(100, this.wallet, new PublicKey(this.mint),"sell", this.solanaConnection, 10000000000, SELL_SLIPPAGE); 195 | bought_count--; 196 | this.isSold=true; 197 | this.stream.end(); 198 | this.stream.destroy(); 199 | this.stream.cancel(); 200 | } 201 | } 202 | } catch (e) { 203 | 204 | } 205 | }); 206 | await streamClosed 207 | } 208 | 209 | 210 | }catch(e){ 211 | 212 | } 213 | } 214 | async sendNewTokenAlert(mintAddress: string) { 215 | const telegramBotToken = String(TELEGRAM_BOT_TOKEN); 216 | const telegramChatId = String(TELEGRAM_CHAT_ID); 217 | const bot = new TelegramBot(telegramBotToken, { polling: false }); 218 | const message = ` 219 | 😊New Token Detected!😊 220 | Mint Address: ${mintAddress} \n 221 | https://gmgn.ai/sol/token/${mintAddress} 222 | `; 223 | try { 224 | await bot.sendMessage(telegramChatId, message); 225 | } catch (error) { 226 | console.error('Error sending Telegram alert:', error); 227 | } 228 | } 229 | 230 | } -------------------------------------------------------------------------------- /backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2017", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "resolveJsonModule": true, /* Enable importing .json files. */ 43 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 44 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 45 | 46 | /* JavaScript Support */ 47 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 48 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 49 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 50 | 51 | /* Emit */ 52 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 53 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 54 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 55 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 56 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 57 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 58 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 59 | // "removeComments": true, /* Disable emitting comments. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 62 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 75 | 76 | /* Interop Constraints */ 77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 92 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 93 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 94 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 95 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 96 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 97 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 98 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 99 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 100 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 101 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 102 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 103 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 104 | 105 | /* Completeness */ 106 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 107 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solana_bot", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "solana_bot", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "@emotion/react": "^11.14.0", 12 | "@emotion/styled": "^11.14.0", 13 | "@mui/base": "^5.0.0-beta.69", 14 | "@mui/material": "^6.4.6", 15 | "axios": "^1.8.1", 16 | "next": "15.2.1", 17 | "react": "^19.0.0", 18 | "react-dom": "^19.0.0", 19 | "react-icons": "^5.5.0" 20 | }, 21 | "devDependencies": { 22 | "@tailwindcss/postcss": "^4", 23 | "@types/node": "^20", 24 | "@types/react": "^19", 25 | "@types/react-dom": "^19", 26 | "tailwindcss": "^4", 27 | "typescript": "^5" 28 | } 29 | }, 30 | "node_modules/@alloc/quick-lru": { 31 | "version": "5.2.0", 32 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 33 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 34 | "dev": true, 35 | "license": "MIT", 36 | "engines": { 37 | "node": ">=10" 38 | }, 39 | "funding": { 40 | "url": "https://github.com/sponsors/sindresorhus" 41 | } 42 | }, 43 | "node_modules/@babel/code-frame": { 44 | "version": "7.26.2", 45 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 46 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 47 | "license": "MIT", 48 | "dependencies": { 49 | "@babel/helper-validator-identifier": "^7.25.9", 50 | "js-tokens": "^4.0.0", 51 | "picocolors": "^1.0.0" 52 | }, 53 | "engines": { 54 | "node": ">=6.9.0" 55 | } 56 | }, 57 | "node_modules/@babel/generator": { 58 | "version": "7.26.9", 59 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", 60 | "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", 61 | "license": "MIT", 62 | "dependencies": { 63 | "@babel/parser": "^7.26.9", 64 | "@babel/types": "^7.26.9", 65 | "@jridgewell/gen-mapping": "^0.3.5", 66 | "@jridgewell/trace-mapping": "^0.3.25", 67 | "jsesc": "^3.0.2" 68 | }, 69 | "engines": { 70 | "node": ">=6.9.0" 71 | } 72 | }, 73 | "node_modules/@babel/helper-module-imports": { 74 | "version": "7.25.9", 75 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", 76 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", 77 | "license": "MIT", 78 | "dependencies": { 79 | "@babel/traverse": "^7.25.9", 80 | "@babel/types": "^7.25.9" 81 | }, 82 | "engines": { 83 | "node": ">=6.9.0" 84 | } 85 | }, 86 | "node_modules/@babel/helper-string-parser": { 87 | "version": "7.25.9", 88 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 89 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 90 | "license": "MIT", 91 | "engines": { 92 | "node": ">=6.9.0" 93 | } 94 | }, 95 | "node_modules/@babel/helper-validator-identifier": { 96 | "version": "7.25.9", 97 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 98 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 99 | "license": "MIT", 100 | "engines": { 101 | "node": ">=6.9.0" 102 | } 103 | }, 104 | "node_modules/@babel/parser": { 105 | "version": "7.26.9", 106 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", 107 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 108 | "license": "MIT", 109 | "dependencies": { 110 | "@babel/types": "^7.26.9" 111 | }, 112 | "bin": { 113 | "parser": "bin/babel-parser.js" 114 | }, 115 | "engines": { 116 | "node": ">=6.0.0" 117 | } 118 | }, 119 | "node_modules/@babel/runtime": { 120 | "version": "7.26.9", 121 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", 122 | "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", 123 | "license": "MIT", 124 | "dependencies": { 125 | "regenerator-runtime": "^0.14.0" 126 | }, 127 | "engines": { 128 | "node": ">=6.9.0" 129 | } 130 | }, 131 | "node_modules/@babel/template": { 132 | "version": "7.26.9", 133 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", 134 | "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", 135 | "license": "MIT", 136 | "dependencies": { 137 | "@babel/code-frame": "^7.26.2", 138 | "@babel/parser": "^7.26.9", 139 | "@babel/types": "^7.26.9" 140 | }, 141 | "engines": { 142 | "node": ">=6.9.0" 143 | } 144 | }, 145 | "node_modules/@babel/traverse": { 146 | "version": "7.26.9", 147 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", 148 | "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", 149 | "license": "MIT", 150 | "dependencies": { 151 | "@babel/code-frame": "^7.26.2", 152 | "@babel/generator": "^7.26.9", 153 | "@babel/parser": "^7.26.9", 154 | "@babel/template": "^7.26.9", 155 | "@babel/types": "^7.26.9", 156 | "debug": "^4.3.1", 157 | "globals": "^11.1.0" 158 | }, 159 | "engines": { 160 | "node": ">=6.9.0" 161 | } 162 | }, 163 | "node_modules/@babel/types": { 164 | "version": "7.26.9", 165 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", 166 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 167 | "license": "MIT", 168 | "dependencies": { 169 | "@babel/helper-string-parser": "^7.25.9", 170 | "@babel/helper-validator-identifier": "^7.25.9" 171 | }, 172 | "engines": { 173 | "node": ">=6.9.0" 174 | } 175 | }, 176 | "node_modules/@emnapi/runtime": { 177 | "version": "1.3.1", 178 | "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", 179 | "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", 180 | "license": "MIT", 181 | "optional": true, 182 | "dependencies": { 183 | "tslib": "^2.4.0" 184 | } 185 | }, 186 | "node_modules/@emotion/babel-plugin": { 187 | "version": "11.13.5", 188 | "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", 189 | "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", 190 | "license": "MIT", 191 | "dependencies": { 192 | "@babel/helper-module-imports": "^7.16.7", 193 | "@babel/runtime": "^7.18.3", 194 | "@emotion/hash": "^0.9.2", 195 | "@emotion/memoize": "^0.9.0", 196 | "@emotion/serialize": "^1.3.3", 197 | "babel-plugin-macros": "^3.1.0", 198 | "convert-source-map": "^1.5.0", 199 | "escape-string-regexp": "^4.0.0", 200 | "find-root": "^1.1.0", 201 | "source-map": "^0.5.7", 202 | "stylis": "4.2.0" 203 | } 204 | }, 205 | "node_modules/@emotion/cache": { 206 | "version": "11.14.0", 207 | "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", 208 | "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", 209 | "license": "MIT", 210 | "dependencies": { 211 | "@emotion/memoize": "^0.9.0", 212 | "@emotion/sheet": "^1.4.0", 213 | "@emotion/utils": "^1.4.2", 214 | "@emotion/weak-memoize": "^0.4.0", 215 | "stylis": "4.2.0" 216 | } 217 | }, 218 | "node_modules/@emotion/hash": { 219 | "version": "0.9.2", 220 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", 221 | "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", 222 | "license": "MIT" 223 | }, 224 | "node_modules/@emotion/is-prop-valid": { 225 | "version": "1.3.1", 226 | "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", 227 | "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", 228 | "license": "MIT", 229 | "dependencies": { 230 | "@emotion/memoize": "^0.9.0" 231 | } 232 | }, 233 | "node_modules/@emotion/memoize": { 234 | "version": "0.9.0", 235 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", 236 | "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", 237 | "license": "MIT" 238 | }, 239 | "node_modules/@emotion/react": { 240 | "version": "11.14.0", 241 | "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", 242 | "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", 243 | "license": "MIT", 244 | "dependencies": { 245 | "@babel/runtime": "^7.18.3", 246 | "@emotion/babel-plugin": "^11.13.5", 247 | "@emotion/cache": "^11.14.0", 248 | "@emotion/serialize": "^1.3.3", 249 | "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", 250 | "@emotion/utils": "^1.4.2", 251 | "@emotion/weak-memoize": "^0.4.0", 252 | "hoist-non-react-statics": "^3.3.1" 253 | }, 254 | "peerDependencies": { 255 | "react": ">=16.8.0" 256 | }, 257 | "peerDependenciesMeta": { 258 | "@types/react": { 259 | "optional": true 260 | } 261 | } 262 | }, 263 | "node_modules/@emotion/serialize": { 264 | "version": "1.3.3", 265 | "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", 266 | "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", 267 | "license": "MIT", 268 | "dependencies": { 269 | "@emotion/hash": "^0.9.2", 270 | "@emotion/memoize": "^0.9.0", 271 | "@emotion/unitless": "^0.10.0", 272 | "@emotion/utils": "^1.4.2", 273 | "csstype": "^3.0.2" 274 | } 275 | }, 276 | "node_modules/@emotion/sheet": { 277 | "version": "1.4.0", 278 | "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", 279 | "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", 280 | "license": "MIT" 281 | }, 282 | "node_modules/@emotion/styled": { 283 | "version": "11.14.0", 284 | "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", 285 | "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", 286 | "license": "MIT", 287 | "dependencies": { 288 | "@babel/runtime": "^7.18.3", 289 | "@emotion/babel-plugin": "^11.13.5", 290 | "@emotion/is-prop-valid": "^1.3.0", 291 | "@emotion/serialize": "^1.3.3", 292 | "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", 293 | "@emotion/utils": "^1.4.2" 294 | }, 295 | "peerDependencies": { 296 | "@emotion/react": "^11.0.0-rc.0", 297 | "react": ">=16.8.0" 298 | }, 299 | "peerDependenciesMeta": { 300 | "@types/react": { 301 | "optional": true 302 | } 303 | } 304 | }, 305 | "node_modules/@emotion/unitless": { 306 | "version": "0.10.0", 307 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", 308 | "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", 309 | "license": "MIT" 310 | }, 311 | "node_modules/@emotion/use-insertion-effect-with-fallbacks": { 312 | "version": "1.2.0", 313 | "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", 314 | "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", 315 | "license": "MIT", 316 | "peerDependencies": { 317 | "react": ">=16.8.0" 318 | } 319 | }, 320 | "node_modules/@emotion/utils": { 321 | "version": "1.4.2", 322 | "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", 323 | "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", 324 | "license": "MIT" 325 | }, 326 | "node_modules/@emotion/weak-memoize": { 327 | "version": "0.4.0", 328 | "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", 329 | "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", 330 | "license": "MIT" 331 | }, 332 | "node_modules/@floating-ui/core": { 333 | "version": "1.6.9", 334 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", 335 | "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", 336 | "license": "MIT", 337 | "dependencies": { 338 | "@floating-ui/utils": "^0.2.9" 339 | } 340 | }, 341 | "node_modules/@floating-ui/dom": { 342 | "version": "1.6.13", 343 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", 344 | "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", 345 | "license": "MIT", 346 | "dependencies": { 347 | "@floating-ui/core": "^1.6.0", 348 | "@floating-ui/utils": "^0.2.9" 349 | } 350 | }, 351 | "node_modules/@floating-ui/react-dom": { 352 | "version": "2.1.2", 353 | "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", 354 | "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", 355 | "license": "MIT", 356 | "dependencies": { 357 | "@floating-ui/dom": "^1.0.0" 358 | }, 359 | "peerDependencies": { 360 | "react": ">=16.8.0", 361 | "react-dom": ">=16.8.0" 362 | } 363 | }, 364 | "node_modules/@floating-ui/utils": { 365 | "version": "0.2.9", 366 | "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", 367 | "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", 368 | "license": "MIT" 369 | }, 370 | "node_modules/@img/sharp-darwin-arm64": { 371 | "version": "0.33.5", 372 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", 373 | "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", 374 | "cpu": [ 375 | "arm64" 376 | ], 377 | "license": "Apache-2.0", 378 | "optional": true, 379 | "os": [ 380 | "darwin" 381 | ], 382 | "engines": { 383 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 384 | }, 385 | "funding": { 386 | "url": "https://opencollective.com/libvips" 387 | }, 388 | "optionalDependencies": { 389 | "@img/sharp-libvips-darwin-arm64": "1.0.4" 390 | } 391 | }, 392 | "node_modules/@img/sharp-darwin-x64": { 393 | "version": "0.33.5", 394 | "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", 395 | "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", 396 | "cpu": [ 397 | "x64" 398 | ], 399 | "license": "Apache-2.0", 400 | "optional": true, 401 | "os": [ 402 | "darwin" 403 | ], 404 | "engines": { 405 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 406 | }, 407 | "funding": { 408 | "url": "https://opencollective.com/libvips" 409 | }, 410 | "optionalDependencies": { 411 | "@img/sharp-libvips-darwin-x64": "1.0.4" 412 | } 413 | }, 414 | "node_modules/@img/sharp-libvips-darwin-arm64": { 415 | "version": "1.0.4", 416 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", 417 | "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", 418 | "cpu": [ 419 | "arm64" 420 | ], 421 | "license": "LGPL-3.0-or-later", 422 | "optional": true, 423 | "os": [ 424 | "darwin" 425 | ], 426 | "funding": { 427 | "url": "https://opencollective.com/libvips" 428 | } 429 | }, 430 | "node_modules/@img/sharp-libvips-darwin-x64": { 431 | "version": "1.0.4", 432 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", 433 | "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", 434 | "cpu": [ 435 | "x64" 436 | ], 437 | "license": "LGPL-3.0-or-later", 438 | "optional": true, 439 | "os": [ 440 | "darwin" 441 | ], 442 | "funding": { 443 | "url": "https://opencollective.com/libvips" 444 | } 445 | }, 446 | "node_modules/@img/sharp-libvips-linux-arm": { 447 | "version": "1.0.5", 448 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", 449 | "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", 450 | "cpu": [ 451 | "arm" 452 | ], 453 | "license": "LGPL-3.0-or-later", 454 | "optional": true, 455 | "os": [ 456 | "linux" 457 | ], 458 | "funding": { 459 | "url": "https://opencollective.com/libvips" 460 | } 461 | }, 462 | "node_modules/@img/sharp-libvips-linux-arm64": { 463 | "version": "1.0.4", 464 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", 465 | "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", 466 | "cpu": [ 467 | "arm64" 468 | ], 469 | "license": "LGPL-3.0-or-later", 470 | "optional": true, 471 | "os": [ 472 | "linux" 473 | ], 474 | "funding": { 475 | "url": "https://opencollective.com/libvips" 476 | } 477 | }, 478 | "node_modules/@img/sharp-libvips-linux-s390x": { 479 | "version": "1.0.4", 480 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", 481 | "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", 482 | "cpu": [ 483 | "s390x" 484 | ], 485 | "license": "LGPL-3.0-or-later", 486 | "optional": true, 487 | "os": [ 488 | "linux" 489 | ], 490 | "funding": { 491 | "url": "https://opencollective.com/libvips" 492 | } 493 | }, 494 | "node_modules/@img/sharp-libvips-linux-x64": { 495 | "version": "1.0.4", 496 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", 497 | "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", 498 | "cpu": [ 499 | "x64" 500 | ], 501 | "license": "LGPL-3.0-or-later", 502 | "optional": true, 503 | "os": [ 504 | "linux" 505 | ], 506 | "funding": { 507 | "url": "https://opencollective.com/libvips" 508 | } 509 | }, 510 | "node_modules/@img/sharp-libvips-linuxmusl-arm64": { 511 | "version": "1.0.4", 512 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", 513 | "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", 514 | "cpu": [ 515 | "arm64" 516 | ], 517 | "license": "LGPL-3.0-or-later", 518 | "optional": true, 519 | "os": [ 520 | "linux" 521 | ], 522 | "funding": { 523 | "url": "https://opencollective.com/libvips" 524 | } 525 | }, 526 | "node_modules/@img/sharp-libvips-linuxmusl-x64": { 527 | "version": "1.0.4", 528 | "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", 529 | "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", 530 | "cpu": [ 531 | "x64" 532 | ], 533 | "license": "LGPL-3.0-or-later", 534 | "optional": true, 535 | "os": [ 536 | "linux" 537 | ], 538 | "funding": { 539 | "url": "https://opencollective.com/libvips" 540 | } 541 | }, 542 | "node_modules/@img/sharp-linux-arm": { 543 | "version": "0.33.5", 544 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", 545 | "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", 546 | "cpu": [ 547 | "arm" 548 | ], 549 | "license": "Apache-2.0", 550 | "optional": true, 551 | "os": [ 552 | "linux" 553 | ], 554 | "engines": { 555 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 556 | }, 557 | "funding": { 558 | "url": "https://opencollective.com/libvips" 559 | }, 560 | "optionalDependencies": { 561 | "@img/sharp-libvips-linux-arm": "1.0.5" 562 | } 563 | }, 564 | "node_modules/@img/sharp-linux-arm64": { 565 | "version": "0.33.5", 566 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", 567 | "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", 568 | "cpu": [ 569 | "arm64" 570 | ], 571 | "license": "Apache-2.0", 572 | "optional": true, 573 | "os": [ 574 | "linux" 575 | ], 576 | "engines": { 577 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 578 | }, 579 | "funding": { 580 | "url": "https://opencollective.com/libvips" 581 | }, 582 | "optionalDependencies": { 583 | "@img/sharp-libvips-linux-arm64": "1.0.4" 584 | } 585 | }, 586 | "node_modules/@img/sharp-linux-s390x": { 587 | "version": "0.33.5", 588 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", 589 | "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", 590 | "cpu": [ 591 | "s390x" 592 | ], 593 | "license": "Apache-2.0", 594 | "optional": true, 595 | "os": [ 596 | "linux" 597 | ], 598 | "engines": { 599 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 600 | }, 601 | "funding": { 602 | "url": "https://opencollective.com/libvips" 603 | }, 604 | "optionalDependencies": { 605 | "@img/sharp-libvips-linux-s390x": "1.0.4" 606 | } 607 | }, 608 | "node_modules/@img/sharp-linux-x64": { 609 | "version": "0.33.5", 610 | "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", 611 | "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", 612 | "cpu": [ 613 | "x64" 614 | ], 615 | "license": "Apache-2.0", 616 | "optional": true, 617 | "os": [ 618 | "linux" 619 | ], 620 | "engines": { 621 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 622 | }, 623 | "funding": { 624 | "url": "https://opencollective.com/libvips" 625 | }, 626 | "optionalDependencies": { 627 | "@img/sharp-libvips-linux-x64": "1.0.4" 628 | } 629 | }, 630 | "node_modules/@img/sharp-linuxmusl-arm64": { 631 | "version": "0.33.5", 632 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", 633 | "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", 634 | "cpu": [ 635 | "arm64" 636 | ], 637 | "license": "Apache-2.0", 638 | "optional": true, 639 | "os": [ 640 | "linux" 641 | ], 642 | "engines": { 643 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 644 | }, 645 | "funding": { 646 | "url": "https://opencollective.com/libvips" 647 | }, 648 | "optionalDependencies": { 649 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" 650 | } 651 | }, 652 | "node_modules/@img/sharp-linuxmusl-x64": { 653 | "version": "0.33.5", 654 | "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", 655 | "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", 656 | "cpu": [ 657 | "x64" 658 | ], 659 | "license": "Apache-2.0", 660 | "optional": true, 661 | "os": [ 662 | "linux" 663 | ], 664 | "engines": { 665 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 666 | }, 667 | "funding": { 668 | "url": "https://opencollective.com/libvips" 669 | }, 670 | "optionalDependencies": { 671 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4" 672 | } 673 | }, 674 | "node_modules/@img/sharp-wasm32": { 675 | "version": "0.33.5", 676 | "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", 677 | "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", 678 | "cpu": [ 679 | "wasm32" 680 | ], 681 | "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", 682 | "optional": true, 683 | "dependencies": { 684 | "@emnapi/runtime": "^1.2.0" 685 | }, 686 | "engines": { 687 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 688 | }, 689 | "funding": { 690 | "url": "https://opencollective.com/libvips" 691 | } 692 | }, 693 | "node_modules/@img/sharp-win32-ia32": { 694 | "version": "0.33.5", 695 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", 696 | "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", 697 | "cpu": [ 698 | "ia32" 699 | ], 700 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 701 | "optional": true, 702 | "os": [ 703 | "win32" 704 | ], 705 | "engines": { 706 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 707 | }, 708 | "funding": { 709 | "url": "https://opencollective.com/libvips" 710 | } 711 | }, 712 | "node_modules/@img/sharp-win32-x64": { 713 | "version": "0.33.5", 714 | "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", 715 | "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", 716 | "cpu": [ 717 | "x64" 718 | ], 719 | "license": "Apache-2.0 AND LGPL-3.0-or-later", 720 | "optional": true, 721 | "os": [ 722 | "win32" 723 | ], 724 | "engines": { 725 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 726 | }, 727 | "funding": { 728 | "url": "https://opencollective.com/libvips" 729 | } 730 | }, 731 | "node_modules/@jridgewell/gen-mapping": { 732 | "version": "0.3.8", 733 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 734 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 735 | "license": "MIT", 736 | "dependencies": { 737 | "@jridgewell/set-array": "^1.2.1", 738 | "@jridgewell/sourcemap-codec": "^1.4.10", 739 | "@jridgewell/trace-mapping": "^0.3.24" 740 | }, 741 | "engines": { 742 | "node": ">=6.0.0" 743 | } 744 | }, 745 | "node_modules/@jridgewell/resolve-uri": { 746 | "version": "3.1.2", 747 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 748 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 749 | "license": "MIT", 750 | "engines": { 751 | "node": ">=6.0.0" 752 | } 753 | }, 754 | "node_modules/@jridgewell/set-array": { 755 | "version": "1.2.1", 756 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 757 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 758 | "license": "MIT", 759 | "engines": { 760 | "node": ">=6.0.0" 761 | } 762 | }, 763 | "node_modules/@jridgewell/sourcemap-codec": { 764 | "version": "1.5.0", 765 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 766 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 767 | "license": "MIT" 768 | }, 769 | "node_modules/@jridgewell/trace-mapping": { 770 | "version": "0.3.25", 771 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 772 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 773 | "license": "MIT", 774 | "dependencies": { 775 | "@jridgewell/resolve-uri": "^3.1.0", 776 | "@jridgewell/sourcemap-codec": "^1.4.14" 777 | } 778 | }, 779 | "node_modules/@mui/base": { 780 | "version": "5.0.0-beta.69", 781 | "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.69.tgz", 782 | "integrity": "sha512-r2YyGUXpZxj8rLAlbjp1x2BnMERTZ/dMqd9cClKj2OJ7ALAuiv/9X5E9eHfRc9o/dGRuLSMq/WTjREktJVjxVA==", 783 | "deprecated": "This package has been replaced by @base-ui-components/react", 784 | "license": "MIT", 785 | "dependencies": { 786 | "@babel/runtime": "^7.26.0", 787 | "@floating-ui/react-dom": "^2.1.1", 788 | "@mui/types": "^7.2.21", 789 | "@mui/utils": "^6.4.1", 790 | "@popperjs/core": "^2.11.8", 791 | "clsx": "^2.1.1", 792 | "prop-types": "^15.8.1" 793 | }, 794 | "engines": { 795 | "node": ">=14.0.0" 796 | }, 797 | "funding": { 798 | "type": "opencollective", 799 | "url": "https://opencollective.com/mui-org" 800 | }, 801 | "peerDependencies": { 802 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", 803 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0", 804 | "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" 805 | }, 806 | "peerDependenciesMeta": { 807 | "@types/react": { 808 | "optional": true 809 | } 810 | } 811 | }, 812 | "node_modules/@mui/core-downloads-tracker": { 813 | "version": "6.4.6", 814 | "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.6.tgz", 815 | "integrity": "sha512-rho5Q4IscbrVmK9rCrLTJmjLjfH6m/NcqKr/mchvck0EIXlyYUB9+Z0oVmkt/+Mben43LMRYBH8q/Uzxj/c4Vw==", 816 | "license": "MIT", 817 | "funding": { 818 | "type": "opencollective", 819 | "url": "https://opencollective.com/mui-org" 820 | } 821 | }, 822 | "node_modules/@mui/material": { 823 | "version": "6.4.6", 824 | "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.6.tgz", 825 | "integrity": "sha512-6UyAju+DBOdMogfYmLiT3Nu7RgliorimNBny1pN/acOjc+THNFVE7hlxLyn3RDONoZJNDi/8vO4AQQr6dLAXqA==", 826 | "license": "MIT", 827 | "dependencies": { 828 | "@babel/runtime": "^7.26.0", 829 | "@mui/core-downloads-tracker": "^6.4.6", 830 | "@mui/system": "^6.4.6", 831 | "@mui/types": "^7.2.21", 832 | "@mui/utils": "^6.4.6", 833 | "@popperjs/core": "^2.11.8", 834 | "@types/react-transition-group": "^4.4.12", 835 | "clsx": "^2.1.1", 836 | "csstype": "^3.1.3", 837 | "prop-types": "^15.8.1", 838 | "react-is": "^19.0.0", 839 | "react-transition-group": "^4.4.5" 840 | }, 841 | "engines": { 842 | "node": ">=14.0.0" 843 | }, 844 | "funding": { 845 | "type": "opencollective", 846 | "url": "https://opencollective.com/mui-org" 847 | }, 848 | "peerDependencies": { 849 | "@emotion/react": "^11.5.0", 850 | "@emotion/styled": "^11.3.0", 851 | "@mui/material-pigment-css": "^6.4.6", 852 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", 853 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0", 854 | "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" 855 | }, 856 | "peerDependenciesMeta": { 857 | "@emotion/react": { 858 | "optional": true 859 | }, 860 | "@emotion/styled": { 861 | "optional": true 862 | }, 863 | "@mui/material-pigment-css": { 864 | "optional": true 865 | }, 866 | "@types/react": { 867 | "optional": true 868 | } 869 | } 870 | }, 871 | "node_modules/@mui/private-theming": { 872 | "version": "6.4.6", 873 | "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.6.tgz", 874 | "integrity": "sha512-T5FxdPzCELuOrhpA2g4Pi6241HAxRwZudzAuL9vBvniuB5YU82HCmrARw32AuCiyTfWzbrYGGpZ4zyeqqp9RvQ==", 875 | "license": "MIT", 876 | "dependencies": { 877 | "@babel/runtime": "^7.26.0", 878 | "@mui/utils": "^6.4.6", 879 | "prop-types": "^15.8.1" 880 | }, 881 | "engines": { 882 | "node": ">=14.0.0" 883 | }, 884 | "funding": { 885 | "type": "opencollective", 886 | "url": "https://opencollective.com/mui-org" 887 | }, 888 | "peerDependencies": { 889 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", 890 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0" 891 | }, 892 | "peerDependenciesMeta": { 893 | "@types/react": { 894 | "optional": true 895 | } 896 | } 897 | }, 898 | "node_modules/@mui/styled-engine": { 899 | "version": "6.4.6", 900 | "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.6.tgz", 901 | "integrity": "sha512-vSWYc9ZLX46be5gP+FCzWVn5rvDr4cXC5JBZwSIkYk9xbC7GeV+0kCvB8Q6XLFQJy+a62bbqtmdwS4Ghi9NBlQ==", 902 | "license": "MIT", 903 | "dependencies": { 904 | "@babel/runtime": "^7.26.0", 905 | "@emotion/cache": "^11.13.5", 906 | "@emotion/serialize": "^1.3.3", 907 | "@emotion/sheet": "^1.4.0", 908 | "csstype": "^3.1.3", 909 | "prop-types": "^15.8.1" 910 | }, 911 | "engines": { 912 | "node": ">=14.0.0" 913 | }, 914 | "funding": { 915 | "type": "opencollective", 916 | "url": "https://opencollective.com/mui-org" 917 | }, 918 | "peerDependencies": { 919 | "@emotion/react": "^11.4.1", 920 | "@emotion/styled": "^11.3.0", 921 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0" 922 | }, 923 | "peerDependenciesMeta": { 924 | "@emotion/react": { 925 | "optional": true 926 | }, 927 | "@emotion/styled": { 928 | "optional": true 929 | } 930 | } 931 | }, 932 | "node_modules/@mui/system": { 933 | "version": "6.4.6", 934 | "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.6.tgz", 935 | "integrity": "sha512-FQjWwPec7pMTtB/jw5f9eyLynKFZ6/Ej9vhm5kGdtmts1z5b7Vyn3Rz6kasfYm1j2TfrfGnSXRvvtwVWxjpz6g==", 936 | "license": "MIT", 937 | "dependencies": { 938 | "@babel/runtime": "^7.26.0", 939 | "@mui/private-theming": "^6.4.6", 940 | "@mui/styled-engine": "^6.4.6", 941 | "@mui/types": "^7.2.21", 942 | "@mui/utils": "^6.4.6", 943 | "clsx": "^2.1.1", 944 | "csstype": "^3.1.3", 945 | "prop-types": "^15.8.1" 946 | }, 947 | "engines": { 948 | "node": ">=14.0.0" 949 | }, 950 | "funding": { 951 | "type": "opencollective", 952 | "url": "https://opencollective.com/mui-org" 953 | }, 954 | "peerDependencies": { 955 | "@emotion/react": "^11.5.0", 956 | "@emotion/styled": "^11.3.0", 957 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", 958 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0" 959 | }, 960 | "peerDependenciesMeta": { 961 | "@emotion/react": { 962 | "optional": true 963 | }, 964 | "@emotion/styled": { 965 | "optional": true 966 | }, 967 | "@types/react": { 968 | "optional": true 969 | } 970 | } 971 | }, 972 | "node_modules/@mui/types": { 973 | "version": "7.2.21", 974 | "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz", 975 | "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==", 976 | "license": "MIT", 977 | "peerDependencies": { 978 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" 979 | }, 980 | "peerDependenciesMeta": { 981 | "@types/react": { 982 | "optional": true 983 | } 984 | } 985 | }, 986 | "node_modules/@mui/utils": { 987 | "version": "6.4.6", 988 | "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.6.tgz", 989 | "integrity": "sha512-43nZeE1pJF2anGafNydUcYFPtHwAqiBiauRtaMvurdrZI3YrUjHkAu43RBsxef7OFtJMXGiHFvq43kb7lig0sA==", 990 | "license": "MIT", 991 | "dependencies": { 992 | "@babel/runtime": "^7.26.0", 993 | "@mui/types": "^7.2.21", 994 | "@types/prop-types": "^15.7.14", 995 | "clsx": "^2.1.1", 996 | "prop-types": "^15.8.1", 997 | "react-is": "^19.0.0" 998 | }, 999 | "engines": { 1000 | "node": ">=14.0.0" 1001 | }, 1002 | "funding": { 1003 | "type": "opencollective", 1004 | "url": "https://opencollective.com/mui-org" 1005 | }, 1006 | "peerDependencies": { 1007 | "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", 1008 | "react": "^17.0.0 || ^18.0.0 || ^19.0.0" 1009 | }, 1010 | "peerDependenciesMeta": { 1011 | "@types/react": { 1012 | "optional": true 1013 | } 1014 | } 1015 | }, 1016 | "node_modules/@next/env": { 1017 | "version": "15.2.1", 1018 | "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.1.tgz", 1019 | "integrity": "sha512-JmY0qvnPuS2NCWOz2bbby3Pe0VzdAQ7XpEB6uLIHmtXNfAsAO0KLQLkuAoc42Bxbo3/jMC3dcn9cdf+piCcG2Q==", 1020 | "license": "MIT" 1021 | }, 1022 | "node_modules/@next/swc-darwin-arm64": { 1023 | "version": "15.2.1", 1024 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.1.tgz", 1025 | "integrity": "sha512-aWXT+5KEREoy3K5AKtiKwioeblmOvFFjd+F3dVleLvvLiQ/mD//jOOuUcx5hzcO9ISSw4lrqtUPntTpK32uXXQ==", 1026 | "cpu": [ 1027 | "arm64" 1028 | ], 1029 | "license": "MIT", 1030 | "optional": true, 1031 | "os": [ 1032 | "darwin" 1033 | ], 1034 | "engines": { 1035 | "node": ">= 10" 1036 | } 1037 | }, 1038 | "node_modules/@next/swc-darwin-x64": { 1039 | "version": "15.2.1", 1040 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.1.tgz", 1041 | "integrity": "sha512-E/w8ervu4fcG5SkLhvn1NE/2POuDCDEy5gFbfhmnYXkyONZR68qbUlJlZwuN82o7BrBVAw+tkR8nTIjGiMW1jQ==", 1042 | "cpu": [ 1043 | "x64" 1044 | ], 1045 | "license": "MIT", 1046 | "optional": true, 1047 | "os": [ 1048 | "darwin" 1049 | ], 1050 | "engines": { 1051 | "node": ">= 10" 1052 | } 1053 | }, 1054 | "node_modules/@next/swc-linux-arm64-gnu": { 1055 | "version": "15.2.1", 1056 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.1.tgz", 1057 | "integrity": "sha512-gXDX5lIboebbjhiMT6kFgu4svQyjoSed6dHyjx5uZsjlvTwOAnZpn13w9XDaIMFFHw7K8CpBK7HfDKw0VZvUXQ==", 1058 | "cpu": [ 1059 | "arm64" 1060 | ], 1061 | "license": "MIT", 1062 | "optional": true, 1063 | "os": [ 1064 | "linux" 1065 | ], 1066 | "engines": { 1067 | "node": ">= 10" 1068 | } 1069 | }, 1070 | "node_modules/@next/swc-linux-arm64-musl": { 1071 | "version": "15.2.1", 1072 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.1.tgz", 1073 | "integrity": "sha512-3v0pF/adKZkBWfUffmB/ROa+QcNTrnmYG4/SS+r52HPwAK479XcWoES2I+7F7lcbqc7mTeVXrIvb4h6rR/iDKg==", 1074 | "cpu": [ 1075 | "arm64" 1076 | ], 1077 | "license": "MIT", 1078 | "optional": true, 1079 | "os": [ 1080 | "linux" 1081 | ], 1082 | "engines": { 1083 | "node": ">= 10" 1084 | } 1085 | }, 1086 | "node_modules/@next/swc-linux-x64-gnu": { 1087 | "version": "15.2.1", 1088 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.1.tgz", 1089 | "integrity": "sha512-RbsVq2iB6KFJRZ2cHrU67jLVLKeuOIhnQB05ygu5fCNgg8oTewxweJE8XlLV+Ii6Y6u4EHwETdUiRNXIAfpBww==", 1090 | "cpu": [ 1091 | "x64" 1092 | ], 1093 | "license": "MIT", 1094 | "optional": true, 1095 | "os": [ 1096 | "linux" 1097 | ], 1098 | "engines": { 1099 | "node": ">= 10" 1100 | } 1101 | }, 1102 | "node_modules/@next/swc-linux-x64-musl": { 1103 | "version": "15.2.1", 1104 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.1.tgz", 1105 | "integrity": "sha512-QHsMLAyAIu6/fWjHmkN/F78EFPKmhQlyX5C8pRIS2RwVA7z+t9cTb0IaYWC3EHLOTjsU7MNQW+n2xGXr11QPpg==", 1106 | "cpu": [ 1107 | "x64" 1108 | ], 1109 | "license": "MIT", 1110 | "optional": true, 1111 | "os": [ 1112 | "linux" 1113 | ], 1114 | "engines": { 1115 | "node": ">= 10" 1116 | } 1117 | }, 1118 | "node_modules/@next/swc-win32-arm64-msvc": { 1119 | "version": "15.2.1", 1120 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.1.tgz", 1121 | "integrity": "sha512-Gk42XZXo1cE89i3hPLa/9KZ8OuupTjkDmhLaMKFohjf9brOeZVEa3BQy1J9s9TWUqPhgAEbwv6B2+ciGfe54Vw==", 1122 | "cpu": [ 1123 | "arm64" 1124 | ], 1125 | "license": "MIT", 1126 | "optional": true, 1127 | "os": [ 1128 | "win32" 1129 | ], 1130 | "engines": { 1131 | "node": ">= 10" 1132 | } 1133 | }, 1134 | "node_modules/@next/swc-win32-x64-msvc": { 1135 | "version": "15.2.1", 1136 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.1.tgz", 1137 | "integrity": "sha512-YjqXCl8QGhVlMR8uBftWk0iTmvtntr41PhG1kvzGp0sUP/5ehTM+cwx25hKE54J0CRnHYjSGjSH3gkHEaHIN9g==", 1138 | "cpu": [ 1139 | "x64" 1140 | ], 1141 | "license": "MIT", 1142 | "optional": true, 1143 | "os": [ 1144 | "win32" 1145 | ], 1146 | "engines": { 1147 | "node": ">= 10" 1148 | } 1149 | }, 1150 | "node_modules/@popperjs/core": { 1151 | "version": "2.11.8", 1152 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", 1153 | "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", 1154 | "license": "MIT", 1155 | "funding": { 1156 | "type": "opencollective", 1157 | "url": "https://opencollective.com/popperjs" 1158 | } 1159 | }, 1160 | "node_modules/@swc/counter": { 1161 | "version": "0.1.3", 1162 | "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", 1163 | "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", 1164 | "license": "Apache-2.0" 1165 | }, 1166 | "node_modules/@swc/helpers": { 1167 | "version": "0.5.15", 1168 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", 1169 | "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", 1170 | "license": "Apache-2.0", 1171 | "dependencies": { 1172 | "tslib": "^2.8.0" 1173 | } 1174 | }, 1175 | "node_modules/@tailwindcss/node": { 1176 | "version": "4.0.9", 1177 | "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.9.tgz", 1178 | "integrity": "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==", 1179 | "dev": true, 1180 | "license": "MIT", 1181 | "dependencies": { 1182 | "enhanced-resolve": "^5.18.1", 1183 | "jiti": "^2.4.2", 1184 | "tailwindcss": "4.0.9" 1185 | } 1186 | }, 1187 | "node_modules/@tailwindcss/oxide": { 1188 | "version": "4.0.9", 1189 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.9.tgz", 1190 | "integrity": "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==", 1191 | "dev": true, 1192 | "license": "MIT", 1193 | "engines": { 1194 | "node": ">= 10" 1195 | }, 1196 | "optionalDependencies": { 1197 | "@tailwindcss/oxide-android-arm64": "4.0.9", 1198 | "@tailwindcss/oxide-darwin-arm64": "4.0.9", 1199 | "@tailwindcss/oxide-darwin-x64": "4.0.9", 1200 | "@tailwindcss/oxide-freebsd-x64": "4.0.9", 1201 | "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.9", 1202 | "@tailwindcss/oxide-linux-arm64-gnu": "4.0.9", 1203 | "@tailwindcss/oxide-linux-arm64-musl": "4.0.9", 1204 | "@tailwindcss/oxide-linux-x64-gnu": "4.0.9", 1205 | "@tailwindcss/oxide-linux-x64-musl": "4.0.9", 1206 | "@tailwindcss/oxide-win32-arm64-msvc": "4.0.9", 1207 | "@tailwindcss/oxide-win32-x64-msvc": "4.0.9" 1208 | } 1209 | }, 1210 | "node_modules/@tailwindcss/oxide-android-arm64": { 1211 | "version": "4.0.9", 1212 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.9.tgz", 1213 | "integrity": "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==", 1214 | "cpu": [ 1215 | "arm64" 1216 | ], 1217 | "dev": true, 1218 | "license": "MIT", 1219 | "optional": true, 1220 | "os": [ 1221 | "android" 1222 | ], 1223 | "engines": { 1224 | "node": ">= 10" 1225 | } 1226 | }, 1227 | "node_modules/@tailwindcss/oxide-darwin-arm64": { 1228 | "version": "4.0.9", 1229 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.9.tgz", 1230 | "integrity": "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==", 1231 | "cpu": [ 1232 | "arm64" 1233 | ], 1234 | "dev": true, 1235 | "license": "MIT", 1236 | "optional": true, 1237 | "os": [ 1238 | "darwin" 1239 | ], 1240 | "engines": { 1241 | "node": ">= 10" 1242 | } 1243 | }, 1244 | "node_modules/@tailwindcss/oxide-darwin-x64": { 1245 | "version": "4.0.9", 1246 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.9.tgz", 1247 | "integrity": "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==", 1248 | "cpu": [ 1249 | "x64" 1250 | ], 1251 | "dev": true, 1252 | "license": "MIT", 1253 | "optional": true, 1254 | "os": [ 1255 | "darwin" 1256 | ], 1257 | "engines": { 1258 | "node": ">= 10" 1259 | } 1260 | }, 1261 | "node_modules/@tailwindcss/oxide-freebsd-x64": { 1262 | "version": "4.0.9", 1263 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.9.tgz", 1264 | "integrity": "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==", 1265 | "cpu": [ 1266 | "x64" 1267 | ], 1268 | "dev": true, 1269 | "license": "MIT", 1270 | "optional": true, 1271 | "os": [ 1272 | "freebsd" 1273 | ], 1274 | "engines": { 1275 | "node": ">= 10" 1276 | } 1277 | }, 1278 | "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 1279 | "version": "4.0.9", 1280 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.9.tgz", 1281 | "integrity": "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==", 1282 | "cpu": [ 1283 | "arm" 1284 | ], 1285 | "dev": true, 1286 | "license": "MIT", 1287 | "optional": true, 1288 | "os": [ 1289 | "linux" 1290 | ], 1291 | "engines": { 1292 | "node": ">= 10" 1293 | } 1294 | }, 1295 | "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 1296 | "version": "4.0.9", 1297 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.9.tgz", 1298 | "integrity": "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==", 1299 | "cpu": [ 1300 | "arm64" 1301 | ], 1302 | "dev": true, 1303 | "license": "MIT", 1304 | "optional": true, 1305 | "os": [ 1306 | "linux" 1307 | ], 1308 | "engines": { 1309 | "node": ">= 10" 1310 | } 1311 | }, 1312 | "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 1313 | "version": "4.0.9", 1314 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.9.tgz", 1315 | "integrity": "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==", 1316 | "cpu": [ 1317 | "arm64" 1318 | ], 1319 | "dev": true, 1320 | "license": "MIT", 1321 | "optional": true, 1322 | "os": [ 1323 | "linux" 1324 | ], 1325 | "engines": { 1326 | "node": ">= 10" 1327 | } 1328 | }, 1329 | "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 1330 | "version": "4.0.9", 1331 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.9.tgz", 1332 | "integrity": "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==", 1333 | "cpu": [ 1334 | "x64" 1335 | ], 1336 | "dev": true, 1337 | "license": "MIT", 1338 | "optional": true, 1339 | "os": [ 1340 | "linux" 1341 | ], 1342 | "engines": { 1343 | "node": ">= 10" 1344 | } 1345 | }, 1346 | "node_modules/@tailwindcss/oxide-linux-x64-musl": { 1347 | "version": "4.0.9", 1348 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.9.tgz", 1349 | "integrity": "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==", 1350 | "cpu": [ 1351 | "x64" 1352 | ], 1353 | "dev": true, 1354 | "license": "MIT", 1355 | "optional": true, 1356 | "os": [ 1357 | "linux" 1358 | ], 1359 | "engines": { 1360 | "node": ">= 10" 1361 | } 1362 | }, 1363 | "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 1364 | "version": "4.0.9", 1365 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.9.tgz", 1366 | "integrity": "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==", 1367 | "cpu": [ 1368 | "arm64" 1369 | ], 1370 | "dev": true, 1371 | "license": "MIT", 1372 | "optional": true, 1373 | "os": [ 1374 | "win32" 1375 | ], 1376 | "engines": { 1377 | "node": ">= 10" 1378 | } 1379 | }, 1380 | "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 1381 | "version": "4.0.9", 1382 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.9.tgz", 1383 | "integrity": "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==", 1384 | "cpu": [ 1385 | "x64" 1386 | ], 1387 | "dev": true, 1388 | "license": "MIT", 1389 | "optional": true, 1390 | "os": [ 1391 | "win32" 1392 | ], 1393 | "engines": { 1394 | "node": ">= 10" 1395 | } 1396 | }, 1397 | "node_modules/@tailwindcss/postcss": { 1398 | "version": "4.0.9", 1399 | "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.0.9.tgz", 1400 | "integrity": "sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ==", 1401 | "dev": true, 1402 | "license": "MIT", 1403 | "dependencies": { 1404 | "@alloc/quick-lru": "^5.2.0", 1405 | "@tailwindcss/node": "4.0.9", 1406 | "@tailwindcss/oxide": "4.0.9", 1407 | "lightningcss": "^1.29.1", 1408 | "postcss": "^8.4.41", 1409 | "tailwindcss": "4.0.9" 1410 | } 1411 | }, 1412 | "node_modules/@types/node": { 1413 | "version": "20.17.23", 1414 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.23.tgz", 1415 | "integrity": "sha512-8PCGZ1ZJbEZuYNTMqywO+Sj4vSKjSjT6Ua+6RFOYlEvIvKQABPtrNkoVSLSKDb4obYcMhspVKmsw8Cm10NFRUg==", 1416 | "dev": true, 1417 | "license": "MIT", 1418 | "dependencies": { 1419 | "undici-types": "~6.19.2" 1420 | } 1421 | }, 1422 | "node_modules/@types/parse-json": { 1423 | "version": "4.0.2", 1424 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", 1425 | "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", 1426 | "license": "MIT" 1427 | }, 1428 | "node_modules/@types/prop-types": { 1429 | "version": "15.7.14", 1430 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", 1431 | "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", 1432 | "license": "MIT" 1433 | }, 1434 | "node_modules/@types/react": { 1435 | "version": "19.0.10", 1436 | "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", 1437 | "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", 1438 | "license": "MIT", 1439 | "dependencies": { 1440 | "csstype": "^3.0.2" 1441 | } 1442 | }, 1443 | "node_modules/@types/react-dom": { 1444 | "version": "19.0.4", 1445 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", 1446 | "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", 1447 | "dev": true, 1448 | "license": "MIT", 1449 | "peerDependencies": { 1450 | "@types/react": "^19.0.0" 1451 | } 1452 | }, 1453 | "node_modules/@types/react-transition-group": { 1454 | "version": "4.4.12", 1455 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", 1456 | "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", 1457 | "license": "MIT", 1458 | "peerDependencies": { 1459 | "@types/react": "*" 1460 | } 1461 | }, 1462 | "node_modules/asynckit": { 1463 | "version": "0.4.0", 1464 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1465 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 1466 | "license": "MIT" 1467 | }, 1468 | "node_modules/axios": { 1469 | "version": "1.8.1", 1470 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.1.tgz", 1471 | "integrity": "sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==", 1472 | "license": "MIT", 1473 | "dependencies": { 1474 | "follow-redirects": "^1.15.6", 1475 | "form-data": "^4.0.0", 1476 | "proxy-from-env": "^1.1.0" 1477 | } 1478 | }, 1479 | "node_modules/babel-plugin-macros": { 1480 | "version": "3.1.0", 1481 | "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", 1482 | "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", 1483 | "license": "MIT", 1484 | "dependencies": { 1485 | "@babel/runtime": "^7.12.5", 1486 | "cosmiconfig": "^7.0.0", 1487 | "resolve": "^1.19.0" 1488 | }, 1489 | "engines": { 1490 | "node": ">=10", 1491 | "npm": ">=6" 1492 | } 1493 | }, 1494 | "node_modules/busboy": { 1495 | "version": "1.6.0", 1496 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 1497 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 1498 | "dependencies": { 1499 | "streamsearch": "^1.1.0" 1500 | }, 1501 | "engines": { 1502 | "node": ">=10.16.0" 1503 | } 1504 | }, 1505 | "node_modules/call-bind-apply-helpers": { 1506 | "version": "1.0.2", 1507 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 1508 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 1509 | "license": "MIT", 1510 | "dependencies": { 1511 | "es-errors": "^1.3.0", 1512 | "function-bind": "^1.1.2" 1513 | }, 1514 | "engines": { 1515 | "node": ">= 0.4" 1516 | } 1517 | }, 1518 | "node_modules/callsites": { 1519 | "version": "3.1.0", 1520 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1521 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1522 | "license": "MIT", 1523 | "engines": { 1524 | "node": ">=6" 1525 | } 1526 | }, 1527 | "node_modules/caniuse-lite": { 1528 | "version": "1.0.30001702", 1529 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", 1530 | "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", 1531 | "funding": [ 1532 | { 1533 | "type": "opencollective", 1534 | "url": "https://opencollective.com/browserslist" 1535 | }, 1536 | { 1537 | "type": "tidelift", 1538 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1539 | }, 1540 | { 1541 | "type": "github", 1542 | "url": "https://github.com/sponsors/ai" 1543 | } 1544 | ], 1545 | "license": "CC-BY-4.0" 1546 | }, 1547 | "node_modules/client-only": { 1548 | "version": "0.0.1", 1549 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 1550 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", 1551 | "license": "MIT" 1552 | }, 1553 | "node_modules/clsx": { 1554 | "version": "2.1.1", 1555 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 1556 | "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 1557 | "license": "MIT", 1558 | "engines": { 1559 | "node": ">=6" 1560 | } 1561 | }, 1562 | "node_modules/color": { 1563 | "version": "4.2.3", 1564 | "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", 1565 | "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", 1566 | "license": "MIT", 1567 | "optional": true, 1568 | "dependencies": { 1569 | "color-convert": "^2.0.1", 1570 | "color-string": "^1.9.0" 1571 | }, 1572 | "engines": { 1573 | "node": ">=12.5.0" 1574 | } 1575 | }, 1576 | "node_modules/color-convert": { 1577 | "version": "2.0.1", 1578 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1579 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1580 | "license": "MIT", 1581 | "optional": true, 1582 | "dependencies": { 1583 | "color-name": "~1.1.4" 1584 | }, 1585 | "engines": { 1586 | "node": ">=7.0.0" 1587 | } 1588 | }, 1589 | "node_modules/color-name": { 1590 | "version": "1.1.4", 1591 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1592 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1593 | "license": "MIT", 1594 | "optional": true 1595 | }, 1596 | "node_modules/color-string": { 1597 | "version": "1.9.1", 1598 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 1599 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 1600 | "license": "MIT", 1601 | "optional": true, 1602 | "dependencies": { 1603 | "color-name": "^1.0.0", 1604 | "simple-swizzle": "^0.2.2" 1605 | } 1606 | }, 1607 | "node_modules/combined-stream": { 1608 | "version": "1.0.8", 1609 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1610 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1611 | "license": "MIT", 1612 | "dependencies": { 1613 | "delayed-stream": "~1.0.0" 1614 | }, 1615 | "engines": { 1616 | "node": ">= 0.8" 1617 | } 1618 | }, 1619 | "node_modules/convert-source-map": { 1620 | "version": "1.9.0", 1621 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 1622 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 1623 | "license": "MIT" 1624 | }, 1625 | "node_modules/cosmiconfig": { 1626 | "version": "7.1.0", 1627 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", 1628 | "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", 1629 | "license": "MIT", 1630 | "dependencies": { 1631 | "@types/parse-json": "^4.0.0", 1632 | "import-fresh": "^3.2.1", 1633 | "parse-json": "^5.0.0", 1634 | "path-type": "^4.0.0", 1635 | "yaml": "^1.10.0" 1636 | }, 1637 | "engines": { 1638 | "node": ">=10" 1639 | } 1640 | }, 1641 | "node_modules/csstype": { 1642 | "version": "3.1.3", 1643 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1644 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1645 | "license": "MIT" 1646 | }, 1647 | "node_modules/debug": { 1648 | "version": "4.4.0", 1649 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1650 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1651 | "license": "MIT", 1652 | "dependencies": { 1653 | "ms": "^2.1.3" 1654 | }, 1655 | "engines": { 1656 | "node": ">=6.0" 1657 | }, 1658 | "peerDependenciesMeta": { 1659 | "supports-color": { 1660 | "optional": true 1661 | } 1662 | } 1663 | }, 1664 | "node_modules/delayed-stream": { 1665 | "version": "1.0.0", 1666 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1667 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1668 | "license": "MIT", 1669 | "engines": { 1670 | "node": ">=0.4.0" 1671 | } 1672 | }, 1673 | "node_modules/detect-libc": { 1674 | "version": "1.0.3", 1675 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 1676 | "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 1677 | "dev": true, 1678 | "license": "Apache-2.0", 1679 | "bin": { 1680 | "detect-libc": "bin/detect-libc.js" 1681 | }, 1682 | "engines": { 1683 | "node": ">=0.10" 1684 | } 1685 | }, 1686 | "node_modules/dom-helpers": { 1687 | "version": "5.2.1", 1688 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", 1689 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", 1690 | "license": "MIT", 1691 | "dependencies": { 1692 | "@babel/runtime": "^7.8.7", 1693 | "csstype": "^3.0.2" 1694 | } 1695 | }, 1696 | "node_modules/dunder-proto": { 1697 | "version": "1.0.1", 1698 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 1699 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 1700 | "license": "MIT", 1701 | "dependencies": { 1702 | "call-bind-apply-helpers": "^1.0.1", 1703 | "es-errors": "^1.3.0", 1704 | "gopd": "^1.2.0" 1705 | }, 1706 | "engines": { 1707 | "node": ">= 0.4" 1708 | } 1709 | }, 1710 | "node_modules/enhanced-resolve": { 1711 | "version": "5.18.1", 1712 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", 1713 | "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", 1714 | "dev": true, 1715 | "license": "MIT", 1716 | "dependencies": { 1717 | "graceful-fs": "^4.2.4", 1718 | "tapable": "^2.2.0" 1719 | }, 1720 | "engines": { 1721 | "node": ">=10.13.0" 1722 | } 1723 | }, 1724 | "node_modules/error-ex": { 1725 | "version": "1.3.2", 1726 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1727 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1728 | "license": "MIT", 1729 | "dependencies": { 1730 | "is-arrayish": "^0.2.1" 1731 | } 1732 | }, 1733 | "node_modules/error-ex/node_modules/is-arrayish": { 1734 | "version": "0.2.1", 1735 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1736 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 1737 | "license": "MIT" 1738 | }, 1739 | "node_modules/es-define-property": { 1740 | "version": "1.0.1", 1741 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 1742 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 1743 | "license": "MIT", 1744 | "engines": { 1745 | "node": ">= 0.4" 1746 | } 1747 | }, 1748 | "node_modules/es-errors": { 1749 | "version": "1.3.0", 1750 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 1751 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 1752 | "license": "MIT", 1753 | "engines": { 1754 | "node": ">= 0.4" 1755 | } 1756 | }, 1757 | "node_modules/es-object-atoms": { 1758 | "version": "1.1.1", 1759 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 1760 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 1761 | "license": "MIT", 1762 | "dependencies": { 1763 | "es-errors": "^1.3.0" 1764 | }, 1765 | "engines": { 1766 | "node": ">= 0.4" 1767 | } 1768 | }, 1769 | "node_modules/es-set-tostringtag": { 1770 | "version": "2.1.0", 1771 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 1772 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 1773 | "license": "MIT", 1774 | "dependencies": { 1775 | "es-errors": "^1.3.0", 1776 | "get-intrinsic": "^1.2.6", 1777 | "has-tostringtag": "^1.0.2", 1778 | "hasown": "^2.0.2" 1779 | }, 1780 | "engines": { 1781 | "node": ">= 0.4" 1782 | } 1783 | }, 1784 | "node_modules/escape-string-regexp": { 1785 | "version": "4.0.0", 1786 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1787 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1788 | "license": "MIT", 1789 | "engines": { 1790 | "node": ">=10" 1791 | }, 1792 | "funding": { 1793 | "url": "https://github.com/sponsors/sindresorhus" 1794 | } 1795 | }, 1796 | "node_modules/find-root": { 1797 | "version": "1.1.0", 1798 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 1799 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 1800 | "license": "MIT" 1801 | }, 1802 | "node_modules/follow-redirects": { 1803 | "version": "1.15.9", 1804 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 1805 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 1806 | "funding": [ 1807 | { 1808 | "type": "individual", 1809 | "url": "https://github.com/sponsors/RubenVerborgh" 1810 | } 1811 | ], 1812 | "license": "MIT", 1813 | "engines": { 1814 | "node": ">=4.0" 1815 | }, 1816 | "peerDependenciesMeta": { 1817 | "debug": { 1818 | "optional": true 1819 | } 1820 | } 1821 | }, 1822 | "node_modules/form-data": { 1823 | "version": "4.0.2", 1824 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 1825 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 1826 | "license": "MIT", 1827 | "dependencies": { 1828 | "asynckit": "^0.4.0", 1829 | "combined-stream": "^1.0.8", 1830 | "es-set-tostringtag": "^2.1.0", 1831 | "mime-types": "^2.1.12" 1832 | }, 1833 | "engines": { 1834 | "node": ">= 6" 1835 | } 1836 | }, 1837 | "node_modules/function-bind": { 1838 | "version": "1.1.2", 1839 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1840 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1841 | "license": "MIT", 1842 | "funding": { 1843 | "url": "https://github.com/sponsors/ljharb" 1844 | } 1845 | }, 1846 | "node_modules/get-intrinsic": { 1847 | "version": "1.3.0", 1848 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 1849 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 1850 | "license": "MIT", 1851 | "dependencies": { 1852 | "call-bind-apply-helpers": "^1.0.2", 1853 | "es-define-property": "^1.0.1", 1854 | "es-errors": "^1.3.0", 1855 | "es-object-atoms": "^1.1.1", 1856 | "function-bind": "^1.1.2", 1857 | "get-proto": "^1.0.1", 1858 | "gopd": "^1.2.0", 1859 | "has-symbols": "^1.1.0", 1860 | "hasown": "^2.0.2", 1861 | "math-intrinsics": "^1.1.0" 1862 | }, 1863 | "engines": { 1864 | "node": ">= 0.4" 1865 | }, 1866 | "funding": { 1867 | "url": "https://github.com/sponsors/ljharb" 1868 | } 1869 | }, 1870 | "node_modules/get-proto": { 1871 | "version": "1.0.1", 1872 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 1873 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 1874 | "license": "MIT", 1875 | "dependencies": { 1876 | "dunder-proto": "^1.0.1", 1877 | "es-object-atoms": "^1.0.0" 1878 | }, 1879 | "engines": { 1880 | "node": ">= 0.4" 1881 | } 1882 | }, 1883 | "node_modules/globals": { 1884 | "version": "11.12.0", 1885 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1886 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1887 | "license": "MIT", 1888 | "engines": { 1889 | "node": ">=4" 1890 | } 1891 | }, 1892 | "node_modules/gopd": { 1893 | "version": "1.2.0", 1894 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 1895 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 1896 | "license": "MIT", 1897 | "engines": { 1898 | "node": ">= 0.4" 1899 | }, 1900 | "funding": { 1901 | "url": "https://github.com/sponsors/ljharb" 1902 | } 1903 | }, 1904 | "node_modules/graceful-fs": { 1905 | "version": "4.2.11", 1906 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1907 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1908 | "dev": true, 1909 | "license": "ISC" 1910 | }, 1911 | "node_modules/has-symbols": { 1912 | "version": "1.1.0", 1913 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 1914 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 1915 | "license": "MIT", 1916 | "engines": { 1917 | "node": ">= 0.4" 1918 | }, 1919 | "funding": { 1920 | "url": "https://github.com/sponsors/ljharb" 1921 | } 1922 | }, 1923 | "node_modules/has-tostringtag": { 1924 | "version": "1.0.2", 1925 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 1926 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 1927 | "license": "MIT", 1928 | "dependencies": { 1929 | "has-symbols": "^1.0.3" 1930 | }, 1931 | "engines": { 1932 | "node": ">= 0.4" 1933 | }, 1934 | "funding": { 1935 | "url": "https://github.com/sponsors/ljharb" 1936 | } 1937 | }, 1938 | "node_modules/hasown": { 1939 | "version": "2.0.2", 1940 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1941 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1942 | "license": "MIT", 1943 | "dependencies": { 1944 | "function-bind": "^1.1.2" 1945 | }, 1946 | "engines": { 1947 | "node": ">= 0.4" 1948 | } 1949 | }, 1950 | "node_modules/hoist-non-react-statics": { 1951 | "version": "3.3.2", 1952 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", 1953 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", 1954 | "license": "BSD-3-Clause", 1955 | "dependencies": { 1956 | "react-is": "^16.7.0" 1957 | } 1958 | }, 1959 | "node_modules/hoist-non-react-statics/node_modules/react-is": { 1960 | "version": "16.13.1", 1961 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1962 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 1963 | "license": "MIT" 1964 | }, 1965 | "node_modules/import-fresh": { 1966 | "version": "3.3.1", 1967 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 1968 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 1969 | "license": "MIT", 1970 | "dependencies": { 1971 | "parent-module": "^1.0.0", 1972 | "resolve-from": "^4.0.0" 1973 | }, 1974 | "engines": { 1975 | "node": ">=6" 1976 | }, 1977 | "funding": { 1978 | "url": "https://github.com/sponsors/sindresorhus" 1979 | } 1980 | }, 1981 | "node_modules/is-arrayish": { 1982 | "version": "0.3.2", 1983 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1984 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", 1985 | "license": "MIT", 1986 | "optional": true 1987 | }, 1988 | "node_modules/is-core-module": { 1989 | "version": "2.16.1", 1990 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 1991 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 1992 | "license": "MIT", 1993 | "dependencies": { 1994 | "hasown": "^2.0.2" 1995 | }, 1996 | "engines": { 1997 | "node": ">= 0.4" 1998 | }, 1999 | "funding": { 2000 | "url": "https://github.com/sponsors/ljharb" 2001 | } 2002 | }, 2003 | "node_modules/jiti": { 2004 | "version": "2.4.2", 2005 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", 2006 | "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", 2007 | "dev": true, 2008 | "license": "MIT", 2009 | "bin": { 2010 | "jiti": "lib/jiti-cli.mjs" 2011 | } 2012 | }, 2013 | "node_modules/js-tokens": { 2014 | "version": "4.0.0", 2015 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2016 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2017 | "license": "MIT" 2018 | }, 2019 | "node_modules/jsesc": { 2020 | "version": "3.1.0", 2021 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 2022 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 2023 | "license": "MIT", 2024 | "bin": { 2025 | "jsesc": "bin/jsesc" 2026 | }, 2027 | "engines": { 2028 | "node": ">=6" 2029 | } 2030 | }, 2031 | "node_modules/json-parse-even-better-errors": { 2032 | "version": "2.3.1", 2033 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2034 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2035 | "license": "MIT" 2036 | }, 2037 | "node_modules/lightningcss": { 2038 | "version": "1.29.1", 2039 | "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", 2040 | "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", 2041 | "dev": true, 2042 | "license": "MPL-2.0", 2043 | "dependencies": { 2044 | "detect-libc": "^1.0.3" 2045 | }, 2046 | "engines": { 2047 | "node": ">= 12.0.0" 2048 | }, 2049 | "funding": { 2050 | "type": "opencollective", 2051 | "url": "https://opencollective.com/parcel" 2052 | }, 2053 | "optionalDependencies": { 2054 | "lightningcss-darwin-arm64": "1.29.1", 2055 | "lightningcss-darwin-x64": "1.29.1", 2056 | "lightningcss-freebsd-x64": "1.29.1", 2057 | "lightningcss-linux-arm-gnueabihf": "1.29.1", 2058 | "lightningcss-linux-arm64-gnu": "1.29.1", 2059 | "lightningcss-linux-arm64-musl": "1.29.1", 2060 | "lightningcss-linux-x64-gnu": "1.29.1", 2061 | "lightningcss-linux-x64-musl": "1.29.1", 2062 | "lightningcss-win32-arm64-msvc": "1.29.1", 2063 | "lightningcss-win32-x64-msvc": "1.29.1" 2064 | } 2065 | }, 2066 | "node_modules/lightningcss-darwin-arm64": { 2067 | "version": "1.29.1", 2068 | "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz", 2069 | "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==", 2070 | "cpu": [ 2071 | "arm64" 2072 | ], 2073 | "dev": true, 2074 | "license": "MPL-2.0", 2075 | "optional": true, 2076 | "os": [ 2077 | "darwin" 2078 | ], 2079 | "engines": { 2080 | "node": ">= 12.0.0" 2081 | }, 2082 | "funding": { 2083 | "type": "opencollective", 2084 | "url": "https://opencollective.com/parcel" 2085 | } 2086 | }, 2087 | "node_modules/lightningcss-darwin-x64": { 2088 | "version": "1.29.1", 2089 | "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz", 2090 | "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==", 2091 | "cpu": [ 2092 | "x64" 2093 | ], 2094 | "dev": true, 2095 | "license": "MPL-2.0", 2096 | "optional": true, 2097 | "os": [ 2098 | "darwin" 2099 | ], 2100 | "engines": { 2101 | "node": ">= 12.0.0" 2102 | }, 2103 | "funding": { 2104 | "type": "opencollective", 2105 | "url": "https://opencollective.com/parcel" 2106 | } 2107 | }, 2108 | "node_modules/lightningcss-freebsd-x64": { 2109 | "version": "1.29.1", 2110 | "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz", 2111 | "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==", 2112 | "cpu": [ 2113 | "x64" 2114 | ], 2115 | "dev": true, 2116 | "license": "MPL-2.0", 2117 | "optional": true, 2118 | "os": [ 2119 | "freebsd" 2120 | ], 2121 | "engines": { 2122 | "node": ">= 12.0.0" 2123 | }, 2124 | "funding": { 2125 | "type": "opencollective", 2126 | "url": "https://opencollective.com/parcel" 2127 | } 2128 | }, 2129 | "node_modules/lightningcss-linux-arm-gnueabihf": { 2130 | "version": "1.29.1", 2131 | "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz", 2132 | "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==", 2133 | "cpu": [ 2134 | "arm" 2135 | ], 2136 | "dev": true, 2137 | "license": "MPL-2.0", 2138 | "optional": true, 2139 | "os": [ 2140 | "linux" 2141 | ], 2142 | "engines": { 2143 | "node": ">= 12.0.0" 2144 | }, 2145 | "funding": { 2146 | "type": "opencollective", 2147 | "url": "https://opencollective.com/parcel" 2148 | } 2149 | }, 2150 | "node_modules/lightningcss-linux-arm64-gnu": { 2151 | "version": "1.29.1", 2152 | "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz", 2153 | "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==", 2154 | "cpu": [ 2155 | "arm64" 2156 | ], 2157 | "dev": true, 2158 | "license": "MPL-2.0", 2159 | "optional": true, 2160 | "os": [ 2161 | "linux" 2162 | ], 2163 | "engines": { 2164 | "node": ">= 12.0.0" 2165 | }, 2166 | "funding": { 2167 | "type": "opencollective", 2168 | "url": "https://opencollective.com/parcel" 2169 | } 2170 | }, 2171 | "node_modules/lightningcss-linux-arm64-musl": { 2172 | "version": "1.29.1", 2173 | "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz", 2174 | "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==", 2175 | "cpu": [ 2176 | "arm64" 2177 | ], 2178 | "dev": true, 2179 | "license": "MPL-2.0", 2180 | "optional": true, 2181 | "os": [ 2182 | "linux" 2183 | ], 2184 | "engines": { 2185 | "node": ">= 12.0.0" 2186 | }, 2187 | "funding": { 2188 | "type": "opencollective", 2189 | "url": "https://opencollective.com/parcel" 2190 | } 2191 | }, 2192 | "node_modules/lightningcss-linux-x64-gnu": { 2193 | "version": "1.29.1", 2194 | "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz", 2195 | "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==", 2196 | "cpu": [ 2197 | "x64" 2198 | ], 2199 | "dev": true, 2200 | "license": "MPL-2.0", 2201 | "optional": true, 2202 | "os": [ 2203 | "linux" 2204 | ], 2205 | "engines": { 2206 | "node": ">= 12.0.0" 2207 | }, 2208 | "funding": { 2209 | "type": "opencollective", 2210 | "url": "https://opencollective.com/parcel" 2211 | } 2212 | }, 2213 | "node_modules/lightningcss-linux-x64-musl": { 2214 | "version": "1.29.1", 2215 | "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz", 2216 | "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==", 2217 | "cpu": [ 2218 | "x64" 2219 | ], 2220 | "dev": true, 2221 | "license": "MPL-2.0", 2222 | "optional": true, 2223 | "os": [ 2224 | "linux" 2225 | ], 2226 | "engines": { 2227 | "node": ">= 12.0.0" 2228 | }, 2229 | "funding": { 2230 | "type": "opencollective", 2231 | "url": "https://opencollective.com/parcel" 2232 | } 2233 | }, 2234 | "node_modules/lightningcss-win32-arm64-msvc": { 2235 | "version": "1.29.1", 2236 | "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz", 2237 | "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==", 2238 | "cpu": [ 2239 | "arm64" 2240 | ], 2241 | "dev": true, 2242 | "license": "MPL-2.0", 2243 | "optional": true, 2244 | "os": [ 2245 | "win32" 2246 | ], 2247 | "engines": { 2248 | "node": ">= 12.0.0" 2249 | }, 2250 | "funding": { 2251 | "type": "opencollective", 2252 | "url": "https://opencollective.com/parcel" 2253 | } 2254 | }, 2255 | "node_modules/lightningcss-win32-x64-msvc": { 2256 | "version": "1.29.1", 2257 | "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz", 2258 | "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==", 2259 | "cpu": [ 2260 | "x64" 2261 | ], 2262 | "dev": true, 2263 | "license": "MPL-2.0", 2264 | "optional": true, 2265 | "os": [ 2266 | "win32" 2267 | ], 2268 | "engines": { 2269 | "node": ">= 12.0.0" 2270 | }, 2271 | "funding": { 2272 | "type": "opencollective", 2273 | "url": "https://opencollective.com/parcel" 2274 | } 2275 | }, 2276 | "node_modules/lines-and-columns": { 2277 | "version": "1.2.4", 2278 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2279 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2280 | "license": "MIT" 2281 | }, 2282 | "node_modules/loose-envify": { 2283 | "version": "1.4.0", 2284 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2285 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2286 | "license": "MIT", 2287 | "dependencies": { 2288 | "js-tokens": "^3.0.0 || ^4.0.0" 2289 | }, 2290 | "bin": { 2291 | "loose-envify": "cli.js" 2292 | } 2293 | }, 2294 | "node_modules/math-intrinsics": { 2295 | "version": "1.1.0", 2296 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 2297 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 2298 | "license": "MIT", 2299 | "engines": { 2300 | "node": ">= 0.4" 2301 | } 2302 | }, 2303 | "node_modules/mime-db": { 2304 | "version": "1.52.0", 2305 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2306 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 2307 | "license": "MIT", 2308 | "engines": { 2309 | "node": ">= 0.6" 2310 | } 2311 | }, 2312 | "node_modules/mime-types": { 2313 | "version": "2.1.35", 2314 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2315 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2316 | "license": "MIT", 2317 | "dependencies": { 2318 | "mime-db": "1.52.0" 2319 | }, 2320 | "engines": { 2321 | "node": ">= 0.6" 2322 | } 2323 | }, 2324 | "node_modules/ms": { 2325 | "version": "2.1.3", 2326 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2327 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2328 | "license": "MIT" 2329 | }, 2330 | "node_modules/nanoid": { 2331 | "version": "3.3.8", 2332 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 2333 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 2334 | "funding": [ 2335 | { 2336 | "type": "github", 2337 | "url": "https://github.com/sponsors/ai" 2338 | } 2339 | ], 2340 | "license": "MIT", 2341 | "bin": { 2342 | "nanoid": "bin/nanoid.cjs" 2343 | }, 2344 | "engines": { 2345 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2346 | } 2347 | }, 2348 | "node_modules/next": { 2349 | "version": "15.2.1", 2350 | "resolved": "https://registry.npmjs.org/next/-/next-15.2.1.tgz", 2351 | "integrity": "sha512-zxbsdQv3OqWXybK5tMkPCBKyhIz63RstJ+NvlfkaLMc/m5MwXgz2e92k+hSKcyBpyADhMk2C31RIiaDjUZae7g==", 2352 | "license": "MIT", 2353 | "dependencies": { 2354 | "@next/env": "15.2.1", 2355 | "@swc/counter": "0.1.3", 2356 | "@swc/helpers": "0.5.15", 2357 | "busboy": "1.6.0", 2358 | "caniuse-lite": "^1.0.30001579", 2359 | "postcss": "8.4.31", 2360 | "styled-jsx": "5.1.6" 2361 | }, 2362 | "bin": { 2363 | "next": "dist/bin/next" 2364 | }, 2365 | "engines": { 2366 | "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" 2367 | }, 2368 | "optionalDependencies": { 2369 | "@next/swc-darwin-arm64": "15.2.1", 2370 | "@next/swc-darwin-x64": "15.2.1", 2371 | "@next/swc-linux-arm64-gnu": "15.2.1", 2372 | "@next/swc-linux-arm64-musl": "15.2.1", 2373 | "@next/swc-linux-x64-gnu": "15.2.1", 2374 | "@next/swc-linux-x64-musl": "15.2.1", 2375 | "@next/swc-win32-arm64-msvc": "15.2.1", 2376 | "@next/swc-win32-x64-msvc": "15.2.1", 2377 | "sharp": "^0.33.5" 2378 | }, 2379 | "peerDependencies": { 2380 | "@opentelemetry/api": "^1.1.0", 2381 | "@playwright/test": "^1.41.2", 2382 | "babel-plugin-react-compiler": "*", 2383 | "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", 2384 | "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", 2385 | "sass": "^1.3.0" 2386 | }, 2387 | "peerDependenciesMeta": { 2388 | "@opentelemetry/api": { 2389 | "optional": true 2390 | }, 2391 | "@playwright/test": { 2392 | "optional": true 2393 | }, 2394 | "babel-plugin-react-compiler": { 2395 | "optional": true 2396 | }, 2397 | "sass": { 2398 | "optional": true 2399 | } 2400 | } 2401 | }, 2402 | "node_modules/next/node_modules/postcss": { 2403 | "version": "8.4.31", 2404 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 2405 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 2406 | "funding": [ 2407 | { 2408 | "type": "opencollective", 2409 | "url": "https://opencollective.com/postcss/" 2410 | }, 2411 | { 2412 | "type": "tidelift", 2413 | "url": "https://tidelift.com/funding/github/npm/postcss" 2414 | }, 2415 | { 2416 | "type": "github", 2417 | "url": "https://github.com/sponsors/ai" 2418 | } 2419 | ], 2420 | "license": "MIT", 2421 | "dependencies": { 2422 | "nanoid": "^3.3.6", 2423 | "picocolors": "^1.0.0", 2424 | "source-map-js": "^1.0.2" 2425 | }, 2426 | "engines": { 2427 | "node": "^10 || ^12 || >=14" 2428 | } 2429 | }, 2430 | "node_modules/object-assign": { 2431 | "version": "4.1.1", 2432 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2433 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2434 | "license": "MIT", 2435 | "engines": { 2436 | "node": ">=0.10.0" 2437 | } 2438 | }, 2439 | "node_modules/parent-module": { 2440 | "version": "1.0.1", 2441 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2442 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2443 | "license": "MIT", 2444 | "dependencies": { 2445 | "callsites": "^3.0.0" 2446 | }, 2447 | "engines": { 2448 | "node": ">=6" 2449 | } 2450 | }, 2451 | "node_modules/parse-json": { 2452 | "version": "5.2.0", 2453 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2454 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2455 | "license": "MIT", 2456 | "dependencies": { 2457 | "@babel/code-frame": "^7.0.0", 2458 | "error-ex": "^1.3.1", 2459 | "json-parse-even-better-errors": "^2.3.0", 2460 | "lines-and-columns": "^1.1.6" 2461 | }, 2462 | "engines": { 2463 | "node": ">=8" 2464 | }, 2465 | "funding": { 2466 | "url": "https://github.com/sponsors/sindresorhus" 2467 | } 2468 | }, 2469 | "node_modules/path-parse": { 2470 | "version": "1.0.7", 2471 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2472 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2473 | "license": "MIT" 2474 | }, 2475 | "node_modules/path-type": { 2476 | "version": "4.0.0", 2477 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2478 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2479 | "license": "MIT", 2480 | "engines": { 2481 | "node": ">=8" 2482 | } 2483 | }, 2484 | "node_modules/picocolors": { 2485 | "version": "1.1.1", 2486 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2487 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2488 | "license": "ISC" 2489 | }, 2490 | "node_modules/postcss": { 2491 | "version": "8.5.3", 2492 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 2493 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 2494 | "dev": true, 2495 | "funding": [ 2496 | { 2497 | "type": "opencollective", 2498 | "url": "https://opencollective.com/postcss/" 2499 | }, 2500 | { 2501 | "type": "tidelift", 2502 | "url": "https://tidelift.com/funding/github/npm/postcss" 2503 | }, 2504 | { 2505 | "type": "github", 2506 | "url": "https://github.com/sponsors/ai" 2507 | } 2508 | ], 2509 | "license": "MIT", 2510 | "dependencies": { 2511 | "nanoid": "^3.3.8", 2512 | "picocolors": "^1.1.1", 2513 | "source-map-js": "^1.2.1" 2514 | }, 2515 | "engines": { 2516 | "node": "^10 || ^12 || >=14" 2517 | } 2518 | }, 2519 | "node_modules/prop-types": { 2520 | "version": "15.8.1", 2521 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 2522 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 2523 | "license": "MIT", 2524 | "dependencies": { 2525 | "loose-envify": "^1.4.0", 2526 | "object-assign": "^4.1.1", 2527 | "react-is": "^16.13.1" 2528 | } 2529 | }, 2530 | "node_modules/prop-types/node_modules/react-is": { 2531 | "version": "16.13.1", 2532 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2533 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 2534 | "license": "MIT" 2535 | }, 2536 | "node_modules/proxy-from-env": { 2537 | "version": "1.1.0", 2538 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 2539 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 2540 | "license": "MIT" 2541 | }, 2542 | "node_modules/react": { 2543 | "version": "19.0.0", 2544 | "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", 2545 | "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", 2546 | "license": "MIT", 2547 | "engines": { 2548 | "node": ">=0.10.0" 2549 | } 2550 | }, 2551 | "node_modules/react-dom": { 2552 | "version": "19.0.0", 2553 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", 2554 | "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", 2555 | "license": "MIT", 2556 | "dependencies": { 2557 | "scheduler": "^0.25.0" 2558 | }, 2559 | "peerDependencies": { 2560 | "react": "^19.0.0" 2561 | } 2562 | }, 2563 | "node_modules/react-icons": { 2564 | "version": "5.5.0", 2565 | "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", 2566 | "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", 2567 | "license": "MIT", 2568 | "peerDependencies": { 2569 | "react": "*" 2570 | } 2571 | }, 2572 | "node_modules/react-is": { 2573 | "version": "19.0.0", 2574 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", 2575 | "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", 2576 | "license": "MIT" 2577 | }, 2578 | "node_modules/react-transition-group": { 2579 | "version": "4.4.5", 2580 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", 2581 | "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", 2582 | "license": "BSD-3-Clause", 2583 | "dependencies": { 2584 | "@babel/runtime": "^7.5.5", 2585 | "dom-helpers": "^5.0.1", 2586 | "loose-envify": "^1.4.0", 2587 | "prop-types": "^15.6.2" 2588 | }, 2589 | "peerDependencies": { 2590 | "react": ">=16.6.0", 2591 | "react-dom": ">=16.6.0" 2592 | } 2593 | }, 2594 | "node_modules/regenerator-runtime": { 2595 | "version": "0.14.1", 2596 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 2597 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", 2598 | "license": "MIT" 2599 | }, 2600 | "node_modules/resolve": { 2601 | "version": "1.22.10", 2602 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 2603 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 2604 | "license": "MIT", 2605 | "dependencies": { 2606 | "is-core-module": "^2.16.0", 2607 | "path-parse": "^1.0.7", 2608 | "supports-preserve-symlinks-flag": "^1.0.0" 2609 | }, 2610 | "bin": { 2611 | "resolve": "bin/resolve" 2612 | }, 2613 | "engines": { 2614 | "node": ">= 0.4" 2615 | }, 2616 | "funding": { 2617 | "url": "https://github.com/sponsors/ljharb" 2618 | } 2619 | }, 2620 | "node_modules/resolve-from": { 2621 | "version": "4.0.0", 2622 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2623 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2624 | "license": "MIT", 2625 | "engines": { 2626 | "node": ">=4" 2627 | } 2628 | }, 2629 | "node_modules/scheduler": { 2630 | "version": "0.25.0", 2631 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", 2632 | "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", 2633 | "license": "MIT" 2634 | }, 2635 | "node_modules/semver": { 2636 | "version": "7.7.1", 2637 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 2638 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 2639 | "license": "ISC", 2640 | "optional": true, 2641 | "bin": { 2642 | "semver": "bin/semver.js" 2643 | }, 2644 | "engines": { 2645 | "node": ">=10" 2646 | } 2647 | }, 2648 | "node_modules/sharp": { 2649 | "version": "0.33.5", 2650 | "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", 2651 | "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", 2652 | "hasInstallScript": true, 2653 | "license": "Apache-2.0", 2654 | "optional": true, 2655 | "dependencies": { 2656 | "color": "^4.2.3", 2657 | "detect-libc": "^2.0.3", 2658 | "semver": "^7.6.3" 2659 | }, 2660 | "engines": { 2661 | "node": "^18.17.0 || ^20.3.0 || >=21.0.0" 2662 | }, 2663 | "funding": { 2664 | "url": "https://opencollective.com/libvips" 2665 | }, 2666 | "optionalDependencies": { 2667 | "@img/sharp-darwin-arm64": "0.33.5", 2668 | "@img/sharp-darwin-x64": "0.33.5", 2669 | "@img/sharp-libvips-darwin-arm64": "1.0.4", 2670 | "@img/sharp-libvips-darwin-x64": "1.0.4", 2671 | "@img/sharp-libvips-linux-arm": "1.0.5", 2672 | "@img/sharp-libvips-linux-arm64": "1.0.4", 2673 | "@img/sharp-libvips-linux-s390x": "1.0.4", 2674 | "@img/sharp-libvips-linux-x64": "1.0.4", 2675 | "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", 2676 | "@img/sharp-libvips-linuxmusl-x64": "1.0.4", 2677 | "@img/sharp-linux-arm": "0.33.5", 2678 | "@img/sharp-linux-arm64": "0.33.5", 2679 | "@img/sharp-linux-s390x": "0.33.5", 2680 | "@img/sharp-linux-x64": "0.33.5", 2681 | "@img/sharp-linuxmusl-arm64": "0.33.5", 2682 | "@img/sharp-linuxmusl-x64": "0.33.5", 2683 | "@img/sharp-wasm32": "0.33.5", 2684 | "@img/sharp-win32-ia32": "0.33.5", 2685 | "@img/sharp-win32-x64": "0.33.5" 2686 | } 2687 | }, 2688 | "node_modules/sharp/node_modules/detect-libc": { 2689 | "version": "2.0.3", 2690 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 2691 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 2692 | "license": "Apache-2.0", 2693 | "optional": true, 2694 | "engines": { 2695 | "node": ">=8" 2696 | } 2697 | }, 2698 | "node_modules/simple-swizzle": { 2699 | "version": "0.2.2", 2700 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2701 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 2702 | "license": "MIT", 2703 | "optional": true, 2704 | "dependencies": { 2705 | "is-arrayish": "^0.3.1" 2706 | } 2707 | }, 2708 | "node_modules/source-map": { 2709 | "version": "0.5.7", 2710 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2711 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 2712 | "license": "BSD-3-Clause", 2713 | "engines": { 2714 | "node": ">=0.10.0" 2715 | } 2716 | }, 2717 | "node_modules/source-map-js": { 2718 | "version": "1.2.1", 2719 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2720 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2721 | "license": "BSD-3-Clause", 2722 | "engines": { 2723 | "node": ">=0.10.0" 2724 | } 2725 | }, 2726 | "node_modules/streamsearch": { 2727 | "version": "1.1.0", 2728 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 2729 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 2730 | "engines": { 2731 | "node": ">=10.0.0" 2732 | } 2733 | }, 2734 | "node_modules/styled-jsx": { 2735 | "version": "5.1.6", 2736 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", 2737 | "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", 2738 | "license": "MIT", 2739 | "dependencies": { 2740 | "client-only": "0.0.1" 2741 | }, 2742 | "engines": { 2743 | "node": ">= 12.0.0" 2744 | }, 2745 | "peerDependencies": { 2746 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" 2747 | }, 2748 | "peerDependenciesMeta": { 2749 | "@babel/core": { 2750 | "optional": true 2751 | }, 2752 | "babel-plugin-macros": { 2753 | "optional": true 2754 | } 2755 | } 2756 | }, 2757 | "node_modules/stylis": { 2758 | "version": "4.2.0", 2759 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", 2760 | "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", 2761 | "license": "MIT" 2762 | }, 2763 | "node_modules/supports-preserve-symlinks-flag": { 2764 | "version": "1.0.0", 2765 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2766 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2767 | "license": "MIT", 2768 | "engines": { 2769 | "node": ">= 0.4" 2770 | }, 2771 | "funding": { 2772 | "url": "https://github.com/sponsors/ljharb" 2773 | } 2774 | }, 2775 | "node_modules/tailwindcss": { 2776 | "version": "4.0.9", 2777 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.9.tgz", 2778 | "integrity": "sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==", 2779 | "dev": true, 2780 | "license": "MIT" 2781 | }, 2782 | "node_modules/tapable": { 2783 | "version": "2.2.1", 2784 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 2785 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 2786 | "dev": true, 2787 | "license": "MIT", 2788 | "engines": { 2789 | "node": ">=6" 2790 | } 2791 | }, 2792 | "node_modules/tslib": { 2793 | "version": "2.8.1", 2794 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2795 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2796 | "license": "0BSD" 2797 | }, 2798 | "node_modules/typescript": { 2799 | "version": "5.8.2", 2800 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 2801 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 2802 | "dev": true, 2803 | "license": "Apache-2.0", 2804 | "bin": { 2805 | "tsc": "bin/tsc", 2806 | "tsserver": "bin/tsserver" 2807 | }, 2808 | "engines": { 2809 | "node": ">=14.17" 2810 | } 2811 | }, 2812 | "node_modules/undici-types": { 2813 | "version": "6.19.8", 2814 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2815 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 2816 | "dev": true, 2817 | "license": "MIT" 2818 | }, 2819 | "node_modules/yaml": { 2820 | "version": "1.10.2", 2821 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2822 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2823 | "license": "ISC", 2824 | "engines": { 2825 | "node": ">= 6" 2826 | } 2827 | } 2828 | } 2829 | } 2830 | --------------------------------------------------------------------------------