├── .env.docker
├── client
├── src
│ ├── img
│ │ └── F1.jpg
│ ├── components
│ │ ├── Progress.jsx
│ │ ├── Modal.jsx
│ │ ├── Result.jsx
│ │ ├── Race.jsx
│ │ └── NavBar.jsx
│ ├── css
│ │ ├── App.css
│ │ ├── Modal.css
│ │ ├── Bookmarks.css
│ │ ├── NavBar.css
│ │ ├── Races.css
│ │ ├── index.css
│ │ ├── Race.css
│ │ └── Progress.css
│ ├── main.jsx
│ ├── App.jsx
│ ├── pages
│ │ ├── Bookmarks.jsx
│ │ ├── Race.jsx
│ │ └── Races.jsx
│ ├── context
│ │ └── BookmarkContext.jsx
│ └── services
│ │ ├── notifications.js
│ │ └── races.js
└── index.html
├── server
├── components
│ └── races
│ │ ├── index.js
│ │ ├── router.js
│ │ └── store.js
├── index.js
├── app.js
├── redis.js
└── services
│ └── wikipedia.js
├── .dockerignore
├── .env.example
├── vite.config.js
├── .gitignore
├── compose.yml
├── package.json
├── Dockerfile
├── README.md
├── assets
├── circuit_images.json
└── driver_images.json
└── bun.lock
/.env.docker:
--------------------------------------------------------------------------------
1 | REDIS_URL="redis://redis:6379"
2 |
3 |
--------------------------------------------------------------------------------
/client/src/img/F1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redis-developer/demo-redis-bigquery/main/client/src/img/F1.jpg
--------------------------------------------------------------------------------
/server/components/races/index.js:
--------------------------------------------------------------------------------
1 | export * from "./router.js";
2 | export { initialize } from "./store.js";
3 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .env
3 | .env.*
4 | .gitignore
5 | compose.yml
6 | Dockerfile
7 | README.md
8 | build/
9 | dist/
10 |
--------------------------------------------------------------------------------
/client/src/components/Progress.jsx:
--------------------------------------------------------------------------------
1 | import "../css/Progress.css";
2 |
3 | export default function Progress() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/client/src/css/App.css:
--------------------------------------------------------------------------------
1 | .main-content {
2 | flex: 1;
3 | padding: 2rem;
4 | box-sizing: border-box;
5 | width: 100%;
6 | display: flex;
7 | flex-direction: column;
8 | }
9 |
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | import "dotenv/config";
2 | import app, { initialize } from "./app.js";
3 |
4 | const port = process.env.PORT ?? 3000;
5 |
6 | app.listen(process.env.PORT ?? 3000, async () => {
7 | console.log(`Server listening on port ${port}`);
8 |
9 | await initialize();
10 | });
11 |
--------------------------------------------------------------------------------
/client/src/main.jsx:
--------------------------------------------------------------------------------
1 | import { createRoot } from "react-dom/client";
2 | import { BrowserRouter } from "react-router-dom";
3 | import "./css/index.css";
4 | import App from "./App.jsx";
5 |
6 | createRoot(document.getElementById("root")).render(
7 |
8 |
9 | ,
10 | );
11 |
--------------------------------------------------------------------------------
/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Redis + BigQuery
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | REDIS_URL="redis://localhost:6379"
2 | # Google Cloud Credentials
3 | GOOGLE_APPLICATION_CREDENTIALS={"account":"","client_id":".apps.googleusercontent.com","client_secret":"","quota_project_id":"","refresh_token":"","type":"authorized_user","universe_domain":"googleapis.com"}
4 | GOOGLE_CLOUD_PROJECT_ID=
5 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import react from "@vitejs/plugin-react-swc";
3 |
4 | // https://vite.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | root: process.cwd() + "/client",
8 | server: {
9 | proxy: {
10 | "/api": {
11 | target: process.env.BACKEND_URL || "http://localhost:3000",
12 | changeOrigin: true,
13 | secure: false,
14 | },
15 | },
16 | },
17 | });
18 |
--------------------------------------------------------------------------------
/client/src/components/Modal.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 | import "../css/Modal.css";
3 |
4 | function Modal({ openModal, closeModal, children }) {
5 | const ref = useRef();
6 |
7 | useEffect(() => {
8 | if (openModal) {
9 | ref.current?.showModal();
10 | } else {
11 | ref.current?.close();
12 | }
13 | }, [openModal]);
14 |
15 | return (
16 |
20 | );
21 | }
22 |
23 | export default Modal;
24 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | node_modules
5 | dist
6 | .vscode
7 |
8 | # env files (can opt-in for commiting if needed)
9 | .env*
10 | !.env.example
11 | !.env.docker
12 |
13 | /.pnp
14 | .pnp.*
15 | .yarn/*
16 | !.yarn/patches
17 | !.yarn/plugins
18 | !.yarn/releases
19 | !.yarn/versions
20 |
21 | # testing
22 | /coverage
23 |
24 | # production
25 | /build
26 |
27 | # misc
28 | .DS_Store
29 | *.pem
30 |
31 | # debug
32 | npm-debug.log*
33 | yarn-debug.log*
34 | yarn-error.log*
35 |
36 |
--------------------------------------------------------------------------------
/server/app.js:
--------------------------------------------------------------------------------
1 | import path from "path";
2 | import express from "express";
3 | import cors from "cors";
4 | import * as races from "./components/races/index.js";
5 |
6 | export async function initialize() {
7 | await races.initialize();
8 | }
9 |
10 | const app = express();
11 |
12 | app.use(express.static("client/"));
13 | app.use(cors());
14 | app.use("/api/races", races.router);
15 |
16 | app.get("/*", (_, res) => {
17 | res.sendFile(path.join(__dirname, "../client/", "index.html"), (err) => {
18 | if (err) {
19 | console.log(err);
20 | }
21 | });
22 | });
23 |
24 | export default app;
25 |
--------------------------------------------------------------------------------
/compose.yml:
--------------------------------------------------------------------------------
1 | name: "demo-redis-biquery"
2 | services:
3 | redis:
4 | container_name: demo-redis-bigquery-redis
5 | image: "redis:8.0-M02"
6 | ports:
7 | - 6379:6379
8 | deploy:
9 | replicas: 1
10 | restart_policy:
11 | condition: on-failure
12 | volumes:
13 | - redis-data:/data
14 |
15 | app:
16 | container_name: demo-redis-bigquery-app
17 | build:
18 | context: ./
19 | command: bun dev
20 | ports:
21 | - "${PORT-8080}:${PORT-8080}"
22 | environment:
23 | PORT: ${PORT-8080}
24 | env_file:
25 | - ./.env
26 | - ./.env.docker
27 | restart: always
28 | depends_on:
29 | - redis
30 |
31 | volumes:
32 | redis-data:
33 |
--------------------------------------------------------------------------------
/client/src/css/Modal.css:
--------------------------------------------------------------------------------
1 | dialog[open] {
2 | position: absolute;
3 | height: 65%;
4 | width: 65%;
5 | margin: auto;
6 | padding: 2rem;
7 | top: 0;
8 | left: 0;
9 | bottom: 0;
10 | right: 0;
11 | color: rgba(255, 255, 255, 0.87);
12 | background-color: #242424;
13 | z-index: 999;
14 |
15 | display: flex;
16 |
17 | > div {
18 | padding: 0rem 2rem;
19 | }
20 |
21 | pre {
22 | padding: 1rem;
23 | }
24 |
25 | button {
26 | position: absolute;
27 | top: 0;
28 | right: 0;
29 |
30 | padding: 0.5rem 1rem;
31 | color: #fff;
32 | border: 1px solid #dcff1e;
33 | border-radius: 2px;
34 | }
35 |
36 | &::backdrop {
37 | background: rgba(0, 0, 0, 0.5);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/client/src/App.jsx:
--------------------------------------------------------------------------------
1 | import "./css/App.css";
2 | import Races from "./pages/Races.jsx";
3 | import Bookmarks from "./pages/Bookmarks.jsx";
4 | import Race from "./pages/Race.jsx";
5 | import { Routes, Route } from "react-router-dom";
6 | import { ContextProvider } from "./context/BookmarkContext.jsx";
7 | import NavBar from "./components/NavBar.jsx";
8 |
9 | function App() {
10 | return (
11 |
12 |
13 |
14 |
15 | } />
16 | } />
17 | } />
18 |
19 |
20 |
21 | );
22 | }
23 |
24 | export default App;
25 |
--------------------------------------------------------------------------------
/client/src/pages/Bookmarks.jsx:
--------------------------------------------------------------------------------
1 | import "../css/Bookmarks.css";
2 | import { useBookmarkContext } from "../context/BookmarkContext";
3 | import Race from "../components/Race.jsx";
4 |
5 | function Bookmarks() {
6 | const { bookmarks } = useBookmarkContext();
7 |
8 | if (bookmarks) {
9 | return (
10 |
11 |
Your Bookmarks
12 |
13 | {bookmarks.map((race) => (
14 |
15 | ))}
16 |
17 |
18 | );
19 | }
20 |
21 | return (
22 |
23 |
No bookmarks
24 |
Start bookmarking races to list them here.
25 |
26 | );
27 | }
28 |
29 | export default Bookmarks;
30 |
--------------------------------------------------------------------------------
/client/src/components/Result.jsx:
--------------------------------------------------------------------------------
1 | import "../css/Race.css";
2 | import { Link } from "react-router-dom";
3 |
4 | function Result({ result }) {
5 | return (
6 |
7 |
8 |
9 |

13 |
14 |
15 |
16 | {result.driver_forename} {result.driver_surname}
17 |
18 | {result.time}
19 |
20 | Position: {result.position}
21 |
22 | Constructor: {result.constructor_name}
23 |
24 | Laps: {result.laps}
25 |
26 |
27 |
28 | );
29 | }
30 |
31 | export default Result;
32 |
--------------------------------------------------------------------------------
/client/src/css/Bookmarks.css:
--------------------------------------------------------------------------------
1 | .bookmarks {
2 | padding: 2rem;
3 | width: 100%;
4 | box-sizing: border-box;
5 | }
6 |
7 | .bookmarks h2 {
8 | margin-bottom: 2rem;
9 | text-align: center;
10 | font-size: 2.5rem;
11 | color: #ffffff;
12 | text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
13 | }
14 |
15 | .bookmarks-empty {
16 | text-align: center;
17 | padding: 4rem 2rem;
18 | background-color: rgba(255, 255, 255, 0.05);
19 | border-radius: 12px;
20 | margin: 2rem auto;
21 | max-width: 600px;
22 | }
23 |
24 | .bookmarks-empty h2 {
25 | margin-bottom: 1rem;
26 | font-size: 2rem;
27 | color: #e50914;
28 | }
29 |
30 | .bookmarks-empty p {
31 | color: #999;
32 | font-size: 1.2rem;
33 | line-height: 1.6;
34 | }
35 |
36 | .bookmark-grid {
37 | display: grid;
38 | grid-template-columns: repeat(auto-fit, minmax(300px, 1rem));
39 | gap: 1.5rem;
40 | padding: 1rem;
41 | width: 100%;
42 | box-sizing: border-box;
43 | }
44 |
--------------------------------------------------------------------------------
/server/redis.js:
--------------------------------------------------------------------------------
1 | import { createClient } from "redis";
2 |
3 | if (!process.env.REDIS_URL) {
4 | console.error("REDIS_URL not set");
5 | }
6 |
7 | let client = null;
8 |
9 | /**
10 | * @param {import("redis").RedisClientOptions} [options]
11 | *
12 | * @returns {Promise>}
13 | */
14 | export async function getClient(options) {
15 | options = Object.assign(
16 | {},
17 | {
18 | url: process.env.REDIS_URL,
19 | },
20 | options,
21 | );
22 |
23 | if (client && client.options?.url === options.url) {
24 | return client;
25 | }
26 |
27 | client = createClient(options);
28 |
29 | client
30 | .on("error", (err) => {
31 | console.error("Redis Client Error", err);
32 | void refreshClient();
33 | })
34 | .connect();
35 |
36 | return client;
37 | }
38 |
39 | async function refreshClient() {
40 | if (client) {
41 | await client.disconnect();
42 | client = null;
43 | }
44 |
45 | client = await getClient();
46 | }
47 |
--------------------------------------------------------------------------------
/client/src/css/NavBar.css:
--------------------------------------------------------------------------------
1 | .navbar {
2 | background-color: #163341;
3 | padding: 1rem 2rem;
4 | display: flex;
5 | justify-content: space-between;
6 | align-items: center;
7 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
8 | }
9 |
10 | .navbar-brand {
11 | font-size: 1.5rem;
12 | font-weight: bold;
13 | }
14 |
15 | .navbar-links {
16 | display: flex;
17 | gap: 2rem;
18 | }
19 |
20 | .timer {
21 | color: #fff;
22 | }
23 |
24 | .nav-button {
25 | color: #fff;
26 | border: 1px solid #dcff1e;
27 | border-radius: 2px;
28 | }
29 |
30 | .nav-link {
31 | font-size: 1rem;
32 | padding: 0.5rem 1rem;
33 | border-radius: 4px;
34 | transition: background-color 0.2s;
35 | }
36 |
37 | .nav-link:hover {
38 | background-color: rgba(255, 255, 255, 0.1);
39 | }
40 |
41 | @media (max-width: 768px) {
42 | .navbar {
43 | padding: 1rem;
44 | }
45 |
46 | .navbar-brand {
47 | font-size: 1.2rem;
48 | }
49 |
50 | .navbar-links {
51 | gap: 1rem;
52 | }
53 |
54 | .nav-link {
55 | padding: 0.5rem;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "redis-bigquery",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "engines": {
7 | "node": ">=22"
8 | },
9 | "scripts": {
10 | "dev": "run-p dev:*",
11 | "dev:client": "bunx --bun vite",
12 | "dev:server": "bun --watch server/index.js",
13 | "format": "prettier . --write",
14 | "start": "bunx --bun vite build && bun server/index.js",
15 | "lint": "eslint .",
16 | "preview": "vite preview"
17 | },
18 | "dependencies": {
19 | "@google-cloud/bigquery": "^7.9.3",
20 | "cors": "^2.8.5",
21 | "dotenv": "^16.4.7",
22 | "express": "^4.21.2",
23 | "jsdom": "^26.0.0",
24 | "react": "^19.1.0",
25 | "react-dom": "^19.1.0",
26 | "react-router-dom": "^7.4.1",
27 | "react-tates": "^0.2.0",
28 | "redis": "^4.7.0"
29 | },
30 | "devDependencies": {
31 | "@types/react": "^19.0.12",
32 | "@types/react-dom": "^19.0.4",
33 | "@vitejs/plugin-react-swc": "^3.8.1",
34 | "globals": "^16.0.0",
35 | "npm-run-all": "^4.1.5",
36 | "prettier": "^3.5.3",
37 | "vite": "^6.2.3"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/server/components/races/router.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import { byYear, count, delAll, one, populate } from "./store";
3 |
4 | export const router = express.Router();
5 |
6 | router.get("/year/:year", async (req, res) => {
7 | const start = performance.now();
8 | const data = await byYear(req.params.year);
9 | const end = performance.now();
10 |
11 | res.json({
12 | ms: end - start,
13 | data,
14 | });
15 | });
16 |
17 | router.get("/count", async (_, res) => {
18 | res.json(await count());
19 | });
20 |
21 | router.get("/clear", async (_, res) => {
22 | await delAll();
23 |
24 | res.sendStatus(200);
25 | });
26 |
27 | router.get("/cache", async (_, res) => {
28 | const start = performance.now();
29 | await populate();
30 | const end = performance.now();
31 |
32 | res.json({
33 | ms: end - start,
34 | });
35 | });
36 |
37 | router.get("/:raceId", async (req, res) => {
38 | const start = performance.now();
39 | const data = await one(req.params.raceId);
40 | const end = performance.now();
41 |
42 | res.json({
43 | ms: end - start,
44 | data,
45 | });
46 | });
47 |
--------------------------------------------------------------------------------
/client/src/css/Races.css:
--------------------------------------------------------------------------------
1 | .home {
2 | padding: 2rem 0;
3 | width: 100%;
4 | box-sizing: border-box;
5 | }
6 |
7 | .search-form {
8 | max-width: 600px;
9 | margin: 0 auto 2rem;
10 | display: flex;
11 | gap: 1rem;
12 | padding: 0 1rem;
13 | box-sizing: border-box;
14 | }
15 |
16 | .search-input {
17 | flex: 1;
18 | padding: 0.75rem 1rem;
19 | border: none;
20 | border-radius: 4px;
21 | background-color: #333;
22 | color: white;
23 | font-size: 1rem;
24 | }
25 |
26 | .search-btn {
27 | padding: 0.75rem 1.5rem;
28 | background-color: #e50914;
29 | color: white;
30 | border-radius: 4px;
31 | font-weight: 500;
32 | transition: background-color 0.2s;
33 | white-space: nowrap;
34 | }
35 |
36 | .search-btn:hover {
37 | background-color: #f40612;
38 | }
39 |
40 | @media (max-width: 639px) {
41 | .home {
42 | padding: 1rem 0;
43 | }
44 |
45 | .search-form {
46 | margin-bottom: 1rem;
47 | }
48 | }
49 |
50 | .loading {
51 | text-align: center;
52 | }
53 |
54 | .race-grid {
55 | display: grid;
56 | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
57 | gap: 1.5rem;
58 | padding: 1rem;
59 | width: 100%;
60 | box-sizing: border-box;
61 | }
62 |
63 | .driver-grid {
64 | display: grid;
65 | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
66 | gap: 1.5rem;
67 | padding: 1rem;
68 | width: 100%;
69 | /* height: 100px; */
70 | box-sizing: border-box;
71 | }
72 |
--------------------------------------------------------------------------------
/client/src/pages/Race.jsx:
--------------------------------------------------------------------------------
1 | import Result from "../components/Result.jsx";
2 | import "../css/Race.css";
3 | import { useParams } from "react-router-dom";
4 | import { hooks } from "../services/races.js";
5 | import { hooks as notifications } from "../services/notifications.js";
6 | import Progress from "../components/Progress.jsx";
7 |
8 | function Race() {
9 | const { raceId } = useParams();
10 | const timerRunning = notifications.useTimerRunning();
11 | const race = hooks.useRace({ actionArgs: [raceId] });
12 |
13 | return (
14 |
15 | {timerRunning ? (
16 |
19 | ) : (
20 | race && (
21 |
22 |
23 |
{race.name}
24 |
25 |
26 |
27 | {race.circuit_name}
28 |
29 |
30 | {race.circuit_location}, {race.circuit_country}
31 |
32 | {race.date.value}
33 |
34 |
35 |
36 | {race.results.map((result) => (
37 |
38 | ))}
39 |
40 |
41 | )
42 | )}
43 |
44 | );
45 | }
46 |
47 | export default Race;
48 |
--------------------------------------------------------------------------------
/client/src/components/Race.jsx:
--------------------------------------------------------------------------------
1 | import "../css/Race.css";
2 | import { useBookmarkContext } from "../context/BookmarkContext";
3 | import { Link } from "react-router-dom";
4 |
5 | function Race({ race }) {
6 | const { changeRace, isBookmark, addToBookmarks, removeFromBookmarks } =
7 | useBookmarkContext();
8 | const bookmark = isBookmark(race.race_id);
9 |
10 | function onBookmark(e) {
11 | e.preventDefault();
12 | if (bookmark) removeFromBookmarks(race.race_id);
13 | else addToBookmarks(race);
14 | }
15 |
16 | function onCardClick() {
17 | changeRace(race.race_id);
18 | }
19 |
20 | return (
21 |
22 |
23 |
24 |

25 |
26 |
32 |
33 |
34 |
35 |
{race.name}
36 |
{race.date.value}
37 |
38 | {race.circuit_location}, {race.circuit_country}
39 |
40 |
41 |
42 | Winner: {race.winner.driver_forename} {race.winner.driver_surname}
43 |
44 |
45 |
46 |
47 |
48 | );
49 | }
50 |
51 | export default Race;
52 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # use the official Bun image
2 | # see all versions at https://hub.docker.com/r/oven/bun/tags
3 | FROM oven/bun:1.2-alpine AS base
4 | WORKDIR /usr/src/app
5 |
6 | # install dependencies into temp directory
7 | # this will cache them and speed up future builds
8 | FROM base AS install
9 | RUN mkdir -p /temp/dev
10 | COPY package.json bun.lock /temp/dev/
11 | RUN cd /temp/dev && bun install --frozen-lockfile
12 |
13 | # install with --production (exclude devDependencies)
14 | RUN mkdir -p /temp/prod
15 | COPY package.json bun.lock /temp/prod/
16 | RUN cd /temp/prod && bun install --frozen-lockfile --production
17 |
18 | # copy node_modules from temp directory
19 | # then copy all (non-ignored) project files into the image
20 | FROM base AS dev
21 | COPY --from=install /temp/dev/node_modules node_modules
22 | COPY . .
23 |
24 | # copy node_modules from temp directory
25 | # then copy all (non-ignored) project files into the image
26 | FROM base AS prerelease
27 | COPY --from=install /temp/dev/node_modules node_modules
28 | COPY . .
29 | ENV NODE_ENV=production
30 | RUN bunx --bun vite build --emptyOutDir --outDir ../build/client
31 | RUN bun build --target=bun server/index.js --outdir build/server
32 |
33 | # copy production dependencies and source code into final image
34 | FROM base AS release
35 | COPY --from=install /temp/prod/node_modules node_modules
36 | COPY --from=prerelease /usr/src/app/build/server/ server/
37 | COPY --from=prerelease /usr/src/app/build/client client/
38 | COPY --from=prerelease /usr/src/app/assets/ assets/
39 | COPY --from=prerelease /usr/src/app/package.json .
40 |
41 | # run the app
42 | USER bun
43 | ENV PORT 8080
44 | EXPOSE ${PORT}
45 | ENTRYPOINT [ "bun", "server/index.js" ]
46 |
--------------------------------------------------------------------------------
/client/src/context/BookmarkContext.jsx:
--------------------------------------------------------------------------------
1 | import { createContext, useState, useContext, useEffect } from "react";
2 |
3 | const BookmarkContext = createContext();
4 |
5 | export const useBookmarkContext = () => useContext(BookmarkContext);
6 |
7 | export const ContextProvider = ({ children }) => {
8 | const [bookmarks, setBookmarks] = useState([]);
9 | const [selectedRace, setRace] = useState("");
10 |
11 | useEffect(() => {
12 | const storedBookmarks = localStorage.getItem("bookmarks");
13 | if (storedBookmarks) setBookmarks(JSON.parse(storedBookmarks));
14 | }, []);
15 |
16 | useEffect(() => {
17 | localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
18 | }, [bookmarks]);
19 |
20 | // Initialize from local storage if available
21 | useEffect(() => {
22 | const storedRace = localStorage.getItem("race");
23 | if (storedRace) setRace(storedRace);
24 | }, []);
25 |
26 | // Effect to update local storage when the string changes
27 | useEffect(() => {
28 | localStorage.setItem("race", selectedRace);
29 | }, [selectedRace]);
30 |
31 | const addToBookmarks = (race) => {
32 | setBookmarks((prev) => [...prev, race]);
33 | };
34 |
35 | const removeFromBookmarks = (raceId) => {
36 | setBookmarks((prev) => prev.filter((race) => race.id !== raceId));
37 | };
38 |
39 | const isBookmark = (raceId) => {
40 | return bookmarks.some((race) => race.id === raceId);
41 | };
42 |
43 | // Function to update the string
44 | const changeRace = (raceId) => {
45 | setRace(raceId);
46 | };
47 |
48 | const value = {
49 | bookmarks,
50 | selectedRace,
51 | addToBookmarks,
52 | removeFromBookmarks,
53 | isBookmark,
54 | changeRace,
55 | };
56 |
57 | return (
58 |
59 | {children}
60 |
61 | );
62 | };
63 |
--------------------------------------------------------------------------------
/client/src/css/index.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap");
2 |
3 | :root {
4 | font-family:
5 | "Space Grotesk", Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
6 | line-height: 1.5;
7 | font-weight: 400;
8 |
9 | color-scheme: light dark;
10 | color: rgba(255, 255, 255, 0.87);
11 | background-color: #242424;
12 |
13 | font-synthesis: none;
14 | text-rendering: optimizeLegibility;
15 | -webkit-font-smoothing: antialiased;
16 | -moz-osx-font-smoothing: grayscale;
17 | }
18 |
19 | * {
20 | margin: 0;
21 | padding: 0;
22 | box-sizing: border-box;
23 | }
24 |
25 | html,
26 | body {
27 | overflow-x: hidden;
28 | }
29 |
30 | body {
31 | margin: 0;
32 | width: 100%;
33 | min-height: 100vh;
34 | position: relative;
35 | }
36 |
37 | #root {
38 | width: 100%;
39 | min-height: 100vh;
40 | display: flex;
41 | flex-direction: column;
42 | }
43 |
44 | a {
45 | font-weight: 500;
46 | color: #dcff1e;
47 | text-decoration: inherit;
48 | }
49 | a:hover {
50 | color: #f1ffa5;
51 | }
52 |
53 | h1 {
54 | font-size: 3.2em;
55 | line-height: 1.1;
56 | }
57 |
58 | button {
59 | border-radius: 8px;
60 | border: 1px solid transparent;
61 | padding: 0.6em 1.2em;
62 | font-size: 1em;
63 | font-weight: 500;
64 | font-family: inherit;
65 | background-color: #1a1a1a;
66 | cursor: pointer;
67 | transition: border-color 0.25s;
68 | }
69 | button:hover {
70 | border-color: #646cff;
71 | }
72 | button:focus,
73 | button:focus-visible {
74 | outline: 4px auto -webkit-focus-ring-color;
75 | }
76 |
77 | /*@media (prefers-color-scheme: light) {*/
78 | /* :root {*/
79 | /* color: #213547;*/
80 | /* background-color: #ffffff;*/
81 | /* }*/
82 | /* a:hover {*/
83 | /* color: #747bff;*/
84 | /* }*/
85 | /* button {*/
86 | /* background-color: #f9f9f9;*/
87 | /* }*/
88 | /*}*/
89 |
--------------------------------------------------------------------------------
/client/src/services/notifications.js:
--------------------------------------------------------------------------------
1 | import * as tates from "tates";
2 | import { createStateHook } from "react-tates";
3 |
4 | /**
5 | * @typedef {Object} Notification
6 | * @property {string | string[] | ArrayLike } text
7 | * @property {string} label?
8 | * @property {'warning' | 'danger' | 'success' | 'info'} severity?
9 | *
10 | * @typedef {Object} NotificationState
11 | * @property {Notification | null} notification
12 | * @property {number} loadTime
13 | * @property {boolean} timerRunning
14 | */
15 |
16 | const tate = /** @type {tates.State} */ tates.createState();
17 | const { state } = tate;
18 |
19 | export const actions = {
20 | /**
21 | * @param { Notification | null } Notification
22 | */
23 | notify(notification = null) {
24 | state.notification = notification;
25 | },
26 |
27 | loadTime(time) {
28 | state.loadTime = time;
29 | },
30 |
31 | startTimer() {
32 | state.loadTime = 0;
33 | state.timerRunning = true;
34 | },
35 |
36 | stopTimer() {
37 | state.timerRunning = false;
38 | },
39 |
40 | /**
41 | * @param {unknown} e
42 | */
43 | handleError(e) {
44 | console.error(e);
45 | let errorMessage = "Unknown error ocurred";
46 | if (utils.isErrorLike(e)) {
47 | errorMessage = e.message;
48 | }
49 |
50 | actions.notify({
51 | text: errorMessage,
52 | severity: "danger",
53 | });
54 | },
55 | };
56 |
57 | /**
58 | * Lets you know when there is a new global notification
59 | */
60 | export const hooks = {
61 | useNotification: createStateHook({
62 | tate,
63 | property: "notifcation",
64 | initialValue: /** @type {Notification | null} */ (null),
65 | }),
66 |
67 | useLoadTime: createStateHook({
68 | tate,
69 | property: "loadTime",
70 | initialValue: 0,
71 | }),
72 |
73 | useTimerRunning: createStateHook({
74 | tate,
75 | property: "timerRunning",
76 | initialValue: 0,
77 | }),
78 | };
79 |
--------------------------------------------------------------------------------
/client/src/pages/Races.jsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { useSearchParams } from "react-router-dom";
3 | import Race from "../components/Race.jsx";
4 | import { actions, hooks } from "../services/races.js";
5 | import { hooks as notifications } from "../services/notifications.js";
6 | import "../css/Races.css";
7 | import Progress from "../components/Progress.jsx";
8 |
9 | function queryToNumber(query) {
10 | if (typeof query !== "string" && typeof query !== "number") {
11 | return;
12 | }
13 |
14 | if (typeof query === "string") {
15 | query = query.trim();
16 | }
17 |
18 | query = Number(query);
19 |
20 | if (!isFinite(query)) {
21 | return;
22 | }
23 |
24 | return query;
25 | }
26 |
27 | function Races() {
28 | const [params, setParams] = useSearchParams({ year: "2024" });
29 | const queryYear = queryToNumber(params.get("year"));
30 | const timerRunning = notifications.useTimerRunning();
31 | const races = hooks.useRacesByYear({
32 | actionArgs: queryYear ? [queryYear] : undefined,
33 | });
34 |
35 | //Load Race year data on search
36 | async function handleSearch(e) {
37 | e.preventDefault();
38 |
39 | if (timerRunning) {
40 | return;
41 | }
42 |
43 | const search = e.target.search.value;
44 | const year = queryToNumber(search);
45 |
46 | if (year) {
47 | await actions.byYear(year);
48 | setParams({ year });
49 | }
50 | }
51 |
52 | return (
53 |
54 |
68 |
69 | {timerRunning ? (
70 |
73 | ) : (
74 |
75 | {races.map((race) => (
76 |
77 | ))}
78 |
79 | )}
80 |
81 | );
82 | }
83 |
84 | export default Races;
85 |
--------------------------------------------------------------------------------
/client/src/components/NavBar.jsx:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 | import "../css/NavBar.css";
3 | import * as racesService from "../services/races.js";
4 | import * as notificationService from "../services/notifications.js";
5 | import Progress from "./Progress.jsx";
6 | import { useState } from "react";
7 | import Modal from "./Modal.jsx";
8 |
9 | function NavBar() {
10 | const [modal, setModal] = useState(false);
11 | const count = racesService.hooks.useCount();
12 | const queries = racesService.hooks.useQueries();
13 | const loadTime = notificationService.hooks.useLoadTime();
14 | const timerRunning = notificationService.hooks.useTimerRunning();
15 |
16 | function handleCacheButtonClick(ev) {
17 | ev.preventDefault();
18 |
19 | if (count > 0) {
20 | racesService.actions.clear();
21 | } else {
22 | racesService.actions.cache();
23 | }
24 | }
25 |
26 | function formatTime(milliseconds) {
27 | const seconds = Math.floor((milliseconds % 60000) / 1000);
28 | const ms = Math.floor(milliseconds % 1000);
29 |
30 | return `${seconds}${String(ms).padStart(3, "0")} ms`;
31 | }
32 |
33 | return (
34 |
72 | );
73 | }
74 |
75 | export default NavBar;
76 |
--------------------------------------------------------------------------------
/client/src/css/Race.css:
--------------------------------------------------------------------------------
1 | input {
2 | outline: none;
3 | }
4 |
5 | input[type="number"] {
6 | -moz-appearance: textfield;
7 | appearance: textfield;
8 | }
9 |
10 | input:invalid {
11 | border: 1px solid #ff4438;
12 | }
13 |
14 | .race {
15 | position: relative;
16 | border-radius: 8px;
17 | overflow: hidden;
18 | background-color: #1a1a1a;
19 | transition: transform 0.2s;
20 | height: 90%;
21 | display: flex;
22 | flex-direction: column;
23 | }
24 |
25 | .race:hover {
26 | transform: translateY(-5px);
27 | }
28 |
29 | .driver-img,
30 | .race-img {
31 | position: relative;
32 | width: 100%;
33 | height: 70%;
34 |
35 | img {
36 | /* aspect-ratio: 2/3; */
37 | max-width: 100%;
38 | max-height: 100%;
39 | width: auto;
40 | height: auto;
41 | object-fit: cover;
42 | }
43 | }
44 |
45 | .race-img {
46 | background-color: #163341;
47 | }
48 |
49 | .race-overlay {
50 | position: absolute;
51 | top: 0;
52 | left: 0;
53 | right: 0;
54 | bottom: 0;
55 | background: linear-gradient(
56 | to bottom,
57 | rgba(0, 0, 0, 0.1),
58 | rgba(0, 0, 0, 0.8)
59 | );
60 | opacity: 0;
61 | transition: opacity 0.2s;
62 | display: flex;
63 | flex-direction: column;
64 | justify-content: flex-end;
65 | padding: 1rem;
66 | }
67 |
68 | .race:hover .race-overlay {
69 | opacity: 1;
70 | }
71 |
72 | .bookmark-btn {
73 | position: absolute;
74 | top: 1rem;
75 | right: 1rem;
76 | color: white;
77 | font-size: 1.5rem;
78 | padding: 0.5rem;
79 | background-color: rgba(0, 0, 0, 0.5);
80 | border-radius: 50%;
81 | width: 40px;
82 | height: 40px;
83 | display: flex;
84 | align-items: center;
85 | justify-content: center;
86 | transition: background-color 0.2s;
87 | }
88 |
89 | .bookmark-btn:hover {
90 | background-color: rgba(0, 0, 0, 0.8);
91 | }
92 |
93 | .bookmark-btn.active {
94 | color: #dcff1e;
95 | }
96 |
97 | .rating-select {
98 | background-color: rgba(0, 0, 0, 0.7);
99 | color: white;
100 | border: none;
101 | padding: 0.5rem;
102 | border-radius: 4px;
103 | cursor: pointer;
104 | margin-top: 0.5rem;
105 | }
106 |
107 | .race-info {
108 | padding: 1rem;
109 | flex: 1;
110 | display: flex;
111 | flex-direction: column;
112 | gap: 0.5rem;
113 | }
114 |
115 | .race-info h3 {
116 | font-size: 1rem;
117 | margin: 0;
118 | }
119 |
120 | .race-info p {
121 | color: #999;
122 | font-size: 0.9rem;
123 | }
124 |
125 | .user-rating {
126 | color: #ffd700;
127 | font-size: 0.9rem;
128 | margin-top: auto;
129 | }
130 |
131 | @media (max-width: 768px) {
132 | .race {
133 | font-size: 0.9rem;
134 | }
135 |
136 | .race-info {
137 | padding: 0.75rem;
138 | }
139 |
140 | .bookmark-btn {
141 | width: 32px;
142 | height: 32px;
143 | font-size: 1.2rem;
144 | }
145 | }
146 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | This demo uses Redis as a frontend cache for BigQuery. It demonstrates how to
2 | apply the cache prefetching strategy and use Redis for JSON storage and search.
3 | The app is written in Express and React with vite.
4 |
5 | ## Requirements
6 |
7 | - [gcloud
8 | credentials](https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment)
9 | - [BigQuery](https://cloud.google.com/bigquery) setup with the [Formula One](https://www.kaggle.com/datasets/rohanrao/formula-1-world-championship-1950-2020) dataset loaded
10 | - [bun](https://bun.sh/)
11 | - [docker](https://www.docker.com/)
12 | - Optional
13 |
14 | ## Getting started
15 |
16 | Copy and edit the `.env` file:
17 |
18 | ```bash
19 | cp .env.example .env
20 | ```
21 |
22 | Your `.env` file should contain the connection string you copied from Redis Cloud. It also has the Google Cloud credentials for connecting to BigQuery.
23 |
24 | 1. Copy the JSON from the generated `application_default_credentials.json` into your `.env` file using the `GOOGLE_APPLICATION_CREDENTIALS` variable
25 | 2. Set the `GOOGLE_CLOUD_PROJECT_ID` environment variable in your `.env` file to the associated gcloud project you want to use.
26 |
27 | Your `.env.docker` file will overwrite the REDIS_URL to use the appropriate docker internal URLs. Here is
28 | an example:
29 |
30 | ```bash
31 | REDIS_URL="redis://redis:6379"
32 | ```
33 |
34 | Next, spin up docker containers:
35 |
36 | ```bash
37 | docker compose up -d --build
38 | ```
39 |
40 | You should have a server running on `http://localhost:` where the port is set in your `.env` file (default is 8080).
41 |
42 | Visit the localhost url to see your site.
43 |
44 | ## Running locally outside docker
45 |
46 | To run the development server outside of docker:
47 |
48 | ```bash
49 | bun install
50 | # then
51 | bun dev
52 | ```
53 |
54 | ## Other Scripts
55 |
56 | Formatting code:
57 |
58 | ```bash
59 | bun format
60 | ```
61 |
62 | ## Connecting to Redis Cloud
63 |
64 | If you don't yet have a database setup in Redis Cloud [get started here for free](https://redis.io/try-free/).
65 |
66 | To connect to a Redis Cloud database, log into the console and find the following:
67 |
68 | 1. The `public endpoint` (looks like `redis-#####.c###.us-east-1-#.ec2.redns.redis-cloud.com:#####`)
69 | 1. Your `username` (`default` is the default username, otherwise find the one you setup)
70 | 1. Your `password` (either setup through Data Access Control, or available in the `Security` section of the database
71 | page.
72 |
73 | Combine the above values into a connection string and put it in your `.env` and `.env.docker` accordingly. It should
74 | look something like the following:
75 |
76 | ```bash
77 | REDIS_URL="redis://default:@redis-#####.c###.us-west-2-#.ec2.redns.redis-cloud.com:#####"
78 | ```
79 |
80 | ## Learn more
81 |
82 | To learn more about Redis, take a look at the following resources:
83 |
84 | - [Redis Documentation](https://redis.io/docs/latest/) - learn about Redis products, features, and commands.
85 | - [Learn Redis](https://redis.io/learn/) - read tutorials, quick starts, and how-to guides for Redis.
86 |
--------------------------------------------------------------------------------
/client/src/css/Progress.css:
--------------------------------------------------------------------------------
1 | .circular-progress {
2 | -webkit-appearance: none;
3 | -moz-appearance: none;
4 | appearance: none;
5 | box-sizing: border-box;
6 | border: none;
7 | border-radius: 50%;
8 | padding: 0.25rem;
9 | width: 2rem;
10 | height: 2rem;
11 | color: #dcff1e;
12 | background-color: transparent;
13 | overflow: hidden;
14 | vertical-align: middle;
15 | }
16 |
17 | .circular-progress::-webkit-progress-bar {
18 | background-color: transparent;
19 | }
20 |
21 | /* Indeterminate */
22 | .circular-progress:indeterminate {
23 | -webkit-mask-image:
24 | linear-gradient(transparent 50%, black 50%),
25 | linear-gradient(to right, transparent 50%, black 50%);
26 | mask-image:
27 | linear-gradient(transparent 50%, black 50%),
28 | linear-gradient(to right, transparent 50%, black 50%);
29 | animation: circular-progress 6s infinite cubic-bezier(0.3, 0.6, 1, 1);
30 | }
31 |
32 | :-ms-lang(x),
33 | .circular-progress:indeterminate {
34 | animation: none;
35 | }
36 |
37 | .circular-progress:indeterminate::before,
38 | .circular-progress:indeterminate::-webkit-progress-value {
39 | content: "";
40 | display: block;
41 | box-sizing: border-box;
42 | margin-bottom: 0.25em;
43 | border: solid 0.25em transparent;
44 | border-top-color: currentColor;
45 | border-radius: 50%;
46 | width: 100% !important;
47 | height: 100%;
48 | background-color: transparent;
49 | animation: pure-material-progress-circular-pseudo 0.75s infinite linear
50 | alternate;
51 | }
52 |
53 | .circular-progress:indeterminate::-moz-progress-bar {
54 | box-sizing: border-box;
55 | border: solid 0.25em transparent;
56 | border-top-color: currentColor;
57 | border-radius: 50%;
58 | width: 100%;
59 | height: 100%;
60 | background-color: transparent;
61 | animation: pure-material-progress-circular-pseudo 0.75s infinite linear
62 | alternate;
63 | }
64 |
65 | .circular-progress:indeterminate::-ms-fill {
66 | animation-name: -ms-ring;
67 | }
68 |
69 | @keyframes circular-progress {
70 | 0% {
71 | transform: rotate(0deg);
72 | }
73 | 12.5% {
74 | transform: rotate(180deg);
75 | animation-timing-function: linear;
76 | }
77 | 25% {
78 | transform: rotate(630deg);
79 | }
80 | 37.5% {
81 | transform: rotate(810deg);
82 | animation-timing-function: linear;
83 | }
84 | 50% {
85 | transform: rotate(1260deg);
86 | }
87 | 62.5% {
88 | transform: rotate(1440deg);
89 | animation-timing-function: linear;
90 | }
91 | 75% {
92 | transform: rotate(1890deg);
93 | }
94 | 87.5% {
95 | transform: rotate(2070deg);
96 | animation-timing-function: linear;
97 | }
98 | 100% {
99 | transform: rotate(2520deg);
100 | }
101 | }
102 |
103 | @keyframes pure-material-progress-circular-pseudo {
104 | 0% {
105 | transform: rotate(-30deg);
106 | }
107 | 29.4% {
108 | border-left-color: transparent;
109 | }
110 | 29.41% {
111 | border-left-color: currentColor;
112 | }
113 | 64.7% {
114 | border-bottom-color: transparent;
115 | }
116 | 64.71% {
117 | border-bottom-color: currentColor;
118 | }
119 | 100% {
120 | border-left-color: currentColor;
121 | border-bottom-color: currentColor;
122 | transform: rotate(225deg);
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/server/services/wikipedia.js:
--------------------------------------------------------------------------------
1 | import fs from "fs/promises";
2 | import path from "path";
3 | const jsdom = require("jsdom");
4 | const { JSDOM } = jsdom;
5 |
6 | const circuitsFilePath = path.resolve("assets/circuit_images.json");
7 | const driversFilePath = path.resolve("assets/driver_images.json");
8 | const query =
9 | "https://en.wikipedia.org/w/api.php?action=query&prop=pageimages&format=json&piprop=original&titles=";
10 | const titleRegex = /[^\/]*$/g;
11 |
12 | export async function findImageUrl(url, type) {
13 | if (typeof url !== "string") {
14 | return;
15 | }
16 |
17 | try {
18 | let existingImage;
19 |
20 | if (type === "circuit") {
21 | existingImage = await findCircuitImageFromFile(url);
22 | } else if (type === "driver") {
23 | existingImage = await findDriverImageFromFile(url);
24 | }
25 |
26 | if (typeof existingImage === "string") {
27 | return existingImage;
28 | }
29 |
30 | const urlResponse = await fetch(url, {
31 | method: "GET",
32 | });
33 |
34 | if (!urlResponse.ok) {
35 | return;
36 | }
37 |
38 | const dom = new JSDOM(await urlResponse.text());
39 | const h1 = dom.window.document.querySelector("h1")?.textContent;
40 | const responseUrl = urlResponse.url ?? url;
41 | const [title] = h1 ? [h1] : (responseUrl.match(titleRegex) ?? []);
42 |
43 | if (!title) {
44 | return;
45 | }
46 | const result = await fetch(`${query}${title}`);
47 |
48 | if (!result.ok) {
49 | return;
50 | }
51 |
52 | const data = await result.json();
53 | const pages = data.query.pages;
54 |
55 | for (let article of Object.values(pages)) {
56 | if (typeof article.original?.source === "string") {
57 | if (type === "circuit") {
58 | await saveCircuitImage(url, article.original.source);
59 | } else if (type === "driver") {
60 | await saveDriverImage(url, article.original.source);
61 | }
62 | return article.original.source;
63 | } else {
64 | if (type === "circuit") {
65 | await saveCircuitImage(url, "");
66 | } else if (type === "driver") {
67 | await saveDriverImage(url, "");
68 | }
69 |
70 | console.log(`No image found for: ${url}`);
71 | }
72 | }
73 | } catch (e) {
74 | console.log(`Error getting image for: ${url}`);
75 | console.log(e);
76 | }
77 | }
78 |
79 | /**
80 | * Reads or creates the file and returns the data
81 | */
82 | async function readFile(filePath) {
83 | try {
84 | await fs.access(filePath);
85 | } catch (e) {
86 | await fs.writeFile(filePath, "{}");
87 | }
88 |
89 | const file = await fs.readFile(filePath);
90 |
91 | return JSON.parse(file);
92 | }
93 |
94 | /**
95 | * Finds images in the circuits file for a given url
96 | *
97 | * @param {string} url
98 | * @returns {Promise}
99 | */
100 | async function findCircuitImageFromFile(url) {
101 | const data = await readFile(circuitsFilePath);
102 |
103 | return data[url];
104 | }
105 |
106 | /**
107 | * Saves circuit images to a file
108 | * @param {string} url The circuit wikipedia url
109 | * @param {string} imageUrl The circuit image url
110 | */
111 | async function saveCircuitImage(url, imageUrl) {
112 | const data = await readFile(circuitsFilePath);
113 | data[url] = imageUrl;
114 |
115 | await fs.writeFile(circuitsFilePath, JSON.stringify(data, null, 2));
116 | }
117 |
118 | /** Finds images in the drivers file for a given url
119 | *
120 | * @param {string} url
121 | * @returns {Promise}
122 | */
123 | async function findDriverImageFromFile(url) {
124 | const data = await readFile(driversFilePath);
125 |
126 | return data[url];
127 | }
128 |
129 | /**
130 | * Saves drivers images to a file
131 | * @param {string} url The driver wikipedia url
132 | * @param {string} imageUrl The driver image url
133 | */
134 | async function saveDriverImage(url, imageUrl) {
135 | const data = await readFile(driversFilePath);
136 | data[url] = imageUrl;
137 |
138 | await fs.writeFile(driversFilePath, JSON.stringify(data, null, 2));
139 | }
140 |
--------------------------------------------------------------------------------
/server/components/races/store.js:
--------------------------------------------------------------------------------
1 | import { BigQuery } from "@google-cloud/bigquery";
2 | import { getClient } from "../../redis";
3 | import { SchemaFieldTypes } from "redis";
4 | import { findImageUrl } from "../../services/wikipedia";
5 |
6 | /**
7 | * @typedef {Object} RaceResult
8 | * @property {number} result_id
9 | * @property {number} race_id
10 | * @property {number} driver_id
11 | * @property {number} constructor_id
12 | * @property {number} position
13 | * @property {string} time
14 | * @property {number} laps
15 | * @property {string} driver_forename
16 | * @property {string} driver_surname
17 | * @property {string} driver_url
18 | * @property {string} constructor_name
19 | *
20 | * @typedef {Object} Race
21 | * @property {number} race_id
22 | * @property {number} year
23 | * @property {number} round
24 | * @property {number} circuit_id
25 | * @property {string} name
26 | * @property {string} date
27 | * @property {string} time
28 | * @property {string} url
29 | * @property {string} circuit_name
30 | * @property {string} circuit_location
31 | * @property {string} circuit_country
32 | * @property {string} circuit_url
33 | * @property {string} circuit_image
34 | * @property {RaceResult[]} results
35 | * @property {RaceResult} winner
36 | *
37 | * @typedef {Object} RaceDocument
38 | * @property {string} id
39 | * @property {Race} value
40 | *
41 | * @typedef {Object} Races
42 | * @property {number} total
43 | * @property {RaceDocument} documents
44 | */
45 |
46 | const bq = new BigQuery({
47 | credentials: JSON.parse(process.env.GOOGLE_APPLICATION_CREDENTIALS),
48 | projectId: process.env.GOOGLE_CLOUD_PROJECT_ID,
49 | });
50 | const RACES_INDEX = "races-idx";
51 | const RACES_PREFIX = "races:";
52 | const QUERIES = {
53 | RACES: `SELECT
54 | r.raceId AS race_id,
55 | r.year AS year,
56 | r.round AS round,
57 | r.circuitId AS circuit_id,
58 | r.name AS name,
59 | r.date AS date,
60 | r.time AS time,
61 | r.url AS url,
62 | c.name AS circuit_name,
63 | c.location AS circuit_location,
64 | c.country AS circuit_country,
65 | c.url AS circuit_url,
66 | FROM
67 | f1.races r
68 | JOIN
69 | f1.circuits c
70 | ON c.circuitId = r.circuitId
71 | ORDER BY r.date desc`,
72 | RESULTS: `SELECT
73 | re.resultId AS result_id,
74 | re.raceId AS race_id,
75 | re.driverId AS driver_id,
76 | re.constructorId AS constructor_id,
77 | re.position AS position,
78 | re.time AS time,
79 | re.laps AS laps,
80 | d.forename AS driver_forename,
81 | d.surname AS driver_surname,
82 | d.url AS driver_url,
83 | c.name AS constructor_name
84 | FROM
85 | f1.results re
86 | JOIN
87 | f1.drivers d
88 | ON
89 | d.driverId = re.driverId
90 | JOIN
91 | f1.constructors c
92 | ON
93 | c.constructorId = re.constructorId
94 | WHERE
95 | re.position IS NOT NULL
96 | ORDER BY re.raceId ASC, re.position ASC`,
97 | };
98 |
99 | async function haveIndex() {
100 | const redis = await getClient();
101 | const indexes = await redis.ft._list();
102 |
103 | return indexes.some((index) => {
104 | return index === RACES_INDEX;
105 | });
106 | }
107 |
108 | export async function createdIndexIfNotExists() {
109 | const redis = await getClient();
110 |
111 | if (!(await haveIndex())) {
112 | await redis.ft.create(
113 | RACES_INDEX,
114 | {
115 | "$.race_id": {
116 | AS: "race_id",
117 | type: SchemaFieldTypes.NUMERIC,
118 | },
119 | "$.year": {
120 | AS: "year",
121 | type: SchemaFieldTypes.NUMERIC,
122 | },
123 | },
124 | {
125 | ON: "JSON",
126 | PREFIX: RACES_PREFIX,
127 | },
128 | );
129 | }
130 | }
131 |
132 | export async function dropIndex() {
133 | const redis = await getClient();
134 |
135 | if (await haveIndex()) {
136 | await redis.ft.dropIndex(RACES_INDEX);
137 | }
138 | }
139 |
140 | export async function initialize() {
141 | await createdIndexIfNotExists();
142 | }
143 |
144 | export async function getRaceKeys() {
145 | const redis = await getClient();
146 |
147 | return redis.keys(`${RACES_PREFIX}*`);
148 | }
149 |
150 | export async function delAll() {
151 | const redis = await getClient();
152 |
153 | const keys = await getRaceKeys();
154 |
155 | if (keys.length > 0) {
156 | await redis.del(keys);
157 | }
158 | }
159 |
160 | export async function count() {
161 | const keys = await getRaceKeys();
162 |
163 | return keys.length;
164 | }
165 |
166 | export async function populate() {
167 | await delAll();
168 | const redis = await getClient();
169 | const [races] = /** @type [Race[]] */ (await bq.query(QUERIES.RACES));
170 | const [results] = /** @type [RaceResult[]] */ (
171 | await bq.query(QUERIES.RESULTS)
172 | );
173 | const circuitsUrls = {};
174 |
175 | for (let race of races) {
176 | let imageUrls = circuitsUrls[race.circuit_url];
177 |
178 | if (!Array.isArray(imageUrls)) {
179 | imageUrls = circuitsUrls[race.circuit_url] = [];
180 | }
181 |
182 | imageUrls.push(race);
183 |
184 | race.results = results.filter((result) => result.race_id === race.race_id);
185 | race.winner = race.results.find((result) => result.position === 1);
186 | }
187 |
188 | for (let result of results) {
189 | let image = await findImageUrl(result.driver_url, "driver");
190 | result.driver_image = image ?? "";
191 | }
192 |
193 | for (let circuitUrl of Object.keys(circuitsUrls)) {
194 | let image = await findImageUrl(circuitUrl, "circuit");
195 | for (let race of circuitsUrls[circuitUrl]) {
196 | race.circuit_image = image ?? "";
197 | }
198 | }
199 |
200 | await redis.json.mSet(
201 | races.map((race) => {
202 | return {
203 | key: `${RACES_PREFIX}${race.race_id}`,
204 | path: "$",
205 | value: race,
206 | };
207 | }),
208 | );
209 | }
210 |
211 | export async function byYear(year) {
212 | const total = await count();
213 |
214 | if (total <= 0) {
215 | await populate();
216 | }
217 |
218 | const redis = await getClient();
219 |
220 | return /** @type {Promise} */ redis.ft.search(
221 | RACES_INDEX,
222 | `@year==${year}`,
223 | {
224 | DIALECT: 2,
225 | LIMIT: { from: 0, size: 9999 },
226 | },
227 | );
228 | }
229 |
230 | export async function one(raceId) {
231 | const total = await count();
232 |
233 | if (total <= 0) {
234 | await populate();
235 | }
236 |
237 | const redis = await getClient();
238 |
239 | return /** @type Promise */ (
240 | redis.json.get(`${RACES_PREFIX}${raceId}`)
241 | );
242 | }
243 |
--------------------------------------------------------------------------------
/client/src/services/races.js:
--------------------------------------------------------------------------------
1 | import * as tates from "tates";
2 |
3 | import { actions as notifications } from "./notifications";
4 | import { createStateHook } from "react-tates";
5 |
6 | /**
7 | * @typedef {Object} RaceResult
8 | * @property {number} result_id
9 | * @property {number} race_id
10 | * @property {number} driver_id
11 | * @property {number} constructor_id
12 | * @property {number} position
13 | * @property {string} time
14 | * @property {number} laps
15 | * @property {string} driver_forename
16 | * @property {string} driver_surname
17 | * @property {string} driver_url
18 | * @property {string} constructor_name
19 | *
20 | * @typedef {Object} Race
21 | * @property {number} race_id
22 | * @property {number} year
23 | * @property {number} round
24 | * @property {number} circuit_id
25 | * @property {string} name
26 | * @property {{ value: string }} date
27 | * @property {string} time
28 | * @property {string} url
29 | * @property {string} circuit_name
30 | * @property {string} circuit_location
31 | * @property {string} circuit_country
32 | * @property {string} circuit_url
33 | * @property {string} circuit_image
34 | * @property {RaceResult[]} results
35 | * @property {RaceResult} winner
36 | *
37 | * @typedef {Object} RaceDocument
38 | * @property {string} id
39 | * @property {Race} value
40 | *
41 | * @typedef {Object} Races
42 | * @property {number} total
43 | * @property {RaceDocument} documents
44 | *
45 | * @typedef {Object} RacesState
46 | * @property {Race[]} races
47 | * @property {number} year
48 | * @property {number} raceId
49 | * @property {Race} race
50 | * @property {{ sql: string; redis: string; }} queries
51 | * @property {number} count
52 | *
53 | * @typedef {Object} RacesResponse
54 | * @property {number} ms
55 | * @property {Races} data
56 | *
57 | * @typedef {Object} RaceResponse
58 | * @property {number} ms
59 | * @property {Race} data
60 | *
61 | * @typedef {Object} CacheResponse
62 | * @property {number} ms
63 | */
64 |
65 | const tate = /** @type {tates.State} */ (tates.createState());
66 | const { state } = tate;
67 | const racesSql = `SELECT Row_number() OVER(ORDER BY races.date DESC) AS id,
68 | races.race_id,
69 | races.year,
70 | Format_date('%b-%d-%Y', races.date) AS date,
71 | races.name,
72 | circuits.location AS circuit_location,
73 | circuits.country AS circuit_country,
74 | drivers.forename AS winner_forename,
75 | drivers.surname AS winner_surname,
76 | FROM f1.drivers AS drivers
77 | JOIN f1.results AS results
78 | ON drivers.driverid = results.driverid
79 | JOIN f1.races AS races
80 | ON races.raceid = results.raceid
81 | JOIN f1.circuits AS circuits
82 | ON races.circuitid = circuits.circuitid
83 | WHERE results.position = 1
84 | AND races.year = $year;`;
85 | const racesRedis = `FT.SEARCH races-idx "@year==$year" DIALECT 2`;
86 | const raceSql = `SELECT Row_number() OVER(ORDER BY results.position ASC) AS id,
87 | results.position,
88 | Format_date('%b-%d-%Y', races.date) AS date,
89 | races.name AS name,
90 | circuits.name AS circuit_name,
91 | circuits.location AS circuit_location,
92 | circuits.country AS circuit_country,
93 | drivers.forename AS driver_forename,
94 | drivers.surname AS driver_surname,
95 | results.laps,
96 | results.time,
97 | constructors.name AS constructor,
98 | drivers.url AS driver_url,
99 | circuits.url AS circuit_url
100 | FROM f1.results AS results
101 | JOIN f1.races AS races
102 | ON results.raceid = races.raceid
103 | JOIN f1.drivers AS drivers
104 | ON results.driverid = drivers.driverid
105 | JOIN f1.circuits AS circuits
106 | ON races.circuitid = circuits.circuitid
107 | JOIN f1.constructors AS constructors
108 | ON results.constructorid = constructors.constructorid
109 | WHERE races.raceid = $raceid
110 | AND results.position IS NOT NULL`;
111 | const raceRedis = `JSON.GET races:$raceId`;
112 |
113 | export const actions = {
114 | /**
115 | * @param {number} year
116 | */
117 | async byYear(year = 2024) {
118 | notifications.startTimer();
119 |
120 | const response = await fetch(`/api/races/year/${year}`);
121 | const racesResults = /** @type RacesResponse */ (await response.json());
122 |
123 | notifications.stopTimer();
124 | notifications.loadTime(racesResults.ms);
125 |
126 | state.year = year;
127 | state.queries = {
128 | sql: racesSql.replace("$year", year),
129 | redis: racesRedis.replace("$year", year),
130 | };
131 | state.races = racesResults.data.documents.map((doc) => doc.value);
132 | actions.count();
133 | },
134 |
135 | /**
136 | * @param {number} raceId
137 | */
138 | async one(raceId) {
139 | if (!raceId) {
140 | return;
141 | }
142 |
143 | notifications.startTimer();
144 |
145 | const response = await fetch(`/api/races/${raceId}`);
146 | const raceResponse = /** @type RaceResponse */ (await response.json());
147 |
148 | notifications.stopTimer();
149 | notifications.loadTime(raceResponse.ms);
150 |
151 | state.raceId = raceId;
152 | state.queries = {
153 | sql: raceSql.replace("$raceId", raceId),
154 | redis: raceRedis.replace("$raceId", raceId),
155 | };
156 | state.race = raceResponse.data;
157 | actions.count();
158 | },
159 |
160 | async count() {
161 | const response = await fetch(`/api/races/count`);
162 | const total = /** @type number */ (await response.json());
163 |
164 | state.count = total;
165 | },
166 |
167 | async clear() {
168 | await fetch(`/api/races/clear`);
169 |
170 | state.count = 0;
171 | state.races = [];
172 | state.race = null;
173 | },
174 |
175 | async cache() {
176 | notifications.startTimer();
177 |
178 | const response = await fetch(`/api/races/cache`);
179 | const { ms } = /** @type CacheResponse */ (await response.json());
180 |
181 | notifications.stopTimer();
182 |
183 | await actions.byYear(state.year);
184 | await actions.one(state.raceId);
185 | await actions.count();
186 |
187 | setTimeout(() => {
188 | notifications.loadTime(ms);
189 | }, 200);
190 | },
191 | };
192 |
193 | export const hooks = {
194 | useRacesByYear: createStateHook({
195 | tate,
196 | action: actions.byYear,
197 | property: "races",
198 | initialValue: /** @type {Race[]} */ ([]),
199 | }),
200 |
201 | useRace: createStateHook({
202 | tate,
203 | action: actions.one,
204 | property: "race",
205 | initialValue: /** @type {Race | null} */ (null),
206 | }),
207 |
208 | useCount: createStateHook({
209 | tate,
210 | action: actions.count,
211 | property: "count",
212 | initialValue: 0,
213 | }),
214 |
215 | useQueries: createStateHook({
216 | tate,
217 | action: actions.count,
218 | property: "queries",
219 | initialValue: { sql: "", redis: "" },
220 | }),
221 | };
222 |
--------------------------------------------------------------------------------
/assets/circuit_images.json:
--------------------------------------------------------------------------------
1 | {
2 | "http://en.wikipedia.org/wiki/Yas_Marina_Circuit": "https://upload.wikimedia.org/wikipedia/commons/b/b0/Yas_Marina_Circuit.png",
3 | "http://en.wikipedia.org/wiki/Losail_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Lusail_International_Circuit_2023.svg",
4 | "https://en.wikipedia.org/wiki/Las_Vegas_Grand_Prix#Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/43/2023_Las_Vegas_street_circuit.svg",
5 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Jos%C3%A9_Carlos_Pace": "https://upload.wikimedia.org/wikipedia/commons/c/cf/Aut%C3%B3dromo_Jos%C3%A9_Carlos_Pace_%28AKA_Interlagos%29_track_map.svg",
6 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez": "https://upload.wikimedia.org/wikipedia/commons/3/36/Aut%C3%B3dromo_Hermanos_Rodr%C3%ADguez_2015.svg",
7 | "http://en.wikipedia.org/wiki/Circuit_of_the_Americas": "https://upload.wikimedia.org/wikipedia/commons/a/a5/Austin_circuit.svg",
8 | "http://en.wikipedia.org/wiki/Marina_Bay_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Marina_Bay_circuit_2023.svg",
9 | "http://en.wikipedia.org/wiki/Baku_City_Circuit": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Baku_Formula_One_circuit_map.svg",
10 | "http://en.wikipedia.org/wiki/Autodromo_Nazionale_Monza": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Monza_track_map.svg",
11 | "http://en.wikipedia.org/wiki/Circuit_Zandvoort": "https://upload.wikimedia.org/wikipedia/commons/7/78/Zandvoort_Circuit.png",
12 | "http://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps": "https://upload.wikimedia.org/wikipedia/commons/5/54/Spa-Francorchamps_of_Belgium.svg",
13 | "http://en.wikipedia.org/wiki/Hungaroring": "https://upload.wikimedia.org/wikipedia/commons/9/91/Hungaroring.svg",
14 | "http://en.wikipedia.org/wiki/Silverstone_Circuit": "https://upload.wikimedia.org/wikipedia/commons/b/bd/Silverstone_Circuit_2020.png",
15 | "http://en.wikipedia.org/wiki/Red_Bull_Ring": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Spielberg_bare_map_numbers_contextless_2021_corner_names.svg",
16 | "http://en.wikipedia.org/wiki/Circuit_de_Barcelona-Catalunya": "https://upload.wikimedia.org/wikipedia/commons/8/87/Circuit_de_Catalunya_moto_2021.svg",
17 | "http://en.wikipedia.org/wiki/Circuit_Gilles_Villeneuve": "https://upload.wikimedia.org/wikipedia/commons/f/f9/%C3%8Ele_Notre-Dame_%28Circuit_Gilles_Villeneuve%29.svg",
18 | "http://en.wikipedia.org/wiki/Circuit_de_Monaco": "https://upload.wikimedia.org/wikipedia/commons/3/36/Monte_Carlo_Formula_1_track_map.svg",
19 | "http://en.wikipedia.org/wiki/Autodromo_Enzo_e_Dino_Ferrari": "https://upload.wikimedia.org/wikipedia/commons/2/22/Imola_2009.svg",
20 | "http://en.wikipedia.org/wiki/Miami_International_Autodrome": "https://upload.wikimedia.org/wikipedia/commons/4/49/Hard_Rock_Stadium_Circuit_2022.svg",
21 | "http://en.wikipedia.org/wiki/Shanghai_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/1/14/Shanghai_International_Racing_Circuit_track_map.svg",
22 | "http://en.wikipedia.org/wiki/Suzuka_Circuit": "https://upload.wikimedia.org/wikipedia/commons/e/ec/Suzuka_circuit_map--2005.svg",
23 | "http://en.wikipedia.org/wiki/Melbourne_Grand_Prix_Circuit": "https://upload.wikimedia.org/wikipedia/commons/0/0a/Albert_Park_Circuit_2021.svg",
24 | "http://en.wikipedia.org/wiki/Jeddah_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/4c/Jeddah_Street_Circuit_2021.svg",
25 | "http://en.wikipedia.org/wiki/Bahrain_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/2/29/Bahrain_International_Circuit--Grand_Prix_Layout.svg",
26 | "http://en.wikipedia.org/wiki/Paul_Ricard_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Le_Castellet_2019_all_layouts.svg",
27 | "http://en.wikipedia.org/wiki/Istanbul_Park": "https://upload.wikimedia.org/wikipedia/commons/5/5d/Istanbul_park.svg",
28 | "http://en.wikipedia.org/wiki/Sochi_Autodrom": "https://upload.wikimedia.org/wikipedia/commons/d/d3/Circuit_Sochi.svg",
29 | "http://en.wikipedia.org/wiki/Algarve_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/0/0a/Aut%C3%B3dromo_do_Algarve_F1_Sectors.svg",
30 | "http://en.wikipedia.org/wiki/N%C3%BCrburgring": "https://upload.wikimedia.org/wikipedia/commons/8/8d/Nurburgringcircuits.jpg",
31 | "http://en.wikipedia.org/wiki/Mugello_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/38/Mugello_Racing_Circuit_track_map_15_turns.svg",
32 | "http://en.wikipedia.org/wiki/Hockenheimring": "https://upload.wikimedia.org/wikipedia/commons/e/e5/Hockenheim2012.svg",
33 | "http://en.wikipedia.org/wiki/Sepang_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/6/67/Sepang.svg",
34 | "http://en.wikipedia.org/wiki/Buddh_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/44/Buddh_International_Circuit.svg",
35 | "http://en.wikipedia.org/wiki/Korean_International_Circuit": "https://upload.wikimedia.org/wikipedia/commons/2/29/Korea_international_circuit_v3.svg",
36 | "http://en.wikipedia.org/wiki/Valencia_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/f/fd/Circuit_Valencia_street.svg",
37 | "http://en.wikipedia.org/wiki/Fuji_Speedway": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Fuji.svg",
38 | "http://en.wikipedia.org/wiki/Circuit_de_Nevers_Magny-Cours": "https://upload.wikimedia.org/wikipedia/commons/8/87/Circuit_de_Nevers_Magny-Cours.svg",
39 | "http://en.wikipedia.org/wiki/Indianapolis_Motor_Speedway": "https://upload.wikimedia.org/wikipedia/commons/2/29/Indianapolis-motor-speedway-1848561.jpg",
40 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Oscar_Alfredo_G%C3%A1lvez": "https://upload.wikimedia.org/wikipedia/commons/c/c6/Aut%C3%B3dromo_Oscar_y_Juan_G%C3%A1lvez_Circuito_N%C2%B0_6_por_Senna.svg",
41 | "http://en.wikipedia.org/wiki/Circuito_Permanente_de_Jerez": "https://upload.wikimedia.org/wikipedia/commons/a/aa/Circuito_de_Jerez_v2.svg",
42 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_do_Estoril": "https://upload.wikimedia.org/wikipedia/commons/3/39/Estoril_track_map.svg",
43 | "http://en.wikipedia.org/wiki/Adelaide_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/a/aa/Adelaide_%28short_route%29.svg",
44 | "http://en.wikipedia.org/wiki/TI_Circuit": "https://upload.wikimedia.org/wikipedia/commons/b/b4/Circuit_TI_%28Aida%29.png",
45 | "http://en.wikipedia.org/wiki/Donington_Park": "https://upload.wikimedia.org/wikipedia/commons/0/07/Donington_circuit.svg",
46 | "http://en.wikipedia.org/wiki/Kyalami": "https://upload.wikimedia.org/wikipedia/commons/9/92/Kyalami_16.png",
47 | "http://en.wikipedia.org/wiki/Phoenix_street_circuit": "https://upload.wikimedia.org/wikipedia/commons/5/53/Phoenix_Grand_Prix_Route_-_1989%2C_1990.svg",
48 | "http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Internacional_Nelson_Piquet": "https://upload.wikimedia.org/wikipedia/commons/f/f6/Jacarepagu%C3%A1-short_circuit.png",
49 | "http://en.wikipedia.org/wiki/Detroit_street_circuit": "https://upload.wikimedia.org/wikipedia/commons/d/df/TrackMap_Detroit-2023.png",
50 | "http://en.wikipedia.org/wiki/Brands_Hatch": "https://upload.wikimedia.org/wikipedia/commons/c/c5/Logo_Brands_Hatch_Circuit.svg",
51 | "http://en.wikipedia.org/wiki/Fair_Park": "https://upload.wikimedia.org/wikipedia/commons/a/a5/Dallas_Fair_Park_Esplanade.jpg",
52 | "http://en.wikipedia.org/wiki/Dijon-Prenois": "https://upload.wikimedia.org/wikipedia/commons/d/de/Dijon-Prenois_Circuit.svg",
53 | "http://en.wikipedia.org/wiki/Zolder": "https://upload.wikimedia.org/wikipedia/commons/e/e2/Zolder.svg",
54 | "http://en.wikipedia.org/wiki/Long_Beach,_California": "https://upload.wikimedia.org/wikipedia/commons/c/c8/Long_beach3_%28cropped%29.jpg",
55 | "http://en.wikipedia.org/wiki/Las_Vegas_Street_Circuit": "https://upload.wikimedia.org/wikipedia/commons/4/43/2023_Las_Vegas_street_circuit.svg",
56 | "http://en.wikipedia.org/wiki/Circuito_Permanente_Del_Jarama": "https://upload.wikimedia.org/wikipedia/commons/5/5c/Circuito_Permanente_del_Jarama.svg",
57 | "http://en.wikipedia.org/wiki/Watkins_Glen_International": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Watkins_Glen_International_Long_Circuit_2024.svg",
58 | "http://en.wikipedia.org/wiki/Scandinavian_Raceway": "https://upload.wikimedia.org/wikipedia/commons/4/4c/Scandinavian_Raceway.svg",
59 | "http://en.wikipedia.org/wiki/Mosport": "https://upload.wikimedia.org/wikipedia/commons/5/51/Mosport-CTMP.svg",
60 | "http://en.wikipedia.org/wiki/Montju%C3%AFc_circuit": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Montju%C3%AFc_circuit.svg",
61 | "http://en.wikipedia.org/wiki/Nivelles-Baulers": "https://upload.wikimedia.org/wikipedia/commons/0/0f/Circuit_Nivelles-Baulers.png",
62 | "http://en.wikipedia.org/wiki/Charade_Circuit": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Circuit_Charade_1958_1988.png",
63 | "http://en.wikipedia.org/wiki/Circuit_Mont-Tremblant": "https://upload.wikimedia.org/wikipedia/commons/8/8d/Circuit_Mont-Tremblant_Track_Map.svg",
64 | "http://en.wikipedia.org/wiki/Rouen-Les-Essarts": "https://upload.wikimedia.org/wikipedia/commons/8/82/Rouen-Les-Essarts.svg",
65 | "http://en.wikipedia.org/wiki/Circuit_de_la_Sarthe#Bugatti_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/35/Circuit_de_la_Sarthe_v2.png",
66 | "http://en.wikipedia.org/wiki/Reims-Gueux": "https://upload.wikimedia.org/wikipedia/commons/f/fa/Circuit-Reims-1954.png",
67 | "http://en.wikipedia.org/wiki/Prince_George_Circuit": "https://upload.wikimedia.org/wikipedia/commons/2/2d/Prince_George_Circuit.svg",
68 | "http://en.wikipedia.org/wiki/Zeltweg_Airfield": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Zeltweg_Airfield_Fliegerhorst_Hinterstoisser_04.jpg",
69 | "http://en.wikipedia.org/wiki/Aintree_Motor_Racing_Circuit": "https://upload.wikimedia.org/wikipedia/commons/3/35/Circuit_Aintree.svg",
70 | "http://en.wikipedia.org/wiki/Riverside_International_Raceway": "https://upload.wikimedia.org/wikipedia/commons/5/50/Riverside_International_Raceway_1980_and_1967.svg",
71 | "http://en.wikipedia.org/wiki/Circuito_da_Boavista": "https://upload.wikimedia.org/wikipedia/commons/2/24/Boavista2.png",
72 | "http://en.wikipedia.org/wiki/Sebring_Raceway": "https://upload.wikimedia.org/wikipedia/commons/4/45/Sebring_International_Raceway.svg",
73 | "http://en.wikipedia.org/wiki/Monsanto_Park_Circuit": "https://upload.wikimedia.org/wikipedia/commons/d/de/Circuit_Monsanto.png",
74 | "http://en.wikipedia.org/wiki/AVUS": "https://upload.wikimedia.org/wikipedia/commons/6/6d/Circuit_AVUS.svg",
75 | "http://en.wikipedia.org/wiki/Ain-Diab_Circuit": "https://upload.wikimedia.org/wikipedia/commons/a/a4/Ain-Diab.svg",
76 | "http://en.wikipedia.org/wiki/Pescara_Circuit": "https://upload.wikimedia.org/wikipedia/commons/d/d9/Circuito_di_Pescara.png",
77 | "http://en.wikipedia.org/wiki/Pedralbes_Circuit": "https://upload.wikimedia.org/wikipedia/commons/5/59/Circuit_Pedralbes.png",
78 | "http://en.wikipedia.org/wiki/Circuit_Bremgarten": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Circuit_Bremgarten.svg"
79 | }
80 |
--------------------------------------------------------------------------------
/assets/driver_images.json:
--------------------------------------------------------------------------------
1 | {
2 | "http://en.wikipedia.org/wiki/Jenson_Button": "https://upload.wikimedia.org/wikipedia/commons/0/0c/Jenson_Button_2024_WEC_Fuji.jpg",
3 | "http://en.wikipedia.org/wiki/Rubens_Barrichello": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Rubinho.jpg",
4 | "http://en.wikipedia.org/wiki/Jarno_Trulli": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Jarno-Trulli-2014-cropped.jpg",
5 | "http://en.wikipedia.org/wiki/Timo_Glock": "https://upload.wikimedia.org/wikipedia/commons/7/73/Timo_Glock_%28cropped%29.JPG",
6 | "http://en.wikipedia.org/wiki/Fernando_Alonso": "https://upload.wikimedia.org/wikipedia/commons/9/97/Alonso-68_%2824710447098%29.jpg",
7 | "http://en.wikipedia.org/wiki/Nico_Rosberg": "https://upload.wikimedia.org/wikipedia/commons/3/31/Nico_Rosberg_2016.jpg",
8 | "http://en.wikipedia.org/wiki/S%C3%A9bastien_Buemi": "https://upload.wikimedia.org/wikipedia/commons/0/05/Ryo_Hirakawa%2C_Brendon_Hartley_%26_Sebastien_Buemi_take_the_podium_for_2nd_in_Hypercar_at_the_2023_Le_Mans_%2853468554280%29_%28cropped%29.jpg",
9 | "http://en.wikipedia.org/wiki/S%C3%A9bastien_Bourdais": "https://upload.wikimedia.org/wikipedia/commons/4/40/Sebastien_Bourdais_in_2021_%2851221641988%29_%28cropped%29.jpg",
10 | "http://en.wikipedia.org/wiki/Adrian_Sutil": "https://upload.wikimedia.org/wikipedia/commons/e/e4/Adrian_Sutil.jpg",
11 | "http://en.wikipedia.org/wiki/Nick_Heidfeld": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Nick_Heidfeld_Goodwood_Festival_of_Speed_2019_%2848242681251%29.jpg",
12 | "http://en.wikipedia.org/wiki/Giancarlo_Fisichella": "https://upload.wikimedia.org/wikipedia/commons/e/e2/Giancarlo_Fisichella_2012_WEC_Fuji.jpg",
13 | "http://en.wikipedia.org/wiki/Mark_Webber_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/e/e3/Mark_Webber_2017_United_States_GP_%28cropped%29.jpg",
14 | "http://en.wikipedia.org/wiki/Sebastian_Vettel": "https://upload.wikimedia.org/wikipedia/commons/c/c9/Sebastian_Vettel_2012_Bahrain_GP.jpg",
15 | "http://en.wikipedia.org/wiki/Robert_Kubica": "https://upload.wikimedia.org/wikipedia/commons/7/7b/Robert_Kubica_at_Monza_2023.jpg",
16 | "http://en.wikipedia.org/wiki/Kimi_R%C3%A4ikk%C3%B6nen": "https://upload.wikimedia.org/wikipedia/commons/f/ff/F12019_Schloss_Gabelhofen_%2822%29_%28cropped%29.jpg",
17 | "http://en.wikipedia.org/wiki/Lewis_Hamilton": "https://upload.wikimedia.org/wikipedia/commons/a/ac/Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg",
18 | "http://en.wikipedia.org/wiki/Felipe_Massa": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Felipe_Massa.jpg",
19 | "http://en.wikipedia.org/wiki/Kazuki_Nakajima": "https://upload.wikimedia.org/wikipedia/commons/b/bc/Kazuki_Nakajima_2012_WEC_Fuji_%28cropped%29.jpg",
20 | "http://en.wikipedia.org/wiki/Nelson_Piquet,_Jr.": "https://upload.wikimedia.org/wikipedia/commons/a/a5/Nelson_Piquet_Jr._2021.jpg",
21 | "http://en.wikipedia.org/wiki/Heikki_Kovalainen": "https://upload.wikimedia.org/wikipedia/commons/2/29/Effect_20190609_091716.jpg",
22 | "http://en.wikipedia.org/wiki/Jaime_Alguersuari": "https://upload.wikimedia.org/wikipedia/commons/8/84/Jaime_Alguersuari_Canada_2010_cropped.jpg",
23 | "http://en.wikipedia.org/wiki/Romain_Grosjean": "https://upload.wikimedia.org/wikipedia/commons/5/58/Grosjean_at_2024_Chevrolet_Detroit_Grand_Prix.jpg",
24 | "http://en.wikipedia.org/wiki/Luca_Badoer": "https://upload.wikimedia.org/wikipedia/commons/9/98/Luca_Badoer_2021_%28cropped%29.jpg",
25 | "http://en.wikipedia.org/wiki/Vitantonio_Liuzzi": "https://upload.wikimedia.org/wikipedia/commons/0/01/Vitantonio_Liuzzi_2011_Malaysia.jpg",
26 | "http://en.wikipedia.org/wiki/Kamui_Kobayashi": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Kamui_Kobayashi_2024_WEC_Fuji_2.jpg",
27 | "http://en.wikipedia.org/wiki/David_Coulthard": "https://upload.wikimedia.org/wikipedia/commons/b/bc/David_Coulthard_Champions_for_Charity_2022_%28cropped%29.jpg",
28 | "http://en.wikipedia.org/wiki/Anthony_Davidson": "https://upload.wikimedia.org/wikipedia/commons/7/7f/Anthony_Davidson_Goodwood_Festival_of_Speed_2019_%2848242774922%29.jpg",
29 | "http://en.wikipedia.org/wiki/Takuma_Sato": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Takuma_Sato_%282021%29.jpg",
30 | "http://en.wikipedia.org/wiki/Ralf_Schumacher": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Ralf_Schumacher%2C_2016.png",
31 | "http://en.wikipedia.org/wiki/Alexander_Wurz": "https://upload.wikimedia.org/wikipedia/commons/e/ef/Alexander_Wurz_-_2016_24_Hours_of_Le_Mans_-_Pit_Walk_%28cropped%29.jpg",
32 | "http://en.wikipedia.org/wiki/Scott_Speed": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Scott_Speed_Sonoma_2024.jpg",
33 | "http://en.wikipedia.org/wiki/Christijan_Albers": "https://upload.wikimedia.org/wikipedia/commons/0/04/Christijan_Albers_2006_%28cropped%29.JPG",
34 | "http://en.wikipedia.org/wiki/Sakon_Yamamoto": "https://upload.wikimedia.org/wikipedia/commons/9/98/Sakon_Yamamoto_2010_Motorsport_Japan.jpg",
35 | "http://en.wikipedia.org/wiki/Michael_Schumacher": "https://upload.wikimedia.org/wikipedia/commons/f/ff/Michael_Schumacher_%28Ferrari%29_-_GP_d%27Italia_1998.jpg",
36 | "http://en.wikipedia.org/wiki/Juan_Pablo_Montoya": "https://upload.wikimedia.org/wikipedia/commons/9/9a/Juan_Pablo_Montoya_at_2021_Indianapolis_500_%2851222252077%29_%28cropped%29.jpg",
37 | "http://en.wikipedia.org/wiki/Christian_Klien": "https://upload.wikimedia.org/wikipedia/commons/9/97/Christian_Klien_%2813994163352%29_%28cropped%29.jpg",
38 | "http://en.wikipedia.org/wiki/Tiago_Monteiro": "https://upload.wikimedia.org/wikipedia/commons/8/88/Tiago_monteiro_spafrancorchamps2014.JPG",
39 | "http://en.wikipedia.org/wiki/Jacques_Villeneuve": "https://upload.wikimedia.org/wikipedia/commons/9/9c/Jacques_Villeneuve_August_2011.jpg",
40 | "http://en.wikipedia.org/wiki/Yuji_Ide": "https://upload.wikimedia.org/wikipedia/commons/9/90/Yuji_Ide_2010_Super_GT_Fuji_400km.jpg",
41 | "http://en.wikipedia.org/wiki/Franck_Montagny": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Franck_Montagny_Le_Mans_drivers_parade_2011_crop.jpg",
42 | "http://en.wikipedia.org/wiki/Pedro_de_la_Rosa": "https://upload.wikimedia.org/wikipedia/commons/f/fe/Pedro_de_la_Rosa_2010_Malaysia.jpg",
43 | "http://en.wikipedia.org/wiki/Robert_Doornbos": "https://upload.wikimedia.org/wikipedia/commons/4/42/Robert_Doornbos_-_Red_Bull_Racing.jpg",
44 | "http://en.wikipedia.org/wiki/Narain_Karthikeyan": "https://upload.wikimedia.org/wikipedia/commons/a/a6/Narain_Karthikeyan_2011_Malaysia2.jpg",
45 | "http://en.wikipedia.org/wiki/Patrick_Friesacher": "https://upload.wikimedia.org/wikipedia/commons/2/26/Patrick_Friesacher.jpg",
46 | "http://en.wikipedia.org/wiki/Ant%C3%B4nio_Pizzonia": "https://upload.wikimedia.org/wikipedia/commons/d/d6/Fale_F1_Monza_2004_13.jpg",
47 | "http://en.wikipedia.org/wiki/Cristiano_da_Matta": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Cdmlb06.jpg",
48 | "http://en.wikipedia.org/wiki/Olivier_Panis": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Olivier_Panis_%28cropped%29.jpg",
49 | "http://en.wikipedia.org/wiki/Giorgio_Pantano": "https://upload.wikimedia.org/wikipedia/commons/7/7d/Giorgio_pantano_brandshatch2014.JPG",
50 | "http://en.wikipedia.org/wiki/Gianmaria_Bruni": "https://upload.wikimedia.org/wikipedia/commons/d/db/Gianmaria_Bruni_2012_WEC_Fuji.jpg",
51 | "http://en.wikipedia.org/wiki/Zsolt_Baumgartner": "https://upload.wikimedia.org/wikipedia/commons/e/e3/ChampCar_2007_Baumgartner.jpg",
52 | "http://en.wikipedia.org/wiki/Marc_Gen%C3%A9": "https://upload.wikimedia.org/wikipedia/commons/6/61/Marc_Gene_2007_Montjuic.jpg",
53 | "http://en.wikipedia.org/wiki/Ricardo_Zonta": "https://upload.wikimedia.org/wikipedia/commons/9/97/Ricardo_Zonta_2007_Curitiba.jpg",
54 | "http://en.wikipedia.org/wiki/Heinz-Harald_Frentzen": "https://upload.wikimedia.org/wikipedia/commons/8/8a/Heinz-Harald_Frentzen_a_%28cropped%29.jpg",
55 | "http://en.wikipedia.org/wiki/Jos_Verstappen": "https://upload.wikimedia.org/wikipedia/commons/b/b9/Jos_Verstappen%2C_2006.jpg",
56 | "http://en.wikipedia.org/wiki/Ralph_Firman": "https://upload.wikimedia.org/wikipedia/commons/8/82/Ralph_Firman_2008_Super_GT.jpg",
57 | "http://en.wikipedia.org/wiki/Justin_Wilson_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Justin_Wilson_2013.jpg",
58 | "http://en.wikipedia.org/wiki/Nicolas_Kiesa": "https://upload.wikimedia.org/wikipedia/commons/6/62/Nicolas_kiesa_lemans2006.jpg",
59 | "http://en.wikipedia.org/wiki/Eddie_Irvine": "https://upload.wikimedia.org/wikipedia/commons/e/eb/Eddie_Irvine_after_the_1999_Australian_Grand_Prix.jpg",
60 | "http://en.wikipedia.org/wiki/Mika_Salo": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Mika_Salo_Le_Mans_2009_cropped.jpg",
61 | "http://en.wikipedia.org/wiki/Alex_Yoong": "https://upload.wikimedia.org/wikipedia/commons/6/69/AlexYoong_0028_%28cropped%29.jpg",
62 | "http://en.wikipedia.org/wiki/Allan_McNish": "https://upload.wikimedia.org/wikipedia/commons/8/87/Allan_Mcnish.jpg",
63 | "http://en.wikipedia.org/wiki/Enrique_Bernoldi": "https://upload.wikimedia.org/wikipedia/commons/f/f7/Enrique_Bernoldi_2007_Curitiba.jpg",
64 | "http://en.wikipedia.org/wiki/Luciano_Burti": "https://upload.wikimedia.org/wikipedia/commons/8/86/Luciano_Burti_2006_Curitiba.jpg",
65 | "http://en.wikipedia.org/wiki/Jean_Alesi": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Jean_Alesi%2C_GIMS_2019%2C_Le_Grand-Saconnex_%28GIMS0047%29.jpg",
66 | "http://en.wikipedia.org/wiki/Mika_H%C3%A4kkinen": "https://upload.wikimedia.org/wikipedia/commons/a/a6/Mika_H%C3%A4kkinen_Champions_for_Charity_2016-07-27.jpg",
67 | "http://en.wikipedia.org/wiki/Gast%C3%B3n_Mazzacane": "https://upload.wikimedia.org/wikipedia/commons/0/01/Gaston_Mazzacane_2018_%28cropped%29.png",
68 | "http://en.wikipedia.org/wiki/Tarso_Marques": "https://upload.wikimedia.org/wikipedia/commons/c/cc/Tarso_Marques_2007_Curitiba.jpg",
69 | "http://en.wikipedia.org/wiki/Tom%C3%A1%C5%A1_Enge": "https://upload.wikimedia.org/wikipedia/commons/5/5c/2021_Barum_Czech_Rally_Zl%C3%ADn_-_Tom%C3%A1%C5%A1_Enge.jpg",
70 | "http://en.wikipedia.org/wiki/Pedro_Diniz": "https://upload.wikimedia.org/wikipedia/commons/1/11/Fazenda_da_Toca_foto_kiko_ferrite_02295_-_Pedro_Paulo_Diniz_%28cropped%29.jpg",
71 | "http://en.wikipedia.org/wiki/Johnny_Herbert": "https://upload.wikimedia.org/wikipedia/commons/b/bf/Johnny_Herbert_%2831729263593%29.jpg",
72 | "http://en.wikipedia.org/wiki/Toranosuke_Takagi": "https://upload.wikimedia.org/wikipedia/commons/f/f2/Toranosuke_Takagi_2008_Super_GT.jpg",
73 | "http://en.wikipedia.org/wiki/Damon_Hill": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Minister_for_Sport_Hugh_Robertson_at_launch_of_GREAT_campaign%2C_Australia_%286841281192%29_%28cropped%29.jpg",
74 | "http://en.wikipedia.org/wiki/Alex_Zanardi": "https://upload.wikimedia.org/wikipedia/commons/3/36/Alex_Zanardi_%28cropped%29.JPG",
75 | "http://en.wikipedia.org/wiki/Jan_Magnussen": "https://upload.wikimedia.org/wikipedia/commons/0/03/Jan_Magnussen_%2837535519996%29_%28cropped%29.jpg",
76 | "http://en.wikipedia.org/wiki/Shinji_Nakano": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Shinji_Nakano_2009_Japan.jpg",
77 | "http://en.wikipedia.org/wiki/Ricardo_Rosset": "https://upload.wikimedia.org/wikipedia/commons/f/fc/Ricarad_Rosset_Thruxton.jpg",
78 | "http://en.wikipedia.org/wiki/Esteban_Tuero": "https://upload.wikimedia.org/wikipedia/commons/b/b6/Esteban_Tuero_2017_%28cropped%29.jpg",
79 | "http://en.wikipedia.org/wiki/Gerhard_Berger": "https://upload.wikimedia.org/wikipedia/commons/c/c9/Gerhard_Berger_1991USA_%28cropped%29.jpg",
80 | "http://en.wikipedia.org/wiki/Nicola_Larini": "https://upload.wikimedia.org/wikipedia/commons/6/6d/Nicola_Larini_2006_Curitiba.jpg",
81 | "http://en.wikipedia.org/wiki/Ukyo_Katayama": "https://upload.wikimedia.org/wikipedia/commons/6/6e/Ukyo_Katayama_2008.jpg",
82 | "http://en.wikipedia.org/wiki/Gianni_Morbidelli": "https://upload.wikimedia.org/wikipedia/commons/1/16/Gianni_morbidelli_spafrancorchamps2014.JPG",
83 | "http://en.wikipedia.org/wiki/Pedro_Lamy": "https://upload.wikimedia.org/wikipedia/commons/7/7f/Pedro_Lamy_Le_Mans_drivers_parade_2011_crop.jpg",
84 | "http://en.wikipedia.org/wiki/Martin_Brundle": "https://upload.wikimedia.org/wikipedia/commons/3/36/Martin_Brundle_2021_%2851591210921%29_%28cropped%29.jpg",
85 | "http://en.wikipedia.org/wiki/Andrea_Montermini": "https://upload.wikimedia.org/wikipedia/commons/1/19/Andrea_montermini_brandshatch2014.JPG",
86 | "http://en.wikipedia.org/wiki/Giovanni_Lavaggi": "https://upload.wikimedia.org/wikipedia/commons/c/cc/Lavaggi_LS1_Spa_2009.JPG",
87 | "http://en.wikipedia.org/wiki/Mark_Blundell": "https://upload.wikimedia.org/wikipedia/commons/9/99/Mark_Blundell_portrait_2011_%28cropped%29.jpg",
88 | "http://en.wikipedia.org/wiki/Aguri_Suzuki": "https://upload.wikimedia.org/wikipedia/commons/7/7d/Aguri_Suzuki_2008_Super_GT.jpg",
89 | "http://en.wikipedia.org/wiki/Nigel_Mansell": "https://upload.wikimedia.org/wikipedia/commons/e/e4/Nigel_Mansell_-_Mexican_Grand_Prix_01_%28cropped%29.jpeg",
90 | "http://en.wikipedia.org/wiki/Pierluigi_Martini": "https://upload.wikimedia.org/wikipedia/commons/5/58/Pierluigi_Martini_in_2016.jpg",
91 | "http://en.wikipedia.org/wiki/Karl_Wendlinger": "https://upload.wikimedia.org/wikipedia/commons/e/ef/GTS_class_winners_%2810th_overall%29_-_Karl_Wendlinger_-_Chrysler_Viper_GTS-R_-_on_the_podium_at_the_1999_Le_Mans_%2851897678180%29_%28cropped%29.jpg",
92 | "http://en.wikipedia.org/wiki/Jean-Christophe_Boullion": "https://upload.wikimedia.org/wikipedia/commons/6/69/Jean-Christophe_Boullion_2007_Mil_Milhas_Brasil.jpg",
93 | "http://en.wikipedia.org/wiki/Roberto_Moreno": "https://upload.wikimedia.org/wikipedia/commons/f/f4/Roberto_Bud_suite_97.tif",
94 | "http://en.wikipedia.org/wiki/Bertrand_Gachot": "https://upload.wikimedia.org/wikipedia/commons/0/08/Bertrand_Gachot_-_1991_US_GP.jpg",
95 | "http://en.wikipedia.org/wiki/Massimiliano_Papis": "https://upload.wikimedia.org/wikipedia/commons/c/cb/Max_papis_%2830129892652%29_%28cropped%29.jpg",
96 | "http://en.wikipedia.org/wiki/Gabriele_Tarquini": "https://upload.wikimedia.org/wikipedia/commons/9/9a/Gabriele_tarquini_spafrancorchamps2014.JPG",
97 | "http://en.wikipedia.org/wiki/Jean-Denis_Deletraz": "https://upload.wikimedia.org/wikipedia/commons/d/da/Jean-Denis_D%C3%A9l%C3%A9traz_-_Le_Mans_2012.JPG",
98 | "http://en.wikipedia.org/wiki/%C3%89rik_Comas": "https://upload.wikimedia.org/wikipedia/commons/d/d2/Comas_lm2005.jpg",
99 | "http://en.wikipedia.org/wiki/David_Brabham": "https://upload.wikimedia.org/wikipedia/commons/6/62/David_Brabham_2012_%287321981998%29_%28cropped%29.jpg",
100 | "http://en.wikipedia.org/wiki/Christian_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/f/f9/Christian_Fittipaldi_2006_Curitiba.jpg",
101 | "http://en.wikipedia.org/wiki/Andrea_de_Cesaris": "https://upload.wikimedia.org/wikipedia/commons/2/22/Andrea_De_Cesaris_1982.jpg",
102 | "http://en.wikipedia.org/wiki/Michele_Alboreto": "https://upload.wikimedia.org/wikipedia/commons/7/76/SCA_0029_MICHELE_ALBORETO_-_Ferrari_F_1-87_-_1987_neg._125_10x15_R_%28cropped%29.JPG",
103 | "http://en.wikipedia.org/wiki/Jyrki_J%C3%A4rvilehto": "https://upload.wikimedia.org/wikipedia/commons/3/3f/JJ_Lehto_%28Petit_Le_Mans%2C_2004%29.jpg",
104 | "http://en.wikipedia.org/wiki/Olivier_Beretta": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Olivier_Beretta_2012_WEC_Fuji.jpg",
105 | "http://en.wikipedia.org/wiki/Jean-Marc_Gounon": "https://upload.wikimedia.org/wikipedia/commons/e/ea/Jean-Marc_Gounon_%282015%29.JPG",
106 | "http://en.wikipedia.org/wiki/Yannick_Dalmas": "https://upload.wikimedia.org/wikipedia/commons/2/2c/Yannick_DALMAS.JPG",
107 | "http://en.wikipedia.org/wiki/Franck_Lagorce": "https://upload.wikimedia.org/wikipedia/commons/9/9c/Franck_Lagorce_-_Mondial_de_l%27Automobile_de_Paris_2016_-_003.jpg",
108 | "http://en.wikipedia.org/wiki/Alain_Prost": "https://upload.wikimedia.org/wikipedia/commons/7/74/Festival_automobile_international_2015_-_Photocall_-_065_%28cropped3%29.jpg",
109 | "http://en.wikipedia.org/wiki/Ayrton_Senna": "https://upload.wikimedia.org/wikipedia/commons/6/65/Ayrton_Senna_9_%28cropped%29.jpg",
110 | "http://en.wikipedia.org/wiki/Derek_Warwick": "https://upload.wikimedia.org/wikipedia/commons/4/47/Derek_Warwick_Silverstone_2014.JPG",
111 | "http://en.wikipedia.org/wiki/Philippe_Alliot": "https://upload.wikimedia.org/wikipedia/commons/f/f0/Philippe_Alliot_1990_United_States.jpg",
112 | "http://en.wikipedia.org/wiki/Riccardo_Patrese": "https://upload.wikimedia.org/wikipedia/commons/3/3e/Riccardo_Patrese_in_the_paddock_before_the_1993_British_Grand_Prix_%2833686653515%29_%28Cropped%29.jpg",
113 | "http://en.wikipedia.org/wiki/Michael_Andretti": "https://upload.wikimedia.org/wikipedia/commons/0/07/Michael_Andretti_%2853785910028%29_%28cropped%29.jpg",
114 | "http://en.wikipedia.org/wiki/Thierry_Boutsen": "https://upload.wikimedia.org/wikipedia/commons/2/20/Thierry_Boutsen_1993.jpg",
115 | "http://en.wikipedia.org/wiki/Toshio_Suzuki_(driver)": "https://upload.wikimedia.org/wikipedia/commons/e/eb/Toyota_GT-One_-_Ukyou_Katayama%2C_Keiichi_Tsuchiya_%26_Toshio_Suzuki_heads_towards_Dunlop_Bridge_at_the_1999_Le_Mans_%2851890094535%29.jpg",
116 | "http://en.wikipedia.org/wiki/Maur%C3%ADcio_Gugelmin": "https://upload.wikimedia.org/wikipedia/commons/e/ea/Gugelmin_%28cropped%29.jpg",
117 | "http://en.wikipedia.org/wiki/Eric_van_de_Poele": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Eric_van_de_Poele_2008.jpg",
118 | "http://en.wikipedia.org/wiki/Ivan_Capelli": "https://upload.wikimedia.org/wikipedia/commons/1/1c/Capelli_1991_%28cropped%29.jpg",
119 | "http://en.wikipedia.org/wiki/Paul_Belmondo": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Paul_Belmondo_par_Claude_Truong-Ngoc_juillet_2013.jpg",
120 | "http://en.wikipedia.org/wiki/Olivier_Grouillard": "https://upload.wikimedia.org/wikipedia/commons/a/af/Andy_Wallace_%26_Olivier_Grouillard_on_the_podium_at_the_Norwich_Union_Empire_Trophy%2C_Silverstone_4_Hrs_1995_%2849890621322%29_%28cropped%29.jpg",
121 | "http://en.wikipedia.org/wiki/Jan_Lammers": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Jan_Lammers_LeMans24_2017.jpg",
122 | "http://en.wikipedia.org/wiki/Nelson_Piquet": "https://upload.wikimedia.org/wikipedia/commons/5/5b/Cerimonia_de_entrega_da_medalha_Bras%C3%ADlia_60_anos_-_16.jpg",
123 | "http://en.wikipedia.org/wiki/Satoru_Nakajima": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Satoru_Nakajima_2008_Motorsport_Japan_%28cropped%29.jpg",
124 | "http://en.wikipedia.org/wiki/Emanuele_Pirro": "https://upload.wikimedia.org/wikipedia/commons/1/1b/Emanuele_Pirro_2012_WEC_Fuji_2.jpg",
125 | "http://en.wikipedia.org/wiki/Alex_Caffi": "https://upload.wikimedia.org/wikipedia/commons/0/0f/Alex_Caffi_1991_%28cropped%29.jpg",
126 | "http://en.wikipedia.org/wiki/Bernd_Schneider_(racecar_driver)": "https://upload.wikimedia.org/wikipedia/commons/1/14/Bernd_Schneider_2007_amk.jpg",
127 | "http://en.wikipedia.org/wiki/Martin_Donnelly_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/7/7f/Martin_Donnelly_VW_Scirocco_R-Cup_-_2012.jpg",
128 | "http://en.wikipedia.org/wiki/Norberto_Fontana": "",
129 | "http://en.wikipedia.org/wiki/Domenico_Schiattarella": "",
130 | "http://en.wikipedia.org/wiki/Taki_Inoue": "",
131 | "http://en.wikipedia.org/wiki/%C3%89ric_Bernard": "",
132 | "http://en.wikipedia.org/wiki/Roland_Ratzenberger": "",
133 | "http://en.wikipedia.org/wiki/Philippe_Adams": "",
134 | "http://en.wikipedia.org/wiki/Fabrizio_Barbazza": "",
135 | "http://en.wikipedia.org/wiki/Emanuele_Naspetti": "",
136 | "http://en.wikipedia.org/wiki/Stefano_Modena": "",
137 | "http://en.wikipedia.org/wiki/Julian_Bailey": "",
138 | "http://en.wikipedia.org/wiki/Alessandro_Nannini": "",
139 | "http://en.wikipedia.org/wiki/Paolo_Barilla": "",
140 | "http://en.wikipedia.org/wiki/Gregor_Foitek": "",
141 | "http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg": "https://upload.wikimedia.org/wikipedia/commons/c/cd/Nico_Hulkenberg_2016_Malaysia.jpg",
142 | "http://en.wikipedia.org/wiki/Karun_Chandhok": "https://upload.wikimedia.org/wikipedia/commons/3/32/Karun_Chandhok_Goodwood_Festival_of_Speed_2019_%2848242680701%29.jpg",
143 | "http://en.wikipedia.org/wiki/Lucas_di_Grassi": "https://upload.wikimedia.org/wikipedia/commons/0/01/TechCrunch_Disrupt_Berlin_2018_%28Day_1%29_08_%28cropped%29.jpg",
144 | "http://en.wikipedia.org/wiki/Bruno_Senna": "https://upload.wikimedia.org/wikipedia/commons/9/9c/Senna_by_United_Autosports_team_04.jpg",
145 | "http://en.wikipedia.org/wiki/Vitaly_Petrov": "https://upload.wikimedia.org/wikipedia/commons/0/00/Vitaly_Petrov_2010_Malaysia_%28cropped%29.jpg",
146 | "http://en.wikipedia.org/wiki/Jonathan_Palmer": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Jonathan_Palmer_Profile.jpg",
147 | "http://en.wikipedia.org/wiki/Christian_Danner": "https://upload.wikimedia.org/wikipedia/commons/f/f6/Christian_Danner_1995_Deutsche_Tourenwagen_Meisterschaft%2C_Donington_Park.jpg",
148 | "http://en.wikipedia.org/wiki/Eddie_Cheever": "https://upload.wikimedia.org/wikipedia/commons/8/87/Eddie_Cheever_Jr_2009_Indy_500_Second_Qual_Day.JPG",
149 | "http://en.wikipedia.org/wiki/Ren%C3%A9_Arnoux": "https://upload.wikimedia.org/wikipedia/commons/6/6f/Rene_Arnoux_WSR2008_HU.png",
150 | "http://en.wikipedia.org/wiki/Stefan_Johansson": "https://upload.wikimedia.org/wikipedia/commons/7/71/Stefan_Johansson3_%285987943266%29_%28cropped%29.jpg",
151 | "http://en.wikipedia.org/wiki/Luis_Perez-Sala": "",
152 | "http://en.wikipedia.org/wiki/Philippe_Streiff": "https://upload.wikimedia.org/wikipedia/commons/c/c7/Festival_automobile_international_2014_-_Photocall_-_019.jpg",
153 | "http://en.wikipedia.org/wiki/Adri%C3%A1n_Campos": "",
154 | "http://en.wikipedia.org/wiki/Oscar_Larrauri": "",
155 | "http://en.wikipedia.org/wiki/Piercarlo_Ghinzani": "https://upload.wikimedia.org/wikipedia/commons/6/6c/1985_European_GP_Piercarlo_Ghinzani_%28cropped%29.jpg",
156 | "http://en.wikipedia.org/wiki/Jean-Louis_Schlesser": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Jean-Louis_Schlesser%2C_2013.JPG",
157 | "http://en.wikipedia.org/wiki/Pascal_Fabre": "",
158 | "http://en.wikipedia.org/wiki/Teo_Fabi": "",
159 | "http://en.wikipedia.org/wiki/Jacques_Laffite": "https://upload.wikimedia.org/wikipedia/commons/d/d3/Jacques_Laffite_2015.jpg",
160 | "http://en.wikipedia.org/wiki/Elio_de_Angelis": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Anefo_932-2371_Elio_de_Angelis_03.07.1982.jpg",
161 | "http://en.wikipedia.org/wiki/Johnny_Dumfries": "",
162 | "http://en.wikipedia.org/wiki/Keke_Rosberg": "https://upload.wikimedia.org/wikipedia/commons/3/3c/Anefo_932-2378_Keke_Rosberg%2C_Zandvoort%2C_03-07-1982_-_Restoration.jpg",
163 | "http://en.wikipedia.org/wiki/Patrick_Tambay": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Zandvoort_circuit_De_striptekenaar_Graton_in_de_pits%2C_NL-HlmNHA_54005237_-_Patrick_Tambay_%28cropped%29.JPG",
164 | "http://en.wikipedia.org/wiki/Marc_Surer": "https://upload.wikimedia.org/wikipedia/commons/3/3e/Marc_Surer_1982.jpg",
165 | "http://en.wikipedia.org/wiki/Alan_Jones_(Formula_1)": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Jones_alan.JPG",
166 | "http://en.wikipedia.org/wiki/Huub_Rothengatter": "https://upload.wikimedia.org/wikipedia/commons/7/72/Huub_Rothengatter_in_1977.jpg",
167 | "http://en.wikipedia.org/wiki/Allen_Berg": "",
168 | "http://en.wikipedia.org/wiki/Manfred_Winkelhock": "",
169 | "http://en.wikipedia.org/wiki/Stefan_Bellof": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Stefan_Bellof_7508-cropped.jpg",
170 | "http://en.wikipedia.org/wiki/Niki_Lauda": "https://upload.wikimedia.org/wikipedia/commons/6/64/Anefo_933-1302_Niki_Lauda_29.10.1984.jpg",
171 | "http://en.wikipedia.org/wiki/John_Watson_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/3/3d/Watson_at_1982_Dutch_Grand_Prix_%28cropped%29.jpg",
172 | "http://en.wikipedia.org/wiki/Mauro_Baldi": "https://upload.wikimedia.org/wikipedia/commons/8/80/Mauro_Baldi_1982.jpg",
173 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Hesnault": "",
174 | "http://en.wikipedia.org/wiki/Johnny_Cecotto": "https://upload.wikimedia.org/wikipedia/commons/4/44/Johnny_Cecotto_%281978%29.jpg",
175 | "http://en.wikipedia.org/wiki/Corrado_Fabi": "",
176 | "http://en.wikipedia.org/wiki/Jo_Gartner": "",
177 | "http://en.wikipedia.org/wiki/Chico_Serra": "https://upload.wikimedia.org/wikipedia/commons/c/c0/Chico_Serra_2007_Mil_Milhas_Brasil.jpg",
178 | "http://en.wikipedia.org/wiki/Danny_Sullivan": "https://upload.wikimedia.org/wikipedia/commons/1/18/DannySullivanAt2015indy500.JPG",
179 | "http://en.wikipedia.org/wiki/Eliseo_Salazar": "https://upload.wikimedia.org/wikipedia/commons/d/d7/Eliseo_Salazar_%281982%29.jpg",
180 | "http://en.wikipedia.org/wiki/Raul_Boesel": "https://upload.wikimedia.org/wikipedia/commons/9/98/Raul_Boesel_2007_Mil_Milhas_Brasil.jpg",
181 | "http://en.wikipedia.org/wiki/Jean-Pierre_Jarier": "https://upload.wikimedia.org/wikipedia/commons/7/7e/Jean-Pierre_Jarier_en_1976.jpg",
182 | "http://en.wikipedia.org/wiki/Bruno_Giacomelli": "https://upload.wikimedia.org/wikipedia/commons/0/01/Bruno_Giacomelli_1982.jpg",
183 | "http://en.wikipedia.org/wiki/Roberto_Guerrero": "https://upload.wikimedia.org/wikipedia/commons/3/36/Roberto_Guerrero_2010_Indy_500_Practice_Day_7.JPG",
184 | "http://en.wikipedia.org/wiki/Kenny_Acheson": "",
185 | "http://en.wikipedia.org/wiki/Carlos_Reutemann": "https://upload.wikimedia.org/wikipedia/commons/3/3a/Reutemann_1981.jpg",
186 | "http://en.wikipedia.org/wiki/Jochen_Mass": "https://upload.wikimedia.org/wikipedia/commons/3/34/Mass_at_1982_Dutch_Grand_Prix.jpg",
187 | "http://en.wikipedia.org/wiki/Derek_Daly": "https://upload.wikimedia.org/wikipedia/commons/8/82/Derek_Daly_1982.jpg",
188 | "http://en.wikipedia.org/wiki/Slim_Borgudd": "https://upload.wikimedia.org/wikipedia/commons/b/b5/Borgudd-Slim-1994.jpg",
189 | "http://en.wikipedia.org/wiki/Didier_Pironi": "https://upload.wikimedia.org/wikipedia/commons/8/86/Pironi_celebrating_at_1982_Dutch_Grand_Prix_%28cropped%29.jpg",
190 | "http://en.wikipedia.org/wiki/Gilles_Villeneuve": "",
191 | "http://en.wikipedia.org/wiki/Brian_Henton": "https://upload.wikimedia.org/wikipedia/commons/c/c4/Brian_Henton_%281971%29.jpg",
192 | "http://en.wikipedia.org/wiki/Geoff_Lees": "",
193 | "http://en.wikipedia.org/wiki/Mario_Andretti": "https://upload.wikimedia.org/wikipedia/commons/c/c3/Mario_Andretti_Goodwood_Festival_of_Speed_2021_%28cropped%29.jpg",
194 | "http://en.wikipedia.org/wiki/Rupert_Keegan": "https://upload.wikimedia.org/wikipedia/commons/2/22/L18.34.10_-_Formel_1_-_24_-_Hesketh_308E%2C_1977_-_Graham_Williams_-_paddock_-_DSC_0628_Balancer_%2836986883421%29.jpg",
195 | "http://en.wikipedia.org/wiki/Ricardo_Zunino": "https://upload.wikimedia.org/wikipedia/commons/0/02/1980_Argentine_Grand_Prix_Zunino.jpg",
196 | "http://en.wikipedia.org/wiki/Siegfried_Stohr": "https://upload.wikimedia.org/wikipedia/commons/3/30/1981_Argentine_Grand_Prix%2C_Stohr.jpg",
197 | "http://en.wikipedia.org/wiki/Hector_Rebaque": "https://upload.wikimedia.org/wikipedia/commons/d/dc/1981_Argentine_Grand_Prix%2C_Rebaque.jpg",
198 | "http://en.wikipedia.org/wiki/Emerson_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Emerson_Fittipaldi_in_2020_%28cropped%29.JPG",
199 | "http://en.wikipedia.org/wiki/Clay_Regazzoni": "https://upload.wikimedia.org/wikipedia/commons/e/e7/Anefo_924-6609_Clay_Reggazoni%2C_Catherine_Blaton%2C_Jacky_Ickx_Zandvoort_18_06_1971_-_Cropped.jpg",
200 | "http://en.wikipedia.org/wiki/Jody_Scheckter": "https://upload.wikimedia.org/wikipedia/commons/d/dc/Jody_Scheckter_during_the_1979_Monaco_Grand_Prix.jpg",
201 | "http://en.wikipedia.org/wiki/Jean-Pierre_Jabouille": "https://upload.wikimedia.org/wikipedia/commons/5/55/JeanPierreJabouille1975.jpg",
202 | "http://en.wikipedia.org/wiki/Patrick_Depailler": "https://upload.wikimedia.org/wikipedia/commons/4/4e/PatrickDepailler-ar.jpg",
203 | "http://en.wikipedia.org/wiki/James_Hunt": "https://upload.wikimedia.org/wikipedia/commons/1/12/J._Hunt_in_1977_%28cropped%29.jpg",
204 | "http://en.wikipedia.org/wiki/Hans_Joachim_Stuck": "https://upload.wikimedia.org/wikipedia/commons/c/cf/HansJoachimStuck2008.jpg",
205 | "http://en.wikipedia.org/wiki/Jacky_Ickx": "https://upload.wikimedia.org/wikipedia/commons/1/19/Jacky_Ickx_Portr%C3%A4t_Mille_Miglia_2018.jpg",
206 | "http://en.wikipedia.org/wiki/Patrick_Gaillard": "",
207 | "http://en.wikipedia.org/wiki/Vittorio_Brambilla": "https://upload.wikimedia.org/wikipedia/commons/7/75/Vittorio_Brambilla.jpg",
208 | "http://en.wikipedia.org/wiki/Ronnie_Peterson": "https://upload.wikimedia.org/wikipedia/commons/e/e2/Peterson_at_1978_Dutch_Grand_Prix.jpg",
209 | "http://en.wikipedia.org/wiki/Brett_Lunger": "",
210 | "http://en.wikipedia.org/wiki/Rolf_Stommelen": "https://upload.wikimedia.org/wikipedia/commons/c/c4/Stommelen%2C_Rolf_am_1972-07-07.jpg",
211 | "http://en.wikipedia.org/wiki/Harald_Ertl": "https://upload.wikimedia.org/wikipedia/commons/f/fa/HaraldErtlZolder1978.jpg",
212 | "http://en.wikipedia.org/wiki/Bobby_Rahal": "https://upload.wikimedia.org/wikipedia/commons/6/69/Bobby_Rahal_%282021%29.jpg",
213 | "http://en.wikipedia.org/wiki/Carlos_Pace": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Carlos_Pace_74_%28cropped%29.jpg",
214 | "http://en.wikipedia.org/wiki/Gunnar_Nilsson": "https://upload.wikimedia.org/wikipedia/commons/1/16/1976-07-10_Gunnar_Nilsson_im_BMW_CSL_%28cropped%29.jpg",
215 | "http://en.wikipedia.org/wiki/Renzo_Zorzi": "",
216 | "http://en.wikipedia.org/wiki/Ingo_Hoffmann": "https://upload.wikimedia.org/wikipedia/commons/b/b3/Ingo_Hoffmann_2007_Curitiba.jpg",
217 | "http://en.wikipedia.org/wiki/Hans_Binder": "https://upload.wikimedia.org/wikipedia/commons/f/f4/1977_Argentine_Grand_Prix_Binder.jpg",
218 | "http://en.wikipedia.org/wiki/Larry_Perkins": "https://upload.wikimedia.org/wikipedia/commons/4/40/1995_Holden_VR_Commodore_Bathurst_winner_%2828249502800%29.jpg",
219 | "http://en.wikipedia.org/wiki/Ian_Scheckter": "https://upload.wikimedia.org/wikipedia/commons/8/85/1977_Argentine_Grand_Prix_Ian_Scheckter.jpg",
220 | "http://en.wikipedia.org/wiki/Patrick_Neve": "",
221 | "http://en.wikipedia.org/wiki/Emilio_de_Villota": "https://upload.wikimedia.org/wikipedia/commons/a/ac/Emilio_de_Villota_%28cropped%29.jpg",
222 | "http://en.wikipedia.org/wiki/David_Purley": "",
223 | "http://en.wikipedia.org/wiki/Arturo_Merzario": "https://upload.wikimedia.org/wikipedia/commons/d/da/Arturo_Merzario_Auto_Zuerich_2024_DSC_6348_%28cropped-2%29.jpg",
224 | "http://en.wikipedia.org/wiki/Jackie_Oliver": "https://upload.wikimedia.org/wikipedia/commons/f/f5/Jackie_Oliver_1969_kl.JPG",
225 | "http://en.wikipedia.org/wiki/Vern_Schuppan": "https://upload.wikimedia.org/wikipedia/commons/3/35/Schholhay_83-98_%281%29.JPG",
226 | "http://en.wikipedia.org/wiki/Alex_Ribeiro": "https://upload.wikimedia.org/wikipedia/commons/b/b3/Alex_Ribeiro.jpg",
227 | "http://en.wikipedia.org/wiki/Ian_Ashley": "https://upload.wikimedia.org/wikipedia/commons/7/7b/Ian_Ashley.jpg",
228 | "http://en.wikipedia.org/wiki/Danny_Ongais": "https://upload.wikimedia.org/wikipedia/commons/f/f5/Ongais%2C_Danny_%281984%29.jpg",
229 | "http://en.wikipedia.org/wiki/Kunimitsu_Takahashi": "https://upload.wikimedia.org/wikipedia/commons/a/a4/Kunimitsu_Takahashi_1963.jpg",
230 | "http://en.wikipedia.org/wiki/Kazuyoshi_Hoshino": "https://upload.wikimedia.org/wikipedia/commons/6/6b/Kazuyoshi_Hoshino_2010_Formula_Nippon_Motegi_%28May%29.jpg",
231 | "http://en.wikipedia.org/wiki/Tom_Pryce": "",
232 | "http://en.wikipedia.org/wiki/Lella_Lombardi": "https://upload.wikimedia.org/wikipedia/commons/0/08/Lella-Garage-Reading-04.jpg",
233 | "http://en.wikipedia.org/wiki/Bob_Evans_(race_driver)": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Monaco_1975_-_Bob_Evans_-_NQ.jpg",
234 | "http://en.wikipedia.org/wiki/Michel_Lecl%C3%A8re": "",
235 | "http://en.wikipedia.org/wiki/Chris_Amon": "https://upload.wikimedia.org/wikipedia/commons/7/7b/AmonChris19730706.jpg",
236 | "http://en.wikipedia.org/wiki/Loris_Kessel": "https://upload.wikimedia.org/wikipedia/commons/0/03/1976_BRDC_International_Trophy%2C_Loris_Kessel.jpg",
237 | "http://en.wikipedia.org/wiki/Guy_Edwards": "",
238 | "http://en.wikipedia.org/wiki/Alessandro_Pesenti-Rossi": "",
239 | "http://en.wikipedia.org/wiki/Henri_Pescarolo": "https://upload.wikimedia.org/wikipedia/commons/3/30/PescaroloHenry1973N%C3%BCrb.jpg",
240 | "http://en.wikipedia.org/wiki/Warwick_Brown": "",
241 | "http://en.wikipedia.org/wiki/Noritake_Takahara": "",
242 | "http://en.wikipedia.org/wiki/Masahiro_Hasemi": "https://upload.wikimedia.org/wikipedia/commons/1/1b/Kojima_KE007_front-right_2013_Yurakucho.jpg",
243 | "http://en.wikipedia.org/wiki/Mark_Donohue": "https://upload.wikimedia.org/wikipedia/commons/a/a0/Mark_Donohue_JPGP_S_75.jpg",
244 | "http://en.wikipedia.org/wiki/Graham_Hill": "https://upload.wikimedia.org/wikipedia/commons/f/fc/Graham_Hill_Bestanddeelnr_924-6564.jpg",
245 | "http://en.wikipedia.org/wiki/Wilson_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Wilson_Fittipaldi_J%C3%BAnior_2017.jpg",
246 | "http://en.wikipedia.org/wiki/Guy_Tunmer": "",
247 | "http://en.wikipedia.org/wiki/Eddie_Keizan": "",
248 | "http://en.wikipedia.org/wiki/Dave_Charlton": "",
249 | "http://en.wikipedia.org/wiki/Tony_Brise": "",
250 | "http://en.wikipedia.org/wiki/Torsten_Palm": "",
251 | "http://en.wikipedia.org/wiki/Damien_Magee": "",
252 | "http://en.wikipedia.org/wiki/Gijs_Van_Lennep": "https://upload.wikimedia.org/wikipedia/commons/4/44/Gijs_van_Lennep_%281971%29.jpg",
253 | "http://en.wikipedia.org/wiki/John_Nicholson_(racing_driver)": "",
254 | "http://en.wikipedia.org/wiki/Dave_Morgan_(racing_driver)": "",
255 | "http://en.wikipedia.org/wiki/Jim_Crawford_(driver)": "https://upload.wikimedia.org/wikipedia/commons/2/2c/JimCrawford1988Indy500.JPG",
256 | "http://en.wikipedia.org/wiki/Denny_Hulme": "https://upload.wikimedia.org/wikipedia/commons/9/92/HulmeDenis196508_%28cropped%29.jpg",
257 | "http://en.wikipedia.org/wiki/Mike_Hailwood": "https://upload.wikimedia.org/wikipedia/commons/f/f0/Mike_Hailwood.jpg",
258 | "http://en.wikipedia.org/wiki/Jean-Pierre_Beltoise": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Jean_Pierre_Beltoise_te_Zandvoort_1968.jpg",
259 | "http://en.wikipedia.org/wiki/Howden_Ganley": "https://upload.wikimedia.org/wikipedia/commons/b/b6/HowdenGanleyNZFMR2015.jpg",
260 | "http://en.wikipedia.org/wiki/Richard_Robarts": "",
261 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Migault": "",
262 | "http://en.wikipedia.org/wiki/Brian_Redman": "https://upload.wikimedia.org/wikipedia/commons/0/01/Brian_Redman_1969_kl.JPG",
263 | "http://en.wikipedia.org/wiki/Tim_Schenken": "https://upload.wikimedia.org/wikipedia/commons/0/07/Tim_Schenken_1971_Hockenheim.JPG",
264 | "http://en.wikipedia.org/wiki/Teddy_Pilette": "https://upload.wikimedia.org/wikipedia/commons/2/23/TeddyPilette1975.jpg",
265 | "http://en.wikipedia.org/wiki/Tom_Bels%C3%B8": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Tom_Belso_1973_%28JOKAMAL3B08-11%29.tif",
266 | "http://en.wikipedia.org/wiki/Rikky_von_Opel": "",
267 | "http://en.wikipedia.org/wiki/Derek_Bell_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Derek_Bell_%282356476570%29.jpg",
268 | "http://en.wikipedia.org/wiki/David_Hobbs_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/4a/David_Hobbs.jpg",
269 | "http://en.wikipedia.org/wiki/Dieter_Quester": "https://upload.wikimedia.org/wikipedia/commons/9/9b/QuesterDieter1973.jpg",
270 | "http://en.wikipedia.org/wiki/Helmuth_Koinigg": "",
271 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Cevert": "https://upload.wikimedia.org/wikipedia/commons/d/d4/Francois_Cevert_1973.jpg",
272 | "http://en.wikipedia.org/wiki/Jackie_Stewart": "https://upload.wikimedia.org/wikipedia/commons/4/4b/Jackie_Stewart_at_the_2014_WEC_Silverstone_round.jpg",
273 | "http://en.wikipedia.org/wiki/Peter_Revson": "https://upload.wikimedia.org/wikipedia/commons/7/7a/Peter_Revson_1973_N%C3%BCrburgring_a_%28cropped%29.jpg",
274 | "http://en.wikipedia.org/wiki/Mike_Beuttler": "https://upload.wikimedia.org/wikipedia/commons/4/40/1972_French_Grand_Prix_Beuttler_%285225615113%29.jpg",
275 | "http://en.wikipedia.org/wiki/Nanni_Galli": "https://upload.wikimedia.org/wikipedia/commons/1/17/Nanni_Galli%2C_Alfa_Romeo_33.3%2C_1971-05-29.jpg",
276 | "http://en.wikipedia.org/wiki/Luiz_Bueno": "https://upload.wikimedia.org/wikipedia/commons/e/eb/Correio_da_Manh%C3%A3_AN_191_%28cropped%29.jpg",
277 | "http://en.wikipedia.org/wiki/George_Follmer": "https://upload.wikimedia.org/wikipedia/commons/3/34/George_Follmer_1973.jpg",
278 | "http://en.wikipedia.org/wiki/Andrea_de_Adamich": "https://upload.wikimedia.org/wikipedia/commons/7/75/Andrea_De_Adamich_-_Alfa_Romeo_Giulia_2000_GTAm_%281972_Monza_4_Hours%29.jpg",
279 | "http://en.wikipedia.org/wiki/Helmut_Marko": "https://upload.wikimedia.org/wikipedia/commons/f/fe/Helmut_Marko_Austrian_GP_2016_%28cropped2%29.jpg",
280 | "http://en.wikipedia.org/wiki/David_Walker_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/e/e4/David_Walker_1971_Lotus_56_B_Pratt_Whitney.jpg",
281 | "http://en.wikipedia.org/wiki/John_Love_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/b/b6/John_Love_Surtees_TS9_2019_Silverstone_Classic_%2848557776041%29.jpg",
282 | "http://en.wikipedia.org/wiki/Peter_Gethin": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Peter_Gethin%2C_Bestanddeelnr_924-6614_%28cropped2%29.jpg",
283 | "http://en.wikipedia.org/wiki/Reine_Wisell": "https://upload.wikimedia.org/wikipedia/commons/d/d1/Reine_Wisell_1970_N%C3%BCrburgring.JPG",
284 | "http://en.wikipedia.org/wiki/Sam_Posey": "https://upload.wikimedia.org/wikipedia/commons/7/72/Speed_tv_f1_panel_ims_stage_2006_%28cropped%29.jpg",
285 | "http://en.wikipedia.org/wiki/Skip_Barber": "",
286 | "http://en.wikipedia.org/wiki/Pedro_Rodr%C3%ADguez_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/6/68/Pedro_Rodr%C3%ADguez_1968_N%C3%BCrburgring-1_%28cropped%29.jpg",
287 | "http://en.wikipedia.org/wiki/John_Surtees": "https://upload.wikimedia.org/wikipedia/commons/c/c3/John_Surtees.JPG",
288 | "http://en.wikipedia.org/wiki/Jo_Siffert": "https://upload.wikimedia.org/wikipedia/commons/7/7e/Siffert%2C_Joseph_1968.jpg",
289 | "http://en.wikipedia.org/wiki/Fran%C3%A7ois_Mazet": "",
290 | "http://en.wikipedia.org/wiki/Vic_Elford": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Vic_Elford_Watkins_Glen_2010_%28cropped%29.jpg",
291 | "http://en.wikipedia.org/wiki/Joakim_Bonnier": "https://upload.wikimedia.org/wikipedia/commons/f/f9/BonnierJo196608.jpg",
292 | "http://en.wikipedia.org/wiki/George_Eaton": "",
293 | "http://en.wikipedia.org/wiki/John_Cannon_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/b/b8/BRM_P153.jpg",
294 | "http://en.wikipedia.org/wiki/Jack_Brabham": "https://upload.wikimedia.org/wikipedia/commons/e/e7/BrabhamJack1966B.jpg",
295 | "http://en.wikipedia.org/wiki/John_Miles_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/3/39/John_Miles_1970_N%C3%BCrburgring.jpg",
296 | "http://en.wikipedia.org/wiki/Peter_de_Klerk": "",
297 | "http://en.wikipedia.org/wiki/Jochen_Rindt": "https://upload.wikimedia.org/wikipedia/commons/c/cb/Rindt_at_1970_Dutch_Grand_Prix_%282C%29.jpg",
298 | "http://en.wikipedia.org/wiki/Bruce_McLaren": "https://upload.wikimedia.org/wikipedia/commons/a/a0/McLarenBruce.jpg",
299 | "http://en.wikipedia.org/wiki/Johnny_Servoz-Gavin": "",
300 | "http://en.wikipedia.org/wiki/Ignazio_Giunti": "",
301 | "http://en.wikipedia.org/wiki/Dan_Gurney": "https://upload.wikimedia.org/wikipedia/commons/b/b8/Dan_Gurney_%281970%29.jpg",
302 | "http://en.wikipedia.org/wiki/Sam_Tingle": "https://upload.wikimedia.org/wikipedia/commons/b/ba/1965_Sam_Tingle_Formula_1_LDS_Race_Car-1_%2829891690293%29.jpg",
303 | "http://en.wikipedia.org/wiki/Piers_Courage": "https://upload.wikimedia.org/wikipedia/commons/3/32/Piers_Courage_1968_N%C3%BCrburgring.JPG",
304 | "http://en.wikipedia.org/wiki/Richard_Attwood": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Richard_Attwood_1968_kl.JPG",
305 | "http://en.wikipedia.org/wiki/Silvio_Moser": "https://upload.wikimedia.org/wikipedia/commons/1/17/SilvioMoser.jpg",
306 | "http://en.wikipedia.org/wiki/Pete_Lovely": "",
307 | "http://en.wikipedia.org/wiki/Jim_Clark": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Jim_Clark_in_1963_%28cropped%29.JPG",
308 | "http://en.wikipedia.org/wiki/Ludovico_Scarfiotti": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Ludivico_Scarfiotti_1966_N%C3%BCrburgring.jpg",
309 | "http://en.wikipedia.org/wiki/Lucien_Bianchi": "https://upload.wikimedia.org/wikipedia/commons/a/ac/BianciLucien_19680802.jpg",
310 | "http://en.wikipedia.org/wiki/Hubert_Hahne": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Hahne%2C_Hubert_-_1968.jpg",
311 | "http://en.wikipedia.org/wiki/Kurt_Ahrens,_Jr.": "https://upload.wikimedia.org/wikipedia/commons/0/03/Bundesarchiv_Bild_183-82487-0008%2C_Internationale_Halle-Saale-Schleife.jpg",
312 | "http://en.wikipedia.org/wiki/Bob_Anderson_(racing_driver)": "",
313 | "http://en.wikipedia.org/wiki/Mike_Spence": "",
314 | "http://en.wikipedia.org/wiki/Mike_Parkes": "https://upload.wikimedia.org/wikipedia/commons/8/86/Mike_Parkes_1969_kl.JPG",
315 | "http://en.wikipedia.org/wiki/Chris_Irwin": "https://upload.wikimedia.org/wikipedia/commons/6/65/Chris_Irwin_1968.JPG",
316 | "http://en.wikipedia.org/wiki/Guy_Ligier": "",
317 | "http://en.wikipedia.org/wiki/Alan_Rees_(racing_driver)": "",
318 | "http://en.wikipedia.org/wiki/Mike_Fisher_(driver)": "",
319 | "http://en.wikipedia.org/wiki/Jonathan_Williams_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/5/51/Jonathan_Williams_1966.jpg",
320 | "http://en.wikipedia.org/wiki/Lorenzo_Bandini": "https://upload.wikimedia.org/wikipedia/commons/d/d8/Bandini1966cropped.jpg",
321 | "http://en.wikipedia.org/wiki/Bob_Bondurant": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Bob_Portrait2_sm.jpg",
322 | "http://en.wikipedia.org/wiki/Richie_Ginther": "https://upload.wikimedia.org/wikipedia/commons/5/5b/Richie_Ginther_1966_N%C3%BCrburgring.jpg",
323 | "http://en.wikipedia.org/wiki/John_Taylor_(racer)": "https://upload.wikimedia.org/wikipedia/commons/2/28/John_Taylor_1966.jpg",
324 | "http://en.wikipedia.org/wiki/Chris_Lawrence_(racing_driver)": "",
325 | "http://en.wikipedia.org/wiki/Peter_Arundell": "https://upload.wikimedia.org/wikipedia/commons/e/e3/Peter_Arundell_1968_kl.JPG",
326 | "http://en.wikipedia.org/wiki/Geki_(driver)": "https://upload.wikimedia.org/wikipedia/commons/7/79/Giacomo_Russo_1966.jpg",
327 | "http://en.wikipedia.org/wiki/Ronnie_Bucknum": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Ron_Bucknum_met_zijn_Honda_%281964%29.jpg",
328 | "http://en.wikipedia.org/wiki/Paul_Hawkins_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/7/79/Hawkins%2C_Paul_1966.jpg",
329 | "http://en.wikipedia.org/wiki/Tony_Maggs": "",
330 | "http://en.wikipedia.org/wiki/Frank_Gardner_(driver)": "",
331 | "http://en.wikipedia.org/wiki/David_Prophet": "",
332 | "http://en.wikipedia.org/wiki/Innes_Ireland": "https://upload.wikimedia.org/wikipedia/commons/8/8c/Innes_Ireland.jpg",
333 | "http://en.wikipedia.org/wiki/Ian_Raby": "",
334 | "http://en.wikipedia.org/wiki/Masten_Gregory": "https://upload.wikimedia.org/wikipedia/commons/2/2c/GregoryMasten1965.jpg",
335 | "http://en.wikipedia.org/wiki/Nino_Vaccarella": "https://upload.wikimedia.org/wikipedia/commons/b/be/Vaccarella%2C_Nino_1972-07-07.jpg",
336 | "http://en.wikipedia.org/wiki/Roberto_Bussinello": "https://upload.wikimedia.org/wikipedia/commons/d/da/1965-05-09_Targa_Florio_Collesano_Alfa_Romeo_Giulia_TZ2_750112_Bussinello%2BTodaro.jpg",
337 | "http://en.wikipedia.org/wiki/Mois%C3%A9s_Solana": "",
338 | "http://en.wikipedia.org/wiki/Phil_Hill": "https://upload.wikimedia.org/wikipedia/commons/8/84/Phil_Hill_1991_USA_%28cropped%29.jpg",
339 | "http://en.wikipedia.org/wiki/Giancarlo_Baghetti": "https://upload.wikimedia.org/wikipedia/commons/2/21/Giancarlo_Baghetti_a_Monza_-_1962.jpg",
340 | "http://en.wikipedia.org/wiki/Trevor_Taylor": "",
341 | "http://en.wikipedia.org/wiki/Maurice_Trintignant": "https://upload.wikimedia.org/wikipedia/commons/3/35/Maurice_Trintignant_-_El_Gr%C3%A1fico_1801.jpg",
342 | "http://en.wikipedia.org/wiki/Gerhard_Mitter": "https://upload.wikimedia.org/wikipedia/commons/9/91/MitterGerhard1968.jpg",
343 | "http://en.wikipedia.org/wiki/Walt_Hansgen": "",
344 | "http://en.wikipedia.org/wiki/Hap_Sharp": "https://upload.wikimedia.org/wikipedia/commons/f/ff/1967-05-14_Targa_Florio_Collesano_Chaparral_2F_Hill%2BSharp.jpg",
345 | "http://en.wikipedia.org/wiki/Carel_Godin_de_Beaufort": "https://upload.wikimedia.org/wikipedia/commons/f/f5/N._13_at_1962_Dutch_Grand_Prix_%282%29_%28cropped%29.jpg",
346 | "http://en.wikipedia.org/wiki/Tony_Settember": "",
347 | "http://en.wikipedia.org/wiki/Jim_Hall_(race_car_driver)": "https://upload.wikimedia.org/wikipedia/commons/3/37/Jim_Hall_%28racer%29.jpg",
348 | "http://en.wikipedia.org/wiki/John_Campbell-Jones": "",
349 | "http://en.wikipedia.org/wiki/Bernard_Collomb": "",
350 | "http://en.wikipedia.org/wiki/Peter_Broeker": "",
351 | "http://en.wikipedia.org/wiki/Doug_Serrurier": "",
352 | "http://en.wikipedia.org/wiki/Trevor_Blokdyk": "",
353 | "http://en.wikipedia.org/wiki/Brausch_Niemann": "",
354 | "http://en.wikipedia.org/wiki/Jackie_Lewis": "https://upload.wikimedia.org/wikipedia/commons/3/37/Photograph_of_Jackie_Lewis_in_1961.jpg",
355 | "http://en.wikipedia.org/wiki/Willy_Mairesse": "https://upload.wikimedia.org/wikipedia/commons/4/48/Willy_Mairesse.jpg",
356 | "http://en.wikipedia.org/wiki/Ricardo_Rodr%C3%ADguez_(Formula_One)": "https://upload.wikimedia.org/wikipedia/commons/2/28/Rodr%C3%ADguez_at_1962_Dutch_Grand_Prix.jpg",
357 | "http://en.wikipedia.org/wiki/Ian_Burgess": "",
358 | "http://en.wikipedia.org/wiki/Jay_Chamberlain": "",
359 | "http://en.wikipedia.org/wiki/Heini_Walter": "",
360 | "http://en.wikipedia.org/wiki/Roger_Penske": "https://upload.wikimedia.org/wikipedia/commons/5/54/Roger_Penske_2023_%28cropped%29.jpg",
361 | "http://en.wikipedia.org/wiki/Rob_Schroeder": "",
362 | "http://en.wikipedia.org/wiki/Neville_Lederle": "",
363 | "http://en.wikipedia.org/wiki/Bruce_Johnstone_(racing_driver)": "",
364 | "http://en.wikipedia.org/wiki/Ernie_Pieterse": "",
365 | "http://en.wikipedia.org/wiki/Stirling_Moss": "https://upload.wikimedia.org/wikipedia/commons/b/b4/Stirling_Moss.jpg",
366 | "http://en.wikipedia.org/wiki/Wolfgang_Graf_Berghe_von_Trips": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Wolfgang_von_Trips_in_1957.JPG",
367 | "http://en.wikipedia.org/wiki/Cliff_Allison": "https://upload.wikimedia.org/wikipedia/commons/7/7b/J_Crosthwaite_%28with_oily_rag%29_and_Graham_Hill_%28on_left_of_picture%29_with_Lotus.jpg",
368 | "http://en.wikipedia.org/wiki/Hans_Herrmann": "https://upload.wikimedia.org/wikipedia/commons/1/1b/Hans_Herrmann_%282011%29.jpg",
369 | "http://en.wikipedia.org/wiki/Tony_Brooks": "",
370 | "http://en.wikipedia.org/wiki/Olivier_Gendebien": "https://upload.wikimedia.org/wikipedia/commons/1/17/Olivier_Gendebien%2C_1960s.jpg",
371 | "http://en.wikipedia.org/wiki/Roy_Salvadori": "https://upload.wikimedia.org/wikipedia/commons/3/3d/1958-03-22_Sebring_Roy_Salvadori_%28cropped2%29.jpg",
372 | "http://en.wikipedia.org/wiki/Henry_Taylor_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/8/86/Henry_Taylor_driving_a_Ford_Cortina_down_the_bobsleigh_run_at_Cortina_d%27Ampezzo.jpg",
373 | "http://en.wikipedia.org/wiki/Michael_May_(racing_driver)": "",
374 | "http://en.wikipedia.org/wiki/Keith_Greene": "",
375 | "http://en.wikipedia.org/wiki/Wolfgang_Seidel": "https://upload.wikimedia.org/wikipedia/commons/0/08/1955-05-01_Mille_Miglia_Porsche_550-15_Seidel_Gl%C3%B6ckler.jpg",
376 | "http://en.wikipedia.org/wiki/Tony_Marsh_(racing_driver)": "",
377 | "http://en.wikipedia.org/wiki/Gerry_Ashmore": "",
378 | "http://en.wikipedia.org/wiki/Tim_Parnell": "",
379 | "http://en.wikipedia.org/wiki/Renato_Pirocchi": "https://upload.wikimedia.org/wikipedia/commons/b/b5/Renato_Pirocchi_-_VII_Gran_Premio_di_Modena_F1_1961.jpg",
380 | "http://en.wikipedia.org/wiki/Peter_Ryan_(driver)": "https://upload.wikimedia.org/wikipedia/commons/9/96/1962-03-24_Sebring_Dino_248_SP_0806_Fulp_Ryan.jpg",
381 | "http://en.wikipedia.org/wiki/Carlos_Menditeguy": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Carlos_Menditeguy_-_El_Gr%C3%A1fico_1805.jpg",
382 | "http://en.wikipedia.org/wiki/Alberto_Rodriguez_Larreta": "https://upload.wikimedia.org/wikipedia/commons/d/dd/Jorge_Rodr%C3%ADguez_Larreta_-_El_Gr%C3%A1fico_2001.jpg",
383 | "http://en.wikipedia.org/wiki/Jos%C3%A9_Froil%C3%A1n_Gonz%C3%A1lez": "https://upload.wikimedia.org/wikipedia/commons/5/51/Jos%C3%A9_Froil%C3%A1n_Gonz%C3%A1lez_1950.jpg",
384 | "http://en.wikipedia.org/wiki/Roberto_Bonomi": "https://upload.wikimedia.org/wikipedia/commons/7/78/Roberto_Bonomi_-_El_Gr%C3%A1fico_1751.jpg",
385 | "http://en.wikipedia.org/wiki/Gino_Munaron": "",
386 | "http://en.wikipedia.org/wiki/Nasif_Est%C3%A9fano": "",
387 | "http://en.wikipedia.org/wiki/Jim_Rathmann": "",
388 | "http://en.wikipedia.org/wiki/Rodger_Ward": "https://upload.wikimedia.org/wikipedia/commons/9/9d/Rodger_Ward_1950.jpg",
389 | "http://en.wikipedia.org/wiki/Paul_Goldsmith": "",
390 | "http://en.wikipedia.org/wiki/Don_Branson": "",
391 | "http://en.wikipedia.org/wiki/Johnny_Thomson": "",
392 | "http://en.wikipedia.org/wiki/Eddie_Johnson_(auto_racer)": "",
393 | "http://en.wikipedia.org/wiki/Lloyd_Ruby": "",
394 | "http://en.wikipedia.org/wiki/Bob_Veith": "",
395 | "http://en.wikipedia.org/wiki/Bud_Tingelstad": "",
396 | "http://en.wikipedia.org/wiki/Bob_Christie_(racing_driver)": "",
397 | "http://en.wikipedia.org/wiki/Red_Amick": "",
398 | "http://en.wikipedia.org/wiki/Duane_Carter": "https://upload.wikimedia.org/wikipedia/commons/8/80/Duane_Carter_at_Soldier_Field_circa_1946.jpg",
399 | "http://en.wikipedia.org/wiki/Bill_Homeier": "",
400 | "http://en.wikipedia.org/wiki/Gene_Hartley": "",
401 | "http://en.wikipedia.org/wiki/Chuck_Stevenson": "https://upload.wikimedia.org/wikipedia/commons/7/72/Chuck_Stevenson_1952cr.jpg",
402 | "http://en.wikipedia.org/wiki/Bobby_Grim": "",
403 | "http://en.wikipedia.org/wiki/Shorty_Templeman": "",
404 | "http://en.wikipedia.org/wiki/Jim_Hurtubise": "https://upload.wikimedia.org/wikipedia/commons/3/39/Jim_Hurtubise.jpg",
405 | "http://en.wikipedia.org/wiki/Jimmy_Bryan": "",
406 | "http://en.wikipedia.org/wiki/Troy_Ruttman": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Troy_Ruttman_1951.jpg",
407 | "http://en.wikipedia.org/wiki/Eddie_Sachs": "",
408 | "http://en.wikipedia.org/wiki/Don_Freeland": "",
409 | "http://en.wikipedia.org/wiki/Tony_Bettenhausen": "https://upload.wikimedia.org/wikipedia/commons/1/15/Tony_Bettenhausen_circa_1952.jpg",
410 | "http://en.wikipedia.org/wiki/Wayne_Weiler": "",
411 | "http://en.wikipedia.org/wiki/A.J._Foyt": "https://upload.wikimedia.org/wikipedia/commons/6/62/AJ_Foyt_at_Foyt_Wine_Vault_-_2015_-_Sarah_Stierch_2.jpg",
412 | "http://en.wikipedia.org/wiki/Eddie_Russo": "",
413 | "http://en.wikipedia.org/wiki/Johnny_Boyd": "",
414 | "http://en.wikipedia.org/wiki/Gene_Force": "",
415 | "http://en.wikipedia.org/wiki/Jim_McWithey": "",
416 | "http://en.wikipedia.org/wiki/Len_Sutton": "",
417 | "http://en.wikipedia.org/wiki/Dick_Rathmann": "https://upload.wikimedia.org/wikipedia/commons/1/1e/Dick_Rathmann_USAC_circa_1957.jpg",
418 | "http://en.wikipedia.org/wiki/Al_Herman": "",
419 | "http://en.wikipedia.org/wiki/Dempsey_Wilson": "",
420 | "http://en.wikipedia.org/wiki/Ron_Flockhart_(auto_racing)": "",
421 | "http://en.wikipedia.org/wiki/Bruce_Halford": "",
422 | "http://en.wikipedia.org/wiki/David_Piper": "",
423 | "http://en.wikipedia.org/wiki/Brian_Naylor": "",
424 | "http://en.wikipedia.org/wiki/Giulio_Cabianca": "https://upload.wikimedia.org/wikipedia/commons/d/d7/Giulio_Cabianca_in_an_OSCA_%28cropped%29.jpg",
425 | "http://en.wikipedia.org/wiki/Edgar_Barth": "https://upload.wikimedia.org/wikipedia/commons/3/3d/Edgar_Barth_podium_Nurburgring_1957.jpg",
426 | "http://en.wikipedia.org/wiki/Piero_Drogo": "https://upload.wikimedia.org/wikipedia/commons/e/e8/1962_ASA_1000_GTC_Drogo_Bizzarini.jpg",
427 | "http://en.wikipedia.org/wiki/Fred_Gamble_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/a/a9/Fred_Gamble_-_1961_U.S._National_Championship.png",
428 | "http://en.wikipedia.org/wiki/Chuck_Daigh": "",
429 | "http://en.wikipedia.org/wiki/Bob_Drake_(Formula_One)": "",
430 | "http://en.wikipedia.org/wiki/Paul_Russo": "https://upload.wikimedia.org/wikipedia/commons/8/81/Paul_Russo_1947.jpg",
431 | "http://en.wikipedia.org/wiki/Jimmy_Daywalt": "",
432 | "http://en.wikipedia.org/wiki/Chuck_Arnold": "",
433 | "http://en.wikipedia.org/wiki/Jean_Behra": "https://upload.wikimedia.org/wikipedia/commons/3/3e/Jean_Behra_-_El_Gr%C3%A1fico_1953.jpg",
434 | "http://en.wikipedia.org/wiki/Harry_Schell": "",
435 | "http://en.wikipedia.org/wiki/Giorgio_Scarlatti": "https://upload.wikimedia.org/wikipedia/commons/9/9e/1957-08-18_Pescara_GP_Maserati_250_Scarlatti.jpg",
436 | "http://en.wikipedia.org/wiki/Fritz_d%27Orey": "",
437 | "http://en.wikipedia.org/wiki/Alan_Stacey": "https://upload.wikimedia.org/wikipedia/commons/3/39/Alan_Stacey_1960.jpg",
438 | "http://en.wikipedia.org/wiki/Chris_Bristow": "",
439 | "http://en.wikipedia.org/wiki/Peter_Ashdown": "https://upload.wikimedia.org/wikipedia/commons/f/f0/1956-08-26_Karlskoga_WINNER_Lotus_IX_Ashdown.jpg",
440 | "http://en.wikipedia.org/wiki/Ivor_Bueb": "",
441 | "http://en.wikipedia.org/wiki/Carroll_Shelby": "https://upload.wikimedia.org/wikipedia/commons/1/13/CarrollShelbyVIR2007.jpg",
442 | "http://en.wikipedia.org/wiki/Mario_de_Araujo_Cabral": "",
443 | "http://en.wikipedia.org/wiki/Colin_Davis_(driver)": "",
444 | "http://en.wikipedia.org/wiki/Harry_Blanchard": "",
445 | "http://en.wikipedia.org/wiki/Luigi_Musso": "https://upload.wikimedia.org/wikipedia/commons/8/8b/Luigi_Musso.jpg",
446 | "http://en.wikipedia.org/wiki/Mike_Hawthorn": "",
447 | "http://en.wikipedia.org/wiki/Juan_Manuel_Fangio": "https://upload.wikimedia.org/wikipedia/commons/2/20/Fangio_in_1955_%28cropped%29.jpg",
448 | "http://en.wikipedia.org/wiki/Paco_Godia": "",
449 | "http://en.wikipedia.org/wiki/Horace_Gould": "",
450 | "http://en.wikipedia.org/wiki/Peter_Collins_(racing_driver)": "",
451 | "http://en.wikipedia.org/wiki/George_Amick": "",
452 | "http://en.wikipedia.org/wiki/Jimmy_Reece": "",
453 | "http://en.wikipedia.org/wiki/Jud_Larson": "",
454 | "http://en.wikipedia.org/wiki/Bill_Cheesbourg": "",
455 | "http://en.wikipedia.org/wiki/Al_Keller": "",
456 | "http://en.wikipedia.org/wiki/Johnnie_Parsons": "https://upload.wikimedia.org/wikipedia/commons/a/a8/Johnnie_Parsons_USAC_circa_1957.jpg",
457 | "http://en.wikipedia.org/wiki/Johnnie_Tolan": "https://upload.wikimedia.org/wikipedia/commons/2/28/Johnnie_Tolan_1950_%28cropped%29.jpg",
458 | "http://en.wikipedia.org/wiki/Stuart_Lewis-Evans": "",
459 | "http://en.wikipedia.org/wiki/Maria_Teresa_de_Filippis": "https://upload.wikimedia.org/wikipedia/commons/8/88/Maria_Teresa_de_Filippis_%28cropped%29.jpg",
460 | "http://en.wikipedia.org/wiki/Gerino_Gerini_(racing_driver)": "",
461 | "http://en.wikipedia.org/wiki/Jack_Fairman": "",
462 | "http://en.wikipedia.org/wiki/Robert_La_Caze": "",
463 | "http://en.wikipedia.org/wiki/Andr%C3%A9_Guelfi": "https://upload.wikimedia.org/wikipedia/commons/5/50/Comit%C3%A9_d%27organisation_du_Grand_Prix_d%27Agadir%2C_1953_%28Andr%C3%A9_Guelfi%29.jpg",
464 | "http://en.wikipedia.org/wiki/Alfonso_de_Portago": "https://upload.wikimedia.org/wikipedia/commons/1/16/Alfonso%2C_Marquess_of_Portago.jpg",
465 | "http://en.wikipedia.org/wiki/Cesare_Perdisa": "",
466 | "http://en.wikipedia.org/wiki/Alessandro_de_Tomaso": "https://upload.wikimedia.org/wikipedia/commons/9/95/Alejandro_detomaso.jpg",
467 | "http://en.wikipedia.org/wiki/Luigi_Piotti": "",
468 | "http://en.wikipedia.org/wiki/Sam_Hanks": "https://upload.wikimedia.org/wikipedia/commons/4/4c/Sam_Hanks_USAC_circa_1957.jpg",
469 | "http://en.wikipedia.org/wiki/Andy_Linden_(racing_driver)": "",
470 | "http://en.wikipedia.org/wiki/Marshall_Teague_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/49/Marshall_Teague_USAC_circa_1957.jpg",
471 | "http://en.wikipedia.org/wiki/Pat_O%27Connor_(auto_racer)": "",
472 | "http://en.wikipedia.org/wiki/Jack_Turner_(driver)": "",
473 | "http://en.wikipedia.org/wiki/Chuck_Weyant": "",
474 | "http://en.wikipedia.org/wiki/Mike_MacDowel": "",
475 | "http://en.wikipedia.org/wiki/Bob_Gerard": "",
476 | "http://en.wikipedia.org/wiki/Andr%C3%A9_Simon_(racing_driver)": "",
477 | "http://en.wikipedia.org/wiki/Ottorino_Volonterio": "",
478 | "http://en.wikipedia.org/wiki/Chico_Landi": "",
479 | "http://en.wikipedia.org/wiki/Alberto_Uria": "",
480 | "http://en.wikipedia.org/wiki/%C3%93scar_Gonz%C3%A1lez_(racing_driver)": "",
481 | "http://en.wikipedia.org/wiki/Eugenio_Castellotti": "https://upload.wikimedia.org/wikipedia/commons/7/75/Eugenio_Castellotti.jpg",
482 | "http://en.wikipedia.org/wiki/Hernando_da_Silva_Ramos": "",
483 | "http://en.wikipedia.org/wiki/%C3%89lie_Bayol": "",
484 | "http://en.wikipedia.org/wiki/Andr%C3%A9_Pilette": "",
485 | "http://en.wikipedia.org/wiki/Pat_Flaherty_(racing_driver)": "",
486 | "http://en.wikipedia.org/wiki/Bob_Sweikert": "https://upload.wikimedia.org/wikipedia/commons/4/4e/Bob_Sweikert.jpg",
487 | "http://en.wikipedia.org/wiki/Cliff_Griffith": "",
488 | "http://en.wikipedia.org/wiki/Fred_Agabashian": "https://upload.wikimedia.org/wikipedia/commons/8/85/Fred_Agabashian_1953_%28cropped%29.jpg",
489 | "http://en.wikipedia.org/wiki/Billy_Garrett": "",
490 | "http://en.wikipedia.org/wiki/Duke_Dinsmore": "",
491 | "http://en.wikipedia.org/wiki/Paul_Fr%C3%A8re": "https://upload.wikimedia.org/wikipedia/commons/5/56/2003-04-26_Paul_Fr%C3%A8re_Cfs.JPG",
492 | "http://en.wikipedia.org/wiki/Luigi_Villoresi": "https://upload.wikimedia.org/wikipedia/commons/d/dd/Luis_Villoresi_-_El_Gr%C3%A1fico_1442.jpg",
493 | "http://en.wikipedia.org/wiki/Louis_Rosier": "",
494 | "http://en.wikipedia.org/wiki/Robert_Manzon": "",
495 | "http://en.wikipedia.org/wiki/Toulo_de_Graffenried": "https://upload.wikimedia.org/wikipedia/commons/7/77/Toulo_de_Graffenried.gif",
496 | "http://en.wikipedia.org/wiki/Nino_Farina": "https://upload.wikimedia.org/wikipedia/commons/d/d0/Giuseppe_Farina_-_El_Gr%C3%A1fico_1750.jpg",
497 | "http://en.wikipedia.org/wiki/Umberto_Maglioli": "https://upload.wikimedia.org/wikipedia/commons/4/41/Umberto_Maglioli.jpg",
498 | "http://en.wikipedia.org/wiki/Karl_Kling": "https://upload.wikimedia.org/wikipedia/commons/a/ad/Karl_Kling_El_Gr%C3%A1fico.jpg",
499 | "http://en.wikipedia.org/wiki/Roberto_Mieres": "https://upload.wikimedia.org/wikipedia/commons/2/23/Roberto_Mieres_-_El_Gr%C3%A1fico_1770.jpg",
500 | "http://en.wikipedia.org/wiki/Sergio_Mantovani": "https://upload.wikimedia.org/wikipedia/commons/4/44/SergioMantovani-AlfaRomeo.png",
501 | "http://en.wikipedia.org/wiki/Louis_Chiron": "https://upload.wikimedia.org/wikipedia/commons/d/d8/Louis_Chiron_1931bw.jpg",
502 | "http://en.wikipedia.org/wiki/Jacques_Pollet": "",
503 | "http://en.wikipedia.org/wiki/Piero_Taruffi": "https://upload.wikimedia.org/wikipedia/commons/8/8e/Piero_Taruffi.jpg",
504 | "http://en.wikipedia.org/wiki/Jimmy_Davies": "",
505 | "http://en.wikipedia.org/wiki/Walt_Faulkner": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Walt_Faulkner_circa_1948.jpg",
506 | "http://en.wikipedia.org/wiki/Johnny_Claes": "https://upload.wikimedia.org/wikipedia/commons/8/84/Talbot_F1_vr_yellow_EMS.jpg",
507 | "http://en.wikipedia.org/wiki/Mike_Sparken": "https://upload.wikimedia.org/wikipedia/commons/1/16/1955-02-27_Agadir_WINNER_Ferrari_750_0504M_Mike_Sparken.jpg",
508 | "http://en.wikipedia.org/wiki/Lance_Macklin": "",
509 | "http://en.wikipedia.org/wiki/Ken_Wharton": "",
510 | "http://en.wikipedia.org/wiki/John_Fitch_(driver)": "",
511 | "http://en.wikipedia.org/wiki/Prince_Bira": "https://upload.wikimedia.org/wikipedia/commons/d/dc/Air_cadets_learn_the_basics_of_flight_at_RNAS_St_Merryn_in_Cornwall%2C_February_1944._A22064-croponBirabongse_Bhanudej.jpg",
512 | "http://en.wikipedia.org/wiki/Bill_Vukovich": "https://upload.wikimedia.org/wikipedia/commons/c/c3/Bill_Vukovich_1951.jpg",
513 | "http://en.wikipedia.org/wiki/Jack_McGrath_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/44/Jack_McGrath_1951.jpg",
514 | "http://en.wikipedia.org/wiki/Mike_Nazaruk": "",
515 | "http://en.wikipedia.org/wiki/Jerry_Hoyt": "",
516 | "http://en.wikipedia.org/wiki/Larry_Crockett": "",
517 | "http://en.wikipedia.org/wiki/Cal_Niday": "",
518 | "http://en.wikipedia.org/wiki/Art_Cross": "",
519 | "http://en.wikipedia.org/wiki/Manny_Ayulo": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Manny_Ayulo_1953.jpg",
520 | "http://en.wikipedia.org/wiki/Jimmy_Jackson_(driver)": "",
521 | "http://en.wikipedia.org/wiki/Ernie_McCoy": "",
522 | "http://en.wikipedia.org/wiki/Ed_Elisian": "",
523 | "http://en.wikipedia.org/wiki/Bob_Scott_(auto_racer)": "https://upload.wikimedia.org/wikipedia/commons/7/77/Bob_Scott_1954.jpg",
524 | "http://en.wikipedia.org/wiki/Frank_Armi": "",
525 | "http://en.wikipedia.org/wiki/George_Fonder": "",
526 | "http://en.wikipedia.org/wiki/Onofre_Marim%C3%B3n": "https://upload.wikimedia.org/wikipedia/commons/1/19/Onofre_Marim%C3%B3n_-_El_Gr%C3%A1fico_1708.jpg",
527 | "http://en.wikipedia.org/wiki/Don_Beauman": "",
528 | "http://en.wikipedia.org/wiki/Leslie_Marr": "https://upload.wikimedia.org/wikipedia/commons/9/9f/Leslie_Marr_with_painting_2019_%28cropped%29.jpg",
529 | "http://en.wikipedia.org/wiki/Leslie_Thorne": "",
530 | "http://en.wikipedia.org/wiki/Jacques_Swaters": "https://upload.wikimedia.org/wikipedia/commons/5/5f/Jacques_Swaters_1980.jpg",
531 | "http://en.wikipedia.org/wiki/Fred_Wacker": "https://upload.wikimedia.org/wikipedia/commons/1/19/Cunningham_C2-R_no_5103%2C_front_right_%28Greenwich_2018%29.jpg",
532 | "http://en.wikipedia.org/wiki/Jorge_Daponte": "",
533 | "http://en.wikipedia.org/wiki/Alberto_Ascari": "https://upload.wikimedia.org/wikipedia/commons/6/69/Ascari_last_photo_in_car.jpg",
534 | "http://en.wikipedia.org/wiki/%C3%93scar_Alfredo_G%C3%A1lvez": "https://upload.wikimedia.org/wikipedia/commons/3/3f/Oscar_Alfredo_G%C3%A1lvez.jpg",
535 | "http://en.wikipedia.org/wiki/John_Barber_(racing_driver)": "",
536 | "http://en.wikipedia.org/wiki/Alan_Brown_(racing_driver)": "",
537 | "http://en.wikipedia.org/wiki/Duke_Nalon": "https://upload.wikimedia.org/wikipedia/commons/9/95/Duke_Nalon_1946.jpg",
538 | "http://en.wikipedia.org/wiki/Carl_Scarborough": "",
539 | "http://en.wikipedia.org/wiki/Bill_Holland": "https://upload.wikimedia.org/wikipedia/commons/8/86/Bill_Holland_and_Linda_Darnell_1949_Indianapolis_500_%28cropped%29.jpg",
540 | "http://en.wikipedia.org/wiki/Johnny_Mantz": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Johnny_Mantz_USAC_circa_1957.jpg",
541 | "http://en.wikipedia.org/wiki/Felice_Bonetto": "https://upload.wikimedia.org/wikipedia/commons/d/d4/Portrait_of_Felice_Bonetto_%28cropped%29.jpg",
542 | "http://en.wikipedia.org/wiki/Yves_Giraud_Cabantous": "https://upload.wikimedia.org/wikipedia/commons/b/b1/Yves_Giraud-Cabantous_vainqueur_du_Championnat_automobile_des_Aviateurs%2C_en_juin_1929_%28et_madame%29.jpg",
543 | "http://en.wikipedia.org/wiki/Peter_Whitehead_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/3/38/ERA_of_Peter_Whitehead%2C_1938_AGP.jpg",
544 | "http://en.wikipedia.org/wiki/Rodney_Nuckey": "",
545 | "http://en.wikipedia.org/wiki/Theo_Helfrich": "https://upload.wikimedia.org/wikipedia/commons/2/20/Fotothek_df_roe-neg_0006640_013_Portrait_eines_Automobilrennfahrers_in_seinem_Wa.jpg",
546 | "http://en.wikipedia.org/wiki/Kenneth_McAlpine": "",
547 | "http://en.wikipedia.org/wiki/Rudolf_Krause": "",
548 | "http://en.wikipedia.org/wiki/Ernst_Klodwig": "https://upload.wikimedia.org/wikipedia/commons/0/05/Klodwig-BMW.jpg",
549 | "http://en.wikipedia.org/wiki/Hermann_Lang": "https://upload.wikimedia.org/wikipedia/commons/5/5b/Hermann_Lang_El_Gr%C3%A1fico.jpg",
550 | "http://en.wikipedia.org/wiki/Max_de_Terra": "",
551 | "http://en.wikipedia.org/wiki/Albert_Scherrer": "",
552 | "http://en.wikipedia.org/wiki/Hans_Von_Stuck": "https://upload.wikimedia.org/wikipedia/commons/6/63/Bundesarchiv_Bild_102-08188%2C_Hans_von_Stuck.jpg",
553 | "http://en.wikipedia.org/wiki/Rudi_Fischer": "",
554 | "http://en.wikipedia.org/wiki/Peter_Hirt": "",
555 | "http://en.wikipedia.org/wiki/Eric_Brandon": "",
556 | "http://en.wikipedia.org/wiki/George_Connor_(driver)": "https://upload.wikimedia.org/wikipedia/commons/8/80/George_Connor_1933.jpg",
557 | "http://en.wikipedia.org/wiki/Jim_Rigsby": "",
558 | "http://en.wikipedia.org/wiki/Joe_James_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/4/49/Joe_James_qualifies_for_the_1951_Indy_500.jpg",
559 | "http://en.wikipedia.org/wiki/Bill_Schindler": "",
560 | "http://en.wikipedia.org/wiki/Henry_Banks": "https://upload.wikimedia.org/wikipedia/commons/3/38/Henry_Banks_1951_%283%29.jpg",
561 | "http://en.wikipedia.org/wiki/Johnny_McDowell": "",
562 | "http://en.wikipedia.org/wiki/Charles_de_Tornaco": "",
563 | "http://en.wikipedia.org/wiki/Roger_Laurent": "https://upload.wikimedia.org/wikipedia/commons/3/32/Ecosse_and_Francorchamps_Jaguar_C-types_Zandvoort_1954_crop.jpg",
564 | "http://en.wikipedia.org/wiki/Arthur_Legat": "",
565 | "http://en.wikipedia.org/wiki/Robert_O%27Brien_(auto_racer)": "",
566 | "http://en.wikipedia.org/wiki/Tony_Gaze": "",
567 | "http://en.wikipedia.org/wiki/Philippe_%C3%89tancelin": "https://upload.wikimedia.org/wikipedia/commons/2/2a/Philippe_%C3%89tancelin_at_the_1933_Grand_Prix_de_la_Marne_%28cropped%29.jpg",
568 | "http://en.wikipedia.org/wiki/Franco_Comotti": "",
569 | "http://en.wikipedia.org/wiki/Dennis_Poore": "",
570 | "http://en.wikipedia.org/wiki/Eric_Thompson_(racing_driver)": "",
571 | "http://en.wikipedia.org/wiki/Reg_Parnell": "https://upload.wikimedia.org/wikipedia/commons/7/72/Autoraces_te_Zandvoort%2C_Bestanddeelnr_902-9002.jpg",
572 | "http://en.wikipedia.org/wiki/Ken_Downing": "https://upload.wikimedia.org/wikipedia/commons/8/89/Ken_Downing_cropped.jpg",
573 | "http://en.wikipedia.org/wiki/Graham_Whitehead": "",
574 | "http://en.wikipedia.org/wiki/Gino_Bianco": "https://upload.wikimedia.org/wikipedia/commons/4/43/Gino_Bianco_%281949%29.jpg",
575 | "http://en.wikipedia.org/wiki/Tony_Crook": "",
576 | "http://en.wikipedia.org/wiki/Fritz_Riess": "https://upload.wikimedia.org/wikipedia/commons/4/48/Fritz_Rie%C3%9F.jpg",
577 | "http://en.wikipedia.org/wiki/Toni_Ulmen": "",
578 | "http://en.wikipedia.org/wiki/Helmut_Niedermayr": "",
579 | "http://en.wikipedia.org/wiki/Hans_Klenk": "",
580 | "http://en.wikipedia.org/wiki/Duncan_Hamilton_(racing_driver)": "",
581 | "http://en.wikipedia.org/wiki/Jan_Flinterman": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Majoor_Flinterman%2C_Bestanddeelnr_903-5819.jpg",
582 | "http://en.wikipedia.org/wiki/Eitel_Cantoni": "",
583 | "http://en.wikipedia.org/wiki/Consalvo_Sanesi": "https://upload.wikimedia.org/wikipedia/commons/e/ee/Consalvo_Sanesi.jpg",
584 | "http://en.wikipedia.org/wiki/Guy_Mairesse": "https://upload.wikimedia.org/wikipedia/commons/1/11/Guymairesse.jpg",
585 | "http://en.wikipedia.org/wiki/Lee_Wallard": "https://upload.wikimedia.org/wikipedia/commons/3/3a/Leewallard.jpg",
586 | "http://en.wikipedia.org/wiki/Bobby_Ball_(auto_racer)": "",
587 | "http://en.wikipedia.org/wiki/Carl_Forberg": "",
588 | "http://en.wikipedia.org/wiki/Pierre_Levegh": "",
589 | "http://en.wikipedia.org/wiki/Luigi_Fagioli": "https://upload.wikimedia.org/wikipedia/commons/b/b3/Luigi_Fagioli_in_his_Maserati_at_the_1932_Targa_Florio_%28cropped%29.jpg",
590 | "http://en.wikipedia.org/wiki/Eug%C3%A8ne_Chaboud": "https://upload.wikimedia.org/wikipedia/commons/7/75/Eug%C3%A8ne_Chaboud%2C_vainqueur_des_24_heures_du_Mans_1938.jpg",
591 | "http://en.wikipedia.org/wiki/Peter_Walker_(driver)": "",
592 | "http://en.wikipedia.org/wiki/Brian_Shawe_Taylor": "",
593 | "http://en.wikipedia.org/wiki/Franco_Rol": "",
594 | "http://en.wikipedia.org/wiki/Cuth_Harrison": "",
595 | "http://en.wikipedia.org/wiki/David_Hampshire": "",
596 | "http://en.wikipedia.org/wiki/Joe_Fry": "",
597 | "http://en.wikipedia.org/wiki/Raymond_Sommer": "https://upload.wikimedia.org/wikipedia/commons/f/f9/Raymond_Sommer_1932.jpg",
598 | "http://en.wikipedia.org/wiki/Mauri_Rose": "",
599 | "http://en.wikipedia.org/wiki/Cecil_Green": "",
600 | "http://en.wikipedia.org/wiki/Joie_Chitwood": "",
601 | "http://en.wikipedia.org/wiki/Myron_Fohr": "https://upload.wikimedia.org/wikipedia/commons/6/60/Myron_Fohr_%28circa_1946%29_%281%29.jpg",
602 | "http://en.wikipedia.org/wiki/Mack_Hellings": "https://upload.wikimedia.org/wikipedia/commons/e/ec/Mack_Hellings_1951.jpg",
603 | "http://en.wikipedia.org/wiki/Walt_Brown_(auto_racer)": "",
604 | "http://en.wikipedia.org/wiki/Travis_Webb": "",
605 | "http://en.wikipedia.org/wiki/Walt_Ader": "",
606 | "http://en.wikipedia.org/wiki/Jackie_Holmes": "",
607 | "http://en.wikipedia.org/wiki/Nello_Pagani": "https://upload.wikimedia.org/wikipedia/commons/b/b2/Nello_Pagani_wordt_gefeliciteerd_door_G._J._Bruinsman%2C_voorzitter_KNMV%2C_Bestanddeelnr_903-4797.jpg",
608 | "http://en.wikipedia.org/wiki/Toni_Branca": "",
609 | "http://en.wikipedia.org/wiki/Geoff_Crossley": "",
610 | "http://en.wikipedia.org/wiki/Charles_Pozzi": "",
611 | "http://en.wikipedia.org/wiki/Dorino_Serafini": "https://upload.wikimedia.org/wikipedia/commons/c/c3/Serafini_1936.jpg",
612 | "http://en.wikipedia.org/wiki/Paul_di_Resta": "https://upload.wikimedia.org/wikipedia/commons/a/a2/2014_DTM_HockenheimringII_Paul_di_Resta_by_2eight_8SC5384_%28cropped2%29.jpg",
613 | "http://en.wikipedia.org/wiki/J%C3%A9r%C3%B4me_d%27Ambrosio": "https://upload.wikimedia.org/wikipedia/commons/4/41/DAmbrosioBerlin_%28cropped%29.jpg",
614 | "http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez": "https://upload.wikimedia.org/wikipedia/commons/7/7a/Sergio_P%C3%A9rez_2019_%28cropped%29.jpg",
615 | "http://en.wikipedia.org/wiki/Pastor_Maldonado": "https://upload.wikimedia.org/wikipedia/commons/8/84/Pastor_Maldonado_2011_Malaysia.jpg",
616 | "http://en.wikipedia.org/wiki/Daniel_Ricciardo": "https://upload.wikimedia.org/wikipedia/commons/9/96/F12019_Schloss_Gabelhofen_%2818%29.jpg",
617 | "http://en.wikipedia.org/wiki/Jean-%C3%89ric_Vergne": "https://upload.wikimedia.org/wikipedia/commons/7/70/Jean-Eric_Vergne_2024_WEC_Fuji.jpg",
618 | "http://en.wikipedia.org/wiki/Charles_Pic": "https://upload.wikimedia.org/wikipedia/commons/e/ef/Charles_Pic_Moscow_2013.jpg",
619 | "http://en.wikipedia.org/wiki/Esteban_Guti%C3%A9rrez": "https://upload.wikimedia.org/wikipedia/commons/d/df/Esteban_Guti%C3%A9rrez_en_el_Gran_Premio_de_Italia_2019_%28cropped%29.jpg",
620 | "http://en.wikipedia.org/wiki/Valtteri_Bottas": "https://upload.wikimedia.org/wikipedia/commons/5/5f/Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg",
621 | "http://en.wikipedia.org/wiki/Jules_Bianchi": "https://upload.wikimedia.org/wikipedia/commons/0/03/Jules_Bianchi_2012-1.JPG",
622 | "http://en.wikipedia.org/wiki/Max_Chilton": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Max_Chilton_2.jpg",
623 | "http://en.wikipedia.org/wiki/Giedo_van_der_Garde": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Giedo_van_der_Garde.jpg",
624 | "http://en.wikipedia.org/wiki/Kevin_Magnussen": "https://upload.wikimedia.org/wikipedia/commons/6/63/Kevin_Magnussen%2C_2019_Formula_One_Tests_Barcelona_%28cropped%29.jpg",
625 | "http://en.wikipedia.org/wiki/Daniil_Kvyat": "https://upload.wikimedia.org/wikipedia/commons/b/b1/Daniil_Kvyat_2024_Suzuka_A2RL.jpg",
626 | "http://en.wikipedia.org/wiki/Marcus_Ericsson": "https://upload.wikimedia.org/wikipedia/commons/8/87/Marcus_Ericsson_in_2023.jpg",
627 | "http://en.wikipedia.org/wiki/Will_Stevens": "https://upload.wikimedia.org/wikipedia/commons/c/c5/Will_Stevens_2017.jpg",
628 | "http://en.wikipedia.org/wiki/Felipe_Nasr": "https://upload.wikimedia.org/wikipedia/commons/c/c8/Piloto_Felipe_Nasr_fala_%C3%A0_imprensa_ap%C3%B3s_encontro_com_Temer_%2828412246304%29_%28cropped%29.jpg",
629 | "http://en.wikipedia.org/wiki/Carlos_Sainz_Jr.": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Formula1Gabelhofen2022_%2804%29_%28cropped2%29.jpg",
630 | "http://en.wikipedia.org/wiki/Max_Verstappen": "https://upload.wikimedia.org/wikipedia/commons/5/52/2024-08-25_Motorsport%2C_Formel_1%2C_Gro%C3%9Fer_Preis_der_Niederlande_2024_STP_3973_by_Stepro_%28medium_crop%29.jpg",
631 | "http://en.wikipedia.org/wiki/Roberto_Merhi": "https://upload.wikimedia.org/wikipedia/commons/3/34/Merhi_Jakarta.jpg",
632 | "http://en.wikipedia.org/wiki/Alexander_Rossi_%28racing_driver%29": "https://upload.wikimedia.org/wikipedia/commons/4/45/Andretti_Autosport_Visit_180405-F-KS667-0012_%28cropped%29.jpg",
633 | "http://en.wikipedia.org/wiki/Jolyon_Palmer": "https://upload.wikimedia.org/wikipedia/commons/6/6c/Jolyon_Palmer_2016_Malaysia.jpg",
634 | "http://en.wikipedia.org/wiki/Pascal_Wehrlein": "https://upload.wikimedia.org/wikipedia/commons/0/0b/2024-05-10_Motorsport%2C_ABB_FIA_Formula_E_World_Championship%2C_Berlin_E-Prix_2024_STP_2554_by_Stepro.jpg",
635 | "http://en.wikipedia.org/wiki/Stoffel_Vandoorne": "https://upload.wikimedia.org/wikipedia/commons/c/c6/2023-04-23_Motorsport%2C_ABB_FIA_Formula_E_World_Championship%2C_Berlin_E-Prix_2023_1DX_1774_by_Stepro_%28cropped%29.jpg",
636 | "http://en.wikipedia.org/wiki/Rio_Haryanto": "https://upload.wikimedia.org/wikipedia/commons/6/6a/Rio_Haryanto_2016_paddock.jpg",
637 | "http://en.wikipedia.org/wiki/Esteban_Ocon": "https://upload.wikimedia.org/wikipedia/commons/e/e8/FIA_F1_Austria_2022_Drivers_Parade_%281%29_%28cropped%29.jpg",
638 | "http://en.wikipedia.org/wiki/Antonio_Giovinazzi": "https://upload.wikimedia.org/wikipedia/commons/9/91/Antonio_Giovinazzi_-_Ferrari_499P_-_Hybrid_during_the_pitwalk_at_the_2023_Le_Mans_%2853468237574%29.jpg",
639 | "http://en.wikipedia.org/wiki/Lance_Stroll": "https://upload.wikimedia.org/wikipedia/commons/a/a4/FIA_F1_Austria_2022_Lance_Stroll_%28cropped_2%29.jpg",
640 | "http://en.wikipedia.org/wiki/Pierre_Gasly": "https://upload.wikimedia.org/wikipedia/commons/f/fd/2022_French_Grand_Prix_%2852279065728%29_%28midcrop%29.png",
641 | "http://en.wikipedia.org/wiki/Brendon_Hartley": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Brendon_Hartley_2024_WEC_Fuji.jpg",
642 | "http://en.wikipedia.org/wiki/Charles_Leclerc": "https://upload.wikimedia.org/wikipedia/commons/7/7b/2024-08-25_Motorsport%2C_Formel_1%2C_Gro%C3%9Fer_Preis_der_Niederlande_2024_STP_3978_by_Stepro_%28cropped2%29.jpg",
643 | "http://en.wikipedia.org/wiki/Sergey_Sirotkin_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/f/fa/Sergey_Sirotkin_Moscow.jpg",
644 | "http://en.wikipedia.org/wiki/Lando_Norris": "https://upload.wikimedia.org/wikipedia/commons/a/ac/2024-08-25_Motorsport%2C_Formel_1%2C_Gro%C3%9Fer_Preis_der_Niederlande_2024_STP_3975_by_Stepro_%28cropped2%29.jpg",
645 | "http://en.wikipedia.org/wiki/Alexander_Albon": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Alex_Albon_%28cropped%29.jpg",
646 | "http://en.wikipedia.org/wiki/George_Russell_(racing_driver)": "https://upload.wikimedia.org/wikipedia/commons/f/ff/George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg",
647 | "http://en.wikipedia.org/wiki/Nicholas_Latifi": "https://upload.wikimedia.org/wikipedia/commons/5/58/Nicholas_Latifi_at_Singapore_in_2022_%28cropped%29.jpg",
648 | "http://en.wikipedia.org/wiki/Jack_Aitken": "https://upload.wikimedia.org/wikipedia/commons/4/42/2023-05-27_Motorsport%2C_DTM%2C_Oschersleben_1DX_4952_by_Stepro_%28cropped%29.jpg",
649 | "http://en.wikipedia.org/wiki/Pietro_Fittipaldi": "https://upload.wikimedia.org/wikipedia/commons/e/ec/Pietro_and_Enzo_Fittipaldi_%28cropped2%29.jpg",
650 | "http://en.wikipedia.org/wiki/Yuki_Tsunoda": "https://upload.wikimedia.org/wikipedia/commons/e/eb/2021_US_GP%2C_Tsunoda.jpg",
651 | "http://en.wikipedia.org/wiki/Mick_Schumacher": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Mick_Schumacher_2024_WEC_Fuji.jpg",
652 | "http://en.wikipedia.org/wiki/Nikita_Mazepin": "https://upload.wikimedia.org/wikipedia/commons/e/e8/%D0%9D%D0%B8%D0%BA%D0%B8%D1%82%D0%B0_%D0%9C%D0%B0%D0%B7%D0%B5%D0%BF%D0%B8%D0%BD_-_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D1%8C%D1%8E_-_2019%2C_02.jpg",
653 | "http://en.wikipedia.org/wiki/Zhou_Guanyu": "https://upload.wikimedia.org/wikipedia/commons/e/ed/Zhou_Guanyu_at_the_2022_Austrian_Grand_Prix.jpg",
654 | "http://en.wikipedia.org/wiki/Nyck_de_Vries": "https://upload.wikimedia.org/wikipedia/commons/2/2e/Nyck_de_Vries_2024_SF_Motegi.jpg",
655 | "http://en.wikipedia.org/wiki/Logan_Sargeant": "https://upload.wikimedia.org/wikipedia/commons/0/02/Logan_Sargeant_NYC_%28cropped%29.jpg",
656 | "http://en.wikipedia.org/wiki/Oscar_Piastri": "https://upload.wikimedia.org/wikipedia/commons/6/64/Oscar_Piastri.png",
657 | "http://en.wikipedia.org/wiki/Liam_Lawson": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Liam_Lawson_Austria_2022.jpg",
658 | "http://en.wikipedia.org/wiki/Oliver_Bearman": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Ollie_Bearman_Austria_2022.jpg",
659 | "http://en.wikipedia.org/wiki/Franco_Colapinto": "https://upload.wikimedia.org/wikipedia/commons/7/79/Conferencia_de_prensa_Colapinto_ACA_octubre_2023_-_BugWarp_%2813%29_%28cropped%29.jpg",
660 | "http://en.wikipedia.org/wiki/Jack_Doohan": "https://upload.wikimedia.org/wikipedia/commons/4/42/Jack_Doohan_2023.jpg"
661 | }
662 |
--------------------------------------------------------------------------------
/bun.lock:
--------------------------------------------------------------------------------
1 | {
2 | "lockfileVersion": 1,
3 | "workspaces": {
4 | "": {
5 | "name": "redis-bigquery",
6 | "dependencies": {
7 | "@google-cloud/bigquery": "^7.9.3",
8 | "cors": "^2.8.5",
9 | "dotenv": "^16.4.7",
10 | "express": "^4.21.2",
11 | "jsdom": "^26.0.0",
12 | "react": "^19.1.0",
13 | "react-dom": "^19.1.0",
14 | "react-router-dom": "^7.4.1",
15 | "react-tates": "^0.2.0",
16 | "redis": "^4.7.0",
17 | },
18 | "devDependencies": {
19 | "@types/react": "^19.0.12",
20 | "@types/react-dom": "^19.0.4",
21 | "@vitejs/plugin-react-swc": "^3.8.1",
22 | "globals": "^16.0.0",
23 | "npm-run-all": "^4.1.5",
24 | "prettier": "^3.5.3",
25 | "vite": "^6.2.3",
26 | },
27 | },
28 | },
29 | "packages": {
30 | "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.1.1", "", { "dependencies": { "@csstools/css-calc": "^2.1.2", "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA=="],
31 |
32 | "@csstools/color-helpers": ["@csstools/color-helpers@5.0.2", "", {}, "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA=="],
33 |
34 | "@csstools/css-calc": ["@csstools/css-calc@2.1.2", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw=="],
35 |
36 | "@csstools/css-color-parser": ["@csstools/css-color-parser@3.0.8", "", { "dependencies": { "@csstools/color-helpers": "^5.0.2", "@csstools/css-calc": "^2.1.2" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ=="],
37 |
38 | "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.4", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A=="],
39 |
40 | "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.3", "", {}, "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw=="],
41 |
42 | "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ=="],
43 |
44 | "@esbuild/android-arm": ["@esbuild/android-arm@0.25.1", "", { "os": "android", "cpu": "arm" }, "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q=="],
45 |
46 | "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.1", "", { "os": "android", "cpu": "arm64" }, "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA=="],
47 |
48 | "@esbuild/android-x64": ["@esbuild/android-x64@0.25.1", "", { "os": "android", "cpu": "x64" }, "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw=="],
49 |
50 | "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ=="],
51 |
52 | "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA=="],
53 |
54 | "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A=="],
55 |
56 | "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww=="],
57 |
58 | "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.1", "", { "os": "linux", "cpu": "arm" }, "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ=="],
59 |
60 | "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ=="],
61 |
62 | "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ=="],
63 |
64 | "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg=="],
65 |
66 | "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg=="],
67 |
68 | "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg=="],
69 |
70 | "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.1", "", { "os": "linux", "cpu": "none" }, "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ=="],
71 |
72 | "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ=="],
73 |
74 | "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA=="],
75 |
76 | "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.1", "", { "os": "none", "cpu": "arm64" }, "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g=="],
77 |
78 | "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.1", "", { "os": "none", "cpu": "x64" }, "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA=="],
79 |
80 | "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg=="],
81 |
82 | "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw=="],
83 |
84 | "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg=="],
85 |
86 | "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ=="],
87 |
88 | "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A=="],
89 |
90 | "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg=="],
91 |
92 | "@google-cloud/bigquery": ["@google-cloud/bigquery@7.9.3", "", { "dependencies": { "@google-cloud/common": "^5.0.0", "@google-cloud/paginator": "^5.0.2", "@google-cloud/precise-date": "^4.0.0", "@google-cloud/promisify": "4.0.0", "arrify": "^2.0.1", "big.js": "^6.0.0", "duplexify": "^4.0.0", "extend": "^3.0.2", "is": "^3.3.0", "stream-events": "^1.0.5", "uuid": "^9.0.0" } }, "sha512-e0jvEwnEyvQeJOn5Twd429yr7T5/+3wR0rO0Vfe+3T25P0dRShhGyknlh/Ucoafa7WR4imFhW8+542yR4VkJ+w=="],
93 |
94 | "@google-cloud/common": ["@google-cloud/common@5.0.2", "", { "dependencies": { "@google-cloud/projectify": "^4.0.0", "@google-cloud/promisify": "^4.0.0", "arrify": "^2.0.1", "duplexify": "^4.1.1", "extend": "^3.0.2", "google-auth-library": "^9.0.0", "html-entities": "^2.5.2", "retry-request": "^7.0.0", "teeny-request": "^9.0.0" } }, "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA=="],
95 |
96 | "@google-cloud/paginator": ["@google-cloud/paginator@5.0.2", "", { "dependencies": { "arrify": "^2.0.0", "extend": "^3.0.2" } }, "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg=="],
97 |
98 | "@google-cloud/precise-date": ["@google-cloud/precise-date@4.0.0", "", {}, "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA=="],
99 |
100 | "@google-cloud/projectify": ["@google-cloud/projectify@4.0.0", "", {}, "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA=="],
101 |
102 | "@google-cloud/promisify": ["@google-cloud/promisify@4.0.0", "", {}, "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="],
103 |
104 | "@redis/bloom": ["@redis/bloom@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg=="],
105 |
106 | "@redis/client": ["@redis/client@1.6.0", "", { "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", "yallist": "4.0.0" } }, "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg=="],
107 |
108 | "@redis/graph": ["@redis/graph@1.1.1", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw=="],
109 |
110 | "@redis/json": ["@redis/json@1.0.7", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ=="],
111 |
112 | "@redis/search": ["@redis/search@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw=="],
113 |
114 | "@redis/time-series": ["@redis/time-series@1.1.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g=="],
115 |
116 | "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.37.0", "", { "os": "android", "cpu": "arm" }, "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ=="],
117 |
118 | "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.37.0", "", { "os": "android", "cpu": "arm64" }, "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA=="],
119 |
120 | "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.37.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA=="],
121 |
122 | "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.37.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ=="],
123 |
124 | "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.37.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA=="],
125 |
126 | "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.37.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA=="],
127 |
128 | "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w=="],
129 |
130 | "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.37.0", "", { "os": "linux", "cpu": "arm" }, "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag=="],
131 |
132 | "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA=="],
133 |
134 | "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.37.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ=="],
135 |
136 | "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA=="],
137 |
138 | "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.37.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ=="],
139 |
140 | "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw=="],
141 |
142 | "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.37.0", "", { "os": "linux", "cpu": "none" }, "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA=="],
143 |
144 | "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.37.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A=="],
145 |
146 | "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ=="],
147 |
148 | "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.37.0", "", { "os": "linux", "cpu": "x64" }, "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w=="],
149 |
150 | "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.37.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg=="],
151 |
152 | "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.37.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA=="],
153 |
154 | "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.37.0", "", { "os": "win32", "cpu": "x64" }, "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA=="],
155 |
156 | "@swc/core": ["@swc/core@1.11.13", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.19" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.11.13", "@swc/core-darwin-x64": "1.11.13", "@swc/core-linux-arm-gnueabihf": "1.11.13", "@swc/core-linux-arm64-gnu": "1.11.13", "@swc/core-linux-arm64-musl": "1.11.13", "@swc/core-linux-x64-gnu": "1.11.13", "@swc/core-linux-x64-musl": "1.11.13", "@swc/core-win32-arm64-msvc": "1.11.13", "@swc/core-win32-ia32-msvc": "1.11.13", "@swc/core-win32-x64-msvc": "1.11.13" }, "peerDependencies": { "@swc/helpers": "*" }, "optionalPeers": ["@swc/helpers"] }, "sha512-9BXdYz12Wl0zWmZ80PvtjBWeg2ncwJ9L5WJzjhN6yUTZWEV/AwAdVdJnIEp4pro3WyKmAaMxcVOSbhuuOZco5g=="],
157 |
158 | "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.11.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-loSERhLaQ9XDS+5Kdx8cLe2tM1G0HLit8MfehipAcsdctpo79zrRlkW34elOf3tQoVPKUItV0b/rTuhjj8NtHg=="],
159 |
160 | "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.11.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-uSA4UwgsDCIysUPfPS8OrQTH2h9spO7IYFd+1NB6dJlVGUuR6jLKuMBOP1IeLeax4cGHayvkcwSJ3OvxHwgcZQ=="],
161 |
162 | "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.11.13", "", { "os": "linux", "cpu": "arm" }, "sha512-boVtyJzS8g30iQfe8Q46W5QE/cmhKRln/7NMz/5sBP/am2Lce9NL0d05NnFwEWJp1e2AMGHFOdRr3Xg1cDiPKw=="],
163 |
164 | "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.11.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-+IK0jZ84zHUaKtwpV+T+wT0qIUBnK9v2xXD03vARubKF+eUqCsIvcVHXmLpFuap62dClMrhCiwW10X3RbXNlHw=="],
165 |
166 | "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.11.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-+ukuB8RHD5BHPCUjQwuLP98z+VRfu+NkKQVBcLJGgp0/+w7y0IkaxLY/aKmrAS5ofCNEGqKL+AOVyRpX1aw+XA=="],
167 |
168 | "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.11.13", "", { "os": "linux", "cpu": "x64" }, "sha512-q9H3WI3U3dfJ34tdv60zc8oTuWvSd5fOxytyAO9Pc5M82Hic3jjWaf2xBekUg07ubnMZpyfnv+MlD+EbUI3Llw=="],
169 |
170 | "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.11.13", "", { "os": "linux", "cpu": "x64" }, "sha512-9aaZnnq2pLdTbAzTSzy/q8dr7Woy3aYIcQISmw1+Q2/xHJg5y80ZzbWSWKYca/hKonDMjIbGR6dp299I5J0aeA=="],
171 |
172 | "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.11.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-n3QZmDewkHANcoHvtwvA6yJbmS4XJf0MBMmwLZoKDZ2dOnC9D/jHiXw7JOohEuzYcpLoL5tgbqmjxa3XNo9Oow=="],
173 |
174 | "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.11.13", "", { "os": "win32", "cpu": "ia32" }, "sha512-wM+Nt4lc6YSJFthCx3W2dz0EwFNf++j0/2TQ0Js9QLJuIxUQAgukhNDVCDdq8TNcT0zuA399ALYbvj5lfIqG6g=="],
175 |
176 | "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.11.13", "", { "os": "win32", "cpu": "x64" }, "sha512-+X5/uW3s1L5gK7wAo0E27YaAoidJDo51dnfKSfU7gF3mlEUuWH8H1bAy5OTt2mU4eXtfsdUMEVXSwhDlLtQkuA=="],
177 |
178 | "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="],
179 |
180 | "@swc/types": ["@swc/types@0.1.20", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-/rlIpxwKrhz4BIplXf6nsEHtqlhzuNN34/k3kMAXH4/lvVoA3cdq+60aqVNnyvw2uITEaCi0WV3pxBe4dQqoXQ=="],
181 |
182 | "@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="],
183 |
184 | "@types/caseless": ["@types/caseless@0.12.5", "", {}, "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="],
185 |
186 | "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="],
187 |
188 | "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
189 |
190 | "@types/node": ["@types/node@22.13.14", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w=="],
191 |
192 | "@types/react": ["@types/react@19.0.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA=="],
193 |
194 | "@types/react-dom": ["@types/react-dom@19.0.4", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg=="],
195 |
196 | "@types/request": ["@types/request@2.48.12", "", { "dependencies": { "@types/caseless": "*", "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.0" } }, "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw=="],
197 |
198 | "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="],
199 |
200 | "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.8.1", "", { "dependencies": { "@swc/core": "^1.11.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6" } }, "sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A=="],
201 |
202 | "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="],
203 |
204 | "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="],
205 |
206 | "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
207 |
208 | "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
209 |
210 | "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="],
211 |
212 | "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
213 |
214 | "arrify": ["arrify@2.0.1", "", {}, "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="],
215 |
216 | "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
217 |
218 | "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
219 |
220 | "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
221 |
222 | "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
223 |
224 | "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
225 |
226 | "big.js": ["big.js@6.2.2", "", {}, "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ=="],
227 |
228 | "bignumber.js": ["bignumber.js@9.1.2", "", {}, "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="],
229 |
230 | "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="],
231 |
232 | "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
233 |
234 | "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
235 |
236 | "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
237 |
238 | "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
239 |
240 | "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
241 |
242 | "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
243 |
244 | "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
245 |
246 | "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="],
247 |
248 | "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
249 |
250 | "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
251 |
252 | "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
253 |
254 | "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
255 |
256 | "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="],
257 |
258 | "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
259 |
260 | "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="],
261 |
262 | "cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="],
263 |
264 | "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
265 |
266 | "cross-spawn": ["cross-spawn@6.0.6", "", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw=="],
267 |
268 | "cssstyle": ["cssstyle@4.3.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.1.1", "rrweb-cssom": "^0.8.0" } }, "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ=="],
269 |
270 | "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
271 |
272 | "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="],
273 |
274 | "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
275 |
276 | "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="],
277 |
278 | "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
279 |
280 | "debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
281 |
282 | "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="],
283 |
284 | "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
285 |
286 | "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
287 |
288 | "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
289 |
290 | "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
291 |
292 | "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
293 |
294 | "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="],
295 |
296 | "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
297 |
298 | "duplexify": ["duplexify@4.1.3", "", { "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", "readable-stream": "^3.1.1", "stream-shift": "^1.0.2" } }, "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA=="],
299 |
300 | "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
301 |
302 | "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
303 |
304 | "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
305 |
306 | "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="],
307 |
308 | "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
309 |
310 | "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="],
311 |
312 | "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="],
313 |
314 | "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
315 |
316 | "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
317 |
318 | "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
319 |
320 | "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
321 |
322 | "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
323 |
324 | "esbuild": ["esbuild@0.25.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.1", "@esbuild/android-arm": "0.25.1", "@esbuild/android-arm64": "0.25.1", "@esbuild/android-x64": "0.25.1", "@esbuild/darwin-arm64": "0.25.1", "@esbuild/darwin-x64": "0.25.1", "@esbuild/freebsd-arm64": "0.25.1", "@esbuild/freebsd-x64": "0.25.1", "@esbuild/linux-arm": "0.25.1", "@esbuild/linux-arm64": "0.25.1", "@esbuild/linux-ia32": "0.25.1", "@esbuild/linux-loong64": "0.25.1", "@esbuild/linux-mips64el": "0.25.1", "@esbuild/linux-ppc64": "0.25.1", "@esbuild/linux-riscv64": "0.25.1", "@esbuild/linux-s390x": "0.25.1", "@esbuild/linux-x64": "0.25.1", "@esbuild/netbsd-arm64": "0.25.1", "@esbuild/netbsd-x64": "0.25.1", "@esbuild/openbsd-arm64": "0.25.1", "@esbuild/openbsd-x64": "0.25.1", "@esbuild/sunos-x64": "0.25.1", "@esbuild/win32-arm64": "0.25.1", "@esbuild/win32-ia32": "0.25.1", "@esbuild/win32-x64": "0.25.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ=="],
325 |
326 | "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
327 |
328 | "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
329 |
330 | "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
331 |
332 | "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="],
333 |
334 | "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
335 |
336 | "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="],
337 |
338 | "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
339 |
340 | "form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="],
341 |
342 | "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
343 |
344 | "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
345 |
346 | "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
347 |
348 | "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
349 |
350 | "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
351 |
352 | "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
353 |
354 | "gaxios": ["gaxios@6.7.1", "", { "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" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="],
355 |
356 | "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="],
357 |
358 | "generic-pool": ["generic-pool@3.9.0", "", {}, "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="],
359 |
360 | "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
361 |
362 | "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
363 |
364 | "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
365 |
366 | "globals": ["globals@16.0.0", "", {}, "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A=="],
367 |
368 | "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
369 |
370 | "google-auth-library": ["google-auth-library@9.15.1", "", { "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" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="],
371 |
372 | "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="],
373 |
374 | "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
375 |
376 | "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
377 |
378 | "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="],
379 |
380 | "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
381 |
382 | "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="],
383 |
384 | "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
385 |
386 | "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="],
387 |
388 | "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
389 |
390 | "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
391 |
392 | "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
393 |
394 | "hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="],
395 |
396 | "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="],
397 |
398 | "html-entities": ["html-entities@2.5.5", "", {}, "sha512-24CG9o869vSa86BGCf7x65slrAztzFTU5VBQzEIwqjhKuB4zCC7xlH/7NCcZ1EN5MdmGx9lUqugfutuT6J+jKQ=="],
399 |
400 | "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="],
401 |
402 | "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
403 |
404 | "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
405 |
406 | "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
407 |
408 | "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
409 |
410 | "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
411 |
412 | "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
413 |
414 | "is": ["is@3.3.0", "", {}, "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg=="],
415 |
416 | "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
417 |
418 | "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
419 |
420 | "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
421 |
422 | "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="],
423 |
424 | "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
425 |
426 | "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
427 |
428 | "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
429 |
430 | "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
431 |
432 | "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
433 |
434 | "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="],
435 |
436 | "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="],
437 |
438 | "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
439 |
440 | "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="],
441 |
442 | "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="],
443 |
444 | "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
445 |
446 | "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
447 |
448 | "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="],
449 |
450 | "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
451 |
452 | "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="],
453 |
454 | "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="],
455 |
456 | "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
457 |
458 | "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
459 |
460 | "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
461 |
462 | "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
463 |
464 | "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
465 |
466 | "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
467 |
468 | "jsdom": ["jsdom@26.0.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", "form-data": "^4.0.1", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.0.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw=="],
469 |
470 | "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
471 |
472 | "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="],
473 |
474 | "jwa": ["jwa@2.0.0", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA=="],
475 |
476 | "jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="],
477 |
478 | "load-json-file": ["load-json-file@4.0.0", "", { "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" } }, "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw=="],
479 |
480 | "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
481 |
482 | "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
483 |
484 | "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
485 |
486 | "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="],
487 |
488 | "memorystream": ["memorystream@0.3.1", "", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="],
489 |
490 | "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="],
491 |
492 | "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="],
493 |
494 | "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
495 |
496 | "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
497 |
498 | "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
499 |
500 | "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
501 |
502 | "ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
503 |
504 | "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
505 |
506 | "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="],
507 |
508 | "nice-try": ["nice-try@1.0.5", "", {}, "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="],
509 |
510 | "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
511 |
512 | "normalize-package-data": ["normalize-package-data@2.5.0", "", { "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA=="],
513 |
514 | "npm-run-all": ["npm-run-all@4.1.5", "", { "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", "cross-spawn": "^6.0.5", "memorystream": "^0.3.1", "minimatch": "^3.0.4", "pidtree": "^0.3.0", "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" }, "bin": { "run-p": "bin/run-p/index.js", "run-s": "bin/run-s/index.js", "npm-run-all": "bin/npm-run-all/index.js" } }, "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ=="],
515 |
516 | "nwsapi": ["nwsapi@2.2.20", "", {}, "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA=="],
517 |
518 | "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
519 |
520 | "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
521 |
522 | "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
523 |
524 | "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
525 |
526 | "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
527 |
528 | "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
529 |
530 | "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
531 |
532 | "parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="],
533 |
534 | "parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="],
535 |
536 | "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
537 |
538 | "path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="],
539 |
540 | "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
541 |
542 | "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="],
543 |
544 | "path-type": ["path-type@3.0.0", "", { "dependencies": { "pify": "^3.0.0" } }, "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg=="],
545 |
546 | "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
547 |
548 | "pidtree": ["pidtree@0.3.1", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA=="],
549 |
550 | "pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="],
551 |
552 | "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
553 |
554 | "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
555 |
556 | "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="],
557 |
558 | "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
559 |
560 | "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
561 |
562 | "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="],
563 |
564 | "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
565 |
566 | "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="],
567 |
568 | "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="],
569 |
570 | "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="],
571 |
572 | "react-router": ["react-router@7.4.1", "", { "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg=="],
573 |
574 | "react-router-dom": ["react-router-dom@7.4.1", "", { "dependencies": { "react-router": "7.4.1" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA=="],
575 |
576 | "react-tates": ["react-tates@0.2.0", "", { "peerDependencies": { "react": ">=17.x", "tates": "^0.3.x" } }, "sha512-m/BfjCeFwFql4SfYuFfHYDqeiOMtKZjWAFdZ8Sw02JmsmDGXZEcKHy32YvJ942LPW518ePUJ2CoUX2SKs0v7qw=="],
577 |
578 | "read-pkg": ["read-pkg@3.0.0", "", { "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" } }, "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA=="],
579 |
580 | "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
581 |
582 | "redis": ["redis@4.7.0", "", { "dependencies": { "@redis/bloom": "1.2.0", "@redis/client": "1.6.0", "@redis/graph": "1.1.1", "@redis/json": "1.0.7", "@redis/search": "1.2.0", "@redis/time-series": "1.1.0" } }, "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ=="],
583 |
584 | "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
585 |
586 | "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
587 |
588 | "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
589 |
590 | "retry-request": ["retry-request@7.0.2", "", { "dependencies": { "@types/request": "^2.48.8", "extend": "^3.0.2", "teeny-request": "^9.0.0" } }, "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w=="],
591 |
592 | "rollup": ["rollup@4.37.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.37.0", "@rollup/rollup-android-arm64": "4.37.0", "@rollup/rollup-darwin-arm64": "4.37.0", "@rollup/rollup-darwin-x64": "4.37.0", "@rollup/rollup-freebsd-arm64": "4.37.0", "@rollup/rollup-freebsd-x64": "4.37.0", "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", "@rollup/rollup-linux-arm-musleabihf": "4.37.0", "@rollup/rollup-linux-arm64-gnu": "4.37.0", "@rollup/rollup-linux-arm64-musl": "4.37.0", "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-gnu": "4.37.0", "@rollup/rollup-linux-riscv64-musl": "4.37.0", "@rollup/rollup-linux-s390x-gnu": "4.37.0", "@rollup/rollup-linux-x64-gnu": "4.37.0", "@rollup/rollup-linux-x64-musl": "4.37.0", "@rollup/rollup-win32-arm64-msvc": "4.37.0", "@rollup/rollup-win32-ia32-msvc": "4.37.0", "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg=="],
593 |
594 | "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="],
595 |
596 | "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="],
597 |
598 | "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
599 |
600 | "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
601 |
602 | "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
603 |
604 | "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
605 |
606 | "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="],
607 |
608 | "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
609 |
610 | "semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
611 |
612 | "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="],
613 |
614 | "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="],
615 |
616 | "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="],
617 |
618 | "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
619 |
620 | "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
621 |
622 | "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
623 |
624 | "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
625 |
626 | "shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="],
627 |
628 | "shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="],
629 |
630 | "shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="],
631 |
632 | "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
633 |
634 | "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
635 |
636 | "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
637 |
638 | "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
639 |
640 | "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
641 |
642 | "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="],
643 |
644 | "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
645 |
646 | "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="],
647 |
648 | "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="],
649 |
650 | "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
651 |
652 | "stream-events": ["stream-events@1.0.5", "", { "dependencies": { "stubs": "^3.0.0" } }, "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg=="],
653 |
654 | "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="],
655 |
656 | "string.prototype.padend": ["string.prototype.padend@3.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q=="],
657 |
658 | "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="],
659 |
660 | "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="],
661 |
662 | "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="],
663 |
664 | "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
665 |
666 | "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
667 |
668 | "stubs": ["stubs@3.0.0", "", {}, "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="],
669 |
670 | "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
671 |
672 | "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
673 |
674 | "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="],
675 |
676 | "tates": ["tates@0.3.4", "", { "dependencies": { "lodash": "^4.17.21" } }, "sha512-fuN+b89K7bjtJOow8K04AOfdsSlzULS3KhIjjHogJ6gSrhMaFsa5uC0Ws1fuKrqwDDEgzJL4P/9jrG4Y1qef8A=="],
677 |
678 | "teeny-request": ["teeny-request@9.0.0", "", { "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" } }, "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g=="],
679 |
680 | "tldts": ["tldts@6.1.85", "", { "dependencies": { "tldts-core": "^6.1.85" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w=="],
681 |
682 | "tldts-core": ["tldts-core@6.1.85", "", {}, "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA=="],
683 |
684 | "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
685 |
686 | "tough-cookie": ["tough-cookie@5.1.2", "", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="],
687 |
688 | "tr46": ["tr46@5.1.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw=="],
689 |
690 | "turbo-stream": ["turbo-stream@2.4.0", "", {}, "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="],
691 |
692 | "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
693 |
694 | "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
695 |
696 | "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="],
697 |
698 | "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="],
699 |
700 | "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="],
701 |
702 | "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
703 |
704 | "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
705 |
706 | "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
707 |
708 | "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
709 |
710 | "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="],
711 |
712 | "uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
713 |
714 | "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
715 |
716 | "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
717 |
718 | "vite": ["vite@6.2.3", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg=="],
719 |
720 | "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="],
721 |
722 | "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
723 |
724 | "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="],
725 |
726 | "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="],
727 |
728 | "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="],
729 |
730 | "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
731 |
732 | "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="],
733 |
734 | "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="],
735 |
736 | "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="],
737 |
738 | "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="],
739 |
740 | "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
741 |
742 | "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="],
743 |
744 | "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
745 |
746 | "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="],
747 |
748 | "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
749 |
750 | "@types/request/form-data": ["form-data@2.5.3", "", { "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" } }, "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ=="],
751 |
752 | "http-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
753 |
754 | "https-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
755 |
756 | "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
757 |
758 | "react-router/cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="],
759 |
760 | "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
761 |
762 | "send/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
763 |
764 | "teeny-request/http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="],
765 |
766 | "teeny-request/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="],
767 |
768 | "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
769 |
770 | "http-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
771 |
772 | "https-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
773 |
774 | "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
775 |
776 | "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
777 |
778 | "teeny-request/http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
779 |
780 | "teeny-request/http-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
781 |
782 | "teeny-request/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
783 |
784 | "teeny-request/https-proxy-agent/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
785 |
786 | "teeny-request/http-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
787 |
788 | "teeny-request/https-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
789 | }
790 | }
791 |
--------------------------------------------------------------------------------