assignmentDetailResList = dayAssignmentList.stream()
+ .map(assignment -> new AssignmentDetailRes(
+ assignment.getAssignmentName(),
+ assignment.getSubmitted()
+ ))
+ .toList();
+ }
+ }
+
+ return assignmentResponses;
+ }
+
+ public String create(AssignmentReq assignmentReq) {
+
+ Assignment assignment = Assignment.create(
+ assignmentReq.getAssignmentName(),
+ assignmentReq.getWeek(),
+ assignmentReq.getSection(),
+ assignmentReq.getOrderNumber());
+
+ assignment = assignmentRepository.save(assignment);
+
+ return assignment.getAssignmentName();
+ }
+}
diff --git a/backend/pirocheck/src/main/resources/application.yml b/backend/pirocheck/src/main/resources/application.yml
new file mode 100644
index 0000000..1416bb4
--- /dev/null
+++ b/backend/pirocheck/src/main/resources/application.yml
@@ -0,0 +1,14 @@
+spring:
+ datasource:
+ url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
+ username: ${DB_USER}
+ password: ${DB_PASSWORD}
+ driver-class-name: org.postgresql.Driver
+ jpa:
+ hibernate:
+ ddl-auto: update
+ show-sql: true
+ properties:
+ hibernate:
+ format_sql: true
+ open-in-view: false
\ No newline at end of file
diff --git a/backend/pirocheck/src/test/java/backend/pirocheck/PirocheckApplicationTests.java b/backend/pirocheck/src/test/java/backend/pirocheck/PirocheckApplicationTests.java
new file mode 100644
index 0000000..ed24e06
--- /dev/null
+++ b/backend/pirocheck/src/test/java/backend/pirocheck/PirocheckApplicationTests.java
@@ -0,0 +1,13 @@
+package backend.pirocheck;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class PirocheckApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/backend/pirocheck/test/java/backend/pirocheck/PirocheckApplicationTests.java b/backend/pirocheck/test/java/backend/pirocheck/PirocheckApplicationTests.java
new file mode 100644
index 0000000..ed24e06
--- /dev/null
+++ b/backend/pirocheck/test/java/backend/pirocheck/PirocheckApplicationTests.java
@@ -0,0 +1,13 @@
+package backend.pirocheck;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class PirocheckApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/frontend/.gitignore b/frontend/.gitignore
index d823d0d..4f48545 100644
--- a/frontend/.gitignore
+++ b/frontend/.gitignore
@@ -24,4 +24,5 @@ dist-ssr
*.sw?
-.env
\ No newline at end of file
+*.env
+*.pem
\ No newline at end of file
diff --git a/frontend/index.html b/frontend/index.html
index 0c589ec..79c4701 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -1,4 +1,4 @@
-
+
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index e8fb4e4..b2c7481 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -8,6 +8,7 @@
"name": "frontend",
"version": "0.0.0",
"dependencies": {
+ "lucide-react": "^0.507.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.5.3"
@@ -2234,6 +2235,15 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/lucide-react": {
+ "version": "0.507.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz",
+ "integrity": "sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 5baabb2..aac2c62 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -10,6 +10,8 @@
"preview": "vite preview"
},
"dependencies": {
+ "axios": "^1.9.0",
+ "lucide-react": "^0.507.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.5.3"
diff --git a/frontend/public/assets/fonts/Akira Expanded Demo.otf b/frontend/public/assets/fonts/Akira Expanded Demo.otf
new file mode 100644
index 0000000..c75fdb3
Binary files /dev/null and b/frontend/public/assets/fonts/Akira Expanded Demo.otf differ
diff --git a/frontend/public/assets/img/arrowicon.png b/frontend/public/assets/img/arrowicon.png
new file mode 100644
index 0000000..01e2334
Binary files /dev/null and b/frontend/public/assets/img/arrowicon.png differ
diff --git a/frontend/public/assets/img/arrowicon.svg b/frontend/public/assets/img/arrowicon.svg
new file mode 100644
index 0000000..8df3309
--- /dev/null
+++ b/frontend/public/assets/img/arrowicon.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/public/assets/img/boom-filled-green.png b/frontend/public/assets/img/boom-filled-green.png
new file mode 100644
index 0000000..6416093
Binary files /dev/null and b/frontend/public/assets/img/boom-filled-green.png differ
diff --git a/frontend/public/assets/img/boom-filled-red.png b/frontend/public/assets/img/boom-filled-red.png
new file mode 100644
index 0000000..ef5bb3b
Binary files /dev/null and b/frontend/public/assets/img/boom-filled-red.png differ
diff --git a/frontend/public/assets/img/full_coin_green.png b/frontend/public/assets/img/full_coin_green.png
new file mode 100644
index 0000000..7471e14
Binary files /dev/null and b/frontend/public/assets/img/full_coin_green.png differ
diff --git a/frontend/public/assets/img/logo.svg b/frontend/public/assets/img/logo.svg
new file mode 100644
index 0000000..62a3683
--- /dev/null
+++ b/frontend/public/assets/img/logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/frontend/public/assets/img/moneyicon.png b/frontend/public/assets/img/moneyicon.png
new file mode 100644
index 0000000..373cce2
Binary files /dev/null and b/frontend/public/assets/img/moneyicon.png differ
diff --git a/frontend/public/assets/img/moneyicon.svg b/frontend/public/assets/img/moneyicon.svg
new file mode 100644
index 0000000..35c8a6f
--- /dev/null
+++ b/frontend/public/assets/img/moneyicon.svg
@@ -0,0 +1,4 @@
+
diff --git a/frontend/public/assets/img/one_coin_yellow.png b/frontend/public/assets/img/one_coin_yellow.png
new file mode 100644
index 0000000..ea0b67a
Binary files /dev/null and b/frontend/public/assets/img/one_coin_yellow.png differ
diff --git a/frontend/public/assets/img/tabler--boom.png b/frontend/public/assets/img/tabler--boom.png
new file mode 100644
index 0000000..23126cf
Binary files /dev/null and b/frontend/public/assets/img/tabler--boom.png differ
diff --git a/frontend/public/assets/img/tabler--boom.svg b/frontend/public/assets/img/tabler--boom.svg
new file mode 100644
index 0000000..8c6b2eb
--- /dev/null
+++ b/frontend/public/assets/img/tabler--boom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/public/assets/img/three_out_red.png b/frontend/public/assets/img/three_out_red.png
new file mode 100644
index 0000000..d2729d1
Binary files /dev/null and b/frontend/public/assets/img/three_out_red.png differ
diff --git a/frontend/public/assets/img/two_coin_yellow.png b/frontend/public/assets/img/two_coin_yellow.png
new file mode 100644
index 0000000..80650f2
Binary files /dev/null and b/frontend/public/assets/img/two_coin_yellow.png differ
diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg
deleted file mode 100644
index e7b8dfb..0000000
--- a/frontend/public/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/frontend/src/Admin.jsx b/frontend/src/Admin.jsx
new file mode 100644
index 0000000..1eb01d0
--- /dev/null
+++ b/frontend/src/Admin.jsx
@@ -0,0 +1,9 @@
+const Admin = () => {
+ return (
+
+
Admin Page
+
This is the admin page.
+
+ );
+};
+export default Admin;
diff --git a/frontend/src/App.css b/frontend/src/App.css
deleted file mode 100644
index b9d355d..0000000
--- a/frontend/src/App.css
+++ /dev/null
@@ -1,42 +0,0 @@
-#root {
- max-width: 1280px;
- margin: 0 auto;
- padding: 2rem;
- text-align: center;
-}
-
-.logo {
- height: 6em;
- padding: 1.5em;
- will-change: filter;
- transition: filter 300ms;
-}
-.logo:hover {
- filter: drop-shadow(0 0 2em #646cffaa);
-}
-.logo.react:hover {
- filter: drop-shadow(0 0 2em #61dafbaa);
-}
-
-@keyframes logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
-
-@media (prefers-reduced-motion: no-preference) {
- a:nth-of-type(2) .logo {
- animation: logo-spin infinite 20s linear;
- }
-}
-
-.card {
- padding: 2em;
-}
-
-.read-the-docs {
- color: #888;
-}
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index f67355a..db217ff 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -1,35 +1,27 @@
-import { useState } from 'react'
-import reactLogo from './assets/react.svg'
-import viteLogo from '/vite.svg'
-import './App.css'
+import React from "react";
+import { BrowserRouter, Routes, Route } from "react-router-dom";
+import Login from "./Login";
+import Home from "./Home";
+import Assignment from "./Assignment";
+import Deposit from "./Deposit";
+import Intro from "./Intro";
+import Admin from "./Admin";
+import Attendance from "./Attendance";
function App() {
- const [count, setCount] = useState(0)
-
return (
- <>
-
- Vite + React
-
-
-
- Edit src/App.jsx and save to test HMR
-
-
-
- Click on the Vite and React logos to learn more
-
- >
- )
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+ );
}
-export default App
+export default App;
diff --git a/frontend/src/Assignment.jsx b/frontend/src/Assignment.jsx
new file mode 100644
index 0000000..cff140f
--- /dev/null
+++ b/frontend/src/Assignment.jsx
@@ -0,0 +1,66 @@
+import React, { useEffect, useState } from "react";
+import WeeklyListBlock from "./components/WeeklyListBlock";
+import Header from "./components/Header";
+import AssignmentInfoBlock from "./components/AssignmentInfoBlock";
+import styles from "./Assignment.module.css";
+import { mapStatus } from "./utils/AssignmentStatus.js";
+
+const Assignment = () => {
+ const [weeks, setWeeks] = useState([]);
+ const [highlightCard, setHighlightCard] = useState(null);
+
+ useEffect(() => {
+ const user = JSON.parse(localStorage.getItem("user"));
+ const userId = user?.id;
+
+ if (!userId) return;
+
+ fetchAssignmentsByUser(userId)
+ .then((weekData) => {
+ const formatted = weekData.map((weekItem) => ({
+ label: `${weekItem.week}주차 ${weekItem.title}`,
+ details: weekItem.days.map((dayItem) => ({
+ day: dayItem.day,
+ subject: weekItem.title,
+ tasks: dayItem.details.map((task) => ({
+ label: task.assignmentName,
+ status: mapStatus(task.status),
+ })),
+ })),
+ }));
+
+ setWeeks(formatted);
+
+ // 형광 카드용 하이라이트 카드 추출 (가장 최근 주차 + 첫 요일)=>운영진용 페이지 만든 후 수정필요
+ // 운영진이 가장 최근 공개한 과제로.
+ if (formatted.length > 0 && formatted[0].details.length > 0) {
+ const first = formatted[0];
+ const firstDay = first.details[0];
+
+ setHighlightCard({
+ weekLabel: first.label,
+ day: firstDay.day,
+ tasks: firstDay.tasks,
+ });
+ }
+ })
+ .catch(() => {
+ alert("과제 정보를 불러오지 못했습니다.");
+ });
+ }, []);
+
+ return (
+
+
+ {highlightCard && (
+
+ )}
+
+
+ );
+};
+
+export default Assignment;
+
diff --git a/frontend/src/Assignment.module.css b/frontend/src/Assignment.module.css
new file mode 100644
index 0000000..ef95f36
--- /dev/null
+++ b/frontend/src/Assignment.module.css
@@ -0,0 +1,13 @@
+.info {
+ margin-top: 28px;
+ margin-bottom: 54px;
+}
+
+.assignment_page {
+ background-color: "black";
+ min-height: "100vh";
+ color: "white";
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
diff --git a/frontend/src/Attendance.jsx b/frontend/src/Attendance.jsx
new file mode 100644
index 0000000..79650f7
--- /dev/null
+++ b/frontend/src/Attendance.jsx
@@ -0,0 +1,62 @@
+import { useState } from "react";
+import Header from "./components/Header";
+import InputBlock from "./components/InputBlock";
+import AttendanceWeekInfo from "./components/AttendanceWeekInfo";
+import styles from "./Attendance.module.css";
+
+const Attendance = () => {
+ const [attendanceCode, setAttendanceCode] = useState([""]);
+ const handleChange = (index, value) => {
+ // 숫자만 입력 허용
+ if (/^\d*$/.test(value)) {
+ const userCodes = [...attendanceCode];
+ userCodes[index] = value;
+ setAttendanceCode(userCodes);
+ }
+ };
+ const handleSubmit = () => {
+ console.log("제출된 출석 코드: ", attendanceCode[0]);
+ // 서버 요청 등 추가 작업
+ };
+
+ return (
+
+
+
+ {attendanceCode[0].length === 4 && (
+
+ )}
+
+
+
+ );
+};
+
+export default Attendance;
diff --git a/frontend/src/Attendance.module.css b/frontend/src/Attendance.module.css
new file mode 100644
index 0000000..a6f3852
--- /dev/null
+++ b/frontend/src/Attendance.module.css
@@ -0,0 +1,35 @@
+.attendance_page {
+ background-color: "black";
+ height: "100vh";
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: relative;
+}
+.submitBtn {
+ background-color: #ffffff;
+ opacity: 42%;
+ border-radius: 10px;
+ position: absolute;
+ top: 109px;
+ right: 63px;
+ padding: 7px;
+}
+.attend_img_container {
+ display: flex;
+ gap: 22px;
+ width: 100%;
+ padding-block: 40px;
+ justify-content: center;
+}
+.boom_icon {
+ width: 70px;
+ height: 65px;
+}
+.boom_icon > img {
+ width: 100%;
+ height: 100%;
+}
+.attend_week_container {
+ margin-top: 20px;
+}
diff --git a/frontend/src/Deposit.jsx b/frontend/src/Deposit.jsx
new file mode 100644
index 0000000..ce2198c
--- /dev/null
+++ b/frontend/src/Deposit.jsx
@@ -0,0 +1,46 @@
+import Header from "./components/Header";
+import styles from "./Deposit.module.css";
+import axios from "axios";
+import { useEffect, useState } from "react";
+
+const Deposit = () => {
+ const [deposit, setDeposit] = useState(null);
+ useEffect(() => {
+ const user = JSON.parse(localStorage.getItem("user"));
+ const userId = user?.id;
+
+ if (!userId) return;
+
+ axios
+ .get(`/api/deposit/${userId}`)
+ .then((res) => setDeposit(res.data))
+ .catch((err) => {
+ alert("보증금 정보를 불러오지 못했습니다.");
+ });
+ }, []);
+
+ if (!deposit) return loagin...
;
+
+ return (
+
+
+
+ 잔여 보증금
+ {deposit.amount}원
+
+
+ 과제 차감
+ {deposit.descentAssignment}원
+
+
+ 출석 차감
+ {deposit.descentAttendance}원
+
+
+ 보증금 방어권
+ {deposit.ascentDefence}원
+
+
+ );
+};
+export default Deposit;
diff --git a/frontend/src/Deposit.module.css b/frontend/src/Deposit.module.css
new file mode 100644
index 0000000..3f83c5d
--- /dev/null
+++ b/frontend/src/Deposit.module.css
@@ -0,0 +1,41 @@
+.deposit_container {
+ width: 390px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+.deposit {
+ background-color: var(--main-green);
+ width: 309px;
+ padding-top: 26px;
+ padding-bottom: 30px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 17px;
+ border-radius: 9px;
+ margin-top: 80px;
+ margin-bottom: 87px;
+}
+.deposit > span:nth-child(1) {
+ font-weight: bold;
+ font-size: 16px;
+}
+.deposit > span:nth-child(2) {
+ font-weight: bold;
+ font-size: 20px;
+}
+.deposit_detail {
+ background-color: #575757;
+ color: white;
+ border: 1px solid rgba(217, 217, 217, 0.4);
+ border-radius: 8px;
+ padding: 12px 20px;
+ font-size: 15px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 309px;
+ height: 47px;
+ margin-bottom: 15px;
+}
diff --git a/frontend/src/Home.jsx b/frontend/src/Home.jsx
new file mode 100644
index 0000000..f1fe4fa
--- /dev/null
+++ b/frontend/src/Home.jsx
@@ -0,0 +1,31 @@
+import React from "react";
+import { useNavigate } from "react-router-dom";
+import styles from "./Home.module.css";
+
+const Home = () => {
+ const navigate = useNavigate();
+ return (
+
+
+
PIROCHECK
+
+
+

+
+
+ );
+};
+
+export default Home;
diff --git a/frontend/src/Home.module.css b/frontend/src/Home.module.css
new file mode 100644
index 0000000..9cdf1de
--- /dev/null
+++ b/frontend/src/Home.module.css
@@ -0,0 +1,48 @@
+.home {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ overflow: hidden;
+ font-family: 'Akira Expanded';
+}
+.pirocheck {
+ margin-top: 43px;
+ font-size: 1.25rem;
+ margin-bottom: 103px;
+}
+.home_container {
+ background-color: var(--background-black);
+ color: var(--main-green);
+ font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+}
+.button {
+ width: 309px;
+ height: 81px;
+ border-radius: 8px;
+ background-color: var(--border-gray);
+ color: var(--text-white);
+ font-family: 'Akira Expanded';
+ font-weight: 400;
+ font-size: 16px;
+ border: 1px var(--background-black) solid;
+ padding: 15px;
+ font-weight: bold;
+ margin-bottom: 26px;
+ z-index: 1;
+}
+.button p {
+ text-align: start;
+}
+.button:hover {
+ background-color: var(--card-toggle-green);
+ color: var(--text-white);
+}
+.home img {
+ position: relative;
+ opacity: 0.8;
+ top: -92px;
+ z-index: 0;
+}
diff --git a/frontend/src/Intro.jsx b/frontend/src/Intro.jsx
new file mode 100644
index 0000000..0419c6a
--- /dev/null
+++ b/frontend/src/Intro.jsx
@@ -0,0 +1,25 @@
+import React, { useEffect } from "react";
+import { useNavigate } from "react-router-dom";
+import styles from "./Intro.module.css";
+
+const Intro = () => {
+ const navigate = useNavigate();
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ navigate("/login");
+ }, 2000);
+
+ return () => clearTimeout(timer);
+ }, [navigate]);
+
+ return (
+
+ );
+};
+
+export default Intro;
diff --git a/frontend/src/Intro.module.css b/frontend/src/Intro.module.css
new file mode 100644
index 0000000..9fc44ae
--- /dev/null
+++ b/frontend/src/Intro.module.css
@@ -0,0 +1,34 @@
+.intro {
+ width: 390px;
+ position: relative;
+ height: 100vh;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 0;
+ overflow: hidden;
+}
+
+.intro::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background-image: url("./assets/img/logo.svg");
+ background-repeat: no-repeat;
+ background-size: contain;
+ background-position: center;
+ opacity: 0.5;
+ z-index: -1;
+}
+.pirocheck {
+ font-size: 1.25rem;
+ transform: scaleX(1.5);
+}
+.intro_container {
+ background-color: var(--background-black);
+ color: var(--main-green);
+ font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+ display: flex;
+ justify-content: center;
+}
diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx
new file mode 100644
index 0000000..e74413a
--- /dev/null
+++ b/frontend/src/Login.jsx
@@ -0,0 +1,90 @@
+import React from "react";
+import { useState } from "react";
+import InputBlock from "./components/InputBlock";
+import { useNavigate } from "react-router-dom";
+import styles from "./Login.module.css";
+import { loginUser } from "./api/user";
+
+const Login = () => {
+ const [name, setName] = useState("");
+ const [password, setPassword] = useState("");
+ const [responseMessage, setResponseMessage] = useState("");
+
+ const navigate = useNavigate();
+
+ const handleChange = (index, value) => {
+ if (index === 0) setName(value);
+ else if (index === 1) setPassword(value);
+ };
+
+ const handleLogin = async () => {
+ try {
+ const res = await loginUser({ name, password });
+
+ if (!res.ok) {
+ const data = await res.json();
+
+ if (res.status === 401) {
+ setResponseMessage(
+ data?.message || "이름 또는 비밀번호를 다시 확인해주세요."
+ );
+ } else {
+ setResponseMessage(
+ data?.message ||
+ "알 수 없는 오류가 발생했습니다. 다시 시도해주세요."
+ );
+ }
+
+ return;
+ }
+
+ const data = await res.json(); // { id, name, role }
+
+ localStorage.setItem("user", JSON.stringify(data));
+
+ if (data.role === "ADMIN") {
+ navigate("/admin");
+ } else if (data.role === "MEMBER") {
+ navigate("/home");
+ } else {
+ setResponseMessage("알 수 없는 사용자 유형입니다.");
+ }
+ } catch (error) {
+ console.error(error);
+ setResponseMessage("서버 연결에 실패했습니다. 다시 시도해주세요.");
+ }
+ };
+
+ return (
+
+
+
PIROCHECK
+
+
+
+ {responseMessage}
+
+
+
+
+ );
+};
+export default Login;
diff --git a/frontend/src/Login.module.css b/frontend/src/Login.module.css
new file mode 100644
index 0000000..170420b
--- /dev/null
+++ b/frontend/src/Login.module.css
@@ -0,0 +1,43 @@
+.login {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+.pirocheck {
+ font-size: 1.25rem;
+ transform: scaleX(1.1);
+ margin-bottom: 65px;
+}
+.login_container {
+ background-color: var(--background-black);
+ color: var(--main-green);
+ font-family: 'Akira Expanded';
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+}
+.button {
+ background-color: var(--main-green);
+ color: white;
+ width: 309px;
+ height: 47px;
+ border-radius: 14px;
+ margin-top: 15px;
+ font-size: 16px;
+}
+button:disabled {
+ opacity: 0.6;
+ cursor: default;
+}
+.errorWrapper {
+ width: 309px;
+ display: flex;
+ justify-content: flex-start;
+ margin-left: 8px;
+}
+.errormessage {
+ font-family: "Noto Sans", sans-serif;
+ color: #ff5858;
+ font-size: 10px;
+ margin-top: 10px;
+}
diff --git a/frontend/src/api/assignment.js b/frontend/src/api/assignment.js
new file mode 100644
index 0000000..4102105
--- /dev/null
+++ b/frontend/src/api/assignment.js
@@ -0,0 +1,5 @@
+import axios from "axios";
+
+export const fetchAssignmentsByUser = async (userId) => {
+ const res = await axios.get(`/api/assignment/grouped/${userId}`); return res.data;
+};
diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js
new file mode 100644
index 0000000..3964bac
--- /dev/null
+++ b/frontend/src/api/user.js
@@ -0,0 +1,14 @@
+export const loginUser = async ({ name, password }) => {
+ const res = await fetch("/api/login", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ credentials: "include",
+ body: JSON.stringify({ name, password }),
+ });
+
+ return res;
+};
+
+export default loginUser;
diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/frontend/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/frontend/src/components/AssignmentInfoBlock.jsx b/frontend/src/components/AssignmentInfoBlock.jsx
new file mode 100644
index 0000000..4fe77b1
--- /dev/null
+++ b/frontend/src/components/AssignmentInfoBlock.jsx
@@ -0,0 +1,16 @@
+import React from "react";
+import "./componentsCss/AssignmentInfoBlock.css"
+
+const AssignmentInfoBlock = ({ weekLabel, day, tasks }) => {
+ return (
+
+
{weekLabel} ({day})
+
+ {tasks.map((task, idx) => (
+ - {task.label}
+ ))}
+
+
+ );
+};
+export default AssignmentInfoBlock;
\ No newline at end of file
diff --git a/frontend/src/components/AttendanceWeekInfo.jsx b/frontend/src/components/AttendanceWeekInfo.jsx
new file mode 100644
index 0000000..2bae09c
--- /dev/null
+++ b/frontend/src/components/AttendanceWeekInfo.jsx
@@ -0,0 +1,21 @@
+import React from "react";
+import "./componentsCss/AttendanceWeekInfo.css";
+
+const AttendanceWeekInfo = ({ week }) => {
+ return (
+
+
{week}주차
+
+

+
+
+

+
+
+

+
+
+ );
+};
+
+export default AttendanceWeekInfo;
diff --git a/frontend/src/components/DailyOpenBlock.jsx b/frontend/src/components/DailyOpenBlock.jsx
new file mode 100644
index 0000000..c0cec72
--- /dev/null
+++ b/frontend/src/components/DailyOpenBlock.jsx
@@ -0,0 +1,42 @@
+import React, { useState } from "react";
+import "./componentsCss/DailyOpenBlock.css";
+
+const DailyOpenBlock = ({ day, subject, tasks }) => {
+ const [open, setOpen] = useState(false);
+
+ const toggleOpen = () => {
+ setOpen(!open);
+ };
+
+ return (
+
+
+
+ {open && (
+
+ {tasks.map((task, index) => (
+
+ {task.label}
+
+ {task.status === "done" && "◯"}
+ {task.status === "progress" && "△"}
+ {task.status === "fail" && "✕"}
+
+
+ ))}
+
+ )}
+
+ );
+};
+
+export default DailyOpenBlock;
\ No newline at end of file
diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx
new file mode 100644
index 0000000..a4f62b1
--- /dev/null
+++ b/frontend/src/components/Header.jsx
@@ -0,0 +1,51 @@
+import React from "react";
+import { useNavigate, useLocation } from "react-router-dom";
+import "./componentsCss/Header.css";
+const Header = () => {
+ const navigate = useNavigate();
+ const location = useLocation();
+ const path = location.pathname;
+
+ let title = "ATTENDANCE\nCHECK";
+ if (path.includes("assignment")) title = "ASSIGNMENT\nCHECK";
+ else if (path.includes("deposit")) title = "DEPOSIT";
+ else if (path.includes("attendance")) title = "ATTENDANCE\nCHECK";
+
+ const showRightButton = !path.includes("deposit");
+
+ return (
+
+
+ {title}
+ {showRightButton ? (
+
+ ) : (
+
+ )}
+
+ );
+};
+
+export default Header;
diff --git a/frontend/src/components/InfoBlock.jsx b/frontend/src/components/InfoBlock.jsx
new file mode 100644
index 0000000..2f66b2c
--- /dev/null
+++ b/frontend/src/components/InfoBlock.jsx
@@ -0,0 +1,12 @@
+import React from "react";
+
+const InfoBlock = () => {
+ return (
+
+ );
+};
+
+export default InfoBlock;
diff --git a/frontend/src/components/InputBlock.jsx b/frontend/src/components/InputBlock.jsx
new file mode 100644
index 0000000..65ae0ab
--- /dev/null
+++ b/frontend/src/components/InputBlock.jsx
@@ -0,0 +1,21 @@
+import React from "react";
+import "./componentsCss/InputBlock.css";
+
+const InputBlock = ({ inputs, onChange, values }) => {
+ return (
+
+ {inputs.map((input, index) => (
+ onChange && onChange(index, e.target.value)}
+ />
+ ))}
+
+ );
+};
+
+export default InputBlock;
diff --git a/frontend/src/components/PageBtn.jsx b/frontend/src/components/PageBtn.jsx
new file mode 100644
index 0000000..678b3cc
--- /dev/null
+++ b/frontend/src/components/PageBtn.jsx
@@ -0,0 +1,15 @@
+import React from "react";
+
+const PageBtn = ({ buttons }) => {
+ return (
+
+ {buttons.map((btn, index) => (
+
+ ))}
+
+ );
+};
+
+export default PageBtn;
diff --git a/frontend/src/components/WeeklyListBlock.jsx b/frontend/src/components/WeeklyListBlock.jsx
new file mode 100644
index 0000000..52a7b92
--- /dev/null
+++ b/frontend/src/components/WeeklyListBlock.jsx
@@ -0,0 +1,44 @@
+import React, { useState } from "react";
+import "./componentsCss/WeeklyListBlock.css";
+import DailyOpenBlock from "./DailyOpenBlock";
+
+const WeeklyListBlock = ({ weeks }) => {
+ const [openIndex, setOpenIndex] = useState(null);
+
+ const toggleOpen = (index) => {
+ setOpenIndex(index === openIndex ? null : index);
+ };
+
+ return (
+
+ {weeks.map((week, index) => (
+
+
+ {openIndex === index && (
+
+
+ {week.details?.map((detail, i) => (
+
+ ))}
+
+ )}
+
+ ))}
+
+ );
+};
+
+export default WeeklyListBlock;
diff --git a/frontend/src/components/WeeklyOpenBlock.jsx b/frontend/src/components/WeeklyOpenBlock.jsx
new file mode 100644
index 0000000..834c4f1
--- /dev/null
+++ b/frontend/src/components/WeeklyOpenBlock.jsx
@@ -0,0 +1,41 @@
+import React, { useState } from "react";
+import "./componentsCss/DailyOpenBlock.css";
+import "./componentsCss/WeeklyListBlock.css";
+import DailyOpenBlock from "./DailyOpenBlock";
+
+const WeeklyOpenBlock = ({ label, days }) => {
+ const [isOpen, setIsOpen] = useState(false);
+
+ const toggleOpen = () => {
+ setIsOpen(!isOpen);
+ };
+
+ return (
+
+
+
+ {isOpen && (
+
+ )}
+
+
+ {isOpen && (
+
+ {days.map((dayData, index) => (
+
+ ))}
+
+ )}
+
+ );
+};
+
+export default WeeklyOpenBlock;
\ No newline at end of file
diff --git a/frontend/src/components/componentsCss/AssignmentInfoBlock.css b/frontend/src/components/componentsCss/AssignmentInfoBlock.css
new file mode 100644
index 0000000..404c79d
--- /dev/null
+++ b/frontend/src/components/componentsCss/AssignmentInfoBlock.css
@@ -0,0 +1,29 @@
+.assignment-info-block {
+ background-color: var(--main-green);
+ padding: 16px;
+ margin: 12px auto;
+ border-radius: 10px;
+ width: 309px;
+
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
+ color: black;
+ font-family: "Noto Sans KR", sans-serif;
+}
+
+.week-day {
+ font-weight: bold;
+ font-size: 18px;
+ margin-bottom: 12px;
+}
+
+.task-list {
+ list-style: none;
+ font-weight: 500;
+ padding: 0;
+ margin: 0;
+}
+
+.task-list li {
+ margin-bottom: 6px;
+ font-size: 16px;
+}
diff --git a/frontend/src/components/componentsCss/AttendanceWeekInfo.css b/frontend/src/components/componentsCss/AttendanceWeekInfo.css
new file mode 100644
index 0000000..458de9d
--- /dev/null
+++ b/frontend/src/components/componentsCss/AttendanceWeekInfo.css
@@ -0,0 +1,25 @@
+.eachWeekInfo {
+ width: 270px;
+ padding: 14px;
+ border-radius: 20px;
+ background-color: #434343;
+ border: 1px solid #d9d9d9;
+ margin-block: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+}
+.weekInfo {
+ font-weight: 600;
+ font-size: 15px;
+ color: #ffffff;
+ font-family: "Inter", sans-serif;
+}
+.coin_img_container {
+ width: 30px;
+ height: 30px;
+}
+.coin_img_container > img {
+ width: 100%;
+ height: 100%;
+}
diff --git a/frontend/src/components/componentsCss/DailyOpenBlock.css b/frontend/src/components/componentsCss/DailyOpenBlock.css
new file mode 100644
index 0000000..5a44722
--- /dev/null
+++ b/frontend/src/components/componentsCss/DailyOpenBlock.css
@@ -0,0 +1,67 @@
+.daily-open-block {
+ background-color:#045E07;
+ padding: 5px 0px 2px 2px;
+ border-radius: 8px;
+ margin-bottom: 8px;
+
+}
+
+.daily-open-header {
+ display: flex;
+ justify-content: start;
+ align-items: center;
+ gap: 12px;
+ color: white;
+ font-weight: 400;
+ margin-bottom: 10px;
+ font-size: 14px;
+}
+
+.task-list {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ font-family: "Noto Sans KR", sans-serif;
+ font-size: 13px;
+ font-weight: 400;
+ margin: 10px;
+}
+
+.task-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background-color: rgba(217, 217, 217, 0.4);
+ border: 1px solid rgba(217, 217, 217, 0.4);
+ border-radius: 30px;
+ padding: 10px 18px;
+ color: white;
+ height: 9px;
+}
+
+
+.task-icon {
+ font-size: 15px;
+
+}
+
+.arrow {
+ font-size: 20px;
+ transition: transform 0.2s ease;
+ transform: rotate(30deg);
+}
+
+.arrow.rotate {
+ transform: rotate(0deg);
+}
+
+.daily-button {
+
+ background-color: transparent;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ text-align: left;
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/frontend/src/components/componentsCss/Header.css b/frontend/src/components/componentsCss/Header.css
new file mode 100644
index 0000000..1c8b660
--- /dev/null
+++ b/frontend/src/components/componentsCss/Header.css
@@ -0,0 +1,33 @@
+.header-container {
+ background-color: var(--background-black);
+ color: var(--main-green);
+ font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif;
+ display: flex;
+ align-items: center;
+ width: 390px;
+ justify-content: space-between;
+ padding: 1rem;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+ margin: 10px;
+}
+
+.header-title {
+ font-size: 18px;
+ font-weight: bold;
+ color: var(--main-green);
+ white-space: pre-line;
+ align-items: center;
+ text-align: center;
+ font-family: "Akira Expanded";
+}
+
+.icon-button {
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 0;
+}
+
+.icon-button svg {
+ color: var(--main-green);
+}
diff --git a/frontend/src/components/componentsCss/InputBlock.css b/frontend/src/components/componentsCss/InputBlock.css
new file mode 100644
index 0000000..82aa409
--- /dev/null
+++ b/frontend/src/components/componentsCss/InputBlock.css
@@ -0,0 +1,22 @@
+.inputTag {
+ width: 309px;
+ height: 47px;
+ border-radius: 14px;
+ background-color: var(--border-gray);
+ color: var(--text-white);
+ font-weight: 400;
+ font-size: 16px;
+ font-family: "Noto Sans KR", sans-serif;
+ border: 1px var(--background-black) solid;
+ padding: 10px;
+ margin-top: 11px;
+}
+.inputTag:focus {
+ border: 1px var(--main-green) solid;
+}
+.inputBlock {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
diff --git a/frontend/src/components/componentsCss/WeeklyListBlock.css b/frontend/src/components/componentsCss/WeeklyListBlock.css
new file mode 100644
index 0000000..b7b1bca
--- /dev/null
+++ b/frontend/src/components/componentsCss/WeeklyListBlock.css
@@ -0,0 +1,62 @@
+.weekly-list {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ font-family: "Inter", sans-serif;
+ width: 309px;
+}
+
+.weekly-item {
+ background-color: #045e07;
+ border-radius: 8px;
+}
+
+.weekly-button {
+ background-color: #575757;
+ color: white;
+ border: 1px solid rgba(217, 217, 217, 0.4);
+ border-radius: 8px;
+ padding: 12px 20px;
+ font-size: 15px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ text-align: left;
+ cursor: pointer;
+}
+
+.weekly-button:hover {
+ border: 1px solid var(--card-toggle-green);
+}
+
+.weekly-button.active {
+ background-color: #045e07;
+ border: none;
+}
+
+.arrow {
+ font-size: 20px;
+ transition: transform 0.2s ease;
+ transform: rotate(30deg);
+}
+
+.arrow.rotate {
+ transform: rotate(0deg);
+}
+
+.week-details {
+ /*background-color: rgba(255, 255, 255, 0.05);*/
+ padding: 10px 20px;
+ border-radius: 0 0 12px 12px;
+ color: white;
+ font-size: 16px;
+}
+
+.detail-item {
+ margin-top: 6px;
+}
+
+.daily-open-block-wrapper {
+ background-color: #045e07;
+}
diff --git a/frontend/src/index.css b/frontend/src/index.css
index 08a3ac9..2de4eee 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -47,7 +47,7 @@ button {
transition: border-color 0.25s;
}
button:hover {
- border-color: #646cff;
+ border-color: #2aff00;
}
button:focus,
button:focus-visible {
@@ -66,3 +66,5 @@ button:focus-visible {
background-color: #f9f9f9;
}
}
+
+
diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx
index b9a1a6d..b318f90 100644
--- a/frontend/src/main.jsx
+++ b/frontend/src/main.jsx
@@ -1,10 +1,11 @@
-import { StrictMode } from 'react'
-import { createRoot } from 'react-dom/client'
-import './index.css'
-import App from './App.jsx'
+import { createRoot } from "react-dom/client";
+import App from "./App.jsx";
+import "./root.css";
+import "./reset.css";
+import { StrictMode } from "react";
-createRoot(document.getElementById('root')).render(
+createRoot(document.getElementById("root")).render(
- ,
-)
+
+);
diff --git a/frontend/src/reset.css b/frontend/src/reset.css
new file mode 100644
index 0000000..dfe9260
--- /dev/null
+++ b/frontend/src/reset.css
@@ -0,0 +1,161 @@
+* {
+ box-sizing: border-box;
+}
+
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+b,
+u,
+i,
+center,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+embed,
+figure,
+figcaption,
+footer,
+header,
+hgroup,
+menu,
+nav,
+output,
+ruby,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+ display: block;
+}
+body {
+ line-height: 1;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
+ Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+}
+blockquote,
+q {
+ quotes: none;
+}
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+ content: "";
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+button {
+ background: inherit;
+ border: none;
+ border-radius: 0;
+ padding: 0;
+ cursor: pointer;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+ outline: none;
+}
+
+a:visited {
+ text-decoration: none;
+ color: inherit;
+}
+
+input {
+ -webkit-appearance: none; /* Safari and Chrome */
+ -moz-appearance: none; /* Firefox */
+ appearance: none;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+input:focus {
+ outline: none;
+}
diff --git a/frontend/src/root.css b/frontend/src/root.css
new file mode 100644
index 0000000..a01e08f
--- /dev/null
+++ b/frontend/src/root.css
@@ -0,0 +1,48 @@
+@font-face {
+ font-family: "Cafe24Moyamoya-Regular-v1.0";
+ src: url("https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_231029@1.1/Cafe24Moyamoya-Regular-v1.0.woff2")
+ format("woff2");
+ font-weight: normal;
+ font-style: normal;
+}
+
+
+:root {
+ --main-green: #49ff24;
+ --card-toggle-green: #2aff00;
+ --card-detail-green: #2d791d;
+ --icon-top-green: #14ae5c;
+ --icon-detail-green: #14ae5c;
+ --icon-detail-yellow: #ffcd29;
+ --icon-detail-red: #ff2c2c;
+ --background-black: #000000;
+ --fill-gray: #d9d9d9;
+ --warn-red: #ff5858;
+ --text-white: #ffffff;
+ --border-gray: rgba(204, 204, 204, 0.4);
+}
+.noto-sans-kr-context {
+ font-family: "Noto Sans KR", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: 400;
+ font-style: normal;
+}
+
+.inter{
+ font-family: "Inter", sans-serif;
+}
+
+@font-face {
+ font-family: 'Akira Expanded';
+ src: url('../assets/fonts/Akira Expanded Demo.otf') format('truetype');
+}
+
+body{
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ overflow: hidden;
+ background-color: #000000;
+}
\ No newline at end of file
diff --git a/frontend/src/root.module.css b/frontend/src/root.module.css
deleted file mode 100644
index 14354e4..0000000
--- a/frontend/src/root.module.css
+++ /dev/null
@@ -1,27 +0,0 @@
-:root {
- .noto-sans-kr-context {
- font-family: "Noto Sans KR", sans-serif;
- font-optical-sizing: auto;
- font-weight: 400;
- font-style: normal;
- }
- @font-face {
- font-family: "Cafe24Moyamoya-Regular-v1.0";
- src: url("https://fastly.jsdelivr.net/gh/projectnoonnu/noonfonts_231029@1.1/Cafe24Moyamoya-Regular-v1.0.woff2")
- format("woff2");
- font-weight: normal;
- font-style: normal;
- }
- --main-green: #49ff24;
- --card-toggle-green: #2aff00;
- --card-detail-green: #2d791d;
- --icon-top-green: #14ae5c;
- --icon-detail-green: #14ae5c;
- --icon-detail-yellow: #ffcd29;
- --icon-detail-red: #ff2c2c;
- --background-black: #000000;
- --fill-gray: #d9d9d9;
- --warn-red: #ff5858;
- --text-white: #ffffff;
- --border-gray: #c7c7c7;
-}
diff --git a/frontend/src/test/AssignmentTest.jsx b/frontend/src/test/AssignmentTest.jsx
new file mode 100644
index 0000000..b9c7e83
--- /dev/null
+++ b/frontend/src/test/AssignmentTest.jsx
@@ -0,0 +1,53 @@
+import React from "react";
+import InputBlock from "./components/InputBlock";
+import InfoBlock from "./components/InfoBlock";
+import PageBtn from "./components/PageBtn";
+import Header from "./components/Header";
+import WeeklyListBlock from "./components/WeeklyListBlock";
+
+function AssignmnetTest() {
+
+const weeks = [
+ {
+ label: "2주차 JS개론/웹개론",
+ details: [
+ {
+ day: "화",
+ subject: "Git HTML CSS",
+ tasks: [
+ { label: "제로초 인강", status: "done" },
+ { label: "깃허브 클론 코딩", status: "progress" },
+ ],
+ },
+ {
+ day: "목",
+ subject: "Git HTML CSS",
+ tasks: [
+ { label: "제로초 인강", status: "fail" },
+ { label: "깃허브 클론 코딩", status: "progress" },
+ ],
+ },
+ ],
+ },
+ {
+ label: "3주차 JS개론/웹개론",
+ details: [
+ {
+ day: "화",
+ subject: "Git HTML CSS",
+ tasks: [],
+ },
+ ],
+ },
+];
+
+
+ return (
+
+
+
+
+
+ );
+}
+export default AssignmnetTest;
diff --git a/frontend/src/utils/AssignmentStatus.js b/frontend/src/utils/AssignmentStatus.js
new file mode 100644
index 0000000..247ed2e
--- /dev/null
+++ b/frontend/src/utils/AssignmentStatus.js
@@ -0,0 +1,12 @@
+const mapStatus = (status) => {
+ switch (status) {
+ case "SUCCESS":
+ return "done";
+ case "INSUFFICIENT":
+ return "progress";
+ case "FAILURE":
+ return "fail";
+ default:
+ return "";
+ }
+};
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
index 8b0f57b..6b46dee 100644
--- a/frontend/vite.config.js
+++ b/frontend/vite.config.js
@@ -1,7 +1,15 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
-// https://vite.dev/config/
+// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
-})
+ server: {
+ proxy: {
+ "/api": {
+ target: "http://localhost:8080",
+ changeOrigin: true,
+ },
+ },
+ },
+});
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
new file mode 100644
index 0000000..f287a33
--- /dev/null
+++ b/frontend/yarn.lock
@@ -0,0 +1,1492 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz"
+ integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.27.1"
+ js-tokens "^4.0.0"
+ picocolors "^1.1.1"
+
+"@babel/compat-data@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz"
+ integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==
+
+"@babel/core@^7.26.10":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz"
+ integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.27.1"
+ "@babel/helper-compilation-targets" "^7.27.1"
+ "@babel/helper-module-transforms" "^7.27.1"
+ "@babel/helpers" "^7.27.1"
+ "@babel/parser" "^7.27.1"
+ "@babel/template" "^7.27.1"
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz"
+ integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==
+ dependencies:
+ "@babel/parser" "^7.27.1"
+ "@babel/types" "^7.27.1"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz"
+ integrity sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==
+ dependencies:
+ "@babel/compat-data" "^7.27.1"
+ "@babel/helper-validator-option" "^7.27.1"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-module-imports@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz"
+ integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==
+ dependencies:
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
+
+"@babel/helper-module-transforms@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz"
+ integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==
+ dependencies:
+ "@babel/helper-module-imports" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+ "@babel/traverse" "^7.27.1"
+
+"@babel/helper-plugin-utils@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz"
+ integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==
+
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz"
+ integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
+
+"@babel/helper-validator-option@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"
+ integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
+
+"@babel/helpers@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz"
+ integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==
+ dependencies:
+ "@babel/template" "^7.27.1"
+ "@babel/types" "^7.27.1"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz"
+ integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==
+ dependencies:
+ "@babel/types" "^7.27.1"
+
+"@babel/plugin-transform-react-jsx-self@^7.25.9":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz"
+ integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/plugin-transform-react-jsx-source@^7.25.9":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz"
+ integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/template@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz"
+ integrity sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/parser" "^7.27.1"
+ "@babel/types" "^7.27.1"
+
+"@babel/traverse@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz"
+ integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.27.1"
+ "@babel/parser" "^7.27.1"
+ "@babel/template" "^7.27.1"
+ "@babel/types" "^7.27.1"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz"
+ integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+
+"@esbuild/aix-ppc64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437"
+ integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==
+
+"@esbuild/android-arm64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe"
+ integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==
+
+"@esbuild/android-arm@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4"
+ integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==
+
+"@esbuild/android-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009"
+ integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==
+
+"@esbuild/darwin-arm64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz"
+ integrity sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==
+
+"@esbuild/darwin-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a"
+ integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==
+
+"@esbuild/freebsd-arm64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b"
+ integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==
+
+"@esbuild/freebsd-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709"
+ integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==
+
+"@esbuild/linux-arm64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30"
+ integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==
+
+"@esbuild/linux-arm@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225"
+ integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==
+
+"@esbuild/linux-ia32@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177"
+ integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==
+
+"@esbuild/linux-loong64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8"
+ integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==
+
+"@esbuild/linux-mips64el@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26"
+ integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==
+
+"@esbuild/linux-ppc64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56"
+ integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==
+
+"@esbuild/linux-riscv64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415"
+ integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==
+
+"@esbuild/linux-s390x@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d"
+ integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==
+
+"@esbuild/linux-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033"
+ integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==
+
+"@esbuild/netbsd-arm64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259"
+ integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==
+
+"@esbuild/netbsd-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5"
+ integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==
+
+"@esbuild/openbsd-arm64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c"
+ integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==
+
+"@esbuild/openbsd-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2"
+ integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==
+
+"@esbuild/sunos-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f"
+ integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==
+
+"@esbuild/win32-arm64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea"
+ integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==
+
+"@esbuild/win32-ia32@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322"
+ integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==
+
+"@esbuild/win32-x64@0.25.3":
+ version "0.25.3"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a"
+ integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==
+
+"@eslint-community/eslint-utils@^4.2.0":
+ version "4.6.1"
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz"
+ integrity sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==
+ dependencies:
+ eslint-visitor-keys "^3.4.3"
+
+"@eslint-community/regexpp@^4.12.1":
+ version "4.12.1"
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz"
+ integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
+
+"@eslint/config-array@^0.20.0":
+ version "0.20.0"
+ resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz"
+ integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==
+ dependencies:
+ "@eslint/object-schema" "^2.1.6"
+ debug "^4.3.1"
+ minimatch "^3.1.2"
+
+"@eslint/config-helpers@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz"
+ integrity sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==
+
+"@eslint/core@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz"
+ integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==
+ dependencies:
+ "@types/json-schema" "^7.0.15"
+
+"@eslint/eslintrc@^3.3.1":
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz"
+ integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^10.0.1"
+ globals "^14.0.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@9.25.1", "@eslint/js@^9.22.0":
+ version "9.25.1"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz"
+ integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==
+
+"@eslint/object-schema@^2.1.6":
+ version "2.1.6"
+ resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz"
+ integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==
+
+"@eslint/plugin-kit@^0.2.8":
+ version "0.2.8"
+ resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz"
+ integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==
+ dependencies:
+ "@eslint/core" "^0.13.0"
+ levn "^0.4.1"
+
+"@humanfs/core@^0.19.1":
+ version "0.19.1"
+ resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz"
+ integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==
+
+"@humanfs/node@^0.16.6":
+ version "0.16.6"
+ resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz"
+ integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==
+ dependencies:
+ "@humanfs/core" "^0.19.1"
+ "@humanwhocodes/retry" "^0.3.0"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/retry@^0.3.0":
+ version "0.3.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz"
+ integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==
+
+"@humanwhocodes/retry@^0.4.2":
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz"
+ integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.8"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz"
+ integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@rollup/rollup-android-arm-eabi@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442"
+ integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==
+
+"@rollup/rollup-android-arm64@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7"
+ integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==
+
+"@rollup/rollup-darwin-arm64@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz"
+ integrity sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==
+
+"@rollup/rollup-darwin-x64@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9"
+ integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==
+
+"@rollup/rollup-freebsd-arm64@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707"
+ integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==
+
+"@rollup/rollup-freebsd-x64@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb"
+ integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864"
+ integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==
+
+"@rollup/rollup-linux-arm-musleabihf@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3"
+ integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==
+
+"@rollup/rollup-linux-arm64-gnu@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c"
+ integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==
+
+"@rollup/rollup-linux-arm64-musl@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e"
+ integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==
+
+"@rollup/rollup-linux-loongarch64-gnu@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc"
+ integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13"
+ integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==
+
+"@rollup/rollup-linux-riscv64-gnu@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca"
+ integrity sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==
+
+"@rollup/rollup-linux-riscv64-musl@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670"
+ integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==
+
+"@rollup/rollup-linux-s390x-gnu@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81"
+ integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==
+
+"@rollup/rollup-linux-x64-gnu@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29"
+ integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==
+
+"@rollup/rollup-linux-x64-musl@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6"
+ integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==
+
+"@rollup/rollup-win32-arm64-msvc@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b"
+ integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==
+
+"@rollup/rollup-win32-ia32-msvc@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350"
+ integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==
+
+"@rollup/rollup-win32-x64-msvc@4.40.1":
+ version "4.40.1"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c"
+ integrity sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==
+
+"@types/babel__core@^7.20.5":
+ version "7.20.5"
+ resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.27.0"
+ resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz"
+ integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.4"
+ resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*":
+ version "7.20.7"
+ resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz"
+ integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==
+ dependencies:
+ "@babel/types" "^7.20.7"
+
+"@types/estree@1.0.7", "@types/estree@^1.0.6":
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz"
+ integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==
+
+"@types/json-schema@^7.0.15":
+ version "7.0.15"
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/react-dom@^19.0.4":
+ version "19.1.3"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz"
+ integrity sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==
+
+"@types/react@^19.0.10":
+ version "19.1.2"
+ resolved "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz"
+ integrity sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==
+ dependencies:
+ csstype "^3.0.2"
+
+"@vitejs/plugin-react@^4.3.4":
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz"
+ integrity sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==
+ dependencies:
+ "@babel/core" "^7.26.10"
+ "@babel/plugin-transform-react-jsx-self" "^7.25.9"
+ "@babel/plugin-transform-react-jsx-source" "^7.25.9"
+ "@types/babel__core" "^7.20.5"
+ react-refresh "^0.17.0"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.14.0:
+ version "8.14.1"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz"
+ integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==
+
+ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+axios@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901"
+ integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+browserslist@^4.24.0:
+ version "4.24.4"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz"
+ integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==
+ dependencies:
+ caniuse-lite "^1.0.30001688"
+ electron-to-chromium "^1.5.73"
+ node-releases "^2.0.19"
+ update-browserslist-db "^1.1.1"
+
+call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001688:
+ version "1.0.30001716"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz"
+ integrity sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cookie@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz"
+ integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==
+
+cross-spawn@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+csstype@^3.0.2:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+debug@^4.1.0, debug@^4.3.1, debug@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+ dependencies:
+ ms "^2.1.3"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
+electron-to-chromium@^1.5.73:
+ version "1.5.148"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.148.tgz"
+ integrity sha512-8uc1QXwwqayD4mblcsQYZqoi+cOc97A2XmKSBOIRbEAvbp6vrqmSYs4dHD2qVygUgn7Mi0qdKgPaJ9WC8cv63A==
+
+es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
+ integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
+ integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
+ dependencies:
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
+esbuild@^0.25.0:
+ version "0.25.3"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz"
+ integrity sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.25.3"
+ "@esbuild/android-arm" "0.25.3"
+ "@esbuild/android-arm64" "0.25.3"
+ "@esbuild/android-x64" "0.25.3"
+ "@esbuild/darwin-arm64" "0.25.3"
+ "@esbuild/darwin-x64" "0.25.3"
+ "@esbuild/freebsd-arm64" "0.25.3"
+ "@esbuild/freebsd-x64" "0.25.3"
+ "@esbuild/linux-arm" "0.25.3"
+ "@esbuild/linux-arm64" "0.25.3"
+ "@esbuild/linux-ia32" "0.25.3"
+ "@esbuild/linux-loong64" "0.25.3"
+ "@esbuild/linux-mips64el" "0.25.3"
+ "@esbuild/linux-ppc64" "0.25.3"
+ "@esbuild/linux-riscv64" "0.25.3"
+ "@esbuild/linux-s390x" "0.25.3"
+ "@esbuild/linux-x64" "0.25.3"
+ "@esbuild/netbsd-arm64" "0.25.3"
+ "@esbuild/netbsd-x64" "0.25.3"
+ "@esbuild/openbsd-arm64" "0.25.3"
+ "@esbuild/openbsd-x64" "0.25.3"
+ "@esbuild/sunos-x64" "0.25.3"
+ "@esbuild/win32-arm64" "0.25.3"
+ "@esbuild/win32-ia32" "0.25.3"
+ "@esbuild/win32-x64" "0.25.3"
+
+escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-plugin-react-hooks@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz"
+ integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==
+
+eslint-plugin-react-refresh@^0.4.19:
+ version "0.4.20"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz"
+ integrity sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==
+
+eslint-scope@^8.3.0:
+ version "8.3.0"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz"
+ integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz"
+ integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
+
+eslint@^9.22.0:
+ version "9.25.1"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz"
+ integrity sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.12.1"
+ "@eslint/config-array" "^0.20.0"
+ "@eslint/config-helpers" "^0.2.1"
+ "@eslint/core" "^0.13.0"
+ "@eslint/eslintrc" "^3.3.1"
+ "@eslint/js" "9.25.1"
+ "@eslint/plugin-kit" "^0.2.8"
+ "@humanfs/node" "^0.16.6"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@humanwhocodes/retry" "^0.4.2"
+ "@types/estree" "^1.0.6"
+ "@types/json-schema" "^7.0.15"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.6"
+ debug "^4.3.2"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^8.3.0"
+ eslint-visitor-keys "^4.2.0"
+ espree "^10.3.0"
+ esquery "^1.5.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^8.0.0"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+
+espree@^10.0.1, espree@^10.3.0:
+ version "10.3.0"
+ resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz"
+ integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
+ dependencies:
+ acorn "^8.14.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^4.2.0"
+
+esquery@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fdir@^6.4.4:
+ version "6.4.4"
+ resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz"
+ integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==
+
+file-entry-cache@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz"
+ integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
+ dependencies:
+ flat-cache "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz"
+ integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.4"
+
+flatted@^3.2.9:
+ version "3.3.3"
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz"
+ integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
+
+follow-redirects@^1.15.6:
+ version "1.15.9"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+
+form-data@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c"
+ integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ es-set-tostringtag "^2.1.0"
+ mime-types "^2.1.12"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-intrinsic@^1.2.6:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ function-bind "^1.1.2"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.1.0"
+
+get-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
+ integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
+
+globals@^16.0.0:
+ version "16.0.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz"
+ integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==
+
+gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.3, has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
+has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+ignore@^5.2.0:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+import-fresh@^3.2.1:
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz"
+ integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.0, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+keyv@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lucide-react@^0.507.0:
+ version "0.507.0"
+ resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.507.0.tgz#d93a75ed130bd530a368fe1dd4ea009ea90a772b"
+ integrity sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ==
+
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.3.8:
+ version "3.3.11"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
+ integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+node-releases@^2.0.19:
+ version "2.0.19"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz"
+ integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.5"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz"
+ integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
+
+postcss@^8.5.3:
+ version "8.5.3"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz"
+ integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
+ dependencies:
+ nanoid "^3.3.8"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+react-dom@^19.0.0:
+ version "19.1.0"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz"
+ integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==
+ dependencies:
+ scheduler "^0.26.0"
+
+react-refresh@^0.17.0:
+ version "0.17.0"
+ resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz"
+ integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==
+
+react-router-dom@^7.5.3:
+ version "7.5.3"
+ resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.5.3.tgz#496e9f6d90f731703c7772668b41747028e0a2d5"
+ integrity sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A==
+ dependencies:
+ react-router "7.5.3"
+
+react-router@7.5.3:
+ version "7.5.3"
+ resolved "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz"
+ integrity sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==
+ dependencies:
+ cookie "^1.0.1"
+ set-cookie-parser "^2.6.0"
+ turbo-stream "2.4.0"
+
+react@^19.0.0:
+ version "19.1.0"
+ resolved "https://registry.npmjs.org/react/-/react-19.1.0.tgz"
+ integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+rollup@^4.34.9:
+ version "4.40.1"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz"
+ integrity sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==
+ dependencies:
+ "@types/estree" "1.0.7"
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.40.1"
+ "@rollup/rollup-android-arm64" "4.40.1"
+ "@rollup/rollup-darwin-arm64" "4.40.1"
+ "@rollup/rollup-darwin-x64" "4.40.1"
+ "@rollup/rollup-freebsd-arm64" "4.40.1"
+ "@rollup/rollup-freebsd-x64" "4.40.1"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.40.1"
+ "@rollup/rollup-linux-arm-musleabihf" "4.40.1"
+ "@rollup/rollup-linux-arm64-gnu" "4.40.1"
+ "@rollup/rollup-linux-arm64-musl" "4.40.1"
+ "@rollup/rollup-linux-loongarch64-gnu" "4.40.1"
+ "@rollup/rollup-linux-powerpc64le-gnu" "4.40.1"
+ "@rollup/rollup-linux-riscv64-gnu" "4.40.1"
+ "@rollup/rollup-linux-riscv64-musl" "4.40.1"
+ "@rollup/rollup-linux-s390x-gnu" "4.40.1"
+ "@rollup/rollup-linux-x64-gnu" "4.40.1"
+ "@rollup/rollup-linux-x64-musl" "4.40.1"
+ "@rollup/rollup-win32-arm64-msvc" "4.40.1"
+ "@rollup/rollup-win32-ia32-msvc" "4.40.1"
+ "@rollup/rollup-win32-x64-msvc" "4.40.1"
+ fsevents "~2.3.2"
+
+scheduler@^0.26.0:
+ version "0.26.0"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz"
+ integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+set-cookie-parser@^2.6.0:
+ version "2.7.1"
+ resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz"
+ integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+tinyglobby@^0.2.13:
+ version "0.2.13"
+ resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz"
+ integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==
+ dependencies:
+ fdir "^6.4.4"
+ picomatch "^4.0.2"
+
+turbo-stream@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz"
+ integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+update-browserslist-db@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz"
+ integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.1"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+vite@^6.3.1:
+ version "6.3.4"
+ resolved "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz"
+ integrity sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==
+ dependencies:
+ esbuild "^0.25.0"
+ fdir "^6.4.4"
+ picomatch "^4.0.2"
+ postcss "^8.5.3"
+ rollup "^4.34.9"
+ tinyglobby "^0.2.13"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==