diff --git a/backend/app.py b/backend/app.py
index 79b33e1..73ade18 100644
--- a/backend/app.py
+++ b/backend/app.py
@@ -13,8 +13,7 @@ def migrate():
with APP.app_context():
try:
db.create_all()
- print("TABLES MIGRATEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD")
- except:
+ except Exception as e:
pass
@APP.teardown_appcontext
diff --git a/backend/config.py b/backend/config.py
index c30ca6d..d8fff35 100644
--- a/backend/config.py
+++ b/backend/config.py
@@ -20,8 +20,8 @@ class ProductionConfig(Config):
DEBUG = False
TESTING = False
# SQLAlchemy Config
- SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URI')
- # SQLALCHEMY_DATABASE_URI = "mysql://root:root@batteryswap-db/energize_swap_db"
+ # SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URI')
+ SQLALCHEMY_DATABASE_URI = "mysql://root:root@batteryswap-db:3308/energize_swap_db"
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
SQLALCHEMY_POOL_TIMEOUT = 10
diff --git a/docker-compose.yml b/docker-compose.yml
index 2455856..a9c6c8a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,15 +1,17 @@
version: '3.8'
name: "energizeswap_project"
services:
- batteryswap-db:
- image: mysql:5.7.22
- container_name: database
+
+ frontend:
+ build:
+ context: ./frontend
+ dockerfile: Dockerfile
+ container_name: frontend
restart: unless-stopped
- environment:
- MYSQL_DATABASE: energize_swap_db
- MYSQL_USER: root
- MYSQL_PASSWORD: root
- MYSQL_ROOT_PASSWORD: root
+ ports:
+ - "5173:5173"
+ networks:
+ - net1
backend:
build:
@@ -23,3 +25,22 @@ services:
- ./backend:/app
depends_on:
- batteryswap-db
+ networks:
+ - net1
+
+ batteryswap-db:
+ image: mysql:5.7.22
+ container_name: database
+ restart: unless-stopped
+ environment:
+ MYSQL_DATABASE: energize_swap_db
+ MYSQL_USER: root
+ MYSQL_PASSWORD: root
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_TCP_PORT: 3308
+ networks:
+ - net1
+
+networks:
+ net1:
+ driver: bridge
diff --git a/frontend/.dockerignore b/frontend/.dockerignore
new file mode 100644
index 0000000..42b2c72
--- /dev/null
+++ b/frontend/.dockerignore
@@ -0,0 +1,27 @@
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
+node_modules
\ No newline at end of file
diff --git a/frontend/.gitattributes b/frontend/.gitattributes
new file mode 100644
index 0000000..dfe0770
--- /dev/null
+++ b/frontend/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000..4d29575
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,23 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
new file mode 100644
index 0000000..950b2da
--- /dev/null
+++ b/frontend/Dockerfile
@@ -0,0 +1,14 @@
+FROM node:16-alpine
+
+WORKDIR /usr/src/app
+
+COPY ./package.json ./
+COPY ./yarn.lock ./
+
+RUN yarn install
+
+COPY . .
+
+EXPOSE 5173
+
+CMD ["yarn", "start"]
\ No newline at end of file
diff --git a/frontend/README.md b/frontend/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/index.html b/frontend/index.html
new file mode 100644
index 0000000..1fefb4f
--- /dev/null
+++ b/frontend/index.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ React App
+
+
+
+
+
+
+
+
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000..5270a0b
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "battery-swapper",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@emotion/react": "^11.10.5",
+ "@emotion/styled": "^11.10.5",
+ "@mui/icons-material": "^5.10.9",
+ "@mui/material": "^5.10.12",
+ "@reduxjs/toolkit": "^1.8.6",
+ "@testing-library/jest-dom": "^5.14.1",
+ "@testing-library/react": "^13.0.0",
+ "@testing-library/user-event": "^13.2.1",
+ "@types/jest": "^27.0.1",
+ "@types/node": "^16.7.13",
+ "@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
+ "jsonwebtoken": "^9.0.0",
+ "jwt-decode": "^3.1.2",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-hook-form": "^7.43.9",
+ "react-redux": "^8.0.4",
+ "react-router-dom": "^6.4.3",
+ "safe-buffer": "^5.2.1",
+ "typescript": "^4.4.2",
+ "web-vitals": "^2.1.0"
+ },
+ "scripts": {
+ "start": "vite",
+ "build": "vite build",
+ "serve": "vite preview"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ },
+ "devDependencies": {
+ "@vitejs/plugin-react": "^4.0.0",
+ "vite": "^4.3.1"
+ }
+}
diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico
new file mode 100644
index 0000000..a11777c
Binary files /dev/null and b/frontend/public/favicon.ico differ
diff --git a/frontend/public/logo192.png b/frontend/public/logo192.png
new file mode 100644
index 0000000..fc44b0a
Binary files /dev/null and b/frontend/public/logo192.png differ
diff --git a/frontend/public/logo512.png b/frontend/public/logo512.png
new file mode 100644
index 0000000..a4e47a6
Binary files /dev/null and b/frontend/public/logo512.png differ
diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json
new file mode 100644
index 0000000..080d6c7
--- /dev/null
+++ b/frontend/public/manifest.json
@@ -0,0 +1,25 @@
+{
+ "short_name": "React App",
+ "name": "Create React App Sample",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt
new file mode 100644
index 0000000..e9e57dc
--- /dev/null
+++ b/frontend/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
new file mode 100644
index 0000000..3c58c79
--- /dev/null
+++ b/frontend/src/App.jsx
@@ -0,0 +1,21 @@
+import { BrowserRouter, Route, Routes } from "react-router-dom";
+import MainLayout from "./components/layout/MainLayout";
+import { routes } from "./routes";
+import LoginPage from "./pages/Login/LoginPage";
+import userData from "./configs/helpers";
+
+function App() {
+ return (
+
+
+ {userData() == null && } />}
+ }>
+ {routes}
+
+ There's nothing here: 404!} />
+
+
+ );
+}
+
+export default App;
diff --git a/frontend/src/components/common/Sidebar.jsx b/frontend/src/components/common/Sidebar.jsx
new file mode 100644
index 0000000..5d1b991
--- /dev/null
+++ b/frontend/src/components/common/Sidebar.jsx
@@ -0,0 +1,69 @@
+import { Button, Drawer, List, Stack, Toolbar } from "@mui/material";
+import colorConfigs from "../../configs/colorConfigs";
+import sizeConfigs from "../../configs/sizeConfigs";
+import appRoutes from "../../routes/appRoutes";
+import SidebarItem from "./SidebarItem";
+import userData from "../../configs/helpers";
+import AccountBoxIcon from "@mui/icons-material/AccountBox";
+import LogoutIcon from "@mui/icons-material/Logout";
+
+const Sidebar = () => {
+ const info = userData();
+
+ const logout = () => {
+ localStorage.removeItem("token");
+ window.location.replace("/login");
+ };
+
+ return (
+
+
+
+
+
+ {info.name ?? ""}
+
+
+ {info &&
+ appRoutes
+ ?.filter((r) => r.role == info.role)
+ .map((route, index) => {
+ return route.sidebarProps ? (
+ (
+
+ )
+ ) : null;
+ })}
+ ,
+ },
+ }}
+ onClick={() => logout()}
+ />
+
+
+ );
+};
+
+export default Sidebar;
diff --git a/frontend/src/components/common/SidebarItem.jsx b/frontend/src/components/common/SidebarItem.jsx
new file mode 100644
index 0000000..56d6207
--- /dev/null
+++ b/frontend/src/components/common/SidebarItem.jsx
@@ -0,0 +1,37 @@
+import { ListItemButton, ListItemIcon } from "@mui/material";
+import { useSelector } from "react-redux";
+import { Link } from "react-router-dom";
+import colorConfigs from "../../configs/colorConfigs";
+
+
+
+const SidebarItem = ({ item, onClick }) => {
+ const { appState } = useSelector((state) => state.appState);
+
+ return (
+ item.sidebarProps ? (
+
+
+ {item.sidebarProps.icon && item.sidebarProps.icon}
+
+ {item.sidebarProps.displayText}
+
+ ) : null
+ );
+};
+
+export default SidebarItem;
\ No newline at end of file
diff --git a/frontend/src/components/common/SidebarItemCollapse.jsx b/frontend/src/components/common/SidebarItemCollapse.jsx
new file mode 100644
index 0000000..59dbe24
--- /dev/null
+++ b/frontend/src/components/common/SidebarItemCollapse.jsx
@@ -0,0 +1,67 @@
+import { Collapse, List, ListItemButton, ListItemIcon, ListItemText, Typography } from "@mui/material";
+import { useEffect, useState } from "react";
+import colorConfigs from "../../configs/colorConfigs";
+import ExpandLessOutlinedIcon from '@mui/icons-material/ExpandLessOutlined';
+import ExpandMoreOutlinedIcon from '@mui/icons-material/ExpandMoreOutlined';
+import SidebarItem from "./SidebarItem";
+import { useSelector } from "react-redux";
+
+
+const SidebarItemCollapse = ({ item }) => {
+ const [open, setOpen] = useState(false);
+
+ const { appState } = useSelector((state) => state.appState);
+
+ useEffect(() => {
+ if (appState.includes(item.state)) {
+ setOpen(true);
+ }
+ }, [appState, item]);
+
+ return (
+ item.sidebarProps ? (
+ <>
+ setOpen(!open)}
+ sx={{
+ "&: hover": {
+ backgroundColor: colorConfigs.sidebar.hoverBg
+ },
+ paddingY: "12px",
+ paddingX: "24px"
+ }}
+ >
+
+ {item.sidebarProps.icon && item.sidebarProps.icon}
+
+
+ {item.sidebarProps.displayText}
+
+ }
+ />
+ {open ? : }
+
+
+
+ {item.child?.map((route, index) => (
+ route.sidebarProps ? (
+ route.child ? (
+
+ ) : (
+
+ )
+ ) : null
+ ))}
+
+
+ >
+ ) : null
+ );
+};
+
+export default SidebarItemCollapse;
\ No newline at end of file
diff --git a/frontend/src/components/common/Topbar.jsx b/frontend/src/components/common/Topbar.jsx
new file mode 100644
index 0000000..bdf6ba4
--- /dev/null
+++ b/frontend/src/components/common/Topbar.jsx
@@ -0,0 +1,26 @@
+import { AppBar, Toolbar, Typography } from "@mui/material";
+import colorConfigs from "../../configs/colorConfigs";
+import sizeConfigs from "../../configs/sizeConfigs";
+
+const Topbar = () => {
+ return (
+
+
+
+ Dashboard
+
+
+
+ );
+};
+
+export default Topbar;
\ No newline at end of file
diff --git a/frontend/src/components/layout/MainLayout.jsx b/frontend/src/components/layout/MainLayout.jsx
new file mode 100644
index 0000000..1a3a1bc
--- /dev/null
+++ b/frontend/src/components/layout/MainLayout.jsx
@@ -0,0 +1,47 @@
+import { Outlet } from "react-router-dom";
+import { Box, Toolbar } from "@mui/material";
+import colorConfigs from "../../configs/colorConfigs";
+import sizeConfigs from "../../configs/sizeConfigs";
+import Sidebar from "../common/Sidebar";
+import Topbar from "../common/Topbar";
+import userData from "../../configs/helpers"
+import {Navigate} from "react-router-dom"
+
+const MainLayout = ({role}) => {
+ const info_role = userData()?.role || null
+
+ if(info_role == null || info_role != role) {
+ localStorage.removeItem('token')
+ return
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default MainLayout;
\ No newline at end of file
diff --git a/frontend/src/components/layout/PageWrapper.jsx b/frontend/src/components/layout/PageWrapper.jsx
new file mode 100644
index 0000000..8e2e17f
--- /dev/null
+++ b/frontend/src/components/layout/PageWrapper.jsx
@@ -0,0 +1,20 @@
+import { ReactNode, useEffect } from "react";
+import { useDispatch } from "react-redux";
+import { setAppState } from "../../redux/features/appStateSlice";
+
+
+const PageWrapper = (props) => {
+ const dispatch = useDispatch();
+
+ useEffect(() => {
+ if (props.state) {
+ dispatch(setAppState(props.state));
+ }
+ }, [dispatch, props]);
+
+ return (
+ <>{props.children}>
+ );
+};
+
+export default PageWrapper;
\ No newline at end of file
diff --git a/frontend/src/configs/colorConfigs.js b/frontend/src/configs/colorConfigs.js
new file mode 100644
index 0000000..55e4b90
--- /dev/null
+++ b/frontend/src/configs/colorConfigs.js
@@ -0,0 +1,17 @@
+import { colors } from "@mui/material";
+
+const colorConfigs = {
+ sidebar: {
+ bg: "#233044",
+ color: "#eeeeee",
+ hoverBg: "#1e293a",
+ activeBg: "#1e253a"
+ },
+ topbar: {
+ bg: "#fff",
+ color: "#000"
+ },
+ mainBg: colors.grey["100"]
+};
+
+export default colorConfigs;
\ No newline at end of file
diff --git a/frontend/src/configs/helpers.js b/frontend/src/configs/helpers.js
new file mode 100644
index 0000000..4f27d3e
--- /dev/null
+++ b/frontend/src/configs/helpers.js
@@ -0,0 +1,13 @@
+import jwt_decode from "jwt-decode";
+
+export const token = localStorage.getItem('token');
+
+export default () => {
+ try {
+ const userData = jwt_decode(localStorage.getItem('token'));
+ if (userData === null) throw new Error();
+ return userData;
+ } catch (err) {
+ return null;
+ }
+};
diff --git a/frontend/src/configs/sizeConfigs.js b/frontend/src/configs/sizeConfigs.js
new file mode 100644
index 0000000..ecb73bf
--- /dev/null
+++ b/frontend/src/configs/sizeConfigs.js
@@ -0,0 +1,7 @@
+const sizeConfigs = {
+ sidebar: {
+ width: "250px"
+ }
+};
+
+export default sizeConfigs;
\ No newline at end of file
diff --git a/frontend/src/index.jsx b/frontend/src/index.jsx
new file mode 100644
index 0000000..4cb3959
--- /dev/null
+++ b/frontend/src/index.jsx
@@ -0,0 +1,24 @@
+import { CssBaseline } from '@mui/material';
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import { Provider } from 'react-redux';
+import App from './App';
+import { store } from './redux/store';
+import reportWebVitals from './reportWebVitals';
+
+const root = ReactDOM.createRoot(
+ document.getElementById('root')
+);
+root.render(
+
+
+
+
+
+
+);
+
+// If you want to start measuring performance in your app, pass a function
+// to log results (for example: reportWebVitals(console.log))
+// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
+reportWebVitals();
diff --git a/frontend/src/pages/Battery/BatteriesPage.jsx b/frontend/src/pages/Battery/BatteriesPage.jsx
new file mode 100644
index 0000000..e13f954
--- /dev/null
+++ b/frontend/src/pages/Battery/BatteriesPage.jsx
@@ -0,0 +1,279 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+import CloseIcon from "@mui/icons-material/Close";
+
+import {
+ Button,
+ Checkbox,
+ FormControl,
+ FormControlLabel,
+ Grid,
+ InputLabel,
+ MenuItem,
+ Select,
+ Stack,
+ TextField,
+} from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+
+import {
+ useCreateBatteryMutation,
+ useGetAllBatteriesQuery,
+ useGetAllStationsQuery,
+} from "../../redux/features/apiSlice";
+
+const style = {
+ position: "absolute",
+ top: "50%",
+ left: "50%",
+ transform: "translate(-50%, -50%)",
+ bgcolor: "background.paper",
+ // border: "2px solid #000",
+ boxShadow: 24,
+ borderRadius: "5px",
+ overflow: "hidden",
+ maxHeight: "85%",
+};
+
+const buttonStyle = { margin: "2rem", backgroundColor: "#233044" };
+
+const headerStyles = {
+ width: "100%",
+ backgroundColor: "#233044",
+ color: "#eeeeee",
+ display: "flex",
+ justifyContent: "space-between",
+ alignItems: "center",
+ gap: "20px",
+ padding: "10px 7px 10px 7px",
+ fontWeight: "bold",
+ position: "sticky",
+ top: 0,
+ overflow: "hidden",
+};
+
+const formStyle = {
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ alignItems: "center",
+ padding: "2rem",
+};
+
+const StyledTextField = {
+ margin: "1rem",
+ width: "300px",
+};
+
+const BatteriesPage = (props) => {
+ const [open, setOpen] = useState(false);
+ const handleOpen = () => setOpen(true);
+ const handleClose = () => setOpen(false);
+
+ const [createBattery] = useCreateBatteryMutation();
+
+ const {
+ refetch,
+ data,
+ isError: BatteryError,
+ isLoading: BatteryLoading,
+ } = useGetAllBatteriesQuery();
+
+ const { data: stationsData, isError: StationError } =
+ useGetAllStationsQuery();
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ control,
+ reset,
+ setValue,
+ } = useForm({
+ defaultValues: {
+ identication_mark: "",
+ station_id: "",
+ name: "",
+ },
+ });
+
+ const onSubmit = (data) => {
+ createBattery(data)
+ .unwrap()
+ .then((res) => {
+ reset();
+ setOpen(false);
+ })
+ .catch((err) => {
+ console.log("Erroe creatng a new Battery", err);
+ });
+ };
+
+ useEffect(() => {
+ refetch();
+ }, []);
+
+ return (
+ <>
+
+
+ Battery Information
+
+
+
+
+
+
+
+
+ Battery Type
+ Serial Number
+ Manufacture Year
+ Station Location
+ Status
+
+
+
+ {!BatteryLoading &&
+ data?.data?.map((row, idx) => (
+
+
+ {row.battery_type}
+
+ {row.serial_number}
+ {row.manufacture_date}
+ {`${row.station.name} - ${row.station.location} `}
+ {row?.status}
+
+ ))}
+
+
+
+
+
+
+
+ Create a new battery
+
+
+
+
+
+
+ >
+ );
+};
+
+export default BatteriesPage;
diff --git a/frontend/src/pages/BatteryMovement/BatteryMovementPage.jsx b/frontend/src/pages/BatteryMovement/BatteryMovementPage.jsx
new file mode 100644
index 0000000..7d83998
--- /dev/null
+++ b/frontend/src/pages/BatteryMovement/BatteryMovementPage.jsx
@@ -0,0 +1,123 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+
+import {
+ Checkbox,
+ FormControl,
+ FormControlLabel,
+ Grid,
+ InputLabel,
+ TextField,
+} from "@mui/material";
+
+import {
+ useGetAllBatteriesQuery,
+ useGetAllDriversQuery,
+ useGetAllStationsQuery,
+ useGetOngoingSwapsQuery,
+} from "../../redux/features/apiSlice";
+import { Button, Stack } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+
+function createData(name, calories, fat, carbs, protein) {
+ return { name, calories, fat, carbs, protein };
+}
+
+const rows = [
+ createData("Frozen yoghurt", 159, 6.0, 24, 4.0),
+ createData("Ice cream sandwich", 237, 9.0, 37, 4.3),
+ createData("Eclair", 262, 16.0, 24, 6.0),
+ createData("Cupcake", 305, 3.7, 67, 4.3),
+ createData("Gingerbread", 356, 16.0, 49, 3.9),
+];
+
+const style = {
+ position: "absolute",
+ top: "50%",
+ left: "50%",
+ transform: "translate(-50%, -50%)",
+ width: 400,
+ bgcolor: "background.paper",
+ border: "2px solid #000",
+ boxShadow: 24,
+ p: 4,
+};
+
+const BatteryMovementPage = () => {
+ const {
+ data: ongoingSwapsData,
+ isLoading: loadingSwaps,
+ refetch,
+ } = useGetOngoingSwapsQuery();
+
+
+ useEffect(()=> {
+ refetch()
+ },[])
+
+ return (
+
+
+ {/* {!loadingSwaps && ongoingSwapsData?.data?.length == 0 ? (
+ No data is available
+ ) : ( */}
+
+
+
+ Battery
+ Driver
+ PickUp Location
+ Deposit Location
+ Start Time
+ End Time
+ Status
+
+
+
+ {!loadingSwaps &&
+ ongoingSwapsData?.data?.map((row, idx) => (
+
+
+ {row.battery?.name}
+
+ {row.driver?.name}
+
+ {row.pickup_station?.id == null
+ ? "-"
+ : row.pickup_station?.name}
+
+
+ {row.deposit_station?.id == null
+ ? "-"
+ : row.deposit_station?.name}
+
+ {row.start_time}
+ {row.end_time}
+
+ {row.deposit_station_id == null ? "On going" : "Stopped"}
+
+
+ ))}
+
+
+ {/* )} */}
+
+
+ );
+};
+
+export default BatteryMovementPage;
diff --git a/frontend/src/pages/Driver/DriversPage.jsx b/frontend/src/pages/Driver/DriversPage.jsx
new file mode 100644
index 0000000..f1c3148
--- /dev/null
+++ b/frontend/src/pages/Driver/DriversPage.jsx
@@ -0,0 +1,314 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import {
+ Button,
+ Checkbox,
+ FormControl,
+ FormControlLabel,
+ Grid,
+ Stack,
+ TextField,
+} from "@mui/material";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+import CloseIcon from "@mui/icons-material/Close";
+
+import {
+ useCreateDriverMutation,
+ useGetAllDriversQuery,
+} from "../../redux/features/apiSlice";
+import { Controller, useForm } from "react-hook-form";
+
+const style = {
+ position: "absolute",
+ top: "50%",
+ left: "50%",
+ transform: "translate(-50%, -50%)",
+ bgcolor: "background.paper",
+ // border: "2px solid #000",
+ boxShadow: 24,
+ borderRadius: "5px",
+ overflow: "hidden",
+ overflowY: 'scroll',
+ maxHeight: '85%'
+};
+
+const buttonStyle = { margin: "2rem", backgroundColor: "#233044" };
+
+
+const headerStyles = {
+ width: "100%",
+ backgroundColor: "#233044",
+ color: "#eeeeee",
+ display: "flex",
+ justifyContent: "space-between",
+ alignItems: "center",
+ gap: "20px",
+ padding: "10px 7px 10px 7px",
+ fontWeight: 'bold',
+ position: "sticky",
+ top: 0,
+ overflow: 'hidden'
+}
+
+const formStyle = {
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ alignItems: "center",
+ padding: "2rem"
+}
+
+const StyledTextField = {
+ margin: "1rem",
+ width: "300px",
+};
+
+const DriversPage = (props) => {
+ const [open, setOpen] = useState(false);
+ const handleOpen = () => setOpen(true);
+ const handleClose = () => {
+ reset();
+ setOpen(false);
+ };
+
+ const { data, isLoading, refetch } = useGetAllDriversQuery();
+
+ const [createDriver] = useCreateDriverMutation();
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ reset,
+ } = useForm({
+ defaultValues: {
+ name: "",
+ email: "",
+ },
+ });
+
+ const onSubmit = (data) => {
+ createDriver(data)
+ .unwrap()
+ .then((res) => {
+ reset();
+ setOpen(false);
+ })
+ .catch((err) => {
+ console.log("Error creating a driver =>", err);
+ });
+ };
+
+ useEffect(()=> {
+ refetch()
+ }, [])
+
+ return (
+
+
+
+ Driver Information
+
+
+
+
+
+
+
+ Name
+ Email
+ Phone
+ Address
+ Licence Number
+ Licence expiry
+ Motocycle Maker
+ Motocycle Model
+ Motocycle Year
+
+
+
+ {!isLoading &&
+ data?.data?.map((row) => (
+
+
+ {row.name}
+
+ {row.email}
+ {row?.phone}
+ {row?.address}
+ {row.license_number}
+ {row.license_expiry}
+ {row.motocycle_make}
+ {row.motocycle_model}
+ {row.motocycle_year}
+
+ ))}
+
+
+
+
+
+
+
+
+ Add New Driver
+
+
+
+
+
+
+
+
+ );
+};
+
+export default DriversPage;
diff --git a/frontend/src/pages/Login/LoginPage.jsx b/frontend/src/pages/Login/LoginPage.jsx
new file mode 100644
index 0000000..d14300e
--- /dev/null
+++ b/frontend/src/pages/Login/LoginPage.jsx
@@ -0,0 +1,276 @@
+import React from "react";
+import Box from "@mui/material/Box";
+import Tabs from "@mui/material/Tabs";
+import Tab from "@mui/material/Tab";
+import { Controller, useForm } from "react-hook-form";
+import { Button, MenuItem, TextField, Typography } from "@mui/material";
+
+import "./login.css";
+
+function TabPanel(props) {
+ const { children, value, index, ...other } = props;
+
+ return (
+
+ {value === index && {children}}
+
+ );
+}
+
+function a11yProps(index) {
+ return {
+ id: `simple-tab-${index}`,
+ "aria-controls": `simple-tabpanel-${index}`,
+ };
+}
+
+const StyledTextField = {
+ margin: "0.4rem 0.4rem 0rem 0rem",
+ width: "300px",
+};
+
+const headerStyles = {
+ width: "100%",
+ backgroundColor: "#233044",
+ color: "#eeeeee",
+ display: "flex",
+ justifyContent: "center",
+ alignItems: "center",
+ padding: "10px 7px 10px 7px",
+ fontWeight: "bold",
+};
+
+const buttonStyle = {
+ margin: "1rem 0rem",
+ backgroundColor: "#233044",
+ padding: "10px 7px 10px 7px",
+};
+
+function LoginPage() {
+ const [value, setTab] = React.useState(0);
+ const [stations, setStations] = React.useState([]);
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ control,
+ reset,
+ setValue,
+ } = useForm({
+ defaultValues: {
+ email: "",
+ password: "",
+ },
+ });
+
+ React.useEffect(() => {
+ function getStations() {
+ fetch("http://backend/api/v1/stations", {
+ method: "GET",
+ headers: { "Content-Type": "application/json" },
+ })
+ .then((res) => res.json())
+ .then((json) => {
+ setStations(json?.data);
+ })
+ .catch((err) => {
+ console.log(err);
+ });
+ }
+ getStations();
+ }, []);
+
+ const handleChange = (event, newValue) => {
+ setTab(newValue);
+ reset();
+ };
+
+ const onSubmit = (data) => {
+ console.log("==>>", data);
+
+ fetch("http://localhost:5000/api/v1/login", {
+ method: "POST",
+ body: JSON.stringify({ ...data }),
+ headers: { "Content-Type": "application/json" },
+ })
+ .then((res) => {
+ if (res.ok) {
+ return res.json();
+ }
+ throw new Error(res.statusText);
+ })
+ .then(({ token }) => {
+ localStorage.setItem("token", token);
+ if (!data?.station_id) {
+ window.location.replace("/admin/drivers");
+ } else {
+ window.location.replace("/manager/swaps/ongoing");
+ }
+ })
+ .catch((err) => {
+ console.log(err, "-------<<<<<<>");
+ });
+ };
+
+ return (
+ <>
+
+
+ Authentication
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+export default LoginPage;
diff --git a/frontend/src/pages/Login/login.css b/frontend/src/pages/Login/login.css
new file mode 100644
index 0000000..c37bbcb
--- /dev/null
+++ b/frontend/src/pages/Login/login.css
@@ -0,0 +1,98 @@
+* {
+ box-sizing: border-box;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-decoration: none;
+ }
+
+ html,
+ body {
+
+ }
+
+ .heading {
+ text-align: center;
+ font-size: 2.75rem;
+ margin-bottom: 1em;
+ }
+
+ .form-section {
+ min-height: 95vh;
+ display: grid;
+ place-content: center;
+ font-family: 'Roboto', sans-serif;
+ font-size: 10px;
+ }
+
+ .input-block {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ margin: 2em 0 0.5em;
+ }
+
+ .label {
+ font-family: 'Roboto';
+ letter-spacing: 0.25px;
+ font-weight: 500;
+ font-size: 1.35rem;
+ color: #000;
+ margin-bottom: 0.35em;
+ }
+
+ .requiredLabel {
+ color: red;
+ font-weight: bold;
+ }
+
+ .input {
+ padding: 1.35em 1em;
+ width: 350px;
+ background-color: #fff;
+ outline: none;
+ border: 1px solid rgb(130, 130, 130);
+ border-radius: 0.25em;
+ }
+
+ .warning-message {
+ color: #ff0000;
+ font-weight: 500;
+ font-size: 1rem;
+ }
+
+ .wrong-input {
+ border: 2px solid #ff0000;
+ color: #ff0000;
+ }
+
+ .correct-input {
+ border: 2px solid #03bb56;
+ color: #03bb56;
+ }
+
+ .submit-button-wrapper {
+ display: flex;
+ }
+
+ .float {
+ justify-content: flex-end;
+ }
+
+ .submit-button {
+ margin-top: 1.75rem;
+ background-color: #000;
+ color: #fff;
+ letter-spacing: 0.5px;
+ padding: 0.85em 2.2em;
+ border: none;
+ font-size: 1.5rem;
+ font-weight: 500;
+ border-radius: 4px;
+ }
+
+ .button-success {
+ color: white;
+ background-color: #03bb56;
+ }
+
\ No newline at end of file
diff --git a/frontend/src/pages/Station/StationsPage.jsx b/frontend/src/pages/Station/StationsPage.jsx
new file mode 100644
index 0000000..14a0ccc
--- /dev/null
+++ b/frontend/src/pages/Station/StationsPage.jsx
@@ -0,0 +1,242 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+import CloseIcon from "@mui/icons-material/Close";
+import {
+ Button,
+ Checkbox,
+ FormControl,
+ FormControlLabel,
+ Grid,
+ InputLabel,
+ MenuItem,
+ Select,
+ Stack,
+ TextField,
+} from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+import {
+ useCreateStationMutation,
+ useGetAllStationsQuery,
+} from "../../redux/features/apiSlice";
+
+const locations = ["Kicukiro", "Gasabo", "Nyarugenge"];
+
+const style = {
+ position: "absolute",
+ top: "50%",
+ left: "50%",
+ transform: "translate(-50%, -50%)",
+ bgcolor: "background.paper",
+ // border: "2px solid #000",
+ boxShadow: 24,
+ borderRadius: "5px",
+ overflow: "hidden",
+ maxHeight: "85%",
+};
+
+const buttonStyle = { margin: "2rem", backgroundColor: "#233044" };
+
+const headerStyles = {
+ width: "100%",
+ backgroundColor: "#233044",
+ color: "#eeeeee",
+ display: "flex",
+ justifyContent: "space-between",
+ alignItems: "center",
+ gap: "20px",
+ padding: "10px 7px 10px 7px",
+ fontWeight: "bold",
+ position: "sticky",
+ top: 0,
+ overflow: "hidden",
+};
+
+const formStyle = {
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ alignItems: "center",
+ padding: "2rem",
+};
+
+const StyledTextField = {
+ margin: "1rem",
+ width: "300px",
+};
+
+export default function StationsPage(props) {
+ const [open, setOpen] = useState(false);
+ const handleOpen = () => setOpen(true);
+ const handleClose = () => setOpen(false);
+
+ const { data, isError, error, refetch, isLoading } = useGetAllStationsQuery();
+
+ const [createStation] = useCreateStationMutation();
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ control,
+ reset,
+ setValue,
+ } = useForm({
+ defaultValues: {
+ name: "",
+ location: "",
+ },
+ });
+
+ const onSubmit = (data) => {
+ createStation(data)
+ .unwrap()
+ .then((resp) => {
+ reset();
+ setOpen(false);
+ })
+ .catch((err) => {
+ console.log("Error creating a Station", err);
+ });
+ };
+
+ useEffect(() => {
+ refetch();
+ }, []);
+
+ console.log(data);
+
+ return (
+
+
+
+
+ Swap Station Information
+
+
+
+
+
+
+
+ name
+ Location
+ Total Swaps
+
+
+
+ {!isLoading &&
+ data?.data?.map((row) => (
+
+
+ {row.name}
+
+ {row.location}
+ {row?.total_swaps}
+
+ ))}
+
+
+
+
+
+
+
+ Add New Station
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/frontend/src/pages/StationBattery/StationBatteryPage.jsx b/frontend/src/pages/StationBattery/StationBatteryPage.jsx
new file mode 100644
index 0000000..1bce189
--- /dev/null
+++ b/frontend/src/pages/StationBattery/StationBatteryPage.jsx
@@ -0,0 +1,83 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+import {
+ Stack,
+ TextField,
+} from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+
+import {
+ useCreateBatteryMutation,
+ useGetAllBatteriesQuery,
+ useGetStationBatteriesQuery,
+} from "../../redux/features/apiSlice";
+
+
+const StationBatteryPage = (props) => {
+ const {
+ refetch,
+ data,
+ isError: BatteryError,
+ isLoading: BatteryLoading,
+ } = useGetStationBatteriesQuery();
+
+ useEffect(() => {
+ refetch();
+ }, []);
+
+ console.log("Rerender", data);
+
+ return (
+ <>
+
+
+ Station Battery Information
+
+
+
+
+
+
+ Battery Type
+ Serial Number
+ Station Location
+ Status
+
+
+
+ {!BatteryLoading &&
+ data?.data?.map((row, i) => (
+
+
+ {row.battery_type}
+
+ {row.serial_number}
+ {`${row.station.name} - ${row.station.location} `}
+ {row?.status}
+
+ ))}
+
+
+
+ >
+ );
+};
+
+export default StationBatteryPage;
diff --git a/frontend/src/pages/StationBatteryHistory/StationSwapHistoryPage.jsx b/frontend/src/pages/StationBatteryHistory/StationSwapHistoryPage.jsx
new file mode 100644
index 0000000..d23a581
--- /dev/null
+++ b/frontend/src/pages/StationBatteryHistory/StationSwapHistoryPage.jsx
@@ -0,0 +1,73 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+import { useGetSwapHistoryQuery } from "../../redux/features/apiSlice";
+import { Stack } from "@mui/material";
+
+const StationSwapHistoryPage = () => {
+ const { data, error, isError, refetch, isLoading } = useGetSwapHistoryQuery();
+
+ useEffect(() => {
+ refetch();
+ }, []);
+
+ return (
+
+
+
+ Battery Swap History Information
+
+
+
+
+
+
+ Battery
+ Driver
+ PickUp Location
+ Deposit Location
+ Start Time
+ End Time
+ Distane
+
+
+
+ {!isLoading &&
+ data?.data?.map((row, idx) => (
+
+
+ {`${row.battery?.battery_type} - ${row.battery?.serial_number}`}
+
+ {row.driver?.name}
+
+ {row.pickup_station?.name}
+
+
+ {row.deposit_station?.name}
+
+ {row.start_time}
+ {row.end_time}
+ {row?.distance} km
+
+ ))}
+
+
+
+
+ );
+};
+
+export default StationSwapHistoryPage;
diff --git a/frontend/src/pages/StationBatteryMovement/StationBatteryMovementPage.jsx b/frontend/src/pages/StationBatteryMovement/StationBatteryMovementPage.jsx
new file mode 100644
index 0000000..ef0f731
--- /dev/null
+++ b/frontend/src/pages/StationBatteryMovement/StationBatteryMovementPage.jsx
@@ -0,0 +1,328 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+import CloseIcon from "@mui/icons-material/Close";
+import {
+ Checkbox,
+ FormControl,
+ FormControlLabel,
+ Grid,
+ InputLabel,
+ MenuItem,
+ Select,
+ TextField,
+} from "@mui/material";
+
+import {
+ useCreateSwapMutation,
+ useGetAllDriversQuery,
+ useGetBatteryMovementQuery,
+ useGetOngoingSwapsQuery,
+ useGetStationBatteriesQuery,
+ useSwapFinishedMutation,
+} from "../../redux/features/apiSlice";
+import { Button, Stack } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+
+const style = {
+ position: "absolute",
+ top: "50%",
+ left: "50%",
+ transform: "translate(-50%, -50%)",
+ bgcolor: "background.paper",
+ // border: "2px solid #000",
+ boxShadow: 24,
+ borderRadius: "5px",
+ overflow: "hidden",
+ maxHeight: "85%",
+};
+
+const buttonStyle = { margin: "2rem", backgroundColor: "#233044" };
+
+const headerStyles = {
+ width: "100%",
+ backgroundColor: "#233044",
+ color: "#eeeeee",
+ display: "flex",
+ justifyContent: "space-between",
+ alignItems: "center",
+ gap: "20px",
+ padding: "10px 7px 10px 7px",
+ fontWeight: "bold",
+ position: "sticky",
+ top: 0,
+ overflow: "hidden",
+};
+
+const formStyle = {
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ alignItems: "center",
+ padding: "2rem",
+};
+
+const StyledTextField = {
+ margin: "1rem",
+ width: "300px",
+};
+
+const StationBatteryMovementPage = () => {
+ const [open, setOpen] = useState(false);
+ const handleOpen = () => setOpen(true);
+ const handleClose = () => {
+ reset()
+ setOpen(false)
+ };
+
+ const { data: driversData, isLoading: driverLoading } =
+ useGetAllDriversQuery();
+ const { data: batterieData, isLoading: BatteryLoading } =
+ useGetStationBatteriesQuery();
+ const {
+ data: ongoingSwapsData,
+ isLoading: loadingSwaps,
+ refetch,
+ } = useGetOngoingSwapsQuery();
+
+ const [swapFinished] = useSwapFinishedMutation();
+
+ const [createSwap] = useCreateSwapMutation();
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ control,
+ reset,
+ setValue,
+ } = useForm({
+ defaultValues: {
+ battery_id: "",
+ driver_id: "",
+ },
+ });
+
+ const onSubmit = (data) => {
+ createSwap(data)
+ .unwrap()
+ .then((res) => {
+ reset();
+ setOpen(false);
+ })
+ .catch((err) => {
+ console.log("Err creating a new swap", err);
+ });
+ };
+
+ useEffect(() => {
+ refetch();
+ }, []);
+
+ const stopSwap = (id) => {
+ swapFinished(id)
+ .unwrap()
+ .then((res) => {
+ refetch();
+ })
+ .catch((err) => {
+ console.log("===>>>", err);
+ });
+ };
+
+ return (
+
+
+
+ Ongoing Battery Swaps
+
+
+
+
+
+
+
+ Battery
+ Driver
+ PickUp Location
+ Deposit Location
+ Start Time
+ End Time
+ Status
+ Action
+
+
+
+ {!loadingSwaps &&
+ ongoingSwapsData?.data?.map((row, idx) => (
+
+
+ {row.battery?.serial_number}
+
+ {row.driver?.name}
+
+ {row.pickup_station?.id == null
+ ? "-"
+ : row.pickup_station?.name}
+
+
+ {row.deposit_station?.id == null
+ ? "-"
+ : row.deposit_station?.name}
+
+ {row.start_time}
+ {row.end_time}
+
+ {row.deposit_station_id == null ? "On going" : "Stopped"}
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ New Battery Swap Form
+
+
+
+
+
+
+
+ );
+};
+
+export default StationBatteryMovementPage;
diff --git a/frontend/src/pages/SwapHistory/SwapHistoryPage.jsx b/frontend/src/pages/SwapHistory/SwapHistoryPage.jsx
new file mode 100644
index 0000000..f4f80b7
--- /dev/null
+++ b/frontend/src/pages/SwapHistory/SwapHistoryPage.jsx
@@ -0,0 +1,75 @@
+import React, { useEffect, useState } from "react";
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import TableCell from "@mui/material/TableCell";
+import TableContainer from "@mui/material/TableContainer";
+import TableHead from "@mui/material/TableHead";
+import TableRow from "@mui/material/TableRow";
+import Paper from "@mui/material/Paper";
+import Backdrop from "@mui/material/Backdrop";
+import Box from "@mui/material/Box";
+import Modal from "@mui/material/Modal";
+import Fade from "@mui/material/Fade";
+import Typography from "@mui/material/Typography";
+import { useGetSwapHistoryQuery } from "../../redux/features/apiSlice";
+
+const SwapHistoryPage = () => {
+ const { data, error, isError, refetch, isLoading } = useGetSwapHistoryQuery();
+
+ useEffect(() => {
+ refetch();
+ }, []);
+
+ return (
+
+
+ {/* {!isLoading && data?.data?.length == 0 ? (
+ No data is available
+ ) : ( */}
+
+
+
+ Battery
+ Driver
+ PickUp Location
+ Deposit Location
+ Start Time
+ End Time
+ Distane
+
+
+
+ {!isLoading &&
+ data?.data?.map((row, idx) => (
+
+
+ {row.battery?.battery_type} - {row.battery?.serial_number}
+
+ {row.driver?.name}
+
+ {row.pickup_station?.id == null
+ ? "-"
+ : row.pickup_station?.name}
+
+
+ {row.deposit_station?.id == null
+ ? "-"
+ : row.deposit_station?.name}
+
+ {row.start_time}
+ {row.end_time}
+ {row?.distance}
+
+ ))}
+
+
+ {/* )} */}
+
+
+ );
+};
+
+export default SwapHistoryPage;
diff --git a/frontend/src/react-app-env.d.ts b/frontend/src/react-app-env.d.ts
new file mode 100644
index 0000000..6431bc5
--- /dev/null
+++ b/frontend/src/react-app-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/frontend/src/redux/features/apiSlice.js b/frontend/src/redux/features/apiSlice.js
new file mode 100644
index 0000000..f4ef2d9
--- /dev/null
+++ b/frontend/src/redux/features/apiSlice.js
@@ -0,0 +1,113 @@
+import {createApi, fetchBaseQuery} from "@reduxjs/toolkit/query/react"
+
+
+
+const baseQuery = fetchBaseQuery({
+ baseUrl: 'http://backend/api/v1/',
+ prepareHeaders: headers => {
+
+ const token = localStorage.getItem('token');
+ // If we have a token set in state, let's assume that we should be passing it.
+ if (token) {
+ headers.set('Authorization', `Bearer ${token}`)
+ }
+ return headers
+ },
+ })
+
+export const backendApis = createApi({
+ reducerPath: "backendApis",
+ baseQuery: baseQuery,
+ tagTypes: ["Station", "Battery", "Driver", "Swap", "Movements" ],
+ endpoints: (builder) => ({
+ getAllDrivers: builder.query({
+ query: () => "drivers",
+ providesTags: ["Driver"]
+ }),
+ createDriver: builder.mutation({
+ query: formData => ({
+ url: "/drivers/addriver",
+ method: "POST",
+ body: formData,
+ headers: {
+ Authorization: "application/json"
+ }
+ }),
+ invalidatesTags: ["Driver"]
+ }),
+ createBattery: builder.mutation({
+ query: formData => ({
+ url: "batteries/addbattery",
+ method: "POST",
+ body: formData,
+ }),
+ invalidatesTags: ["Battery"]
+ }),
+ getAllBatteries: builder.query({
+ query: () => "batteries",
+ providesTags:["Battery"]
+ }),
+ getAllStations: builder.query({
+ query: () => "stations",
+ providesTags: ["Station"]
+ }),
+ createStation: builder.mutation({
+ query: formData => ({
+ url: "stations/addstation",
+ method: "POST",
+ body: formData
+ }),
+ invalidatesTags: ["Station"]
+ }),
+ getSwapHistory: builder.query({
+ query: () => `swaps/totalswappedbattery`,
+ providesTags: ["Swap"]
+ }),
+ getBatteryMovement: builder.query({
+ query: () => 'movements',
+ providesTags: ["Movements"]
+ }),
+ getStationBatteries: builder.query({
+ query: () => `stations/batteries`,
+ providesTags: ["Battery"]
+ }),
+ createSwap: builder.mutation({
+ query: formData => ({
+ url: 'swaps/addswap',
+ method: 'POST',
+ body: formData
+ }),
+ invalidatesTags: ["Swap"]
+ }),
+ getOngoingSwaps: builder.query({
+ query: () => 'swaps',
+ providesTags: ["Swap"]
+ }),
+ swapFinished: builder.mutation({
+ query: id => ({
+ url: `swaps/stopswap/${id}`,
+ method: 'PUT'
+ }),
+ invalidatesTags: ["Swap"]
+ })
+ })
+})
+
+
+
+export const {
+ useGetAllDriversQuery,
+ useCreateDriverMutation,
+ useGetAllBatteriesQuery,
+ useCreateBatteryMutation,
+ useGetAllStationsQuery,
+ useCreateStationMutation,
+ useGetSwapHistoryQuery,
+ useGetBatteryMovementQuery,
+ useGetStationBatteriesQuery,
+ useCreateSwapMutation,
+ useGetOngoingSwapsQuery,
+ useSwapFinishedMutation
+} = backendApis
+
+export default backendApis.endpoints
\ No newline at end of file
diff --git a/frontend/src/redux/features/appStateSlice.js b/frontend/src/redux/features/appStateSlice.js
new file mode 100644
index 0000000..503e4f6
--- /dev/null
+++ b/frontend/src/redux/features/appStateSlice.js
@@ -0,0 +1,21 @@
+import { createSlice } from "@reduxjs/toolkit";
+
+const initialState = {
+ appState: ""
+};
+
+export const appStateSlice = createSlice({
+ name: "appState",
+ initialState,
+ reducers: {
+ setAppState: (state, action) => {
+ state.appState = action.payload;
+ }
+ }
+});
+
+export const {
+ setAppState
+} = appStateSlice.actions;
+
+export default appStateSlice.reducer;
\ No newline at end of file
diff --git a/frontend/src/redux/store.js b/frontend/src/redux/store.js
new file mode 100644
index 0000000..3500341
--- /dev/null
+++ b/frontend/src/redux/store.js
@@ -0,0 +1,11 @@
+import { configureStore, getDefaultMiddleware } from "@reduxjs/toolkit";
+import appStateSlice from "./features/appStateSlice";
+import { backendApis } from "./features/apiSlice";
+
+export const store = configureStore({
+ reducer: {
+ appState: appStateSlice,
+ [backendApis.reducerPath]: backendApis.reducer
+ },
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(backendApis.middleware)
+});
\ No newline at end of file
diff --git a/frontend/src/reportWebVitals.ts b/frontend/src/reportWebVitals.ts
new file mode 100644
index 0000000..49a2a16
--- /dev/null
+++ b/frontend/src/reportWebVitals.ts
@@ -0,0 +1,15 @@
+import { ReportHandler } from 'web-vitals';
+
+const reportWebVitals = (onPerfEntry?: ReportHandler) => {
+ if (onPerfEntry && onPerfEntry instanceof Function) {
+ import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
+ getCLS(onPerfEntry);
+ getFID(onPerfEntry);
+ getFCP(onPerfEntry);
+ getLCP(onPerfEntry);
+ getTTFB(onPerfEntry);
+ });
+ }
+};
+
+export default reportWebVitals;
diff --git a/frontend/src/routes/appRoutes.jsx b/frontend/src/routes/appRoutes.jsx
new file mode 100644
index 0000000..5a968a5
--- /dev/null
+++ b/frontend/src/routes/appRoutes.jsx
@@ -0,0 +1,99 @@
+import DriversPage from "../pages/Driver/DriversPage";
+import BatteriesPage from "../pages/Battery/BatteriesPage";
+import StationsPage from "../pages/Station/StationsPage";
+import SwapHistoryPage from "../pages/SwapHistory/SwapHistoryPage";
+import BatteryMovementPage from "../pages/BatteryMovement/BatteryMovementPage";
+import StationBatteryPage from "../pages/StationBattery/StationBatteryPage";
+import StationBatteryMovementPage from "../pages/StationBatteryMovement/StationBatteryMovementPage";
+import StationSwapHistoryPage from "../pages/StationBatteryHistory/StationSwapHistoryPage";
+import GpsFixedIcon from '@mui/icons-material/GpsFixed';
+import BatterySaverIcon from '@mui/icons-material/BatterySaver';
+import HistoryIcon from '@mui/icons-material/History';
+import EvStationIcon from '@mui/icons-material/EvStation';
+import SportsMotorsportsIcon from '@mui/icons-material/SportsMotorsports';
+
+const appRoutes = [
+ {
+ role: "admin",
+ path: "/admin/drivers",
+ element: ,
+ state: "drivers",
+ sidebarProps: {
+ displayText: "Drivers",
+ icon: ,
+ },
+ },
+ { index: true,
+ role: "admin",
+ path: "/admin/stations",
+ element: ,
+ state: "stations",
+ sidebarProps: {
+ displayText: "Swap Stations",
+ icon: ,
+ },
+ },
+ {
+ role: "admin",
+ path: "/admin/batteries",
+ element: ,
+ state: "batteries",
+ sidebarProps: {
+ displayText: "Battery",
+ icon: ,
+ },
+ },
+ {
+ role: "admin",
+ path: "/admin/swaphistory",
+ element: ,
+ state: "swaphistory",
+ sidebarProps: {
+ displayText: "Swap History",
+ icon: ,
+ },
+ },
+ {
+ role: "admin",
+ path: "/admin/swaps/ongoing",
+ element: ,
+ state: "batterymovement",
+ sidebarProps: {
+ displayText: "Active Swaps",
+ icon: ,
+ },
+ },
+ {
+ index: true,
+ role: "manager",
+ path: "/manager/swaps/ongoing",
+ element: ,
+ state: "managerbatterymovement",
+ sidebarProps: {
+ displayText: "Active Swaps",
+ icon: ,
+ },
+ },
+ {
+ role: "manager",
+ path: "/manager/station/battery",
+ element: ,
+ state: "managerstationbatteries",
+ sidebarProps: {
+ displayText: "Battery",
+ icon: ,
+ },
+ },
+ {
+ role: "manager",
+ path: "/manager/swaphistory",
+ element: ,
+ state: "managerbatteryhistory",
+ sidebarProps: {
+ displayText: "History",
+ icon: ,
+ },
+ },
+];
+
+export default appRoutes;
\ No newline at end of file
diff --git a/frontend/src/routes/index.jsx b/frontend/src/routes/index.jsx
new file mode 100644
index 0000000..6bf2a48
--- /dev/null
+++ b/frontend/src/routes/index.jsx
@@ -0,0 +1,38 @@
+import { ReactNode } from "react";
+import { Route } from "react-router-dom";
+import PageWrapper from "../components/layout/PageWrapper";
+import appRoutes from "./appRoutes";
+import userData from "../configs/helpers";
+
+const generateRoute = (routes) => {
+ const info = userData();
+ return (
+ info &&
+ routes
+ ?.filter((r) => r?.role == info?.role)
+ .map((route, index) => {
+ return route.index ? (
+ {route.element}
+ }
+ key={index}
+ />
+ ) : (
+
+ {route.element}
+
+ }
+ key={index}
+ />
+ );
+ })
+ );
+};
+
+export const routes = generateRoute(appRoutes);
\ No newline at end of file
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
new file mode 100644
index 0000000..17a77ad
--- /dev/null
+++ b/frontend/vite.config.js
@@ -0,0 +1,19 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+export default defineConfig(() => {
+ return {
+ build: {
+ outDir: "build",
+ },
+ plugins: [react()],
+ server: {
+ watch: {
+ usePolling: true,
+ },
+ host: true, // needed for the Docker Container port mapping to work
+ strictPort: true,
+ port: 5173, // you can replace this port with any port
+ }
+ };
+});
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
new file mode 100644
index 0000000..4197cad
--- /dev/null
+++ b/frontend/yarn.lock
@@ -0,0 +1,1781 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@adobe/css-tools@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz"
+ integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==
+
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz"
+ integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==
+ dependencies:
+ "@babel/highlight" "^7.18.6"
+
+"@babel/compat-data@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz"
+ integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==
+
+"@babel/core@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz"
+ integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.21.4"
+ "@babel/generator" "^7.21.4"
+ "@babel/helper-compilation-targets" "^7.21.4"
+ "@babel/helper-module-transforms" "^7.21.2"
+ "@babel/helpers" "^7.21.0"
+ "@babel/parser" "^7.21.4"
+ "@babel/template" "^7.20.7"
+ "@babel/traverse" "^7.21.4"
+ "@babel/types" "^7.21.4"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.2"
+ semver "^6.3.0"
+
+"@babel/generator@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz"
+ integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==
+ dependencies:
+ "@babel/types" "^7.21.4"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
+
+"@babel/helper-compilation-targets@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz"
+ integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==
+ dependencies:
+ "@babel/compat-data" "^7.21.4"
+ "@babel/helper-validator-option" "^7.21.0"
+ browserslist "^4.21.3"
+ lru-cache "^5.1.1"
+ semver "^6.3.0"
+
+"@babel/helper-environment-visitor@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz"
+ integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
+
+"@babel/helper-function-name@^7.21.0":
+ version "7.21.0"
+ resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz"
+ integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==
+ dependencies:
+ "@babel/template" "^7.20.7"
+ "@babel/types" "^7.21.0"
+
+"@babel/helper-hoist-variables@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz"
+ integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz"
+ integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-module-transforms@^7.21.2":
+ version "7.21.2"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz"
+ integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-module-imports" "^7.18.6"
+ "@babel/helper-simple-access" "^7.20.2"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/helper-validator-identifier" "^7.19.1"
+ "@babel/template" "^7.20.7"
+ "@babel/traverse" "^7.21.2"
+ "@babel/types" "^7.21.2"
+
+"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2":
+ version "7.20.2"
+ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz"
+ integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==
+
+"@babel/helper-simple-access@^7.20.2":
+ version "7.20.2"
+ resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz"
+ integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==
+ dependencies:
+ "@babel/types" "^7.20.2"
+
+"@babel/helper-split-export-declaration@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz"
+ integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-string-parser@^7.19.4":
+ version "7.19.4"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz"
+ integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
+
+"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
+ version "7.19.1"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz"
+ integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
+
+"@babel/helper-validator-option@^7.21.0":
+ version "7.21.0"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz"
+ integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==
+
+"@babel/helpers@^7.21.0":
+ version "7.21.0"
+ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz"
+ integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==
+ dependencies:
+ "@babel/template" "^7.20.7"
+ "@babel/traverse" "^7.21.0"
+ "@babel/types" "^7.21.0"
+
+"@babel/highlight@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz"
+ integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.18.6"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.20.7", "@babel/parser@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz"
+ integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==
+
+"@babel/plugin-syntax-jsx@^7.17.12":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz"
+ integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-react-jsx-self@^7.21.0":
+ version "7.21.0"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz"
+ integrity sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.20.2"
+
+"@babel/plugin-transform-react-jsx-source@^7.19.6":
+ version "7.19.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz"
+ integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.19.0"
+
+"@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+ version "7.20.1"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz"
+ integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==
+ dependencies:
+ regenerator-runtime "^0.13.10"
+
+"@babel/template@^7.20.7":
+ version "7.20.7"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz"
+ integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
+ dependencies:
+ "@babel/code-frame" "^7.18.6"
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+
+"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz"
+ integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==
+ dependencies:
+ "@babel/code-frame" "^7.21.4"
+ "@babel/generator" "^7.21.4"
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-function-name" "^7.21.0"
+ "@babel/helper-hoist-variables" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/parser" "^7.21.4"
+ "@babel/types" "^7.21.4"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4":
+ version "7.21.4"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz"
+ integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==
+ dependencies:
+ "@babel/helper-string-parser" "^7.19.4"
+ "@babel/helper-validator-identifier" "^7.19.1"
+ to-fast-properties "^2.0.0"
+
+"@emotion/babel-plugin@^11.10.5":
+ version "11.10.5"
+ resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz"
+ integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/plugin-syntax-jsx" "^7.17.12"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.0"
+ "@emotion/memoize" "^0.8.0"
+ "@emotion/serialize" "^1.1.1"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.1.3"
+
+"@emotion/cache@^11.10.3", "@emotion/cache@^11.10.5":
+ version "11.10.5"
+ resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz"
+ integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==
+ dependencies:
+ "@emotion/memoize" "^0.8.0"
+ "@emotion/sheet" "^1.2.1"
+ "@emotion/utils" "^1.2.0"
+ "@emotion/weak-memoize" "^0.3.0"
+ stylis "4.1.3"
+
+"@emotion/hash@^0.9.0":
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz"
+ integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==
+
+"@emotion/is-prop-valid@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz"
+ integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==
+ dependencies:
+ "@emotion/memoize" "^0.8.0"
+
+"@emotion/memoize@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz"
+ integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==
+
+"@emotion/react@^11.10.5":
+ version "11.10.5"
+ resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz"
+ integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.10.5"
+ "@emotion/cache" "^11.10.5"
+ "@emotion/serialize" "^1.1.1"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
+ "@emotion/utils" "^1.2.0"
+ "@emotion/weak-memoize" "^0.3.0"
+ hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz"
+ integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==
+ dependencies:
+ "@emotion/hash" "^0.9.0"
+ "@emotion/memoize" "^0.8.0"
+ "@emotion/unitless" "^0.8.0"
+ "@emotion/utils" "^1.2.0"
+ csstype "^3.0.2"
+
+"@emotion/sheet@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz"
+ integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==
+
+"@emotion/styled@^11.10.5":
+ version "11.10.5"
+ resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz"
+ integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.10.5"
+ "@emotion/is-prop-valid" "^1.2.0"
+ "@emotion/serialize" "^1.1.1"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
+ "@emotion/utils" "^1.2.0"
+
+"@emotion/unitless@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz"
+ integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz"
+ integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==
+
+"@emotion/utils@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz"
+ integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==
+
+"@emotion/weak-memoize@^0.3.0":
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz"
+ integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==
+
+"@esbuild/android-arm64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz#4aa8d8afcffb4458736ca9b32baa97d7cb5861ea"
+ integrity sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==
+
+"@esbuild/android-arm@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.18.tgz#74a7e95af4ee212ebc9db9baa87c06a594f2a427"
+ integrity sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==
+
+"@esbuild/android-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.18.tgz#1dcd13f201997c9fe0b204189d3a0da4eb4eb9b6"
+ integrity sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==
+
+"@esbuild/darwin-arm64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz#444f3b961d4da7a89eb9bd35cfa4415141537c2a"
+ integrity sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==
+
+"@esbuild/darwin-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz#a6da308d0ac8a498c54d62e0b2bfb7119b22d315"
+ integrity sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==
+
+"@esbuild/freebsd-arm64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz#b83122bb468889399d0d63475d5aea8d6829c2c2"
+ integrity sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==
+
+"@esbuild/freebsd-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz#af59e0e03fcf7f221b34d4c5ab14094862c9c864"
+ integrity sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==
+
+"@esbuild/linux-arm64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz#8551d72ba540c5bce4bab274a81c14ed01eafdcf"
+ integrity sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==
+
+"@esbuild/linux-arm@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz#e09e76e526df4f665d4d2720d28ff87d15cdf639"
+ integrity sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==
+
+"@esbuild/linux-ia32@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz#47878860ce4fe73a36fd8627f5647bcbbef38ba4"
+ integrity sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==
+
+"@esbuild/linux-loong64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz#3f8fbf5267556fc387d20b2e708ce115de5c967a"
+ integrity sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==
+
+"@esbuild/linux-mips64el@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz#9d896d8f3c75f6c226cbeb840127462e37738226"
+ integrity sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==
+
+"@esbuild/linux-ppc64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz#3d9deb60b2d32c9985bdc3e3be090d30b7472783"
+ integrity sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==
+
+"@esbuild/linux-riscv64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz#8a943cf13fd24ff7ed58aefb940ef178f93386bc"
+ integrity sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==
+
+"@esbuild/linux-s390x@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz#66cb01f4a06423e5496facabdce4f7cae7cb80e5"
+ integrity sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==
+
+"@esbuild/linux-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz"
+ integrity sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==
+
+"@esbuild/netbsd-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz#789a203d3115a52633ff6504f8cbf757f15e703b"
+ integrity sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==
+
+"@esbuild/openbsd-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz#d7b998a30878f8da40617a10af423f56f12a5e90"
+ integrity sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==
+
+"@esbuild/sunos-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz#ecad0736aa7dae07901ba273db9ef3d3e93df31f"
+ integrity sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==
+
+"@esbuild/win32-arm64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz#58dfc177da30acf956252d7c8ae9e54e424887c4"
+ integrity sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==
+
+"@esbuild/win32-ia32@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz#340f6163172b5272b5ae60ec12c312485f69232b"
+ integrity sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==
+
+"@esbuild/win32-x64@0.17.18":
+ version "0.17.18"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz#3a8e57153905308db357fd02f57c180ee3a0a1fa"
+ integrity sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.14"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.17"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz"
+ integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==
+ dependencies:
+ "@jridgewell/resolve-uri" "3.1.0"
+ "@jridgewell/sourcemap-codec" "1.4.14"
+
+"@mui/base@5.0.0-alpha.104":
+ version "5.0.0-alpha.104"
+ resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.104.tgz"
+ integrity sha512-tQPxZTzfYMwxYfKhEwufbTfdLpNjFdW7bXq6dK0j8651AAyZL4M8wynWUQ98hH1362R26mZFhVxHB2UD9t7VuA==
+ dependencies:
+ "@babel/runtime" "^7.19.0"
+ "@emotion/is-prop-valid" "^1.2.0"
+ "@mui/types" "^7.2.0"
+ "@mui/utils" "^5.10.9"
+ "@popperjs/core" "^2.11.6"
+ clsx "^1.2.1"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+
+"@mui/core-downloads-tracker@^5.10.12":
+ version "5.10.12"
+ resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.12.tgz"
+ integrity sha512-cR8lOS606G++iVHR8I6ySgMAEiPoA3DxO/nLeqiv7w7d1707kvKoV4/7SWjh4ui+kHb052xlf/G196q2EKx31w==
+
+"@mui/icons-material@^5.10.9":
+ version "5.10.9"
+ resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.10.9.tgz"
+ integrity sha512-sqClXdEM39WKQJOQ0ZCPTptaZgqwibhj2EFV9N0v7BU1PO8y4OcX/a2wIQHn4fNuDjIZktJIBrmU23h7aqlGgg==
+ dependencies:
+ "@babel/runtime" "^7.19.0"
+
+"@mui/material@^5.10.12":
+ version "5.10.12"
+ resolved "https://registry.npmjs.org/@mui/material/-/material-5.10.12.tgz"
+ integrity sha512-rG9ZTkG9qUwujyAY1I+uQAa9pkGdsWY3KN+wvS/6H6ZbYIA06QRwmig6ySC6LbeB3WL/I/1ngwJqWX7nfINSbA==
+ dependencies:
+ "@babel/runtime" "^7.19.0"
+ "@mui/base" "5.0.0-alpha.104"
+ "@mui/core-downloads-tracker" "^5.10.12"
+ "@mui/system" "^5.10.12"
+ "@mui/types" "^7.2.0"
+ "@mui/utils" "^5.10.9"
+ "@types/react-transition-group" "^4.4.5"
+ clsx "^1.2.1"
+ csstype "^3.1.1"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+ react-transition-group "^4.4.5"
+
+"@mui/private-theming@^5.10.9":
+ version "5.10.9"
+ resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.9.tgz"
+ integrity sha512-BN7/CnsVPVyBaQpDTij4uV2xGYHHHhOgpdxeYLlIu+TqnsVM7wUeF+37kXvHovxM6xmL5qoaVUD98gDC0IZnHg==
+ dependencies:
+ "@babel/runtime" "^7.19.0"
+ "@mui/utils" "^5.10.9"
+ prop-types "^15.8.1"
+
+"@mui/styled-engine@^5.10.8":
+ version "5.10.8"
+ resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.8.tgz"
+ integrity sha512-w+y8WI18EJV6zM/q41ug19cE70JTeO6sWFsQ7tgePQFpy6ToCVPh0YLrtqxUZXSoMStW5FMw0t9fHTFAqPbngw==
+ dependencies:
+ "@babel/runtime" "^7.19.0"
+ "@emotion/cache" "^11.10.3"
+ csstype "^3.1.1"
+ prop-types "^15.8.1"
+
+"@mui/system@^5.10.12":
+ version "5.10.12"
+ resolved "https://registry.npmjs.org/@mui/system/-/system-5.10.12.tgz"
+ integrity sha512-9DcN3hF2KTTTpZ0K5Tn20B+Tz7tIqDmJLk1M6P0CYoAGUN/xrcF/6dn1zZ829rxE5tmauoDUekTfomrvPsvlSQ==
+ dependencies:
+ "@babel/runtime" "^7.19.0"
+ "@mui/private-theming" "^5.10.9"
+ "@mui/styled-engine" "^5.10.8"
+ "@mui/types" "^7.2.0"
+ "@mui/utils" "^5.10.9"
+ clsx "^1.2.1"
+ csstype "^3.1.1"
+ prop-types "^15.8.1"
+
+"@mui/types@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.0.tgz"
+ integrity sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA==
+
+"@mui/utils@^5.10.9":
+ version "5.10.9"
+ resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.10.9.tgz"
+ integrity sha512-2tdHWrq3+WCy+G6TIIaFx3cg7PorXZ71P375ExuX61od1NOAJP1mK90VxQ8N4aqnj2vmO3AQDkV4oV2Ktvt4bA==
+ dependencies:
+ "@babel/runtime" "^7.19.0"
+ "@types/prop-types" "^15.7.5"
+ "@types/react-is" "^16.7.1 || ^17.0.0"
+ prop-types "^15.8.1"
+ react-is "^18.2.0"
+
+"@popperjs/core@^2.11.6":
+ version "2.11.6"
+ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz"
+ integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==
+
+"@reduxjs/toolkit@^1.8.6":
+ version "1.8.6"
+ resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.8.6.tgz"
+ integrity sha512-4Ia/Loc6WLmdSOzi7k5ff7dLK8CgG2b8aqpLsCAJhazAzGdp//YBUSaj0ceW6a3kDBDNRrq5CRwyCS0wBiL1ig==
+ dependencies:
+ immer "^9.0.7"
+ redux "^4.1.2"
+ redux-thunk "^2.4.1"
+ reselect "^4.1.5"
+
+"@remix-run/router@1.0.3":
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.0.3.tgz"
+ integrity sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q==
+
+"@testing-library/dom@^8.5.0":
+ version "8.19.0"
+ resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.0.tgz"
+ integrity sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/runtime" "^7.12.5"
+ "@types/aria-query" "^4.2.0"
+ aria-query "^5.0.0"
+ chalk "^4.1.0"
+ dom-accessibility-api "^0.5.9"
+ lz-string "^1.4.4"
+ pretty-format "^27.0.2"
+
+"@testing-library/jest-dom@^5.14.1":
+ version "5.16.5"
+ resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz"
+ integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==
+ dependencies:
+ "@adobe/css-tools" "^4.0.1"
+ "@babel/runtime" "^7.9.2"
+ "@types/testing-library__jest-dom" "^5.9.1"
+ aria-query "^5.0.0"
+ chalk "^3.0.0"
+ css.escape "^1.5.1"
+ dom-accessibility-api "^0.5.6"
+ lodash "^4.17.15"
+ redent "^3.0.0"
+
+"@testing-library/react@^13.0.0":
+ version "13.4.0"
+ resolved "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz"
+ integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ "@testing-library/dom" "^8.5.0"
+ "@types/react-dom" "^18.0.0"
+
+"@testing-library/user-event@^13.2.1":
+ version "13.5.0"
+ resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz"
+ integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+
+"@types/aria-query@^4.2.0":
+ version "4.2.2"
+ resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz"
+ integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==
+
+"@types/hoist-non-react-statics@^3.3.1":
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz"
+ integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
+ dependencies:
+ "@types/react" "*"
+ hoist-non-react-statics "^3.3.0"
+
+"@types/jest@*", "@types/jest@^27.0.1":
+ version "27.5.2"
+ resolved "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz"
+ integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==
+ dependencies:
+ jest-matcher-utils "^27.0.0"
+ pretty-format "^27.0.0"
+
+"@types/node@^16.7.13":
+ version "16.18.3"
+ resolved "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz"
+ integrity sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/prop-types@*", "@types/prop-types@^15.7.5":
+ version "15.7.5"
+ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz"
+ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
+
+"@types/react-dom@^18.0.0":
+ version "18.0.8"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz"
+ integrity sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react-is@^16.7.1 || ^17.0.0":
+ version "17.0.3"
+ resolved "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz"
+ integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react-transition-group@^4.4.5":
+ version "4.4.5"
+ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz"
+ integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@^18.0.0":
+ version "18.0.24"
+ resolved "https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz"
+ integrity sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
+"@types/scheduler@*":
+ version "0.16.2"
+ resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz"
+ integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
+
+"@types/testing-library__jest-dom@^5.9.1":
+ version "5.14.5"
+ resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz"
+ integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==
+ dependencies:
+ "@types/jest" "*"
+
+"@types/use-sync-external-store@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz"
+ integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==
+
+"@vitejs/plugin-react@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28"
+ integrity sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==
+ dependencies:
+ "@babel/core" "^7.21.4"
+ "@babel/plugin-transform-react-jsx-self" "^7.21.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.19.6"
+ react-refresh "^0.14.0"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+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"
+
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+aria-query@^5.0.0:
+ version "5.1.3"
+ resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz"
+ integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
+ dependencies:
+ deep-equal "^2.0.5"
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+babel-plugin-macros@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
+browserslist@^4.21.3:
+ version "4.21.4"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz"
+ integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
+ dependencies:
+ caniuse-lite "^1.0.30001400"
+ electron-to-chromium "^1.4.251"
+ node-releases "^2.0.6"
+ update-browserslist-db "^1.0.9"
+
+buffer-equal-constant-time@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+ integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.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.30001400:
+ version "1.0.30001429"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz"
+ integrity sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg==
+
+chalk@^2.0.0:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^4.0.0, chalk@^4.1.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"
+
+clsx@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz"
+ integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+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.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+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==
+
+convert-source-map@^1.5.0, convert-source-map@^1.7.0:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+cosmiconfig@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz"
+ integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+css.escape@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz"
+ integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==
+
+csstype@^3.0.2, csstype@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz"
+ integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
+
+debug@^4.1.0:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+deep-equal@^2.0.5:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.1.0.tgz"
+ integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA==
+ dependencies:
+ call-bind "^1.0.2"
+ es-get-iterator "^1.1.2"
+ get-intrinsic "^1.1.3"
+ is-arguments "^1.1.1"
+ is-date-object "^1.0.5"
+ is-regex "^1.1.4"
+ isarray "^2.0.5"
+ object-is "^1.1.5"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.4.3"
+ side-channel "^1.0.4"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.8"
+
+define-properties@^1.1.3, define-properties@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz"
+ integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
+dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9:
+ version "0.5.14"
+ resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz"
+ integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==
+
+dom-helpers@^5.0.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
+ integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
+ecdsa-sig-formatter@1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+ integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+electron-to-chromium@^1.4.251:
+ version "1.4.284"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz"
+ integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-get-iterator@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz"
+ integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.0"
+ has-symbols "^1.0.1"
+ is-arguments "^1.1.0"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.5"
+ isarray "^2.0.5"
+
+esbuild@^0.17.5:
+ version "0.17.18"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz"
+ integrity sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.17.18"
+ "@esbuild/android-arm64" "0.17.18"
+ "@esbuild/android-x64" "0.17.18"
+ "@esbuild/darwin-arm64" "0.17.18"
+ "@esbuild/darwin-x64" "0.17.18"
+ "@esbuild/freebsd-arm64" "0.17.18"
+ "@esbuild/freebsd-x64" "0.17.18"
+ "@esbuild/linux-arm" "0.17.18"
+ "@esbuild/linux-arm64" "0.17.18"
+ "@esbuild/linux-ia32" "0.17.18"
+ "@esbuild/linux-loong64" "0.17.18"
+ "@esbuild/linux-mips64el" "0.17.18"
+ "@esbuild/linux-ppc64" "0.17.18"
+ "@esbuild/linux-riscv64" "0.17.18"
+ "@esbuild/linux-s390x" "0.17.18"
+ "@esbuild/linux-x64" "0.17.18"
+ "@esbuild/netbsd-x64" "0.17.18"
+ "@esbuild/openbsd-x64" "0.17.18"
+ "@esbuild/sunos-x64" "0.17.18"
+ "@esbuild/win32-arm64" "0.17.18"
+ "@esbuild/win32-ia32" "0.17.18"
+ "@esbuild/win32-x64" "0.17.18"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+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==
+
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functions-have-names@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+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.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz"
+ integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.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==
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+has-bigints@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+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-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+immer@^9.0.7:
+ version "9.0.16"
+ resolved "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz"
+ integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+is-arguments@^1.1.0, is-arguments@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.9.0:
+ version "2.11.0"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz"
+ integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-map@^2.0.1, is-map@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz"
+ integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-set@^2.0.1, is-set@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz"
+ integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
+is-string@^1.0.5:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10:
+ version "1.1.10"
+ resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz"
+ integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+is-weakmap@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz"
+ integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+
+is-weakset@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz"
+ integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-matcher-utils@^27.0.0:
+ version "27.5.1"
+ resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+"js-tokens@^3.0.0 || ^4.0.0", 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==
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json5@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonwebtoken@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d"
+ integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==
+ dependencies:
+ jws "^3.2.2"
+ lodash "^4.17.21"
+ ms "^2.1.1"
+ semver "^7.3.8"
+
+jwa@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
+ integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
+ dependencies:
+ buffer-equal-constant-time "1.0.1"
+ ecdsa-sig-formatter "1.0.11"
+ safe-buffer "^5.0.1"
+
+jws@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
+ integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
+ dependencies:
+ jwa "^1.4.1"
+ safe-buffer "^5.0.1"
+
+jwt-decode@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59"
+ integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+lodash@^4.17.15, lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+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"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+lz-string@^1.4.4:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz"
+ integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.3.6:
+ version "3.3.6"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz"
+ integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
+
+node-releases@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz"
+ integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
+
+object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.9.0:
+ version "1.12.2"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz"
+ integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
+
+object-is@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+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"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+postcss@^8.4.21:
+ version "8.4.23"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz"
+ integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==
+ dependencies:
+ nanoid "^3.3.6"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+prop-types@^15.6.2, prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+react-dom@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
+ integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
+ dependencies:
+ loose-envify "^1.1.0"
+ scheduler "^0.23.0"
+
+react-hook-form@^7.43.9:
+ version "7.43.9"
+ resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.43.9.tgz#84b56ac2f38f8e946c6032ccb760e13a1037c66d"
+ integrity sha512-AUDN3Pz2NSeoxQ7Hs6OhQhDr6gtF9YRuutGDwPQqhSUAHJSgGl2VeY3qN19MG0SucpjgDiuMJ4iC5T5uB+eaNQ==
+
+react-is@^16.13.1, react-is@^16.7.0:
+ version "16.13.1"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+react-is@^18.0.0, react-is@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz"
+ integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+
+react-redux@^8.0.4:
+ version "8.0.4"
+ resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.0.4.tgz"
+ integrity sha512-yMfQ7mX6bWuicz2fids6cR1YT59VTuT8MKyyE310wJQlINKENCeT1UcPdEiX6znI5tF8zXyJ/VYvDgeGuaaNwQ==
+ dependencies:
+ "@babel/runtime" "^7.12.1"
+ "@types/hoist-non-react-statics" "^3.3.1"
+ "@types/use-sync-external-store" "^0.0.3"
+ hoist-non-react-statics "^3.3.2"
+ react-is "^18.0.0"
+ use-sync-external-store "^1.0.0"
+
+react-refresh@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz"
+ integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
+
+react-router-dom@^6.4.3:
+ version "6.4.3"
+ resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.3.tgz"
+ integrity sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ==
+ dependencies:
+ "@remix-run/router" "1.0.3"
+ react-router "6.4.3"
+
+react-router@6.4.3:
+ version "6.4.3"
+ resolved "https://registry.npmjs.org/react-router/-/react-router-6.4.3.tgz"
+ integrity sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA==
+ dependencies:
+ "@remix-run/router" "1.0.3"
+
+react-transition-group@^4.4.5:
+ version "4.4.5"
+ resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
+ integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ dom-helpers "^5.0.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+
+react@^18.2.0:
+ version "18.2.0"
+ resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
+ integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+ dependencies:
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
+
+redux-thunk@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz"
+ integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==
+
+redux@^4.1.2:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz"
+ integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+
+regenerator-runtime@^0.13.10:
+ version "0.13.10"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz"
+ integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==
+
+regexp.prototype.flags@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz"
+ integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ functions-have-names "^1.2.2"
+
+reselect@^4.1.5:
+ version "4.1.6"
+ resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz"
+ integrity sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==
+
+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==
+
+resolve@^1.19.0:
+ version "1.22.1"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^3.20.2:
+ version "3.21.0"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz"
+ integrity sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+safe-buffer@^5.0.1, safe-buffer@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+scheduler@^0.23.0:
+ version "0.23.0"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz"
+ integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+ dependencies:
+ loose-envify "^1.1.0"
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.8:
+ version "7.5.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec"
+ integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==
+ dependencies:
+ lru-cache "^6.0.0"
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
+stylis@4.1.3:
+ version "4.1.3"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz"
+ integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+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"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+typescript@^4.4.2:
+ version "4.8.4"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz"
+ integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
+
+update-browserslist-db@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz"
+ integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+use-sync-external-store@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz"
+ integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
+
+vite@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.1.tgz#9badb1377f995632cdcf05f32103414db6fbb95a"
+ integrity sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==
+ dependencies:
+ esbuild "^0.17.5"
+ postcss "^8.4.21"
+ rollup "^3.20.2"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+web-vitals@^2.1.0:
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz"
+ integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-collection@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz"
+ integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+ dependencies:
+ is-map "^2.0.1"
+ is-set "^2.0.1"
+ is-weakmap "^2.0.1"
+ is-weakset "^2.0.1"
+
+which-typed-array@^1.1.8:
+ version "1.1.9"
+ resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz"
+ integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+ is-typed-array "^1.1.10"
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==