diff --git a/platform/README.md b/platform/README.md index 5512cd3..23ef20e 100644 --- a/platform/README.md +++ b/platform/README.md @@ -71,3 +71,28 @@ The platform consists of: - Firestore database for storing team and submission data - Mailgun for sending automated emails - Discord integration for monitoring and error reporting + +## Flow + +### Friday: Team Registration + +0. Setup Google Service Account, Mailgun API Key +1. Team registration +2. Download completed submissions from Formbricks, rename to `hackathon_participants.csv` +3. Run `platform/team-allocation/team_allocation.py` +4. Run `platform/team-allocation/send_team_emails.js` (disable test mode in the script) + +### Sunday: Submission + +0. Setup Google Service Account, Mailgun API Key +1. Download completed submissions from Formbricks, rename to `submissions.csv` +2. Copy `submissions.csv` to `platform/submission/submissions.csv` +3. Navigate to `platform/submission` +4. Run: +```bash +npx tsx src/genreate-project-page-data.ts +npx tsx src/generate-challenge-scoring.ts +npx tsx src/generate-case-scoring.ts +``` +5. Commit your changes to deploy the website +6. Import csv files into Google Sheets diff --git a/platform/backend/functions/package.json b/platform/backend/functions/package.json index ad966b7..70c0235 100644 --- a/platform/backend/functions/package.json +++ b/platform/backend/functions/package.json @@ -14,6 +14,7 @@ }, "main": "lib/index.js", "dependencies": { + "csv-parse": "^5.5.3", "dotenv": "^16.5.0", "firebase-admin": "^13.2.0", "firebase-functions": "^6.3.2", diff --git a/platform/backend/functions/src/convert-submissions.ts b/platform/backend/functions/src/convert-submissions.ts new file mode 100644 index 0000000..911a3a1 --- /dev/null +++ b/platform/backend/functions/src/convert-submissions.ts @@ -0,0 +1,120 @@ +import * as admin from "firebase-admin"; +import { parse } from "csv-parse/sync"; +import * as fs from "fs"; +import * as path from "path"; +import { firestore } from "./gcp_global"; + +interface Project { + id: string; + name: string; + case: "Trade Republic" | "avi" | "beam"; + description: string; + pitch: string; + githubUrl: string; + videoUrl: string; + placement?: 1 | 2; + challenges?: Array<{ + name: string; + sponsoredBy: string; + companies: Array<{ + name: string; + url?: string; + logoPath: string; + logoClass: string; + }>; + }>; +} + +interface TeamData { + name: string; + emails: string[]; + case: "Trade Republic" | "avi" | "beam"; +} + +async function convertSubmissions() { + try { + // Read CSV file + const csvContent = fs.readFileSync( + path.join(__dirname, "../../../website/export-submission-2025-05-07-08-43-55.csv"), + "utf-8" + ); + + // Parse CSV + const records = parse(csvContent, { + columns: true, + skip_empty_lines: true, + }); + + const projects: Project[] = []; + + // Process each record + for (const record of records) { + const teamCode = record["1. What is your team code?"]; + + // Fetch team data from Firestore + const teamDoc = await firestore + .collection("Teams") + .doc(teamCode.toLowerCase()) + .get(); + + if (!teamDoc.exists) { + console.warn(`Team with code ${teamCode} not found in Firestore`); + continue; + } + + const teamData = teamDoc.data() as TeamData; + + // Parse challenges + const challenges = record["5. Challenges"] + ? record["5. Challenges"] + .split(";") + .map((challenge: string) => { + const match = challenge.match(/"([^"]+)" by ([^"]+)/); + if (match) { + return { + name: match[1], + sponsoredBy: match[2], + companies: [], // You'll need to map these based on your challenges data + }; + } + return null; + }) + .filter(Boolean) + : []; + + const project: Project = { + id: `project-${teamCode.toLowerCase()}`, + name: record["7. What is your project?"].split(".")[0], // Take first sentence as name + case: teamData.case, + description: record["7. What is your project?"], + pitch: record["6. One sentence pitch"], + githubUrl: record["2. GitHub Repository"], + videoUrl: record["4. Pitch video"], + challenges: challenges.length > 0 ? challenges : undefined, + }; + + projects.push(project); + } + + // Generate TypeScript file + const tsContent = `// This file is auto-generated. Do not edit manually. +import { Project } from "./projects-page-config"; + +export const projects: Project[] = ${JSON.stringify(projects, null, 2)}; +`; + + // Write to file + fs.writeFileSync( + path.join(__dirname, "../../../website/src/constants/projects.ts"), + tsContent + ); + + console.log("Successfully converted submissions to projects.ts"); + } catch (error) { + console.error("Error converting submissions:", error); + process.exit(1); + } +} + +// Run the conversion +convertSubmissions(); \ No newline at end of file diff --git a/platform/submission/.gitignore b/platform/submission/.gitignore new file mode 100644 index 0000000..235bd3e --- /dev/null +++ b/platform/submission/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +service-account.json +key_store +.env +challenge-scoring-sheets/ \ No newline at end of file diff --git a/platform/submission/example_submissions.csv b/platform/submission/example_submissions.csv new file mode 100644 index 0000000..3ce2639 --- /dev/null +++ b/platform/submission/example_submissions.csv @@ -0,0 +1,38 @@ +No.,Response ID,Timestamp,Finished,Survey ID,Formbricks ID (internal),User ID,Notes,Tags,url,userAgent - os,userAgent - device,userAgent - browser,1. What is Your Team ID?,2. Give Your Team a Name,3. Give Your Project a Name,4. Pitch video,5. Link to Your Demo or MVP,6. GitHub Repository,7. One-Sentence Pitch,8. What Is Your Project?,9. How You Built It,10. Difficulties You Faced,11. Challenges,"12. Why Your Project Deserves to Win ""Best Use of La Plateforme/ Mistral models"" by Mistral AI","13. Why Your Project Deserves to Win ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence, and Paid","14. Why Your Project Deserves to Win ""Best Use of Real-Time Interactive Avatars"" by Beyond Presence","15. Why Your Project Deserves to Win ""Best use of AI to improve processes"" by Celonis","16. Why Your Project Deserves to Win ""Why Not? Biggest Creative Risk"" by Tanso",17. Just a reminder: Prepare for Your Final Presentation +1,resp0018898,2025-05-10 09:59:44,Yes,cm9v6d41o0014rr01x483l5fb,form001,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0001,AlphaBits,SmartGuide,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=1,https://demo.smartguide.com,https://github.com/alphabits/smartguide,SmartGuide brings AI-powered insights to businesses.,SmartGuide is a platform that helps teachers gain insights using AI-driven automation.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +2,resp0027157,2025-05-10 10:37:25,Yes,cm9v6d41o0014rr01x483l5fb,form002,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0002,CodeCrafters,HealthHub,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=2,https://demo.healthhub.com,https://github.com/codecrafters/healthhub,HealthHub brings AI-powered insights to developers.,HealthHub is a platform that helps individuals gain insights using AI-driven recommendations.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of La Plateforme/ Mistral models"" by Mistral AI; ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",We leverage Mistral-7B for multilingual summarization.,Clear revenue model with subscription tiers.,,,,clicked +3,resp0031886,2025-05-10 11:51:31,Yes,cm9v6d41o0014rr01x483l5fb,form003,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Android,mobile,Chrome Mobile,0003,QuantumLeap,EcoTrack,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=3,https://demo.ecotrack.com,https://github.com/quantumleap/ecotrack,EcoTrack brings AI-powered insights to students.,EcoTrack is a platform that helps teachers gain insights using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of La Plateforme/ Mistral models"" by Mistral AI; ""Why Not? Biggest Creative Risk"" by Tanso",We leverage Mistral-7B for multilingual summarization.,,,,Combines AR and AI in an untested market.,clicked +4,resp0048454,2025-05-10 12:27:28,Yes,cm9v6d41o0014rr01x483l5fb,form004,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,iOS,mobile,Safari,0004,PixelPioneers,TutorAI,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=4,https://demo.tutorai.com,,TutorAI brings AI-powered insights to developers.,TutorAI is a platform that helps individuals gain insights using AI-driven automation.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +5,resp0053796,2025-05-10 13:57:52,Yes,cm9v6d41o0014rr01x483l5fb,form005,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Windows,desktop,Chrome,0005,DataDynamos,RetailRadar,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=5,,https://github.com/datadynamos/retailradar,RetailRadar brings AI-powered insights to consumers.,RetailRadar is a platform that helps teachers optimize workflows using AI-driven analytics.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of La Plateforme/ Mistral models"" by Mistral AI; ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",We leverage Mistral-7B for multilingual summarization.,Clear revenue model with subscription tiers.,,,,clicked +6,resp0068418,2025-05-10 14:57:01,Yes,cm9v6d41o0014rr01x483l5fb,form006,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0006,NeuralNet Ninjas,LegalLogic,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=6,https://demo.legallogic.com,https://github.com/neuralnetninjas/legallogic,LegalLogic brings AI-powered insights to developers.,LegalLogic is a platform that helps SMBs optimize workflows using AI-driven automation.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +7,resp0072481,2025-05-10 15:58:07,Yes,cm9v6d41o0014rr01x483l5fb,form007,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0007,TensorTitans,FarmSense,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=7,https://demo.farmsense.com,https://github.com/tensortitans/farmsense,FarmSense brings AI-powered insights to consumers.,FarmSense is a platform that helps teachers gain insights using AI-driven analytics.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of Real-Time Interactive Avatars"" by Beyond Presence; ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",,Clear revenue model with subscription tiers.,Interactive avatars improve user engagement by 40%.,,,clicked +8,resp0084924,2025-05-10 16:29:02,Yes,cm9v6d41o0014rr01x483l5fb,form008,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Android,mobile,Chrome Mobile,0008,CloudComrades,FitFusion,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=8,https://demo.fitfusion.com,,FitFusion brings AI-powered insights to developers.,FitFusion is a platform that helps teachers stay organized using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of Real-Time Interactive Avatars"" by Beyond Presence",,,Interactive avatars improve user engagement by 40%.,,,clicked +9,resp0092642,2025-05-10 17:09:15,Yes,cm9v6d41o0014rr01x483l5fb,form009,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,iOS,mobile,Safari,0009,ByteBuddies,CityScope,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=9,https://demo.cityscope.com,https://github.com/bytebuddies/cityscope,CityScope brings AI-powered insights to developers.,CityScope is a platform that helps enterprises improve productivity using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +10,resp0107839,2025-05-10 18:13:39,Yes,cm9v6d41o0014rr01x483l5fb,form010,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Windows,desktop,Chrome,0010,Innovara,FleetFlow,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=10,,https://github.com/innovara/fleetflow,FleetFlow brings AI-powered insights to consumers.,FleetFlow is a platform that helps teachers improve productivity using AI-driven automation.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Why Not? Biggest Creative Risk"" by Tanso",,,,,Combines AR and AI in an untested market.,clicked +11,resp0111489,2025-05-10 19:02:37,Yes,cm9v6d41o0014rr01x483l5fb,form011,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0011,DeltaForce,EventEase,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=11,https://demo.eventease.com,https://github.com/deltaforce/eventease,EventEase brings AI-powered insights to students.,EventEase is a platform that helps teachers stay organized using AI-driven automation.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of Real-Time Interactive Avatars"" by Beyond Presence; ""Why Not? Biggest Creative Risk"" by Tanso",,,Interactive avatars improve user engagement by 40%.,,Combines AR and AI in an untested market.,clicked +12,resp0123263,2025-05-10 08:36:52,Yes,cm9v6d41o0014rr01x483l5fb,form012,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0012,SmartSolutions,MindMate,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=12,https://demo.mindmate.com,,MindMate brings AI-powered insights to consumers.,MindMate is a platform that helps individuals improve productivity using AI-driven analytics.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of La Plateforme/ Mistral models"" by Mistral AI; ""Why Not? Biggest Creative Risk"" by Tanso",We leverage Mistral-7B for multilingual summarization.,,,,Combines AR and AI in an untested market.,clicked +13,resp0138243,2025-05-10 09:36:03,Yes,cm9v6d41o0014rr01x483l5fb,form013,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Android,mobile,Chrome Mobile,0013,VisionaryVibes,SkillSync,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=13,https://demo.skillsync.com,https://github.com/visionaryvibes/skillsync,SkillSync brings AI-powered insights to developers.,SkillSync is a platform that helps enterprises optimize workflows using AI-driven automation.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Why Not? Biggest Creative Risk"" by Tanso",,,,,Combines AR and AI in an untested market.,clicked +14,resp0147468,2025-05-10 10:36:26,Yes,cm9v6d41o0014rr01x483l5fb,form014,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,iOS,mobile,Safari,0014,FutureForge,FoodFetch,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=14,https://demo.foodfetch.com,https://github.com/futureforge/foodfetch,FoodFetch brings AI-powered insights to consumers.,FoodFetch is a platform that helps enterprises stay organized using AI-driven recommendations.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid; ""Best Use of La Plateforme/ Mistral models"" by Mistral AI",We leverage Mistral-7B for multilingual summarization.,Clear revenue model with subscription tiers.,,,,clicked +15,resp0157693,2025-05-10 11:36:33,Yes,cm9v6d41o0014rr01x483l5fb,form015,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Windows,desktop,Chrome,0015,AICatalysts,TravelTrek,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=15,,https://github.com/aicatalysts/traveltrek,TravelTrek brings AI-powered insights to students.,TravelTrek is a platform that helps teachers optimize workflows using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Why Not? Biggest Creative Risk"" by Tanso; ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",,Clear revenue model with subscription tiers.,,,Combines AR and AI in an untested market.,clicked +16,resp0169930,2025-05-10 12:25:25,Yes,cm9v6d41o0014rr01x483l5fb,form016,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0016,Synthetix,Artify,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=16,https://demo.artify.com,,Artify brings AI-powered insights to consumers.,Artify is a platform that helps enterprises optimize workflows using AI-driven recommendations.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +17,resp0175476,2025-05-10 13:03:37,Yes,cm9v6d41o0014rr01x483l5fb,form017,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0017,BrightBrains,BuildBuddy,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=17,https://demo.buildbuddy.com,https://github.com/brightbrains/buildbuddy,BuildBuddy brings AI-powered insights to creators.,BuildBuddy is a platform that helps individuals optimize workflows using AI-driven analytics.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Why Not? Biggest Creative Risk"" by Tanso; ""Best Use of Real-Time Interactive Avatars"" by Beyond Presence",,,Interactive avatars improve user engagement by 40%.,,Combines AR and AI in an untested market.,clicked +18,resp0186934,2025-05-10 14:15:08,Yes,cm9v6d41o0014rr01x483l5fb,form018,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Android,mobile,Chrome Mobile,0018,MetaMakers,CivicConnect,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=18,https://demo.civicconnect.com,https://github.com/metamakers/civicconnect,CivicConnect brings AI-powered insights to businesses.,CivicConnect is a platform that helps SMBs improve productivity using AI-driven automation.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",,Clear revenue model with subscription tiers.,,,,clicked +19,resp0194409,2025-05-10 15:47:14,Yes,cm9v6d41o0014rr01x483l5fb,form019,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,iOS,mobile,Safari,0019,DeepDivers,CleanCharge,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=19,https://demo.cleancharge.com,https://github.com/deepdivers/cleancharge,CleanCharge brings AI-powered insights to businesses.,CleanCharge is a platform that helps SMBs gain insights using AI-driven analytics.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +20,resp0209906,2025-05-10 16:14:16,Yes,cm9v6d41o0014rr01x483l5fb,form020,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Windows,desktop,Chrome,0020,InsightLab,DocuDesk,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=20,,,DocuDesk brings AI-powered insights to consumers.,DocuDesk is a platform that helps individuals stay organized using AI-driven recommendations.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +21,resp0219354,2025-05-10 17:55:41,Yes,cm9v6d41o0014rr01x483l5fb,form021,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0021,CoreCreators,EnergyEye,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=21,https://demo.energyeye.com,https://github.com/corecreators/energyeye,EnergyEye brings AI-powered insights to developers.,EnergyEye is a platform that helps individuals improve productivity using AI-driven analytics.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +22,resp0223379,2025-05-10 18:07:46,Yes,cm9v6d41o0014rr01x483l5fb,form022,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0022,Streamline,FinFast,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=22,https://demo.finfast.com,https://github.com/streamline/finfast,FinFast brings AI-powered insights to creators.,FinFast is a platform that helps individuals optimize workflows using AI-driven automation.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +23,resp0235054,2025-05-10 19:38:09,Yes,cm9v6d41o0014rr01x483l5fb,form023,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Android,mobile,Chrome Mobile,0023,Skyline Tech,GrowGrid,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=23,https://demo.growgrid.com,https://github.com/skylinetech/growgrid,GrowGrid brings AI-powered insights to developers.,GrowGrid is a platform that helps enterprises gain insights using AI-driven automation.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +24,resp0243925,2025-05-10 08:31:09,Yes,cm9v6d41o0014rr01x483l5fb,form024,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,iOS,mobile,Safari,0024,EcoCoders,HireHive,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=24,https://demo.hirehive.com,,HireHive brings AI-powered insights to consumers.,HireHive is a platform that helps SMBs stay organized using AI-driven analytics.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best use of AI to improve processes"" by Celonis; ""Why Not? Biggest Creative Risk"" by Tanso",,,,"Automates manual steps, saving 200 hours/month.",Combines AR and AI in an untested market.,clicked +25,resp0257109,2025-05-10 09:20:38,Yes,cm9v6d41o0014rr01x483l5fb,form025,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Windows,desktop,Chrome,0025,NovaNext,InsightIQ,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=25,,https://github.com/novanext/insightiq,InsightIQ brings AI-powered insights to students.,InsightIQ is a platform that helps enterprises optimize workflows using AI-driven analytics.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best use of AI to improve processes"" by Celonis",,,,"Automates manual steps, saving 200 hours/month.",,clicked +26,resp0269731,2025-05-10 10:01:00,Yes,cm9v6d41o0014rr01x483l5fb,form026,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0026,PrismWorks,JoyJournal,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=26,https://demo.joyjournal.com,https://github.com/prismworks/joyjournal,JoyJournal brings AI-powered insights to consumers.,JoyJournal is a platform that helps teachers gain insights using AI-driven recommendations.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of Real-Time Interactive Avatars"" by Beyond Presence; ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",,Clear revenue model with subscription tiers.,Interactive avatars improve user engagement by 40%.,,,clicked +27,resp0272465,2025-05-10 11:03:27,Yes,cm9v6d41o0014rr01x483l5fb,form027,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0027,TechTrailblazers,KlinikAI,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=27,https://demo.klinikai.com,https://github.com/techtrailblazers/klinikai,KlinikAI brings AI-powered insights to developers.,KlinikAI is a platform that helps individuals stay organized using AI-driven automation.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best use of AI to improve processes"" by Celonis",,,,"Automates manual steps, saving 200 hours/month.",,clicked +28,resp0288693,2025-05-10 12:19:49,Yes,cm9v6d41o0014rr01x483l5fb,form028,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Android,mobile,Chrome Mobile,0028,EchoTeam,LearnLink,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=28,https://demo.learnlink.com,,LearnLink brings AI-powered insights to students.,LearnLink is a platform that helps teachers improve productivity using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of La Plateforme/ Mistral models"" by Mistral AI; ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",We leverage Mistral-7B for multilingual summarization.,Clear revenue model with subscription tiers.,,,,clicked +29,resp0292196,2025-05-10 13:00:10,Yes,cm9v6d41o0014rr01x483l5fb,form029,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,iOS,mobile,Safari,0029,FusionFive,MarketMaven,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=29,https://demo.marketmaven.com,https://github.com/fusionfive/marketmaven,MarketMaven brings AI-powered insights to creators.,MarketMaven is a platform that helps teachers improve productivity using AI-driven automation.,"Built with React, Node.js, and Supabase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Why Not? Biggest Creative Risk"" by Tanso; ""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid",,Clear revenue model with subscription tiers.,,,Combines AR and AI in an untested market.,clicked +30,resp0309550,2025-05-10 14:49:52,Yes,cm9v6d41o0014rr01x483l5fb,form030,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Windows,desktop,Chrome,0030,OrbitOps,NewsNexus,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=30,,https://github.com/orbitops/newsnexus,NewsNexus brings AI-powered insights to consumers.,NewsNexus is a platform that helps enterprises stay organized using AI-driven automation.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Most potential to earn real money"" by Visionaries Club, Everyday Intelligence & Paid; ""Best Use of La Plateforme/ Mistral models"" by Mistral AI",We leverage Mistral-7B for multilingual summarization.,Clear revenue model with subscription tiers.,,,,clicked +31,resp0314986,2025-05-10 15:44:12,Yes,cm9v6d41o0014rr01x483l5fb,form031,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0031,ShiftLeft,OptimaOps,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=31,https://demo.optimaops.com,https://github.com/shiftleft/optimaops,OptimaOps brings AI-powered insights to creators.,OptimaOps is a platform that helps teachers stay organized using AI-driven recommendations.,"Built with React, Node.js, and PostgreSQL; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +32,resp0328049,2025-05-10 16:53:58,Yes,cm9v6d41o0014rr01x483l5fb,form032,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0032,SolveSphere,PetPal,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=32,https://demo.petpal.com,,PetPal brings AI-powered insights to students.,PetPal is a platform that helps teachers gain insights using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +33,resp0337737,2025-05-10 17:43:15,Yes,cm9v6d41o0014rr01x483l5fb,form033,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Android,mobile,Chrome Mobile,0033,TurboTech,QuizQuick,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=33,https://demo.quizquick.com,https://github.com/turbotech/quizquick,QuizQuick brings AI-powered insights to creators.,QuizQuick is a platform that helps individuals gain insights using AI-driven automation.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of La Plateforme/ Mistral models"" by Mistral AI; ""Best use of AI to improve processes"" by Celonis",We leverage Mistral-7B for multilingual summarization.,,,"Automates manual steps, saving 200 hours/month.",,clicked +34,resp0346841,2025-05-10 18:22:00,Yes,cm9v6d41o0014rr01x483l5fb,form034,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,iOS,mobile,Safari,0034,Ultrabotics,RouteRight,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=34,https://demo.routeright.com,https://github.com/ultrabotics/routeright,RouteRight brings AI-powered insights to businesses.,RouteRight is a platform that helps SMBs gain insights using AI-driven automation.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of Real-Time Interactive Avatars"" by Beyond Presence",,,Interactive avatars improve user engagement by 40%.,,,clicked +35,resp0356128,2025-05-10 19:28:28,Yes,cm9v6d41o0014rr01x483l5fb,form035,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Windows,desktop,Chrome,0035,VertexVentures,ShopSmart,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=35,,https://github.com/vertexventures/shopsmart,ShopSmart brings AI-powered insights to developers.,ShopSmart is a platform that helps enterprises optimize workflows using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked +36,resp0369106,2025-05-10 08:33:45,Yes,cm9v6d41o0014rr01x483l5fb,form036,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,macOS,desktop,Safari,0036,WaveMinds,TaskTrack,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=36,https://demo.tasktrack.com,,TaskTrack brings AI-powered insights to businesses.,TaskTrack is a platform that helps individuals optimize workflows using AI-driven automation.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,"""Best Use of La Plateforme/ Mistral models"" by Mistral AI",We leverage Mistral-7B for multilingual summarization.,,,,,clicked +37,resp0373781,2025-05-10 09:11:04,Yes,cm9v6d41o0014rr01x483l5fb,form037,,,,https://app.formbricks.com/s/cm9v6d41o0014rr01x483l5fb,Linux,desktop,Firefox,0037,ZenithZone,VibeVoice,https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=37,https://demo.vibevoice.com,https://github.com/zenithzone/vibevoice,VibeVoice brings AI-powered insights to consumers.,VibeVoice is a platform that helps enterprises improve productivity using AI-driven recommendations.,"Built with React, Node.js, and Firebase; AI via OpenAI & Mistral APIs.",Integrating multiple APIs smoothly and ensuring scalability.,,,,,,,clicked diff --git a/platform/submission/package-lock.json b/platform/submission/package-lock.json new file mode 100644 index 0000000..c0e4b06 --- /dev/null +++ b/platform/submission/package-lock.json @@ -0,0 +1,2197 @@ +{ + "name": "submission-converter", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "submission-converter", + "version": "1.0.0", + "dependencies": { + "csv-parse": "^5.5.3", + "csv-stringify": "^6.4.5", + "dotenv": "^16.5.0", + "firebase-admin": "^13.2.0" + }, + "devDependencies": { + "@types/node": "^22.15.3", + "ts-node": "^10.9.2", + "typescript": "^5.8.2" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", + "integrity": "sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==", + "license": "MIT" + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", + "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-types": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", + "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", + "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/component": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.13.tgz", + "integrity": "sha512-I/Eg1NpAtZ8AAfq8mpdfXnuUpcLxIDdCDtTzWSh+FXnp/9eCKJ3SNbOCKrUCyhLzNa2SiPJYruei0sxVjaOTeg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.14.tgz", + "integrity": "sha512-9nxYtkHAG02/Nh2Ssms1T4BbWPPjiwohCvkHDUl4hNxnki1kPgsLo5xe9kXNzbacOStmVys+RUXvwzynQSKmUQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.13", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.5.tgz", + "integrity": "sha512-CNf1UbvWh6qIaSf4sn6sx2DTDz/em/D7QxULH1LTxxDQHr9+CeYGvlAqrKnk4ZH0P0eIHyQFQU7RwkUJI0B9gQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.13", + "@firebase/database": "1.0.14", + "@firebase/database-types": "1.0.10", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.11.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.10.tgz", + "integrity": "sha512-mH6RC1E9/Pv8jf1/p+M8YFTX+iu+iHDN89hecvyO7wHrI4R1V0TXjxOHvX3nLJN1sfh0CWG6CHZ0VlrSmK/cwg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-types": "0.9.3", + "@firebase/util": "1.11.0" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.4.tgz", + "integrity": "sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/util": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.11.0.tgz", + "integrity": "sha512-PzSrhIr++KI6y4P6C/IdgBNMkEx0Ex6554/cYd0Hm+ovyFSJtJXqb/3OSIdnBoa2cpwZT1/GW56EmRc5qEc5fQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@google-cloud/firestore": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.0.tgz", + "integrity": "sha512-88uZ+jLsp1aVMj7gh3EKYH1aulTAMFAp8sH/v5a9w8q8iqSG27RiWLoxSAFr/XocZ9hGiWH1kEnBw+zl3xAgNA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/api": "^1.3.0", + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^4.3.3", + "protobufjs": "^7.2.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", + "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.16.0.tgz", + "integrity": "sha512-7/5LRgykyOfQENcm6hDKP8SX/u9XxE5YOiWOkgkwcoO+cG8xT/cyOvp9wwN3IxfdYgpHs8CE7Nq2PKX2lNaEXw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "<4.1.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "duplexify": "^4.1.3", + "fast-xml-parser": "^4.4.1", + "gaxios": "^6.0.2", + "google-auth-library": "^9.6.3", + "html-entities": "^2.5.2", + "mime": "^3.0.0", + "p-limit": "^3.0.1", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", + "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "optional": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", + "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.14.tgz", + "integrity": "sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "license": "MIT", + "optional": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "optional": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "optional": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", + "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT", + "optional": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/csv-parse": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz", + "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==", + "license": "MIT" + }, + "node_modules/csv-stringify": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.2.tgz", + "integrity": "sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "optional": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT", + "optional": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/farmhash-modern": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", + "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT", + "optional": true + }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/firebase-admin": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.3.0.tgz", + "integrity": "sha512-MFxv86Aw2rjM/TpKwU86jN7YUFfN1jy6mREYZTLL1aW1rCpZFi4c70b9U12J9Xa4RbJkiXpWBAwth9IVSqR91A==", + "license": "Apache-2.0", + "dependencies": { + "@fastify/busboy": "^3.0.0", + "@firebase/database-compat": "^2.0.0", + "@firebase/database-types": "^1.0.6", + "@types/node": "^22.8.7", + "farmhash-modern": "^1.1.0", + "google-auth-library": "^9.14.2", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.1.0", + "node-forge": "^1.3.1", + "uuid": "^11.0.2" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.11.0", + "@google-cloud/storage": "^7.14.0" + } + }, + "node_modules/form-data": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz", + "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "license": "MIT", + "optional": true + }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "optional": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "optional": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/google-auth-library": { + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", + "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.0.tgz", + "integrity": "sha512-zKKLeLfcYBVOzzM48Brtn4EQkKcTli9w6c1ilzFK2NbJvcd4ATD8/XqFExImvE/W5IwMlKKwa5qqVufji3ioNQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^9.3.0", + "node-fetch": "^2.7.0", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^2.0.2", + "protobufjs": "^7.3.2", + "retry-request": "^7.0.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "license": "MIT", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "optional": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC", + "optional": true + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwks-rsa": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", + "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", + "license": "MIT", + "dependencies": { + "@types/express": "^4.17.20", + "@types/jsonwebtoken": "^9.0.4", + "debug": "^4.3.4", + "jose": "^4.15.4", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT", + "optional": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-memoizer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", + "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", + "license": "MIT", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proto3-json-serializer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", + "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "license": "MIT", + "optional": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT", + "optional": true + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "license": "MIT", + "optional": true + }, + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT", + "optional": true + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC", + "optional": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "optional": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/platform/submission/package.json b/platform/submission/package.json new file mode 100644 index 0000000..4393cbd --- /dev/null +++ b/platform/submission/package.json @@ -0,0 +1,23 @@ +{ + "name": "submission-converter", + "version": "1.0.0", + "description": "Convert CSV submissions to TypeScript projects", + "type": "module", + "main": "dist/convert-submissions.js", + "scripts": { + "build": "tsc", + "start": "node --loader ts-node/esm src/convert-submissions.ts", + "score": "node --loader ts-node/esm src/generate-scoring.ts" + }, + "dependencies": { + "csv-parse": "^5.5.3", + "csv-stringify": "^6.4.5", + "dotenv": "^16.5.0", + "firebase-admin": "^13.2.0" + }, + "devDependencies": { + "@types/node": "^22.15.3", + "ts-node": "^10.9.2", + "typescript": "^5.8.2" + } +} diff --git a/platform/submission/src/generate-case-scoring.ts b/platform/submission/src/generate-case-scoring.ts new file mode 100644 index 0000000..6232650 --- /dev/null +++ b/platform/submission/src/generate-case-scoring.ts @@ -0,0 +1,151 @@ +import admin from "firebase-admin"; +import { parse } from "csv-parse/sync"; +import * as fs from "fs"; +import * as path from "path"; +import { fileURLToPath } from "url"; +import { stringify } from "csv-stringify/sync"; +import "dotenv/config"; + +// Get __dirname equivalent in ES modules +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Initialize Firebase Admin using environment variable +admin.initializeApp(); + +interface TeamData { + name: string; + emails: string[]; + case: "Trade Republic" | "avi" | "beam"; +} + +interface ScoringRow { + "Team Code": string; + "Team Name": string; + "Project Name": string; + "Pitch YT Link": string; + "Demo / MVP Link": string; + "GitHub URL": string; + "One Sentence Pitch": string; + "What Is Your Project": string; + "How You Built It": string; + "Difficulties You Faced": string; +} + +async function generateScoringSheets() { + try { + // Read CSV file + const csvContent = fs.readFileSync( + path.join(__dirname, "../../submission/submissions.csv"), + "utf-8", + ); + + // Parse CSV + const records = parse(csvContent, { + columns: true, + skip_empty_lines: true, + }); + + // Group projects by case + const projectsByCase: Record = { + "Trade Republic": [], + avi: [], + beam: [], + }; + + // Process each record + for (const record of records) { + const teamId = record["1. What is Your Team ID?"]; + + // Fetch team data from Firestore + const teamDoc = await admin + .firestore() + .collection("Teams") + .doc(`${teamId}`) + .get(); + + let teamData: TeamData; + + if (!teamDoc.exists) { + console.warn(`Team with ID ${teamId} not found in Firestore`); + + // dummy data + // teamData = { + // name: "Team Name", + // emails: ["team@example.com"], + // case: ["Trade Republic", "avi", "beam"][ + // Math.floor(Math.random() * 3) + // ] as "Trade Republic" | "avi" | "beam", + // }; + // console.log( + // `WARNING: Team with code ${teamId} not found in Firestore. Using dummy data.`, + // ); + + continue; + } else { + teamData = teamDoc.data() as TeamData; + } + + const scoringRow: ScoringRow = { + "Team Code": teamId, + "Team Name": record["2. Give Your Team a Name"], + "Project Name": record["3. Give Your Project a Name"], + "Pitch YT Link": record["4. Pitch video"], + "Demo / MVP Link": record["5. Link to Your Demo or MVP"], + "GitHub URL": record["6. GitHub Repository"], + "One Sentence Pitch": record["7. One-Sentence Pitch"], + "What Is Your Project": record["8. What Is Your Project?"], + "How You Built It": record["9. How You Built It"], + "Difficulties You Faced": record["10. Difficulties You Faced"], + }; + + projectsByCase[teamData.case].push(scoringRow); + } + + // Create scoring sheets directory if it doesn't exist + const scoringDir = path.join(__dirname, "../scoring-sheets"); + if (!fs.existsSync(scoringDir)) { + fs.mkdirSync(scoringDir); + } + + // Generate CSV files for each case + for (const [caseName, projects] of Object.entries(projectsByCase)) { + if (projects.length > 0) { + const csvContent = stringify(projects, { + header: true, + columns: [ + "Team Code", + "Team Name", + "Project Name", + "Pitch YT Link", + "Demo / MVP Link", + "GitHub URL", + "One Sentence Pitch", + "What Is Your Project", + "How You Built It", + "Difficulties You Faced", + ], + }); + + fs.writeFileSync( + path.join(scoringDir, `${caseName}-scoring.csv`), + csvContent, + ); + + console.log( + `Generated scoring sheet for ${caseName} with ${projects.length} projects`, + ); + } else { + console.log(`No projects found for case: ${caseName}`); + } + } + + console.log("Successfully generated all scoring sheets"); + } catch (error) { + console.error("Error generating scoring sheets:", error); + process.exit(1); + } +} + +// Run the script +generateScoringSheets(); diff --git a/platform/submission/src/generate-challenge-scoring.ts b/platform/submission/src/generate-challenge-scoring.ts new file mode 100644 index 0000000..149525c --- /dev/null +++ b/platform/submission/src/generate-challenge-scoring.ts @@ -0,0 +1,150 @@ +import { parse } from "csv-parse/sync"; +import * as fs from "fs"; +import * as path from "path"; +import { fileURLToPath } from "url"; +import { stringify } from "csv-stringify/sync"; +import 'dotenv/config'; + +// Get __dirname equivalent in ES modules +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +interface ScoringRow { + "Team Code": string; + "Team Name": string; + "Project Name": string; + "Pitch YT Link": string; + "Demo / MVP Link": string; + "GitHub URL": string; + "One Sentence Pitch": string; + "What Is Your Project": string; + "How You Built It": string; + "Difficulties You Faced": string; + "Why you should win the challenge": string; +} + +async function generateChallengeScoringSheets() { + try { + // Read CSV file + const csvContent = fs.readFileSync( + path.join( + __dirname, + "../../submission/submissions.csv" + ), + "utf-8" + ); + + // Parse CSV + const records = parse(csvContent, { + columns: true, + skip_empty_lines: true, + }); + + // Group projects by challenge partner + const projectsByChallenge: Record = { + "mistral": [], + "visionaries": [], + "beyond_presence": [], + "celonis": [], + "tanso": [], + }; + + // Process each record + for (const record of records) { + const challenges = record["11. Challenges"] || ""; + + // Create base scoring row without the challenge-specific pitch + const baseScoringRow: Omit = { + "Team Code": record["1. What is Your Team ID?"], + "Team Name": record["2. Give Your Team a Name"], + "Project Name": record["3. Give Your Project a Name"], + "Pitch YT Link": record["4. Pitch video"], + "Demo / MVP Link": record["5. Link to Your Demo or MVP"], + "GitHub URL": record["6. GitHub Repository"], + "One Sentence Pitch": record["7. One-Sentence Pitch"], + "What Is Your Project": record["8. What Is Your Project?"], + "How You Built It": record["9. How You Built It"], + "Difficulties You Faced": record["10. Difficulties You Faced"], + }; + + // Check for each challenge partner and add to their respective array with the relevant pitch + if (challenges.toLowerCase().includes("mistral")) { + projectsByChallenge["mistral"].push({ + ...baseScoringRow, + "Why you should win the challenge": record["12. Why Your Project Deserves to Win \"Best Use of La Plateforme/ Mistral models\" by Mistral AI"] + }); + } + if (challenges.toLowerCase().includes("visionaries")) { + projectsByChallenge["visionaries"].push({ + ...baseScoringRow, + "Why you should win the challenge": record["13. Why Your Project Deserves to Win \"Most potential to earn real money\" by Visionaries Club, Everyday Intelligence, and Paid"] + }); + } + if (challenges.toLowerCase().includes("beyond presence")) { + projectsByChallenge["beyond_presence"].push({ + ...baseScoringRow, + "Why you should win the challenge": record["14. Why Your Project Deserves to Win \"Best Use of Real-Time Interactive Avatars\" by Beyond Presence"] + }); + } + if (challenges.toLowerCase().includes("celonis")) { + projectsByChallenge["celonis"].push({ + ...baseScoringRow, + "Why you should win the challenge": record["15. Why Your Project Deserves to Win \"Best use of AI to improve processes\" by Celonis"] + }); + } + if (challenges.toLowerCase().includes("tanso")) { + projectsByChallenge["tanso"].push({ + ...baseScoringRow, + "Why you should win the challenge": record["16. Why Your Project Deserves to Win \"Why Not? Biggest Creative Risk\" by Tanso"] + }); + } + } + + // Create scoring sheets directory if it doesn't exist + const scoringDir = path.join(__dirname, "../challenge-scoring-sheets"); + if (!fs.existsSync(scoringDir)) { + fs.mkdirSync(scoringDir); + } + + // Generate CSV files for each challenge partner + for (const [challengeName, projects] of Object.entries(projectsByChallenge)) { + if (projects.length > 0) { + const csvContent = stringify(projects, { + header: true, + columns: [ + "Team Code", + "Team Name", + "Project Name", + "Pitch YT Link", + "Demo / MVP Link", + "GitHub URL", + "One Sentence Pitch", + "What Is Your Project", + "How You Built It", + "Difficulties You Faced", + "Why you should win the challenge" + ], + }); + + fs.writeFileSync( + path.join(scoringDir, `${challengeName}-scoring.csv`), + csvContent + ); + + console.log( + `Generated scoring sheet for ${challengeName} with ${projects.length} projects` + ); + } else { + console.log(`No projects found for challenge: ${challengeName}`); + } + } + + console.log("Successfully generated all challenge scoring sheets"); + } catch (error) { + console.error("Error generating challenge scoring sheets:", error); + process.exit(1); + } +} + +// Run the script +generateChallengeScoringSheets(); \ No newline at end of file diff --git a/platform/submission/src/genreate-project-page-data.ts b/platform/submission/src/genreate-project-page-data.ts new file mode 100644 index 0000000..db69dd5 --- /dev/null +++ b/platform/submission/src/genreate-project-page-data.ts @@ -0,0 +1,123 @@ +import 'dotenv/config'; +import admin from "firebase-admin"; +import { parse } from "csv-parse/sync"; +import * as fs from "fs"; +import * as path from "path"; +import { fileURLToPath } from "url"; + +// Get __dirname equivalent in ES modules +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Initialize Firebase Admin using environment variable +admin.initializeApp(); + +interface Project { + id: string; + name: string; + case: "Trade Republic" | "avi" | "beam"; + whatIsProject: string; + howBuilt: string; + difficulties: string; + oneSentencePitch: string; + githubUrl: string; + videoUrl: string; + placement?: 1 | 2; + challenges?: Array<{ + name: string; + sponsoredBy: string; + companies: Array<{ + name: string; + url?: string; + logoPath: string; + logoClass: string; + }>; + }>; +} + +interface TeamData { + name: string; + emails: string[]; + case: "Trade Republic" | "avi" | "beam"; +} + +async function convertSubmissions() { + try { + // Read CSV file + const csvContent = fs.readFileSync( + path.join(__dirname, "../submissions.csv"), + "utf-8" + ); + + // Parse CSV + const records = parse(csvContent, { + columns: true, + skip_empty_lines: true, + }); + + const projects: Project[] = []; + + // Process each record + for (const record of records) { + const teamCode = record["1. What is Your Team ID?"]; + + // Fetch team data from Firestore + const teamDoc = await admin.firestore() + .collection("Teams") + .doc(teamCode.toLowerCase()) + .get(); + + let teamData: TeamData; + if (!teamDoc.exists) { + console.warn(`Team with code ${teamCode} not found in Firestore`); + + // dummy data + // teamData = { + // name: "Team Name", + // emails: ["team@example.com"], + // case: ["Trade Republic", "avi", "beam"][Math.floor(Math.random() * 3)] as "Trade Republic" | "avi" | "beam", + // }; + // console.log(`WARNING: Team with code ${teamCode} not found in Firestore. Using dummy data.`); + + continue; + } else { + teamData = teamDoc.data() as TeamData; + } + + const project: Project = { + id: `project-${teamCode.toLowerCase()}`, + name: record["3. Give Your Project a Name"], + case: teamData.case, + whatIsProject: record["8. What Is Your Project?"], + howBuilt: record["9. How You Built It"], + difficulties: record["10. Difficulties You Faced"], + oneSentencePitch: record["7. One-Sentence Pitch"], + githubUrl: record["6. GitHub Repository"] || "", + videoUrl: record["4. Pitch video"], + }; + + projects.push(project); + } + + // Generate TypeScript file + const tsContent = `// This file is auto-generated. Do not edit manually. +import { Project } from "./projects-page-config"; + +export const projects: Project[] = ${JSON.stringify(projects, null, 2)}; +`; + + // Write to file + fs.writeFileSync( + path.join(__dirname, "../../../website/src/constants/projects.ts"), + tsContent + ); + + console.log("Successfully converted submissions to projects.ts"); + } catch (error) { + console.error("Error converting submissions:", error); + process.exit(1); + } +} + +// Run the conversion +convertSubmissions(); \ No newline at end of file diff --git a/platform/submission/tsconfig.json b/platform/submission/tsconfig.json new file mode 100644 index 0000000..bcc837f --- /dev/null +++ b/platform/submission/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "ES2020", + "moduleResolution": "node", + "esModuleInterop": true, + "resolveJsonModule": true, + "outDir": "dist" + }, + "include": ["src/**/*.ts"] +} \ No newline at end of file diff --git a/website/public/images/partners/beam.png b/website/public/images/partners/beam.png index e605e12..c6f4454 100644 Binary files a/website/public/images/partners/beam.png and b/website/public/images/partners/beam.png differ diff --git a/website/public/images/partners/trade_republic.png b/website/public/images/partners/trade_republic.png new file mode 100644 index 0000000..c2d019a Binary files /dev/null and b/website/public/images/partners/trade_republic.png differ diff --git a/website/public/images/partners/trade_republic.svg b/website/public/images/partners/trade_republic.svg deleted file mode 100644 index 2f640a7..0000000 --- a/website/public/images/partners/trade_republic.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/src/App.tsx b/website/src/App.tsx index 5990c24..2190585 100644 --- a/website/src/App.tsx +++ b/website/src/App.tsx @@ -5,6 +5,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { BrowserRouter, Routes, Route } from "react-router-dom"; import Index from "./pages/Index"; import NotFound from "./pages/NotFound"; +import Projects from "./pages/Projects"; import Guidebook from "./pages/Guidebook"; import Submission from "./pages/Submission"; @@ -18,6 +19,8 @@ const App = () => ( } /> + } /> + } /> } /> } /> } /> diff --git a/website/src/components/Navbar.tsx b/website/src/components/Navbar.tsx index 5254492..db442a5 100644 --- a/website/src/components/Navbar.tsx +++ b/website/src/components/Navbar.tsx @@ -1,6 +1,7 @@ import { ExternalLink, Menu as MenuIcon, X } from "lucide-react"; import { useEffect, useState } from "react"; import MobileNavigation from "./MobileNavigation"; +import { Link, useNavigate, useLocation } from "react-router-dom"; import ApplicationsClosedDialog from "./ApplicationsClosedDialog"; interface SubMenuItem { @@ -19,9 +20,15 @@ interface Menu { items: MenuItem[]; } -const Navbar = () => { +interface NavbarProps { + backgroundColor?: string; +} + +const Navbar = ({ backgroundColor = "bg-transparent" }: NavbarProps) => { const [isMenuOpen, setIsMenuOpen] = useState(false); const [scrolled, setScrolled] = useState(false); + const navigate = useNavigate(); + const location = useLocation(); const [isDialogOpen, setIsDialogOpen] = useState(false); // Handle scroll event to change navbar appearance @@ -42,6 +49,42 @@ const Navbar = () => { setIsMenuOpen(false); }; + // Handle navigation with hash + const handleNavigation = (hash: string) => { + if (location.pathname !== '/') { + navigate(`/${hash}`); + } else { + // If we're already on the home page, just scroll to the section + const element = document.querySelector(hash); + if (element) { + element.scrollIntoView({ behavior: 'smooth' }); + } + } + }; + + // Add effect to handle hash navigation after page load + useEffect(() => { + const handleHashNavigation = () => { + const hash = window.location.hash; + if (hash) { + const element = document.querySelector(hash); + if (element) { + // Small delay to ensure the page is fully loaded + setTimeout(() => { + element.scrollIntoView({ behavior: 'smooth' }); + }, 100); + } + } + }; + + // Handle initial load + handleHashNavigation(); + + // Handle hash changes + window.addEventListener('hashchange', handleHashNavigation); + return () => window.removeEventListener('hashchange', handleHashNavigation); + }, []); + // Define the menu structure const navMenu: Menu = { items: [ @@ -68,51 +111,51 @@ const Navbar = () => { return (
{/* Logo */} - + CDTM Hacks Logo - + {/* Desktop Navigation */}