diff --git a/.woodpecker/.woodpecker.yml b/.woodpecker/.woodpecker.yml index 94ea84d..d37e70f 100644 --- a/.woodpecker/.woodpecker.yml +++ b/.woodpecker/.woodpecker.yml @@ -5,16 +5,135 @@ steps: checkout: image: debian:latest environment: - FORGEJO_TOKEN: - from_secret: forgejo_token + GONETS: + from_secret: GONETS commands: # ПОДГОТОВКА ГИТА И КЛОНИРОВАНИЕ GONETS - apt update - apt install -y git git-lfs - git lfs install - - git config --global user.email "s.galanskiy@gossys.dev" - - git config --global user.name "s.galanskiy" - - touch file - - git add . - - git commit -m "commit" - - git push https://$FORGEJO_TOKEN@dev.gossys.dev/s.galanskiy/gonets.git \ No newline at end of file + + # УСТАНОВКА НЕОБХОДИМЫХ ЗАВИСИМОСТЕЙ НА СИСТЕМЕ + - apt update + - apt install -y python3 curl findutils grep sed openssh-server tree libnss3 libnss3-dev libnspr4 libnspr4-dev libasound2 libasound2-dev python3.11-venv python3-pip python3-poetry nodejs npm debhelper devscripts build-essential fakeroot dh-make dpkg-dev cmake libgirepository1.0-dev gobject-introspection libcairo2-dev pkg-config python3-dev libdbus-1-dev + - python3 --version + - node -v + - npm -v + + # ПОДГОТОВКА СПИСКА PYTHON ЗАВИСИМОСТЕЙ GONETS + - rm -rf /usr/lib/python3.11/EXTERNALLY-MANAGED + - rm -rf /root/.local/share/pypoetry + - rm -rf /root/.poetry + - rm -rf /usr/bin/poetry + - pip install pipx + - pipx ensurepath + - pipx install poetry + - echo 'export PATH="$HOME/.local/bin:$PATH"' >> /root/.bashrc + - . /root/.bashrc + - poetry --version + - cd SRV + - poetry env activate + - poetry add poetry-plugin-export + - poetry install + - poetry self update + - rm -f requirements.txt + - poetry run poetry export -f requirements.txt --output requirements.txt --without-hashes + + # ПОДГОТОВКА И СБОРКА FRONTEND ЧАСТИ GONETS + - pwd + - cd .. + - pwd + - cd FRONT/DEV + - pwd + - npm install + - npm run package + - cd dist/gonets-linux-x64/resources/app + - pwd + - npm run build + - sed -i 's#href="/assets/#href="./assets/#g' dist/index.html + - sed -i 's#src="/assets/#src="./assets/#g' dist/index.html + - cd ../../../../.. + - pwd + - rm -rf BUILD/* + - cp -r DEV/dist/gonets-linux-x64/* BUILD/ + - rm -rf DEV + + # ИНИЦИАЛИЗАЦИЯ DEBIAN КОНФИГУРАЦИЙ ДЛЯ СБОРКИ + - cd .. + - pwd + - cd .. + - pwd + - mv gonets gonets-0.1 + - cd gonets-0.1 + - pwd + - ls + - DEBEMAIL="devteam@gossys.dev" DEBFULLNAME="GOSSYS LLC" dh_make --single -y --createorig + - cd debian/ + - rm -f *.ex + - rm -f README.* + + # КЛОНИРОВАНИЕ НЕОБХОДИМЫХ ШАБЛОНОВ КОНФИГОВ ДЕБИАНА ДЛЯ СБОРКИ + - mkdir -p /woodpecker/src/dev.gossys.dev/s.galanskiy/templates + - git clone https://s.galanskiy:${GONETS}@dev.gossys.dev/s.galanskiy/gonets-debian-template.git /woodpecker/src/dev.gossys.dev/s.galanskiy/templates + - mv /woodpecker/src/dev.gossys.dev/s.galanskiy/templates/changelog /woodpecker/src/dev.gossys.dev/s.galanskiy/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/s.galanskiy/templates/control /woodpecker/src/dev.gossys.dev/s.galanskiy/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/s.galanskiy/templates/copyright /woodpecker/src/dev.gossys.dev/s.galanskiy/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/s.galanskiy/templates/install /woodpecker/src/dev.gossys.dev/s.galanskiy/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/s.galanskiy/templates/postinst /woodpecker/src/dev.gossys.dev/s.galanskiy/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/s.galanskiy/templates/postrm /woodpecker/src/dev.gossys.dev/s.galanskiy/gonets-0.1/debian/ + - mv /woodpecker/src/dev.gossys.dev/s.galanskiy/templates/rules /woodpecker/src/dev.gossys.dev/s.galanskiy/gonets-0.1/debian/ + + # СБОРКА ДЕБИАН ПАКЕТА + - cd .. + - pwd + - dpkg-buildpackage -us -uc -b + + # ИЗВЛЕЧЕНИЕ ВЕРСИИ ПАКЕТА ДЛЯ КОММИТА + - VERSION=$(dpkg-parsechangelog -l./debian/changelog --show-field Version) + - echo "VERSION=$VERSION" > version.env + + # КОММИТ И ТЕГ НА ВЕТКУ DEVELOP + - . ./version.env + - git config user.name "s.galanskiy" + - git config user.email "s.galanskiy@gossys.dev" + - git fetch --all --prune + - git branch -r + - git checkout -b "release/$VERSION" + - git commit -am "Релиз $VERSION" + - git tag -f "v$VERSION" + - git push "https://s.galanskiy:b4785198d18200dfed812dc4299575f736255bd7@dev.gossys.dev/s.galanskiy/gonets.git" "release/$VERSION" + - git push -f https://s.galanskiy:b4785198d18200dfed812dc4299575f736255bd7@dev.gossys.dev/s.galanskiy/gonets.git "v$VERSION" + + # СОЗДАНИЕ И ЗАГРУЗКА РЕЛИЗА ЧЕРЕЗ API + - | + VERSION=$(dpkg-parsechangelog -l./debian/changelog --show-field Version) + echo "VERSION=$VERSION" > version.env + + # Задать переменные + . ./version.env + TAG="v$VERSION" + + DEB_PATH=$(find .. -maxdepth 1 -type f -name "gonets_*_amd64.deb" | head -n 1) + + if [ ! -f "$DEB_PATH" ]; then + echo "❌ .deb файл не найден по пути: $DEB_PATH" + exit 1 + fi + + RELEASE_JSON=$(curl -s -X POST "https://dev.gossys.dev/api/v1/repos/s.galanskiy/gonets/releases" \ + -H "Authorization: token b4785198d18200dfed812dc4299575f736255bd7" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\": \"$TAG\", \"name\": \"Релиз $TAG\", \"body\": \"Сборка .deb пакета для версии $TAG\", \"draft\": false, \"prerelease\": true}") + + RELEASE_ID=$(echo "$RELEASE_JSON" | grep '"id":' | head -n1 | sed 's/[^0-9]*\([0-9]*\).*/\1/') + + if [ -z "$RELEASE_ID" ]; then + echo "❌ Не удалось получить ID релиза из ответа:" + echo "$RELEASE_JSON" + exit 1 + fi + + curl -s -X POST \ + -H "Authorization: token b4785198d18200dfed812dc4299575f736255bd7" \ + -F "attachment=@$DEB_PATH" \ + "https://dev.gossys.dev/api/v1/repos/s.galanskiy/gonets/releases/$RELEASE_ID/assets" || echo "❌ Ошибка загрузки файла" \ No newline at end of file diff --git a/FRONT/BUILD/index.html b/FRONT/BUILD/index.html deleted file mode 100644 index 8f4d4d1..0000000 --- a/FRONT/BUILD/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - GoNets - - - - - -
- - \ No newline at end of file diff --git a/FRONT/BUILD/resources/app/src/api/request.ts b/FRONT/BUILD/resources/app/src/api/request.ts index 27dafd1..99f1f22 100644 --- a/FRONT/BUILD/resources/app/src/api/request.ts +++ b/FRONT/BUILD/resources/app/src/api/request.ts @@ -1,13 +1,13 @@ import axios, { AxiosResponse } from "axios"; const axiosWithoutCredentials = axios.create({ - baseURL: `https://localhost:8001`, + baseURL: `http://localhost:8001`, }) export class NetworkService { static createAxiosInstance(ipAddress: string) { return axios.create({ - baseURL: `https://${ipAddress}:8001`, + baseURL: `http://${ipAddress}:8001`, }); } diff --git a/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx b/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx index cfed6c4..0345346 100644 --- a/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx +++ b/FRONT/BUILD/resources/app/src/components/UI/Dropdown/DeviceCard.tsx @@ -100,7 +100,7 @@ const DeviceCard: React.FC = ({ device, status }) => { - {device.hostname || 'Неизвестно'} + {device.hostname || device.ip} diff --git a/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx b/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx index e1b8c6f..8657a17 100644 --- a/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx +++ b/FRONT/BUILD/resources/app/src/components/UI/tables/TableScanner.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useState} from 'react'; import { DeviceUser } from '../../../store/useDeviceStore'; interface TableScannerProps { @@ -9,18 +9,19 @@ import {IconComponent} from "../../../const/buttons/icons"; import {buttonNames} from "../../../const/buttons/names"; import {ModalMap} from "../../modalwindows/windowsType"; import {useModalContext} from "../../../store"; +import Pagination from "../Pagination"; const TableContainer = styled.div` width: 100%; - box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08); - background: ${({ theme }) => theme.primary}; margin: 24px 0; `; const StyledTable = styled.table` - width: 100%; - border-collapse: separate; - border-spacing: 0; + width: 100%; + border-collapse: separate; + border-spacing: 0; + box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08); + background: ${({ theme }) => theme.primary}; `; const TableHeaderCell = styled.th<{ sortable?: boolean }>` @@ -28,7 +29,7 @@ const TableHeaderCell = styled.th<{ sortable?: boolean }>` text-align: left; font-weight: 600; font-size: 14px; - color: ${({ theme }) => theme.textSecondary}; + color: ${({ theme }) => theme.textColor}; background: ${({ theme }) => theme.primary}; border-bottom: 1px solid ${({ theme }) => theme.borderColor}; transition: all 0.2s ease; @@ -47,6 +48,11 @@ const TableCell = styled.td` color: ${({ theme }) => theme.text}; border-bottom: 1px solid ${({ theme }) => theme.borderColor}; transition: all 0.2s ease; + button{ + background-color: transparent; + border: none; + cursor: pointer; + } `; const StatusBadge = styled.span<{ status:string }>` @@ -68,7 +74,23 @@ const TableScanner = ({devices}:TableScannerProps) => { }); }; - return ( + // Пагинация + const [currentPage, setCurrentPage] = useState(1); + const [devicesPerPage] = useState(10); + + const indexOfLastDevice = currentPage * devicesPerPage; + const indexOfFirstDevice = indexOfLastDevice - devicesPerPage; + const currentDevices = devices.slice(indexOfFirstDevice, indexOfLastDevice); + const totalPages = Math.ceil(devices.length / devicesPerPage); + + const handlePrevPage = () => { + if(currentPage > 1) setCurrentPage(currentPage - 1); + } + const handleNextPage = () => { + if(currentPage < totalPages) setCurrentPage(currentPage + 1); + } + + return ( @@ -84,24 +106,30 @@ const TableScanner = ({devices}:TableScannerProps) => { - {devices.map((item, i) => ( + {currentDevices.map((item, i) => ( - {item.hostname || 'Неизвестен'} + {item.hostname || item.ip} {item.vendor} {item.ip} {item.open_ports.join(', ') || '-'} {item.last_seen} {item.note || '-'} - openModalNote(e, item)}> + ))} + ); }; diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/about.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/about.tsx index 57207b9..59a4c39 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/about.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/about.tsx @@ -2,8 +2,10 @@ import { MainButton } from "../../../UI/buttons/mainButton" import { workSpaceNames } from "../../../../const/workspace/names" import { useWorkSpaceStore } from "../../../../store" -import styled from "styled-components" +import styled, {useTheme} from "styled-components" import ThemeButton from "../../../UI/buttons/toggletheme" +import {buttonNames} from "../../../../const/buttons/names"; +import {IconComponent} from "../../../../const/buttons/icons"; type Props = { from: 'reg' | 'helloWindow' | 'workSpace' @@ -29,23 +31,41 @@ const Content = styled.div` justify-content: space-between; height: 100%; box-sizing: border-box; - padding: 25px 50px; - background: ${(props => props.theme.secondary)}; + padding: 40px 50px; + background: ${(props => props.theme.primary)}; border-radius: 18px; + position: relative; ` const Listing = styled.div` display: flex; flex-direction: column; - gap: 15px; - + background-color: ${(props => props.theme.secondary)}; + border-radius: 10px; + padding: 24px 20px; + p{ + font-weight: bold; + font-size: 24px; + } ` -const List = styled.div` +const List = styled.ul` display: flex; flex-direction: column; - gap: 15px; - margin-left: 10px; + margin: 10px 0; + padding: 0; + list-style-type: none; + font-size: 18px; + gap: 4px; + & li:before { + color: ${(props => props.theme.accent)}; + content: "•"; + font-size: 28px; + width: .8em; + display: inline-block; + position: relative; + top: 2px; + } ` const Title = styled.div` @@ -55,43 +75,55 @@ const Title = styled.div` const SubTitle = styled.div` display: flex; flex-direction: column; - gap: 10px; - + gap: 24px; + background-color:rgba(255, 248, 225, 0.6); + border-left: #ff9800 solid 4px; + border-radius: 0 8px 8px 0; + padding: 20px 12px; + + a{ + text-decoration: none; + color: ${(props => props.theme.errorColor)}; + font-weight: 500; + font-size: 18px; + width: max-content; + } p{ font-size: 18px; + color: ${(props=>props.theme.textColor)}; + } + .icon{ + width: 32px; + height: 32px; + fill: #ff9800; } - ` const Links = styled.div` display: flex; - flex-direction: column; + justify-content: start; gap: 20px; ` -const LinkColumn = styled.div` - display: flex; - flex-direction: column; - gap: 10px; -` - - -const LinkBlock = styled.div` - display: flex; - gap: 5px; +const LinkBlock = styled.a` + text-decoration: none; + color: ${(props => props.theme.accent)};; ` const Copyright = styled.div` width: 100%; - text-align: center; - margin-top: 50px; + text-align: start; + color: ${(props => props.theme.offlineColor)}; ` const ButtonContainer = styled.div` + position: absolute; + top: 12px; + right: 14px; +` +const AboutLine = styled.hr` + border: ${(props => props.theme.hoverBtn)} 1px solid; width: 100%; - display: flex; - justifi-content: flex-start; - align-items: center; ` const MainTitle = styled.div` @@ -99,24 +131,33 @@ const MainTitle = styled.div` display: flex; gap: 15px; align-items: center; - justify-content: center; - padding-top: 50px; + justify-content: space-between; + padding-top: 10px; box-sizing: border-box; img{ - width: 40px; - height: 40px; + width: 50px; + height: 50px; + } + .version{ + text-wrap: nowrap; + background-color: ${(props => props.theme.hoverBtn)}; + color: ${(props => props.theme.borderColor)}; + border-radius: 20px; + font-size: 18px; + padding: 10px 18px; + line-height: 1; + } + .title{ + display: flex; + justify-content: center; + align-items: center; + gap: 24px; } -` -const Text = styled.div` - display: flex; - flex-direction: column; - gap: 30px; ` export default function About({ from, onBack }: Props) { const { setWorkModule } = useWorkSpaceStore() - const getBackHandler = () => { switch (from) { case 'reg': @@ -138,68 +179,63 @@ export default function About({ from, onBack }: Props) { - -

О приложении

- +
+ +

О приложении

+
+

v 0.0.3

+ - + + <p>ГоNets — минимально работоспособный кроссплатформенный продукт (MVP) для демонстрации нашего подхода к управлению настройками ПК в корпоративной среде.</p> + - - <p>Приложение ГоNets является минимально работоспособным кроссплатформенным продуктом (MVP) для демонстрации нашего подхода к управлению настройками ПК в корпоративной среде.</p> - + +

Возможности:

+ +
  • Визуализация активных сетевых ресурсов
  • +
  • Настройка параметров локальных и удалённых сетевых ресурсов
  • +
  • Управление взаимодействием ресурсов с Клиентом ГoNets
  • +
    +
    + + + + +

    Программное обеспечение исключительно для ознакомления и домашнего использования.

    + Перейти на ГоNets-PRO +
    - -

    Данное приложение умеет:

    - -

    - Отображать в графическом виде активные сетевые ресурсы

    -

    - Настраивать сетевые параметры локального и удаленных сетевых ресурсов

    -

    - Отображать и изменять взаимодействие сетевых ресурсов с установленным Клиентом ГоNets

    -
    -
    + + + Домашняя страницa + - -

    Программное обеспечение исключительно для ознакомления и домашнего использования.

    -

    Для коммерческого использования приобретите версию ГоNets-PRO (Подробная информация на странице продукта)

    -
    + + Документация + - - -

    Ссылка на домашнюю страницу:

    - https://gossys.dev/pages/projects/gonets -
    - - -

    Инструкции и информация:

    - https://wiki.gossys.dev/ru/gonets -
    - - -

    Распространяется под лицензией GosysPUB текущей версии.

    - -

    Полный текст актуальной лицензии:

    - https://wiki.gossys.dev/ru/lic/GosysPUB -
    -
    - -
    - - -

    Разработано и поддерживается ООО «Гибридные Офисные Системы» 2024-2025 г. Все права защищены.

    -
    - -
    + + Лицензия + + + + Разработано и поддерживается ООО «Гибридные Офисные Системы» 2024-2025 г. Все права защищены. + {showBackButton && backHandler && ( - + )} {from == 'reg' && diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx index 1075a09..52f146e 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import styled from 'styled-components'; import DeviceCard from "../../../../../UI/Dropdown/DeviceCard"; import {DeviceUser} from "../../../../../../store/useDeviceStore"; @@ -28,10 +28,15 @@ const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps const activeDevices = devices.filter(device => device.status === 'online'); const inactiveDevices = devices.filter(device => device.status !== 'online'); + // Пагинация + const [currentPage, setCurrentPage] = useState(1); + const [devicesPerPage] = useState(10); + + return ( <> - {devices.length > 0 ? 'Обновить список' : 'Сканировать сеть'} + {devices.length > 0 ? 'Обновить список' : 'Сканировать узлы'} {devices.length > 0 ? ( @@ -42,7 +47,7 @@ const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps }}> {/* Колонка активных устройств */}
    -

    Активные устройства ({activeDevices.length})

    +

    Активные узлы ({activeDevices.length})

    {activeDevices.map((device, index) => ( {/* Колонка неактивных устройств */}
    -

    Неактивные устройства ({inactiveDevices.length})

    +

    Неактивные узлы ({inactiveDevices.length})

    {inactiveDevices.map((device, index) => (
    ) : scanInitiated ? ( -

    Устройства не найдены

    +

    Узлы не найдены

    ) : null} ); diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx index ebe71a9..77e064c 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx @@ -30,13 +30,13 @@ const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps return ( <> - {devices.length > 0 ? 'Обновить список' : 'Сканировать сеть'} + {devices.length > 0 ? 'Обновить список' : 'Сканировать узлы'} {devices.length > 0 ? ( ) : scanInitiated ? ( -

    Устройства не найдены

    +

    Узлы не найдены

    ) : null} ); diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx index cb816ca..19ca497 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx @@ -77,7 +77,7 @@ const UserLocate = styled.div<{ loading: boolean, scanInitiated: boolean }>` span { position: absolute; display: inline-block; - background: ${(props) => props.theme.accent}; + background: ${(props) => props.theme.scannerColor}; top: 50%; left: 50%; transform: translate(-50%, -50%); @@ -163,7 +163,7 @@ export default function UserScanner() { return ( - {(!scanInitiated || loading) && (Сканирование пользователей в сети)} + {(!scanInitiated || loading) && (Сканирование узлов подсети)} @@ -177,7 +177,7 @@ export default function UserScanner() { {loading ? ( - Сканирование сети + Сканирование узлов ) : selectedView.value == 1 ? ( diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx index b24e367..25000eb 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/WifiScanner.tsx @@ -136,7 +136,8 @@ const ScanBtn = styled.button<{scanInitiated: boolean}>` ` export function WifiScanner() { - const { ipAddress } = useIpStore(); + //const { ipAddress } = useIpStore(); + const ipAddress = '192.168.1.147' const [loading, setLoading] = useState(false); const [scanInitiated, setScanInitiated] = useState(false); const { wifiNetworks, setWifiNetworks } = useNetworkStore(); @@ -161,17 +162,19 @@ export function WifiScanner() { return ( - Сканирование Wi-Fi сети + Сканирование точек доступа Wi-Fi сети - {wifiNetworks.map((network) => ( + {wifiNetworks.map((network, index) => ( ))} @@ -186,11 +189,11 @@ export function WifiScanner() { {loading ? ( - Сканирование сети + Сканирование точек доступа ) : ( 0 }> - {wifiNetworks.length > 0 ? 'Обновить список' : 'Сканировать сеть'} + {wifiNetworks.length > 0 ? 'Обновить список' : 'Сканировать точки доступа'} )} diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/modules/WifiDot.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/modules/WifiDot.tsx index eccd601..54fee2b 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/modules/WifiDot.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/appModules/wifiScanner/modules/WifiDot.tsx @@ -31,43 +31,45 @@ const Dot = styled.div<{ top: string; left: string }>` } `; -const WifiDot = ({ network, onSelect }: { network: WifiNetworkScanner, onSelect: (n: WifiNetworkScanner) => void }) => { - const getPositionInRing = (bssid: string, ringSize: number) => { - const hash = bssid.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0); - const randomAngle = (hash % 360) * (Math.PI / 180); - const innerRadius = ringSize * 0.4; - const outerRadius = ringSize * 0.5; - const randomValue = (hash % 1000) / 1000; - const randomRadius = Math.sqrt(innerRadius * innerRadius + randomValue * (outerRadius * outerRadius - innerRadius * innerRadius)); +const getPositionInRing = (index: number, total: number, ringSize: number) => { + const angle = (index * (2 * Math.PI / total)) + (Math.PI / total * (index % 2)); + const innerRadius = ringSize * 0.4; + const outerRadius = ringSize * 0.5; + const radius = innerRadius + (outerRadius - innerRadius) * (0.3 + 0.7 * (index % 10) / 10); - return { - x: Math.cos(randomAngle) * randomRadius, - y: Math.sin(randomAngle) * randomRadius - }; + return { + x: Math.cos(angle) * radius, + y: Math.sin(angle) * radius }; +}; - const getPosition = (signal: number, bssid: string) => { +const WifiDot = ({ network, index, total, onSelect }: { + network: WifiNetworkScanner, + index: number, + total: number, + onSelect: (n: WifiNetworkScanner) => void +}) => { + const getPosition = (signal: number, index: number, total: number) => { let strength: 1 | 2 | 3; if (signal >= -50) { strength = 3; } else if (signal >= -70) { strength = 2; - } else if (signal >= -90) { - strength = 1; } else { strength = 1; } + const ringSizes = { 1: 550, 2: 400, 3: 250 }; const ringSize = ringSizes[strength]; - const offset = getPositionInRing(bssid, ringSize); + const offset = getPositionInRing(index, total, ringSize); return { - top: `calc(50% - ${offset.y}px)`, - left: `calc(50% - ${offset.x}px)` + top: `calc(50% + ${offset.y}px)`, + left: `calc(50% + ${offset.x}px)` }; }; - const position = getPosition(network.signal, network.bssid); + const position = getPosition(network.signal, index, total); return ( onSelect(network)}> diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx index 1996ddd..d0325ef 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/modules/workModules/networkInterfaces.tsx @@ -76,7 +76,7 @@ export const NetworkInterfaces = ({ startConnection, ws }: Props) => { setHasInited(false) initializationAttempt.current = 0; - const newSocket = new WebSocket(`wss://${ws}:8001/api/v1`); + const newSocket = new WebSocket(`ws://${ws}:8001/api/v1`); let connectionTimeout; setSocket(newSocket); diff --git a/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx b/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx index 8b919f4..dd5ca2b 100644 --- a/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx +++ b/FRONT/BUILD/resources/app/src/components/workSpace/sideBar/toolSpace/devicesBar.tsx @@ -115,7 +115,7 @@ export const DevicesBar = () => { const checkWebSocketAvailability = async (ip: string): Promise => { return new Promise((resolve) => { - const testSocket = new WebSocket(`wss://${ip}:8001/api/v1`); + const testSocket = new WebSocket(`ws://${ip}:8001/api/v1`); const timeout = setTimeout(() => { testSocket.close(); resolve(false); diff --git a/FRONT/BUILD/resources/app/src/const/buttons/icons.tsx b/FRONT/BUILD/resources/app/src/const/buttons/icons.tsx index 301b1d6..9cab629 100644 --- a/FRONT/BUILD/resources/app/src/const/buttons/icons.tsx +++ b/FRONT/BUILD/resources/app/src/const/buttons/icons.tsx @@ -9,6 +9,7 @@ import settings from '@iconify/icons-ic/baseline-settings'; import info from '@iconify/icons-ic/baseline-info'; import arrowDown from '@iconify/icons-ic/baseline-keyboard-arrow-down'; import arrowRight from '@iconify/icons-ic/baseline-keyboard-arrow-right'; +import arrowLeft from '@iconify/icons-ic/baseline-keyboard-arrow-left'; import edit from '@iconify/icons-ic/baseline-edit'; import checkCircle from '@iconify/icons-ic/round-check-circle'; import cancel from '@iconify/icons-ic/baseline-cancel'; @@ -37,6 +38,7 @@ export const ICONS = { [buttonNames[14]]: userSearch, [buttonNames[15]]: wifiFind, [buttonNames[16]]: noteEdit, + [buttonNames[17]]: arrowLeft, } as const; type IconName = keyof typeof ICONS; diff --git a/FRONT/BUILD/resources/app/src/const/buttons/names.ts b/FRONT/BUILD/resources/app/src/const/buttons/names.ts index 54c1d40..052321e 100644 --- a/FRONT/BUILD/resources/app/src/const/buttons/names.ts +++ b/FRONT/BUILD/resources/app/src/const/buttons/names.ts @@ -16,5 +16,6 @@ export const buttonNames: names ={ 13: 'noAdmin', 14: 'userSearch', 15: 'wifiFind', - 16: 'noteEdit' + 16: 'noteEdit', + 17: 'arrowLeft', } \ No newline at end of file diff --git a/FRONT/BUILD/resources/app/src/const/menus/sideBar/icons.tsx b/FRONT/BUILD/resources/app/src/const/menus/sideBar/icons.tsx index 1d80d6b..b5560ce 100644 --- a/FRONT/BUILD/resources/app/src/const/menus/sideBar/icons.tsx +++ b/FRONT/BUILD/resources/app/src/const/menus/sideBar/icons.tsx @@ -3,7 +3,7 @@ import { toolBarNames } from "./names" import { useTheme } from "styled-components" import { Icon } from '@iconify/react'; -import desktop from '@iconify/icons-ic/round-desktop-windows'; +import desktop from '@iconify/icons-ic/baseline-menu'; export const ICONS = { [toolBarNames[1]]: desktop, diff --git a/FRONT/BUILD/resources/app/src/const/theme/theme.ts b/FRONT/BUILD/resources/app/src/const/theme/theme.ts index aab3658..dbf1cb3 100644 --- a/FRONT/BUILD/resources/app/src/const/theme/theme.ts +++ b/FRONT/BUILD/resources/app/src/const/theme/theme.ts @@ -24,7 +24,7 @@ export const dark = { background: '#3A3A3A', textColor: '#FFFFFF', borderColor: '#b6b6b6', - scannerColor: '#0E9C9D', + scannerColor: '#00E5FF', offlineColor: '#656565', hoverBtn: '#4a4a4a', }; \ No newline at end of file diff --git a/FRONT/DEV/.gitignore b/FRONT/DEV/.gitignore deleted file mode 100644 index b2d59d1..0000000 --- a/FRONT/DEV/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules -/dist \ No newline at end of file diff --git a/FRONT/DEV/assets/icon.png b/FRONT/DEV/assets/icon.png deleted file mode 100644 index b39bc87..0000000 Binary files a/FRONT/DEV/assets/icon.png and /dev/null differ diff --git a/FRONT/DEV/eslint.config.js b/FRONT/DEV/eslint.config.js deleted file mode 100644 index 092408a..0000000 --- a/FRONT/DEV/eslint.config.js +++ /dev/null @@ -1,28 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' - -export default tseslint.config( - { ignores: ['dist'] }, - { - extends: [js.configs.recommended, ...tseslint.configs.recommended], - files: ['**/*.{ts,tsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - plugins: { - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...reactHooks.configs.recommended.rules, - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - }, -) diff --git a/FRONT/DEV/index.html b/FRONT/DEV/index.html deleted file mode 100644 index 7e0fab5..0000000 --- a/FRONT/DEV/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - GoNets - - - -
    - - - \ No newline at end of file diff --git a/FRONT/DEV/index.tsx b/FRONT/DEV/index.tsx deleted file mode 100644 index eeb0635..0000000 --- a/FRONT/DEV/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react'; -import { createRoot } from 'react-dom/client'; -import { HashRouter } from 'react-router-dom'; -import { useIpStore } from './src/store'; -import { useEffect } from 'react'; -import {useCheckAdmin} from './src/utils/checkAdmin.ts' - -import { - ModalProvider, - useModalContext, - ThemeProvider -} from './src/store'; - -import WindowComponent from './src/components/modalwindows/modalWindow.tsx'; -import Router from './src/router.tsx'; - -const MainComponent = () => { - - const checkAdmin = useCheckAdmin() - const {ipAddress} = useIpStore() - - useEffect(() => { - const checkAdminStatus = async () => { - await checkAdmin() - } - checkAdminStatus() - }, [ipAddress]) - - - const { isOpen, modalType, modalData } = useModalContext(); - return ( - <> - - - - ); -}; - -const container = document.getElementById('root'); -if (!container) { - throw new Error('Root element with id "root" not found'); -} -const root = createRoot(container); -root.render( - - - - - - - -); \ No newline at end of file diff --git a/FRONT/DEV/main.js b/FRONT/DEV/main.js deleted file mode 100644 index df09e91..0000000 --- a/FRONT/DEV/main.js +++ /dev/null @@ -1,61 +0,0 @@ -const { app, BrowserWindow, session, Menu, ipcMain } = require('electron'); -const path = require('path'); - -ipcMain.on('quit-app', () => { - app.quit(); -}); - -app.commandLine.appendSwitch('ignore-certificate-errors'); - -function createWindow() { - const win = new BrowserWindow({ - icon: path.join(__dirname, 'assets/icon.png'), - webPreferences: { - preload: path.join(__dirname, 'preload.js'), - contextIsolation: true, - }, - show: false - }); - - win.maximize(); - win.show(); - - if (process.env.NODE_ENV === 'development') { - win.loadURL('https://localhost:8001'); - win.webContents.openDevTools(); - } else { - win.loadFile(path.join(__dirname, 'dist/index.html')); - } -} - -app.whenReady().then(() => { - session.defaultSession.setCertificateVerifyProc((request, callback) => { - // Разрешаем для: - // 1. localhost - // 2. Всех IP в локальной сети (192.168.x.x, 10.x.x.x и т.д.) - // 3. Конкретного домена (если есть) - if ( - request.hostname === 'localhost' || - request.hostname === '127.0.0.1' || - request.hostname === '0.0.0.0' || - /^(192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)/.test(request.hostname) - ) { - return callback(0); - } - callback(-2); - }); - Menu.setApplicationMenu(null); - createWindow(); -}); - -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('activate', () => { - if (BrowserWindow.getAllWindows().length === 0) { - createWindow(); - } -}); \ No newline at end of file diff --git a/FRONT/DEV/package-lock.json b/FRONT/DEV/package-lock.json deleted file mode 100644 index d77a3e1..0000000 --- a/FRONT/DEV/package-lock.json +++ /dev/null @@ -1,4845 +0,0 @@ -{ - "name": "gonets", - "version": "0.0.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "gonets", - "version": "0.0.2", - "dependencies": { - "@iconify/icons-ic": "^1.2.13", - "@iconify/icons-ph": "^1.2.5", - "@iconify/react": "^5.2.0", - "@reduxjs/toolkit": "^2.6.0", - "@xyflow/react": "^12.3.5", - "axios": "^1.7.9", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-flow-renderer": "^10.3.17", - "react-redux": "^9.2.0", - "react-router-dom": "^7.0.2", - "styled-components": "^6.1.13", - "zustand": "^5.0.3" - }, - "devDependencies": { - "@iconify-json/ic": "^1.2.2", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@vitejs/plugin-basic-ssl": "^2.0.0", - "@vitejs/plugin-react": "^4.4.1", - "electron": "^34.0.2", - "electron-packager": "^17.1.2", - "esbuild-wasm": "^0.17.12", - "typescript": "^4.9.5", - "vite": "^6.3.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.18", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz", - "integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.2.tgz", - "integrity": "sha512-KqVlm9WMWq19lBpCXQoThC/Koaiji2zotUDYwZDaZlZZym+FXY9mQW8wN6sUQ93nkVc42f3TQ1S/XN9S1kjM5Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/universal": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", - "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@iconify-json/ic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@iconify-json/ic/-/ic-1.2.2.tgz", - "integrity": "sha512-QmjwS3lYiOmVWgTCEOTFyGODaR/+689+ajep/VsrCcsUN0Gdle5PmIcibDsdmRyrOsW/E77G41UUijdbjQUofw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/icons-ic": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@iconify/icons-ic/-/icons-ic-1.2.13.tgz", - "integrity": "sha512-TphrhwOvgd7CTmUhz6jgXF+SPnMtvTm03bZsAYbny2kwq4zlkhr9e16YEyPGMvKhjtTqNooA3iZ9Wa+pZ8moXQ==", - "license": "Apache-2.0", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/icons-ph": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@iconify/icons-ph/-/icons-ph-1.2.5.tgz", - "integrity": "sha512-ewrnpL0u3MAP0wLDnXb/39W9W71ObyY8DNig6rYj7NEwcndWWlrGHt1RxEGYE3eqILl/IUcNIQQF1CXZAhwr/w==", - "license": "MIT", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/react": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@iconify/react/-/react-5.2.0.tgz", - "integrity": "sha512-7Sdjrqq3fkkQNks9SY3adGC37NQTHsBJL2PRKlQd455PoDi9s+Es9AUTY+vGLFOYs5yO9w9yCE42pmxCwG26WA==", - "license": "MIT", - "dependencies": { - "@iconify/types": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - }, - "peerDependencies": { - "react": ">=16" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.6.0.tgz", - "integrity": "sha512-mWJCYpewLRyTuuzRSEC/IwIBBkYg2dKtQas8mty5MaV2iXzcmicS3gW554FDeOvLnY3x13NIk8MB1e8wHO7rqQ==", - "license": "MIT", - "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", - "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", - "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", - "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", - "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", - "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", - "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", - "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", - "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", - "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", - "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", - "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", - "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", - "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", - "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", - "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", - "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", - "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", - "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", - "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", - "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.17.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.17.tgz", - "integrity": "sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", - "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resize-observer-browser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz", - "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==", - "license": "MIT" - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.0.0.tgz", - "integrity": "sha512-gc9Tjg8bUxBVSTzeWT3Njc0Cl3PakHFKdNfABnZWiUgbxqmHDEn7uECv3fHVylxoYgNzAcmU7ZrILz+BwSo3sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependencies": { - "vite": "^6.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", - "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@xyflow/react": { - "version": "12.3.5", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.3.5.tgz", - "integrity": "sha512-wAYqpicdrVo1rxCu0X3M9s3YIF45Agqfabw0IBryTGqjWvr2NyfciI8gIP4MB+NKpWWN5kxZ9tiZ9u8lwC7iAg==", - "license": "MIT", - "dependencies": { - "@xyflow/system": "0.0.46", - "classcat": "^5.0.3", - "zustand": "^4.4.0" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@xyflow/react/node_modules/zustand": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.6.tgz", - "integrity": "sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/@xyflow/system": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.46.tgz", - "integrity": "sha512-bmFXvboVdiydIFZmDCjrbBCYgB0d5pYdkcZPWbAxGmhMRUZ+kW3CksYgYxWabrw51rwpWitLEadvLrivG0mVfA==", - "license": "MIT", - "dependencies": { - "@types/d3-drag": "^3.0.7", - "@types/d3-selection": "^3.0.10", - "@types/d3-transition": "^3.0.8", - "@types/d3-zoom": "^3.0.8", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/author-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", - "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001716", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", - "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", - "license": "MIT" - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn-windows-exe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", - "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@malept/cross-spawn-promise": "^1.1.0", - "is-wsl": "^2.2.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, - "node_modules/electron": { - "version": "34.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-34.0.2.tgz", - "integrity": "sha512-u3F+DSUlg9NaGS+9qnYmSRN8VjAnc3LJDDk1ye1uISJnh4gjG76y3681qLowsPMx4obvCP2eBINnmbLo0yT5WA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-packager": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", - "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==", - "deprecated": "Please use @electron/packager moving forward. There is no API change, just a package name change", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@electron/asar": "^3.2.1", - "@electron/get": "^2.0.0", - "@electron/notarize": "^1.2.3", - "@electron/osx-sign": "^1.0.5", - "@electron/universal": "^1.3.2", - "cross-spawn-windows-exe": "^1.2.0", - "debug": "^4.0.1", - "extract-zip": "^2.0.0", - "filenamify": "^4.1.0", - "fs-extra": "^11.1.0", - "galactus": "^1.0.0", - "get-package-info": "^1.0.0", - "junk": "^3.1.0", - "parse-author": "^2.0.0", - "plist": "^3.0.0", - "rcedit": "^3.0.1", - "resolve": "^1.1.6", - "semver": "^7.1.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "electron-packager": "bin/electron-packager.js" - }, - "engines": { - "node": ">= 14.17.5" - }, - "funding": { - "url": "https://github.com/electron/electron-packager?sponsor=1" - } - }, - "node_modules/electron-packager/node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/electron-packager/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-packager/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-packager/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.145", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.145.tgz", - "integrity": "sha512-pZ5EcTWRq/055MvSBgoFEyKf2i4apwfoqJbK/ak2jnFq8oHjZ+vzc3AhRcz37Xn+ZJfL58R666FLJx0YOK9yTw==", - "dev": true, - "license": "ISC" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/esbuild": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.3", - "@esbuild/android-arm": "0.25.3", - "@esbuild/android-arm64": "0.25.3", - "@esbuild/android-x64": "0.25.3", - "@esbuild/darwin-arm64": "0.25.3", - "@esbuild/darwin-x64": "0.25.3", - "@esbuild/freebsd-arm64": "0.25.3", - "@esbuild/freebsd-x64": "0.25.3", - "@esbuild/linux-arm": "0.25.3", - "@esbuild/linux-arm64": "0.25.3", - "@esbuild/linux-ia32": "0.25.3", - "@esbuild/linux-loong64": "0.25.3", - "@esbuild/linux-mips64el": "0.25.3", - "@esbuild/linux-ppc64": "0.25.3", - "@esbuild/linux-riscv64": "0.25.3", - "@esbuild/linux-s390x": "0.25.3", - "@esbuild/linux-x64": "0.25.3", - "@esbuild/netbsd-arm64": "0.25.3", - "@esbuild/netbsd-x64": "0.25.3", - "@esbuild/openbsd-arm64": "0.25.3", - "@esbuild/openbsd-x64": "0.25.3", - "@esbuild/sunos-x64": "0.25.3", - "@esbuild/win32-arm64": "0.25.3", - "@esbuild/win32-ia32": "0.25.3", - "@esbuild/win32-x64": "0.25.3" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz", - "integrity": "sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg==", - "dev": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flora-colossus": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", - "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/flora-colossus/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/flora-colossus/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/flora-colossus/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/galactus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", - "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "flora-colossus": "^2.0.0", - "fs-extra": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/galactus/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/galactus/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/galactus/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/gensync": { - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-package-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", - "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.1.1", - "debug": "^2.2.0", - "lodash.get": "^4.0.0", - "read-pkg-up": "^2.0.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/get-package-info/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/get-package-info/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-author": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", - "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "author-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rcedit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", - "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn-windows-exe": "^1.1.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-flow-renderer": { - "version": "10.3.17", - "resolved": "https://registry.npmjs.org/react-flow-renderer/-/react-flow-renderer-10.3.17.tgz", - "integrity": "sha512-bywiqVErlh5kCDqw3x0an5Ur3mT9j9CwJsDwmhmz4i1IgYM1a0SPqqEhClvjX+s5pU4nHjmVaGXWK96pwsiGcQ==", - "deprecated": "react-flow-renderer has been renamed to reactflow, please use this package from now on https://reactflow.dev/docs/guides/migrate-to-v11/", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.9", - "@types/d3": "^7.4.0", - "@types/resize-observer-browser": "^0.1.7", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^3.7.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "16 || 17 || 18", - "react-dom": "16 || 17 || 18" - } - }, - "node_modules/react-flow-renderer/node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "license": "MIT", - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-redux/node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.2.tgz", - "integrity": "sha512-9Rw8r199klMnlGZ8VAsV/I8WrIF6IyJ90JQUdboupx1cdkgYqwnrYjH+I/nY/7cA1X5zia4mDJqH36npP7sxGQ==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.2.tgz", - "integrity": "sha512-yk1XW8Fj7gK7flpYBXF3yzd2NbX6P7Kxjvs2b5nu1M04rb5pg/Zc4fGdBNTeT4eDYL2bvzWNyKaIMJX/RKHTTg==", - "license": "MIT", - "dependencies": { - "react-router": "7.5.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/rollup": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", - "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.1", - "@rollup/rollup-android-arm64": "4.40.1", - "@rollup/rollup-darwin-arm64": "4.40.1", - "@rollup/rollup-darwin-x64": "4.40.1", - "@rollup/rollup-freebsd-arm64": "4.40.1", - "@rollup/rollup-freebsd-x64": "4.40.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", - "@rollup/rollup-linux-arm-musleabihf": "4.40.1", - "@rollup/rollup-linux-arm64-gnu": "4.40.1", - "@rollup/rollup-linux-arm64-musl": "4.40.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-musl": "4.40.1", - "@rollup/rollup-linux-s390x-gnu": "4.40.1", - "@rollup/rollup-linux-x64-gnu": "4.40.1", - "@rollup/rollup-linux-x64-musl": "4.40.1", - "@rollup/rollup-win32-arm64-msvc": "4.40.1", - "@rollup/rollup-win32-ia32-msvc": "4.40.1", - "@rollup/rollup-win32-x64-msvc": "4.40.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/styled-components": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", - "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", - "license": "MIT", - "dependencies": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", - "css-to-react-native": "3.2.0", - "csstype": "3.1.3", - "postcss": "8.4.38", - "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - } - }, - "node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" - }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vite": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", - "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zustand": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", - "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - } - } -} diff --git a/FRONT/DEV/package.json b/FRONT/DEV/package.json deleted file mode 100644 index 304540a..0000000 --- a/FRONT/DEV/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "gonets", - "version": "0.0.2", - "main": "main.js", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "start": "electron .", - "package": "vite build && electron-packager . --out=dist --overwrite --icon=assets/icon" - }, - "dependencies": { - "@iconify/icons-ic": "^1.2.13", - "@iconify/icons-ph": "^1.2.5", - "@iconify/react": "^5.2.0", - "@reduxjs/toolkit": "^2.6.0", - "@xyflow/react": "^12.3.5", - "axios": "^1.7.9", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-flow-renderer": "^10.3.17", - "react-redux": "^9.2.0", - "react-router-dom": "^7.0.2", - "styled-components": "^6.1.13", - "zustand": "^5.0.3" - }, - "devDependencies": { - "@iconify-json/ic": "^1.2.2", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@vitejs/plugin-basic-ssl": "^2.0.0", - "@vitejs/plugin-react": "^4.4.1", - "electron": "^34.0.2", - "electron-packager": "^17.1.2", - "esbuild-wasm": "^0.17.12", - "typescript": "^4.9.5", - "vite": "^6.3.4" - } -} diff --git a/FRONT/DEV/preload.js b/FRONT/DEV/preload.js deleted file mode 100644 index 3e21ba6..0000000 --- a/FRONT/DEV/preload.js +++ /dev/null @@ -1,19 +0,0 @@ -const { contextBridge, ipcRenderer } = require('electron'); - -contextBridge.exposeInMainWorld('electron', { - send: (channel, data) => { - ipcRenderer.send(channel, data); - }, - on: (channel, func) => { - ipcRenderer.on(channel, (event, ...args) => func(...args)); - }, - quitApp: () => { - ipcRenderer.send('quit-app'); - }, - - onThemeChange: (callback) => { - ipcRenderer.on('theme-update', (event, theme) => { - callback(theme); - }); - } -}); \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/back1.svg b/FRONT/DEV/public/assets/images/back1.svg deleted file mode 100644 index 6c1ae68..0000000 --- a/FRONT/DEV/public/assets/images/back1.svg +++ /dev/null @@ -1,836 +0,0 @@ - - - Created with Pixso. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/bigLogo.svg b/FRONT/DEV/public/assets/images/bigLogo.svg deleted file mode 100644 index fbc2512..0000000 --- a/FRONT/DEV/public/assets/images/bigLogo.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - Created with Pixso. - - - - - - - - - - - - - - - - - diff --git a/FRONT/DEV/public/assets/images/bukvi.svg b/FRONT/DEV/public/assets/images/bukvi.svg deleted file mode 100644 index 88ba39c..0000000 --- a/FRONT/DEV/public/assets/images/bukvi.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/FRONT/DEV/public/assets/images/cancel.svg b/FRONT/DEV/public/assets/images/cancel.svg deleted file mode 100644 index a39ab7f..0000000 --- a/FRONT/DEV/public/assets/images/cancel.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/check.svg b/FRONT/DEV/public/assets/images/check.svg deleted file mode 100644 index a91a6c0..0000000 --- a/FRONT/DEV/public/assets/images/check.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/edit.svg b/FRONT/DEV/public/assets/images/edit.svg deleted file mode 100644 index f3f1b8e..0000000 --- a/FRONT/DEV/public/assets/images/edit.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/ethernet.svg b/FRONT/DEV/public/assets/images/ethernet.svg deleted file mode 100644 index ef4cdcd..0000000 --- a/FRONT/DEV/public/assets/images/ethernet.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/gossys.png b/FRONT/DEV/public/assets/images/gossys.png deleted file mode 100644 index 5b01b0e..0000000 Binary files a/FRONT/DEV/public/assets/images/gossys.png and /dev/null differ diff --git a/FRONT/DEV/public/assets/images/logo.svg b/FRONT/DEV/public/assets/images/logo.svg deleted file mode 100644 index 4f3a4dd..0000000 --- a/FRONT/DEV/public/assets/images/logo.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/FRONT/DEV/public/assets/images/signal.svg b/FRONT/DEV/public/assets/images/signal.svg deleted file mode 100644 index a589c67..0000000 --- a/FRONT/DEV/public/assets/images/signal.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/vite.svg b/FRONT/DEV/public/assets/images/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/FRONT/DEV/public/assets/images/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/FRONT/DEV/public/assets/images/vpn.svg b/FRONT/DEV/public/assets/images/vpn.svg deleted file mode 100644 index 8999c36..0000000 --- a/FRONT/DEV/public/assets/images/vpn.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - diff --git a/FRONT/DEV/public/assets/images/wifi.svg b/FRONT/DEV/public/assets/images/wifi.svg deleted file mode 100644 index dad2dd2..0000000 --- a/FRONT/DEV/public/assets/images/wifi.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/FRONT/DEV/src/api/request.ts b/FRONT/DEV/src/api/request.ts deleted file mode 100644 index 99f1f22..0000000 --- a/FRONT/DEV/src/api/request.ts +++ /dev/null @@ -1,160 +0,0 @@ -import axios, { AxiosResponse } from "axios"; - -const axiosWithoutCredentials = axios.create({ - baseURL: `http://localhost:8001`, -}) - -export class NetworkService { - static createAxiosInstance(ipAddress: string) { - return axios.create({ - baseURL: `http://${ipAddress}:8001`, - }); - } - - static async checkIp(ipAddress: string, data: any): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.post('/ip/check_ip', data); - } catch (error: any) { - return error.response; - } - } - - static async saveIp(ipAddress: string, data: any): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.post('/ip/apply_ip', data); - } catch (error: any) { - return error.response; - } - } - - static async getHostname(): Promise{ - try{ - const response = await axiosWithoutCredentials.get('/network/get_hostname') - return response - } catch (error: any){ - return error.response - } - } - - static async createUser(ipAddress: string, data: any): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.post('/auth/register', data); - } catch (error: any) { - return error.response; - } - } - - static async login(ipAddress: string, data: any): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.post('/auth/login', data); - } catch (error: any) { - return error.response; - } - } - - static async logout(ipAddress: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.get('/auth/logout'); - } catch (error: any) { - return error.response; - } - } - - static async checkServerConf(ipAddress: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.get('/auth/check_json'); - } catch (error: any) { - return error.response; - } - } - - static async whoami(ipAddress: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.get('/auth/me'); - } catch (error: any) { - return error.response; - } - } - - static async scanUser(ipAddress: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.get('/subnet/devices'); - } catch (error: any) { - return error.response; - } - } - - static async scanWifi(ipAddress: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.get('/subnet/wifi'); - } catch (error: any) { - return error.response; - } - } - static async addNote(ipAddress: string, address:string, note: string,type:string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.post(`/subnet/${type}/${address}/note`, { - note: note - }); - } catch (error: any) { - return error.response; - } - } - static async editNote(ipAddress: string, address:string, note: string,type:string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.put(`/subnet/${type}/${address}/note`, { - note: note - }); - } catch (error: any) { - return error.response; - } - } - static async deleteNote(ipAddress: string, address:string, type:string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.delete(`/subnet/${type}/${address}/note`); - } catch (error: any) { - return error.response; - } - } - static async statusNetwork(ipAddress: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.get(`/subnet/wifi/status`); - } catch (error: any) { - return error.response; - } - } - static async connectNetwork(ipAddress: string, password:string, address: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.post(`/subnet/wifi/connect`, { - ssid: address, - password: password, - }); - } catch (error: any) { - return error.response; - } - } - static async disconnectNetwork(ipAddress: string, ssid: string): Promise { - try { - const axiosInstance = this.createAxiosInstance(ipAddress); - return await axiosInstance.post(`/subnet/wifi/disconnect`, { - ssid: ssid, - }); - } catch (error: any) { - return error.response; - } - } -} \ No newline at end of file diff --git a/FRONT/DEV/src/assets/css/flow.css b/FRONT/DEV/src/assets/css/flow.css deleted file mode 100644 index 0a79079..0000000 --- a/FRONT/DEV/src/assets/css/flow.css +++ /dev/null @@ -1,108 +0,0 @@ -.react-flow { - /* Custom Variables */ - --xy-theme-selected: #F57DBD; - --xy-theme-hover: #C5C5C5; - --xy-theme-edge-hover: black; - --xy-theme-color-focus: #E8E8E8; - - /* Built-in Variables see https://reactflow.dev/learn/customization/theming */ - --xy-node-border-default: 1px solid #EDEDED; - - /* --xy-node-boxshadow-default: - 0px 3.54px 4.55px 0px #00000005, - 0px 3.54px 4.55px 0px #0000000D, - 0px 0.51px 1.01px 0px #0000001A; */ - - --xy-node-border-radius-default: 8px; - - --xy-handle-background-color-default: #ffffff; - --xy-handle-border-color-default: #AAAAAA; - - --xy-edge-label-color-default: #505050; -} - -.react-flow.dark { - --xy-node-boxshadow-default: - 0px 3.54px 4.55px 0px rgba(255, 255, 255, 0.05), /* light shadow */ - 0px 3.54px 4.55px 0px rgba(255, 255, 255, 0.13), /* medium shadow */ - 0px 0.51px 1.01px 0px rgba(255, 255, 255, 0.2); /* smallest shadow */ - --xy-theme-color-focus: #535353; -} - -/* Customizing Default Theming */ - -.react-flow__node { - /* box-shadow: var(--xy-node-boxshadow-default); - border-radius: var(--xy-node-border-radius-default); - background-color: var(--xy-node-background-color-default); */ - display: flex; - justify-content: center; - align-items: center; - text-align: center; - font-size: 12px; - flex-direction: column; - /* border: var(--xy-node-border-default); - color: var(--xy-node-color, var(--xy-node-color-default)); */ - pointer-events: all; - user-select: none; -} - -.react-flow__node.selectable:focus { - box-shadow: 0px 0px 0px 4px var(--xy-theme-color-focus); - border-color: #d9d9d9; -} - -.react-flow__node.selectable:focus:active { - box-shadow: var(--xy-node-boxshadow-default); -} - - -.react-flow__node.selectable:hover, -.react-flow__node.draggable:hover { - border-color: var(--xy-theme-hover); -} - -.react-flow__node.selectable.selected { - border-color: var(--xy-theme-selected); - box-shadow: var(--xy-node-boxshadow-default); -} - -.react-flow__node-group { - background-color: rgba(207, 182, 255, 0.4); - border-color: #9E86ED; -} - -.react-flow__edge.selectable:hover .react-flow__edge-path, -.react-flow__edge.selectable.selected .react-flow__edge-path { - stroke: var(--xy-theme-edge-hover); -} - -.react-flow__handle { - width: 15px; - height: 15px; -} - -.react-flow__handle.connectionindicator:hover { - pointer-events: all; - border-color: var(--xy-theme-edge-hover); - background-color: white; -} - -.react-flow__handle.connectionindicator:focus , -.react-flow__handle.connectingfrom, -.react-flow__handle.connectingto { - border-color: var(--xy-theme-edge-hover); -} - -.react-flow__node-resizer { - border-radius: 0; - border: none; -} - -.react-flow__resize-control.handle { - background-color: #ffffff; - border-color: #9E86ED; - border-radius: 0; - width: 5px; - height: 5px; -} \ No newline at end of file diff --git a/FRONT/DEV/src/assets/css/index.css b/FRONT/DEV/src/assets/css/index.css deleted file mode 100644 index c597aa3..0000000 --- a/FRONT/DEV/src/assets/css/index.css +++ /dev/null @@ -1,36 +0,0 @@ -html, -body { - margin: 0; - font-family: sans-serif; - box-sizing: border-box; - min-height: 100%; - height: 100%; -} - -#root{ - width: 100%; - height: 100%; - margin: 0; - padding: 0; -} - -#app { - width: 100%; - height: 100%; - margin: 0; - padding: 0; -} - -button{ - background-color: #006666; - border: none; - padding: 6px 10px; - border-radius: 8px; - color: white; - font-size: 14px; - cursor: pointer; - - &:hover{ - background-color: #255252; - } -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/Dropdown/DeviceCard.tsx b/FRONT/DEV/src/components/UI/Dropdown/DeviceCard.tsx deleted file mode 100644 index 0345346..0000000 --- a/FRONT/DEV/src/components/UI/Dropdown/DeviceCard.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, {useState} from 'react'; -import styled, { css } from 'styled-components'; -import { DeviceUser } from "../../../store/useDeviceStore"; -import {buttonNames} from "../../../const/buttons/names"; -import {ModalMap} from "../../modalwindows/windowsType"; -import {IconComponent} from "../../../const/buttons/icons"; -import {useModalContext} from "../../../store"; - -interface DeviceCardProps { - device: DeviceUser; - status: 'online' | 'offline'; -} - -const CardWrapper = styled.div<{ status: 'online' | 'offline' }>` - background: white; - border-radius: 12px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - overflow: hidden; - transition: all 0.3s ease; - cursor: pointer; - margin-bottom: 16px; - - &:hover { - transform: translateY(-2px); - box-shadow: 0 6px 16px rgba(0, 0, 0, 0.15); - } -`; - -const CardHeader = styled.div<{ status: 'online' | 'offline' }>` - background: ${({ status, theme }) => - status === 'online' ? theme.successColor : theme.offlineColor}; - color: white; - padding: 16px; - font-size: 18px; - font-weight: 500; - display: flex; - justify-content: space-between; - align-items: center; -`; - - -const CardContent = styled.div<{ isExpanded: boolean }>` - max-height: 0; - opacity: 0; - padding: 0 16px; - transition: all 0.3s ease; - color: #333; - font-size: 14px; - display: grid; - gap: 12px; - - ${({ isExpanded }) => isExpanded && css` - max-height: 500px; - opacity: 1; - padding: 16px; - `} -`; - -const InfoRow = styled.div` - display: flex; - justify-content: space-between; - align-items: center; -`; - -const Label = styled.span` - font-weight: 500; - color: #666; -`; - -const Value = styled.span` - color: #333; -`; - - -const DeviceCard: React.FC = ({ device, status }) => { - const [isExpanded, setIsExpanded] = useState(false); - const toggleExpanded = () => setIsExpanded(!isExpanded); - const { openModal } = useModalContext(); - - const openModalNote = (e: React.MouseEvent) => { - e.stopPropagation(); - openModal(ModalMap['6'], { - address: device.mac, - currentNote: device.note || '' - }); - }; - - - return ( - - -

    - MAC: {device.mac} -

    - - - -
    - - - - - {device.hostname || device.ip} - - - - - {device.vendor || 'Неизвестно'} - - - - - {device.ip} - - - {device.open_ports?.length > 0 && ( - - - {device.open_ports.join(', ')} - - )} - - - - {device.last_seen} - - - - - {device.note || '-'} - - -
    - ); -}; - -export default DeviceCard; \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/Dropdown/DropdownType.tsx b/FRONT/DEV/src/components/UI/Dropdown/DropdownType.tsx deleted file mode 100644 index d1e90c5..0000000 --- a/FRONT/DEV/src/components/UI/Dropdown/DropdownType.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import React, {useEffect, useRef, useState} from 'react'; -import styled from "styled-components"; -import {buttonNames} from "../../../const/buttons/names"; -import {IconComponent} from "../../../const/buttons/icons"; - -type Option = { - value: number, - label: string, -} - -interface DropdownTypeProps { - options: Option[]; - label?: string; - onChange?: (selectedItem: Option) => void; - value: Option | null; -} - -const DropdownWrapper = styled.div` - position: absolute; - top: 18px; - right:20px; - display: inline-block; - background-color: ${({theme}) => theme.background}; - padding: 12px 16px; - border-radius: 12px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - z-index: 10; -` -const Label = styled.p` - color: ${({theme}) => theme.textColor}; - font-size: 16px; -` - -const Dropdown = styled.div` - background-color: ${({theme}) => theme.primary}; - border-radius: 15px; - overflow: hidden; - transition: all .3s ease; - cursor: pointer; - z-index: 10; - margin-top: 6px; -` - -const DropdownHeader = styled.div` - display: flex; - justify-content: space-between; - gap: 14px; - padding: 12px 24px; - font-size: 16px; - align-items: center; - height: 100%; - min-width: 200px; -` - -const DropdownContent = styled.div<{$isOpen: boolean}>` - max-height: ${({$isOpen}) => $isOpen ? '500px' : '0'}; - opacity: ${({$isOpen}) => $isOpen ? 1 : 0}; - transition: all .3s ease; - display: flex; - flex-direction: column; - overflow: hidden; -` - -const DropdownRow = styled.button` - padding: 12px 24px; - background-color: transparent; - text-align: start; - font-size: 16px; - border: none; - width: 100%; - color: ${({theme}) => theme.textColor}; - transition: all .3s ease; - cursor: pointer; - - &:hover { - background-color: ${({theme}) => theme.background}; - } -` - -const DropdownArrow = styled.div<{ $isOpen: boolean }>` - transition: transform 0.3s ease; - transform: rotate(${({ $isOpen }) => ($isOpen ? "90deg" : "0deg")}); -`; - -const DropdownType = ({options, value, onChange, label}: DropdownTypeProps) => { - const [isOpen, setIsOpen] = useState(false); - const dropdownRef = useRef(null); - - function toggleOpen() { - setIsOpen((prev) => !prev); - } - - function handleSelect(option: Option) { - onChange?.(option); - setIsOpen(false); - } - - useEffect(() => { - function handleClickOutside(event: MouseEvent) { - if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { - setIsOpen(false); - } - } - document.addEventListener("mousedown", handleClickOutside); - return () => document.removeEventListener("mousedown", handleClickOutside); - }, []); - - return ( - - - - -

    {value?.label || 'Select an option'}

    - - - -
    - - {options.map((option, i) => ( - handleSelect(option)}> - {option.label} - - ))} - -
    -
    - ); -}; - -export default DropdownType; \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/Pagination.tsx b/FRONT/DEV/src/components/UI/Pagination.tsx deleted file mode 100644 index 94e63d8..0000000 --- a/FRONT/DEV/src/components/UI/Pagination.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react'; -import styled from "styled-components"; -import {buttonNames} from "../../const/buttons/names"; -import {IconComponent} from "../../const/buttons/icons"; - -const PaginateWrapper = styled.div` - width: 100%; - margin-top: 24px; - display: flex; - justify-content: center; - align-items: center; - gap: 10px; -` -const Page = styled.button` - width: 36px; - height: 36px; - background: ${(props => props.theme.primary)}; - color: ${(props => props.theme.textColor)}; - border: 1px solid ${(props => props.theme.borderColor)}; - font-size: 16px; - cursor: pointer; - border-radius: 4px; - - transition: .4s ease; - &:hover { - background: ${(props => props.theme.background)}; - } -` - -interface PaginationProps { - currentPage: number; - totalPages: number; - onPrevPage: () => void; - onNextPage: () => void; -} - -const Pagination = ({currentPage, totalPages, onPrevPage, onNextPage}: PaginationProps) => { - return ( - - - - - - - - - - ); -}; - -export default Pagination; \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/animDot.tsx b/FRONT/DEV/src/components/UI/animDot.tsx deleted file mode 100644 index 48bee7e..0000000 --- a/FRONT/DEV/src/components/UI/animDot.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import styled, { keyframes } from "styled-components"; - -const blink = keyframes` - 0%, 100% { opacity: 0.3; } - 50% { opacity: 1; } -`; - -interface DotProps { - $delay: number; -} - -const Dot = styled.span` - animation: ${blink} 1s infinite; - animation-delay: ${({ $delay }) => $delay}s; - margin: 0; -`; - -const Wrapper = styled.div` - display: flex; - gap: 4px; -`; - -export const AnimDot = () => ( - - . - . - . - -); diff --git a/FRONT/DEV/src/components/UI/buttons/mainButton.tsx b/FRONT/DEV/src/components/UI/buttons/mainButton.tsx deleted file mode 100644 index 55ca7e3..0000000 --- a/FRONT/DEV/src/components/UI/buttons/mainButton.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import styled from "styled-components"; -import { useTheme } from "styled-components"; -import { IconComponent } from "../../../const/buttons/icons"; - -const Button = styled.button.withConfig({ - shouldForwardProp: (prop) => !['color', '$hoverсolor', 'size', '$iconpos'].includes(prop), - })<{ color: string; size?: string, $hoverсolor: string, $iconpos: string }>` - background-color: ${(props) => props.color}; - border: none; - padding: ${(props) => - props.size === "small" - ? "10px 28px" - : props.size === "big" - ? "10px 20px" - : "12px 20px"}; // По умолчанию - border-radius: 8px; - color: white; - font-size: ${(props) => - props.size === "small" - ? "14px" - : props.size === "big" - ? "16px" - : "14px"}; // По умолчанию - cursor: pointer; - display: flex; - justify-content: center; - align-items: center; - flex-direction: ${(props) => - props.$iconpos === 'right' - ? 'row-reverse' - : 'row'}; - gap: 10px; - transition: all .3s ease; - &:hover{ - background-color: ${(props) => props.$hoverсolor}; - } -`; - -type Props = { - color?: string; - hoverColor?: string - size?: "small" | "big"; - title: string - onClick?: () => void; - type?: "button" | "submit" | "reset" | undefined - icon?: string - iconPosition?: 'left' | 'right' - iconSize?: { - width: string, - height: string - } - style?: any -}; - -export const MainButton = ({ color, size, title, hoverColor, type, icon, iconPosition, iconSize, onClick, style }: Props) => { - const theme = useTheme(); - const defaultColor: string = theme.accent; - const defaultHoverColor: string = theme.accentHover - - - return ( - - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/buttons/quitButton.tsx b/FRONT/DEV/src/components/UI/buttons/quitButton.tsx deleted file mode 100644 index 373655f..0000000 --- a/FRONT/DEV/src/components/UI/buttons/quitButton.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { MainButton } from "./mainButton"; -import styled from "styled-components"; -import { buttonNames } from "../../../const/buttons/names"; -import { IconComponent as Icon } from '../../../const/buttons/icons'; -import { useWorkSpaceStore } from "../../../store"; - -type Props = { - size: "small" | "big"; -}; - -const Container = styled.div<{ size: "small" | "big" }>` - ${(props) => props.size === "small" && "width: 100%;"} -`; - -const Button = styled.div` - width: 100%; - cursor: pointer; - color: ${(props) => props.theme.textColor}; -`; - -const IconContainer = styled.div` - padding: 10px; -`; - -export const QuitButton = ({ size }: Props) => { - const handleExit = () => { - window.electron.quitApp(); - }; - - const { setWorkModule } = useWorkSpaceStore() - - return ( - setWorkModule('helloWindow')}> - {size === "big" ? ( - - ) : ( - - )} - - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/buttons/toggletheme.tsx b/FRONT/DEV/src/components/UI/buttons/toggletheme.tsx deleted file mode 100644 index f1ca231..0000000 --- a/FRONT/DEV/src/components/UI/buttons/toggletheme.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import styled, { useTheme } from "styled-components"; -import { IconComponent as Icon } from '../../../const/theme/icons'; -import { ThemName } from "../../../const/theme/names"; - -const Button = styled.div` - width: 100%; - cursor: pointer; -` - -const IconContainer = styled.div` - padding: 10px; - color: ${props => props.theme.text}; -` - -export default function ThemeButton() { - const theme = useTheme(); - const name = localStorage.getItem('theme') as ThemName - - return ( - - ); -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/inputs/input.tsx b/FRONT/DEV/src/components/UI/inputs/input.tsx deleted file mode 100644 index dd2b9c9..0000000 --- a/FRONT/DEV/src/components/UI/inputs/input.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react'; -import styled from 'styled-components'; - -type Props = { - placeholderText: string; - id: string; - value?: string; - onChange?: (value: string) => void; - onFileChange?: (event: React.ChangeEvent) => void; - type?: string; - multiple?: boolean; - style?: React.CSSProperties; - search?: boolean; - onFocus?: any - onBlur?: any - $size?: string -} - -const InputContainer = styled.div` - width: 100%; - display: flex; - flex: 3; - -`; - -const StyledInput = styled.input` - padding: 8px 10px; - color: black; - border-radius: 8px; - border: 1px solid #A1A1A1; - background-color: transparent; - &:focus{ - border: 1px solid #adadad; - } - width: 100%; - font-size: 18px; - color: ${props=>props.theme.textColor} -`; - -const Input = React.forwardRef(({ placeholderText, id, value, onChange, onFileChange, type = "text", multiple, style, onFocus, onBlur }, ref) => { - const handleInputChange = (e: React.ChangeEvent) => { - const { value } = e.target; - if (onChange) { - onChange(value); - } - }; - - return ( - - - - ); -}); - -export default Input; \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/loader.tsx b/FRONT/DEV/src/components/UI/loader.tsx deleted file mode 100644 index c13bd3f..0000000 --- a/FRONT/DEV/src/components/UI/loader.tsx +++ /dev/null @@ -1,101 +0,0 @@ -type Props = { - loaderText: string; //Тип передаваемых данных loaderText - string -} - -import styled, { keyframes } from 'styled-components' -import { AnimDot } from './animDot'; - - -//Константа которая устанавливает кейфвреймы для вращения -const spinAnimation = keyframes` - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -` - -//Стиль экрана загрузки -export const LoaderContainer = styled.div` - top: 0px; - z-index:998; - background-color: rgba(0,0,0, 0.7); - position: fixed; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - overflow-y: hidden; -` - - -//Стиль блока с элементами загрузки -export const Loaderblock = styled.div` - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; - - p{ - font-size: 24px; - color: white; - } -` -//Стиль для блока с кольцом загрузки -export const LoadingSpinner = styled.div` - position: relative; - width: 65px; - height: 65px; -` - -//Стиль для кольца загрузки -export const LoadingRing = styled.div` - position: absolute; - top: 0; - left: 0; - width: 65px; - height: 65px; - border-radius: 50%; - border: 12px solid white; -` -//Стиль для части кольца загрузки, которая будет вращаться -export const LoadingPart = styled.div` - position: absolute; - top: 0; - left: 0; - width: 65px; - height: 65px; - border-radius: 50%; - border: 12px solid transparent; - border-top: 12px solid ${props => props.theme.accent}; - - // Добавление аниманции и использование кейфремов - animation: ${spinAnimation} 1s linear infinite; -` - -const Text = styled.div` - display: flex; - gap: 3px; - font-size: 24px; - color: white; - margin-top: 30px; - margin-left: 25px; -` - -export default function Loader({ loaderText }: Props) { - return ( - - - - - - - - - {/* Текст экрана загрузки устанавливается с помощью передаваемых данных loaderText */} - {loaderText} - - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/routerLoader.tsx b/FRONT/DEV/src/components/UI/routerLoader.tsx deleted file mode 100644 index 9a788f4..0000000 --- a/FRONT/DEV/src/components/UI/routerLoader.tsx +++ /dev/null @@ -1,103 +0,0 @@ -type Props = { - loaderText: string; //Тип передаваемых данных loaderText - string -} - -import styled, { keyframes } from 'styled-components' -import { AnimDot } from './animDot'; -import { ModalWindow } from '../modalwindows/style'; - - -//Константа которая устанавливает кейфвреймы для вращения -const spinAnimation = keyframes` - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -` - -//Стиль экрана загрузки -export const LoaderContainer = styled.div` - top: 0px; - z-index:998; - background-color: rgba(0,0,0, 0.7); - position: fixed; - display: flex; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - overflow-y: hidden; -` - - -//Стиль блока с элементами загрузки -export const Loaderblock = styled.div` - display: flex; - flex-direction: column; - align-items: center; - gap: 15px; - - p{ - font-size: 24px; - color: white; - } -` -//Стиль для блока с кольцом загрузки -export const LoadingSpinner = styled.div` - position: relative; - width: 65px; - height: 65px; -` - -//Стиль для кольца загрузки -export const LoadingRing = styled.div` - position: absolute; - top: 0; - left: 0; - width: 65px; - height: 65px; - border-radius: 50%; - border: 12px solid white; -` -//Стиль для части кольца загрузки, которая будет вращаться -export const LoadingPart = styled.div` - position: absolute; - top: 0; - left: 0; - width: 65px; - height: 65px; - border-radius: 50%; - border: 12px solid transparent; - border-top: 12px solid ${props => props.theme.accent}; - - // Добавление аниманции и использование кейфремов - animation: ${spinAnimation} 1s linear infinite; -` - -const Text = styled.div` - display: flex; - gap: 3px; - font-size: 24px; - color: white; - margin-top: 30px; - margin-left: 25px; -` - -export default function RouterLoader({ loaderText }: Props) { - return ( - - - - - - - - {/* Текст экрана загрузки устанавливается с помощью передаваемых данных loaderText */} - {loaderText} - - - - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/signalSvg.tsx b/FRONT/DEV/src/components/UI/signalSvg.tsx deleted file mode 100644 index 9590433..0000000 --- a/FRONT/DEV/src/components/UI/signalSvg.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React, { useEffect, useRef } from 'react'; - -interface SignalSVGProps { - signal: number; // Принимаем signal как пропс - color: string; - size: string; -} - -const SignalSVG: React.FC = ({ signal, color, size }) => { - const svgRef = useRef(null); - - useEffect(() => { - // Устанавливаем цвета в зависимости от signal - const colors = { - '--st1-color': signal >= 1 ? color : 'black', - '--st2-color': signal >= 2 ? color : 'black', - '--st3-color': signal >= 3 ? color : 'black', - '--st4-color': signal >= 4 ? color : 'black', - '--st5-color': signal === 5 ? color : 'black', - }; - - // Применяем стили к SVG - if (svgRef.current) { - Object.entries(colors).forEach(([key, value]) => { - svgRef.current?.style.setProperty(key, value); - }); - } - }, [signal]); - - return ( - - - - - - - - - - - ); -}; - -export default SignalSVG; \ No newline at end of file diff --git a/FRONT/DEV/src/components/UI/tables/TableScanner.tsx b/FRONT/DEV/src/components/UI/tables/TableScanner.tsx deleted file mode 100644 index 8657a17..0000000 --- a/FRONT/DEV/src/components/UI/tables/TableScanner.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, {useState} from 'react'; -import { DeviceUser } from '../../../store/useDeviceStore'; - -interface TableScannerProps { - devices: DeviceUser[]; -} -import styled from 'styled-components'; -import {IconComponent} from "../../../const/buttons/icons"; -import {buttonNames} from "../../../const/buttons/names"; -import {ModalMap} from "../../modalwindows/windowsType"; -import {useModalContext} from "../../../store"; -import Pagination from "../Pagination"; - -const TableContainer = styled.div` - width: 100%; - margin: 24px 0; -`; - -const StyledTable = styled.table` - width: 100%; - border-collapse: separate; - border-spacing: 0; - box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08); - background: ${({ theme }) => theme.primary}; -`; - -const TableHeaderCell = styled.th<{ sortable?: boolean }>` - padding: 16px 24px; - text-align: left; - font-weight: 600; - font-size: 14px; - color: ${({ theme }) => theme.textColor}; - background: ${({ theme }) => theme.primary}; - border-bottom: 1px solid ${({ theme }) => theme.borderColor}; - transition: all 0.2s ease; -`; - -const TableRow = styled.tr<{ clickable?: boolean }>` - transition: all 0.2s ease; - &:hover { - background-color: ${({ theme }) => theme.background}; - } -`; - -const TableCell = styled.td` - padding: 16px 24px; - font-size: 14px; - color: ${({ theme }) => theme.text}; - border-bottom: 1px solid ${({ theme }) => theme.borderColor}; - transition: all 0.2s ease; - button{ - background-color: transparent; - border: none; - cursor: pointer; - } -`; - -const StatusBadge = styled.span<{ status:string }>` - width: 10px; - height: 30px; - background-color: ${({theme, status}) => (status==='online' ? theme.successColor : theme.offlineColor)}; - display: inline-block; - border-radius:4px; -` - -const TableScanner = ({devices}:TableScannerProps) => { - const { openModal } = useModalContext(); - - const openModalNote = (e: React.MouseEvent, device:DeviceUser ) => { - e.stopPropagation(); - openModal(ModalMap['6'], { - address: device.mac, - currentNote: device.note || '' - }); - }; - - // Пагинация - const [currentPage, setCurrentPage] = useState(1); - const [devicesPerPage] = useState(10); - - const indexOfLastDevice = currentPage * devicesPerPage; - const indexOfFirstDevice = indexOfLastDevice - devicesPerPage; - const currentDevices = devices.slice(indexOfFirstDevice, indexOfLastDevice); - const totalPages = Math.ceil(devices.length / devicesPerPage); - - const handlePrevPage = () => { - if(currentPage > 1) setCurrentPage(currentPage - 1); - } - const handleNextPage = () => { - if(currentPage < totalPages) setCurrentPage(currentPage + 1); - } - - return ( - - - - - - Имя - Производитель - IP адрес - Открытые порты - Последняя активность - Заметка - - - - - {currentDevices.map((item, i) => ( - - - {item.hostname || item.ip} - {item.vendor} - {item.ip} - {item.open_ports.join(', ') || '-'} - {item.last_seen} - {item.note || '-'} - - - - - ))} - - - - - ); -}; - -export default TableScanner; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/circleNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/circleNode.tsx deleted file mode 100644 index 94eb76c..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/circleNode.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; -import { Handle, Position } from '@xyflow/react'; -import { Circle } from './style'; - -interface CustomNodeProps { - data: { - label: string; - style:{ - width: any; - height: any; - borderType: any; - borderColor: any; - } - }; -} - -export const CircleNode = ({ data }: CustomNodeProps) => { - return ( - {/* */} - {/*
    */} - {data.label} - - {/* Узлы для подключения */} - - - - - - {/* Для входящих подключений */} - - - - - {/*
    */} - -
    - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/style.ts deleted file mode 100644 index df61ace..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/circle/style.ts +++ /dev/null @@ -1,20 +0,0 @@ -import styled from "styled-components"; - -type Props={ - width: string, - height: string, - bordertype: string, - bordercolor: string -} - - -export const Circle = styled.div` - background-color: white; - border-radius: 100%; - display: flex; - align-items: center; - justify-content: center; - border: 2px ${(props) => props.bordertype} ${(props) => props.bordercolor}; - width: ${(props) => props.width}px; - height: ${(props) => props.height}px; -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/defaultNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/defaultNode.tsx deleted file mode 100644 index 388e9fb..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/defaultNode.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { Handle, Position } from '@xyflow/react'; -import { Default } from './style'; - -interface CustomNodeProps { - data: { - label: string; - style:{ - width: any; - height: any; - borderType: any; - borderColor: any; - } - }; -} - -export const DefaultNode = ({ data }: CustomNodeProps) => { - return ( - - {data.label} - - {/* Узлы для подключения */} - {/* - - - */} - - {/* Для входящих подключений */} - {/* */} - - {/* - */} - {/*
    */} - - - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/style.ts deleted file mode 100644 index 62595bc..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/default/style.ts +++ /dev/null @@ -1,20 +0,0 @@ -import styled from "styled-components"; - -type Props={ - width: string, - height: string, - bordertype: string, - bordercolor: string -} - -export const Default = styled.div` - background-color: white; - border: 2px ${(props) => props.bordertype} ${(props) => props.bordercolor}; - width: ${(props) => props.width}px; - height: ${(props) => props.height}px; - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - visibility: visible; -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/diamondNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/diamondNode.tsx deleted file mode 100644 index 49ab61c..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/diamondNode.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import { Handle, Position } from '@xyflow/react'; -import { Diamond, InnerDiamond, Border } from './style'; - -interface CustomNodeProps { - data: { - label: string; - style:{ - width: any; - height: any; - borderType: any; - borderColor: any; - } - }; -} - -export const DiamondNode = ({ data }: CustomNodeProps) => { - - const baseSize = Math.max(data.style.width, data.style.height); - - return ( - {/* */} - - - {data.label} - - - -
    - {/* Узлы для подключения */} - - - - - - {/* Для входящих подключений */} - - - - -
    - -
    - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/style.ts deleted file mode 100644 index 5eb0ba0..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/diamond/style.ts +++ /dev/null @@ -1,32 +0,0 @@ -import styled from "styled-components"; - -interface StyledDefaultProps { - width: any; - height: any; -} - -export const Diamond = styled.div` - position: relative; - width: ${(props) => props.width}px; - height: ${(props) => props.height}px; -`; - -export const InnerDiamond = styled.div` - clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); - width: ${(props) => props.width - 6}px; - height: ${(props) => props.height - 4}px; - background-color: white; - display: flex; - align-items: center; - justify-content: center; -` - -export const Border = styled.div<{ width: number; height: number, bordercolor: any }>` - clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); - width: ${(props) => props.width}px; - height: ${(props) => props.height}px; - background-color: ${(props) => props.bordercolor}; - display: flex; - align-items: center; - justify-content: center; -`; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/index.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/index.ts deleted file mode 100644 index 9827eef..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export {DefaultNode} from './default/defaultNode' -export {PillNode} from './pill/pillNode' -export {ParalelorgamNode} from './paralelogram/paralelogramNode' -export {CircleNode} from './circle/circleNode' -export {DiamondNode} from './diamond/diamondNode' \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/paralelogramNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/paralelogramNode.tsx deleted file mode 100644 index 699f00c..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/paralelogramNode.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React from 'react'; -import { Handle, Position } from '@xyflow/react'; -import { Paralelorgam } from './style'; - -interface CustomNodeProps { - data: { - label: string; - style:{ - width: any; - height: any; - borderType: any; - borderColor: any; - } - }; -} - -export const ParalelorgamNode = ({ data }: CustomNodeProps) => { - return ( - - {data.label} - - {/* Узлы для подключения */} - - - - - - {/* Для входящих подключений */} - - - - - - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/style.ts deleted file mode 100644 index 46791e4..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/paralelogram/style.ts +++ /dev/null @@ -1,43 +0,0 @@ -import styled from "styled-components"; - -type Props={ - width: string, - height: string, - bordertype: string, - bordercolor: string -} - - -export const Paralelorgam = styled.div` - transform: skewX(-20deg); - background-color: white; - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - border: 2px ${(props) => props.bordertype} ${(props) => props.bordercolor}; - width: ${(props) => props.width}px; - height: ${(props) => props.height}px; - - .react-flow__handle-top{ - transform: skewX(20deg); - top: -5px; - } - - .react-flow__handle-bottom{ - transform: skewX(20deg); - bottom: -5px; - } - - .react-flow__handle-right{ - transform: skewX(20deg); - right: -5px; - top: 25px; - } - - .react-flow__handle-left{ - transform: skewX(20deg); - left: -5px; - top: 25px; - } -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/pillNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/pillNode.tsx deleted file mode 100644 index 7adf271..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/pillNode.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import { Handle, Position } from '@xyflow/react'; -import { Pill } from './style'; - -interface CustomNodeProps { - data: { - label: string; - style:{ - width: any; - height: any; - borderType: any; - borderColor: any; - } - }; -} - -export const PillNode = ({ data }: CustomNodeProps) => { - return ( - {/* */} - {/*
    */} - {data.label} - - {/* Узлы для подключения */} - - - - - - {/* Для входящих подключений */} - - - - - {/*
    */} - -
    - ); -}; - -export default PillNode; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/style.ts deleted file mode 100644 index d08fe21..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/baseForm/pill/style.ts +++ /dev/null @@ -1,19 +0,0 @@ -import styled from "styled-components"; - -type Props={ - width: string, - height: string, - bordertype: string, - bordercolor: string -} - -export const Pill = styled.div` - background-color: white; - border-radius: 50px; - display: flex; - align-items: center; - justify-content: center; - border: 2px ${(props) => props.bordertype} ${(props) => props.bordercolor}; - width: ${(props) => props.width}px; - height: ${(props) => props.height}px; -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/index.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/index.ts deleted file mode 100644 index 64b1036..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export {NodeGroupNode} from './networkGroup/nodeGroup' -export {NetWorkNode} from './networkNode/networkNode' -export {IpGroupeNode} from './ipGroup/ipGroup' -export {IpNode} from './ipNode/ipNode' -export {PortNode} from './portNode/portNode' \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/ipGroup.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/ipGroup.tsx deleted file mode 100644 index 750e612..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/ipGroup.tsx +++ /dev/null @@ -1,18 +0,0 @@ - -import { IpGroup } from "./style"; - -interface CustomNodeProps { - data: { - style: { - width: any, - height: any, - } - }; -} - -export const IpGroupeNode = ({ data }: CustomNodeProps) => { - return ( - - ); -}; - diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/style.ts deleted file mode 100644 index 606ce1a..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipGroup/style.ts +++ /dev/null @@ -1,12 +0,0 @@ -import styled from "styled-components" - -type Props={ - $width: string, - $height?: any -} - - -export const IpGroup = styled.div` - width: ${(props) => props.$width}px; - height: ${(props) => typeof props.$height === 'number' ? `${props.$height}px` : props.$height}; -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx deleted file mode 100644 index d04af92..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/ipNode.tsx +++ /dev/null @@ -1,245 +0,0 @@ -import { useState } from 'react'; -import { Handle, Position } from '@xyflow/react'; -import { Ip } from './style'; -import { Row, IpTitle, IpContent } from './style'; -import Input from '../../../../UI/inputs/input'; -import { useModalContext, usePannableStore } from '../../../../../store'; -import { ModalMap } from '../../../../modalwindows/windowsType'; -import { validateIPAddress, validateSameSubnet } from '../../../../../utils/nodeController/validator'; -import {changeIp} from '../../../../../const/types/types' -import { IconComponent } from "../../../../../const/buttons/icons"; -import { buttonNames } from "../../../../../const/buttons/names"; - -interface IIp { - ipType: string - ipAdress: string, - ipGate: string, - ipDns: string[] - ipVersion: string -} - -type StateType = Record; -const typeMap: StateType = { - 'auto': "DHCP", - 'manual': "Static" -} - -interface CustomNodeProps { - data: { - ipData: IIp, - interfaceData: { - device: string, - connection: string - }, - style: { - width: any, - height: any, - borderType: string, - borderColor: string, - } - route: boolean - } -} - -export const IpNode = ({ data }: CustomNodeProps) => { - const { toggleEditingMode } = usePannableStore(); - const [isInput, setIsInput] = useState(false) - const { openModal } = useModalContext(); - - const [ipData, setIpData] = useState( - { - currentIp: data.ipData.ipAdress, - newIp: data.ipData.ipAdress, - currentGate: data.ipData.ipGate, - newGate: data.ipData.ipGate, - currentDns: data.ipData.ipDns, - newDns: data.ipData.ipDns, - device: data.interfaceData.device, - connection: data.interfaceData.connection, - version: data.ipData.ipVersion, - prefix: 0 - } - ) - - const handleFocus = () => { - toggleEditingMode(); - }; - - const handleBlur = () => { - toggleEditingMode(); - }; - - const handleClick = () => { - if (isInput) { - setIsInput(false) - setIpData(prevData => ({ - ...prevData, - newIp: data.ipData.ipAdress, - newGate: data.ipData.ipGate, - newDns: data.ipData.ipDns - })); - } - else { - setIsInput(true) - } - } - - const handleChange = (id: string, value: string) => { - if (id === 'newDns') { - const dnsArray = value.split(',').map(dns => dns.trim()); - setIpData(prevData => ({ - ...prevData, - [id]: dnsArray - })); - } else { - setIpData(prevData => ({ - ...prevData, - [id]: value - })); - } - }; - - function getSubnetMask(ipAddress: string, ipVersion: string): number { - if (ipVersion === "6") { - return 64; - } - - const firstOctet = parseInt(ipAddress.split(".")[0], 10); - if (firstOctet >= 0 && firstOctet <= 127) { - return 8; - } else if (firstOctet >= 128 && firstOctet <= 191) { - return 16; - } else if (firstOctet >= 192 && firstOctet <= 223) { - return 24; - } else { - return 24; - } - } - - - const handleConfirm = () => { - if ( - !validateIPAddress(ipData.newIp) || - !validateIPAddress(ipData.newGate) || - !ipData.newDns.every(dns => validateIPAddress(dns)) - ) { - alert('Один или несколько IP-адресов некорректны.'); - return; - } - - if (!validateSameSubnet(ipData.newIp, ipData.newGate, ipData.newDns)) { - alert('Адрес, шлюз и хотя бы один DNS должны находиться в одной подсети.'); - return; - } - - const calculatedPrefix = getSubnetMask(ipData.newIp, data.ipData.ipVersion); - - setIpData(prevData => ({ - ...prevData, - prefix: calculatedPrefix, - })); - - openModal(ModalMap['1'], { - ...ipData, - prefix: calculatedPrefix, - }); - - setIsInput(false) - }; - - - return ( - <> - - - - {/* -

    Версия IP:

    -

    v{data.ipData.ipVersion}

    -
    */} - - -

    Метод:

    -

    {typeMap[data.ipData.ipType]}

    -
    - - {isInput ? ( - - - - - - ) : ( - - )} - -
    - - - -

    IPv{data.ipData.ipVersion}-Addr:

    - {isInput ? ( - handleChange('newIp', value)} - onBlur={handleBlur} - onFocus={handleFocus} - style={{fontSize: '12px', padding: '4px 10px'}} - /> - ) : ( -

    {data.ipData.ipAdress}

    - )} - -
    - - -

    IPv{data.ipData.ipVersion}-GW:

    - {isInput ? ( - handleChange('newGate', value)} - onBlur={handleBlur} - onFocus={handleFocus} - style={{fontSize: '12px', padding: '4px 10px'}} - /> - ) : ( -

    {data.ipData.ipGate}

    - )} -
    - - -

    IPv{data.ipData.ipVersion}-DNS:

    - {isInput ? ( - handleChange('newDns', value)} - onBlur={handleBlur} - onFocus={handleFocus} - style={{fontSize: '12px', padding: '4px 10px'}} - /> - ) : ( -

    {data.ipData.ipDns.join(', ')}

    - )} -
    - - {data.route && - <> - - - - } -
    -
    - - - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/style.ts deleted file mode 100644 index 3355417..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/ipNode/style.ts +++ /dev/null @@ -1,74 +0,0 @@ -import styled from "styled-components"; - -type Props={ - $width: string, - $height?: any - $bordertype: string, - $bordercolor: string -} - -export const Ip = styled.div` - background-color: ${(props)=>props.theme.secondary}; - display: flex; - flex-direction: column; - width: ${(props) => props.$width}px; - height: ${(props) => typeof props.$height === 'number' ? `${props.$height}px` : props.$height}; - // box-shadow: 0px 0px 15px 2px rgba(0, 0, 0, 0.1); - border-radius: 8px; - - p{ - margin: 0; - } - - img{ - width: 15px; - height: 15px; - } -` - -export const IpTitle = styled.div` - background: ${(props)=>props.theme.accent}; - border-top-left-radius: 6px; - border-top-right-radius: 6px; - color: white; - display: flex; - justify-content: space-between; - padding: 10px; - -` - -export const IpContent = styled.div` - display: flex; - flex-direction: column; - justify-content: space-between; - height: 100%; - padding: 10px; - - .row{ - height: 24px; - - .row-label{ - flex: 1; - } - - .row-text{ - flex: 3; - } - - p{ - - text-wrap: nowrap; - text-align: left; - } - } -` - -export const Row = styled.div` - display: flex; - align-items: center; - gap: 5px; - - p{ - margin: 0; - } -` diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/nodeGroup.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/nodeGroup.tsx deleted file mode 100644 index e7b3f66..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/nodeGroup.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { useState } from "react"; -import { NodeGroup, Row, CollapseButton } from "./style"; -import { useGroupStore } from "../../../../../store"; -import { MainButton } from "../../../../UI/buttons/mainButton"; -import { IconComponent } from "../../../../../const/buttons/icons"; -import { buttonNames } from "../../../../../const/buttons/names"; - -interface CustomNodeProps { - data: { - id: string; - label: string; - height: any - style: { - width: any; - height: any; - borderType: any; - borderColor: any; - }; - }; -} - -export const NodeGroupNode = ({ data }: CustomNodeProps) => { - const [click, setClick] = useState(false); - const { groups, setGroups } = useGroupStore(); - - const handleClick = () => { - const newClickState = !click; - setClick(newClickState); - - const updatedNodes = groups.map((groups) => - groups.id === data.id ? { ...groups, click: newClickState } : groups - ); - - if (!groups.some((groups) => groups.id === data.id)) { - updatedNodes.push({ id: data.id, click: newClickState }); - } - - setGroups(updatedNodes); - }; - - return ( - - -

    {data.label}

    - - {/* */} - - {click ?( - 'Развернуть' - ):( - 'Свернуть' - )} - - {/* */} - -
    -
    - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/style.ts deleted file mode 100644 index 9311bd5..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkGroup/style.ts +++ /dev/null @@ -1,47 +0,0 @@ -import styled from "styled-components" - -type Props={ - $width?: string, - $height?: any - $bordertype?: string, - $bordercolor?: string - $backgroundcolor?: string -} - - -export const NodeGroup = styled.div` - border: 2px ${(props) => props.$bordertype} ${(props) => props.$bordercolor}; - width: ${(props) => props.$width}px; - height: ${(props) => typeof props.$height === 'number' ? `${props.$height}px` : props.$height}; - border-radius: 12px; - display: flex; - align-items: center; - justify-content: center; - visibility: visible; -` - -export const Row = styled.div` - position: absolute; - top: -25px; - left: 10px; - display: flex; - justify-content: space-between; - align-items: center; - width: ${props=>props.$width}px; - gap: 5px; - padding-right: 10px; - - p{ - margin: 0; - } -` - -export const CollapseButton = styled.p` - padding: unset; - background: none; - color: ${(props)=>props.theme.textColor}; - margin-right: 15px !important; - &:hover{ - background: none; - } -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/networkNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/networkNode.tsx deleted file mode 100644 index 0c0bfa4..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/networkNode.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Handle, Position } from '@xyflow/react'; -import { Network, TitleContainer, Device, Status, Content, Row, MAC, LabelColumn } from './style'; -import SignalSVG from '../../../../UI/signalSvg'; - -interface CustomNodeProps { - data: { - networkData: { - device: string - type: string - mac: string - mtu: number - state: string - connection: string - id: string, - strength: string - } - style: { - width: any, - height: any, - borderType: string, - borderColor: string, - backgroundColor: string - } - height: string - visible: true - }; -} - -export const NetWorkNode = ({ data }: CustomNodeProps) => { - const [signal, setSignal] = useState(1); - - useEffect(() => { - const perc = Number(data.networkData.strength); - - switch (true) { - case perc < 20: - setSignal(1); - break; - case perc < 40: - setSignal(2); - break; - case perc < 60: - setSignal(3); - break; - case perc < 80: - setSignal(4); - break; - default: - setSignal(5); - break; - } - - }, [data.networkData.strength]) - - return ( - - - - {data.networkData.type == "WIFI" && - - } - - {data.networkData.type == "ETHERNET" && - - } - - {data.networkData.type == "TUN" && - - } - - {data.networkData.device} - - {data.networkData.type == 'WIFI' && data.networkData.state === "Подключено" ? ( - - - - ) : ( -
    - ) - } - -
    - - {data.visible && - - -

    Конфигурация

    - - -

    MAC:

    -

    {data.networkData.mac}

    -
    - -

    MTU:

    -

    {data.networkData.mtu}

    -
    -
    -
    -
    - } - - {data.networkData.connection !== 'unknown' && - - } -
    - ); -}; - -export default NetWorkNode \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/style.ts deleted file mode 100644 index f73753f..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/networkNode/style.ts +++ /dev/null @@ -1,93 +0,0 @@ -import styled from "styled-components"; - -type Props = { - $width?: string, - $height?: any - $bordertype?: string, - $bordercolor?: string - $backgroundcolor?: string -} - -export const Network = styled.div` - background-color: ${(props) => props.theme.primary}; - border: 2px ${(props) => props.$bordertype} ${(props) => props.$bordercolor}; - min-width: ${(props) => props.$width}px; - height: ${(props) => typeof props.$height === 'number' ? `${props.$height}px` : props.$height}; - border-radius: 8px; - display: flex; - flex-direction: column; - gap: 10px; - visibility: visible; - overflow: hidden; - p{ - margin: 0; - } -` - -export const TitleContainer = styled.div` - display: flex; - justify-content: space-between; - align-items: center; - background: ${(props) => props.$backgroundcolor}; - color: white; - padding: 15px; - height: ${(props) => props.$height ? props.$height : 'unset'}; - - img{ - width: 20px - } -` - -export const Device = styled.p` - font-size: 18px; -` - -export const Status = styled.p` - font-size: 14px; - - - img{ - width: 20px; - height: 20px; - } -` - -export const Content = styled.div` - display: flex; - flex-direction: column; - gap: 15px; - padding: 15px; -` - -export const Row = styled.div` - display: flex; - gap: 5px; -` - -export const MAC = styled.div` - display: flex; - justify-content: space-between; - background: ${(props) => props.theme.secondary}; - border-radius: 8px; - // box-shadow: 0px 0px 15px 2px rgba(0, 0, 0, 0.1); - width: 100%; - - .networkNode-row{ - padding: 10px; - } -` - -export const LabelColumn = styled.div` - display: flex; - flex-direction: column; - align-items: center; - gap: 5px; - width: 100%; - - .networkNode-label{ - font-size: 10px; - width: 100%; - text-align: left; - margin-left: 15px; - } -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/portNode.tsx b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/portNode.tsx deleted file mode 100644 index 68939f7..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/portNode.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Handle, Position } from '@xyflow/react'; -import { Port, Column } from './style'; - -interface CustomNodeProps { - data: { - label: string; - port: string - id: string; - style: { - width: any; - height: any; - borderType: any; - borderColor: any; - } - }; -} - -export const PortNode = ({ data }: CustomNodeProps) => { - return ( - - - -

    {data.label}

    - - - {data.port && -

    {data.port}

    - } -
    - - - {data.port ? ( - <> - - - - - ) : ( - <> - - - - - )} - -
    - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/style.ts b/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/style.ts deleted file mode 100644 index 17a1b0f..0000000 --- a/FRONT/DEV/src/components/customeNodes/nodes/networkInterface/portNode/style.ts +++ /dev/null @@ -1,30 +0,0 @@ -import styled from "styled-components" - -type Props={ - $width: string, - $height?: any - $bordertype: string, - $bordercolor: string -} - -export const Port = styled.div` - background-color: ${(props)=>props.theme.primary}; - border: 2px ${(props) => props.$bordertype} ${(props) => props.$bordercolor}; - width: ${(props) => props.$width}px; - height: ${(props) => typeof props.$height === 'number' ? `${props.$height}px` : props.$height}; - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - visibility: visible; -` - -export const Column = styled.div` - display: flex; - flex-direction: column; - gap: 15px; - - p{ - margin: 0; - } -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/types/colors.ts b/FRONT/DEV/src/components/customeNodes/types/colors.ts deleted file mode 100644 index 342c6f7..0000000 --- a/FRONT/DEV/src/components/customeNodes/types/colors.ts +++ /dev/null @@ -1,11 +0,0 @@ -type ColorType = Record; - -export const NodeColors: ColorType = { - '0': '#c0c0c0', - '1': '#ef6e7d', - '2': '#f19e4c', - '3': '#e9c44c', - '4': '#51ce82', - '5': '#4cd2d0', - '6': '#a085f3', -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/customeNodes/types/types.ts b/FRONT/DEV/src/components/customeNodes/types/types.ts deleted file mode 100644 index 5b7ce87..0000000 --- a/FRONT/DEV/src/components/customeNodes/types/types.ts +++ /dev/null @@ -1,16 +0,0 @@ - -import { DefaultNode, PillNode, ParalelorgamNode, DiamondNode, CircleNode } from '../nodes/baseForm' -import { NodeGroupNode, NetWorkNode, IpGroupeNode, IpNode, PortNode } from '../nodes/networkInterface'; - -export const nodeTypes = { - custom: DefaultNode, - pill: PillNode, - parallelogram: ParalelorgamNode, - diamond: DiamondNode, - circle: CircleNode, - nodegroup: NodeGroupNode, - portNode: PortNode, - network: NetWorkNode, - ipgroup: IpGroupeNode, - ip: IpNode, -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modal.tsx b/FRONT/DEV/src/components/modalwindows/modal.tsx deleted file mode 100644 index b030ace..0000000 --- a/FRONT/DEV/src/components/modalwindows/modal.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { ModalWindow, ModalContainer } from "./style" -import { modalNames } from "../../const/modals/names" - -export const WindowComponent = ()=>{ - return( - - - - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/ConnectNetwork.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/ConnectNetwork.tsx deleted file mode 100644 index ff3532f..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/ConnectNetwork.tsx +++ /dev/null @@ -1,84 +0,0 @@ -// components/modalContainers/NoteDevice.tsx -import { ModalContainer, ModalTitle, ModalContent, ButtonContainer } from "../style"; -import { MainButton } from "../../UI/buttons/mainButton"; -import Input from "../../UI/inputs/input"; -import { useState } from "react"; -import {NetworkService} from "../../../api/request"; -import useNetworkStore from "../../../store/useDeviceStore"; -import RouterLoader from "../../UI/routerLoader"; -import {useTheme} from "styled-components"; -import {useIpStore} from "../../../store"; - -interface Props { - address: string; - onClose: () => void; -} - - - -export const ConnectNetwork = ({address, onClose}: Props) => { - const [password, setPassword] = useState(''); - const theme = useTheme(); - const { ipAddress } = useIpStore(); - const [error, setError] = useState(''); - const [isLoading, setIsLoading] = useState(false); - - const handleSave = async () => { - try { - setIsLoading(true); - setError('') - const res = await NetworkService.connectNetwork(ipAddress, password, address); - if(res.status === 200) { - onClose() - }else{ - setError(res.data.detail) - } - } catch (error) { - console.error('Error connection:', error); - setError('Ошибка подключения к сети') - }finally { - setIsLoading(false); - } - }; - - - return ( - - -

    Подключение к сети

    -
    - - - setPassword(value)} - /> -

    - {error} -

    -
    - - - - - - - {isLoading && } -
    - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/NoteDevice.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/NoteDevice.tsx deleted file mode 100644 index 6d0b666..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/NoteDevice.tsx +++ /dev/null @@ -1,82 +0,0 @@ -// components/modalContainers/NoteDevice.tsx -import { ModalContainer, ModalTitle, ModalContent, ButtonContainer } from "../style"; -import { MainButton } from "../../UI/buttons/mainButton"; -import Input from "../../UI/inputs/input"; -import { useState } from "react"; -import {useIpStore} from "../../../store"; -import {NetworkService} from "../../../api/request"; -import useNetworkStore from "../../../store/useDeviceStore"; - -interface Props { - address: string; - onClose: () => void; - currentNote?: string; - type: string -} - - - -export const NoteDevice = ({ address, onClose, currentNote, type}: Props) => { - const [note, setNote] = useState(currentNote || ''); - const { ipAddress } = useIpStore(); - const { devices, setDevices } = useNetworkStore(); - - const handleSave = async () => { - try { - if (!currentNote && note.trim() !== '') { - await NetworkService.addNote(ipAddress, address, note, type); - }else if (currentNote && note.trim() !== '' && note !== currentNote) { - await NetworkService.editNote(ipAddress, address, note, type); - }else if (currentNote && note.trim() === '') { - await NetworkService.deleteNote(ipAddress, address, type); - }else { - onClose(); - return; - } - - const updatedDevices = devices.map(device => - device.mac === address - ? { ...device, note: note.trim() } - : device - ); - setDevices(updatedDevices); - onClose(); - - } catch (error) { - console.error('Error saving note:', error); - } - }; - - return ( - - -

    {currentNote ? 'Редактирование заметки' : 'Добавление заметки'}

    -
    - - - setNote(value)} - /> - - - - - - -
    - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/NoteWifi.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/NoteWifi.tsx deleted file mode 100644 index c03a48a..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/NoteWifi.tsx +++ /dev/null @@ -1,82 +0,0 @@ -// components/modalContainers/NoteDevice.tsx -import { ModalContainer, ModalTitle, ModalContent, ButtonContainer } from "../style"; -import { MainButton } from "../../UI/buttons/mainButton"; -import Input from "../../UI/inputs/input"; -import { useState } from "react"; -import {NetworkService} from "../../../api/request"; -import useNetworkStore from "../../../store/useDeviceStore"; -import {useIpStore} from "../../../store"; - -interface Props { - address: string; - onClose: () => void; - currentNote?: string; - type: string -} - - - -export const NoteWifi = ({ address, onClose, currentNote, type}: Props) => { - const [note, setNote] = useState(currentNote || ''); - const { ipAddress } = useIpStore(); - const { wifiNetworks, setWifiNetworks } = useNetworkStore(); - - const handleSave = async () => { - try { - if (!currentNote && note.trim() !== '') { - await NetworkService.addNote(ipAddress, address, note, type); - }else if (currentNote && note.trim() !== '' && note !== currentNote) { - await NetworkService.editNote(ipAddress, address, note, type); - }else if (currentNote && note.trim() === '') { - await NetworkService.deleteNote(ipAddress, address, type); - }else { - onClose(); - return; - } - const updatedNetworks = wifiNetworks.map(network => - network.ssid === address - ? { ...network, note: note.trim() } - : { ...network } - ); - setWifiNetworks(updatedNetworks); - onClose(); - - } catch (error) { - console.error('Error saving note:', error); - } - }; - - - return ( - - -

    {currentNote ? 'Редактирование заметки' : 'Добавление заметки'}

    -
    - - - setNote(value)} - /> - - - - - - -
    - ); -}; \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/addDevice.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/addDevice.tsx deleted file mode 100644 index 5611792..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/addDevice.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import Input from "../../UI/inputs/input" -import { MainButton } from "../../UI/buttons/mainButton"; -import { useState } from "react"; -import { ModalContainer, ModalTitle, ModalContent, ModalText, ButtonContainer } from "../style" -import { validateIPAddress } from "../../../utils/nodeController/validator"; - -interface Props { - onSave?: (data: string) => void; - onClose: () => void; -} - -export const AddDevice = ({ onSave, onClose }: Props) => { - const [ipAddress, setIpAddress] = useState('') - const [error, setError] = useState(false) - - const handleSubmit = () => { - if (!validateIPAddress(ipAddress)) { - setError(true) - return; - } - // e.preventDefault(); // Предотвращаем перезагрузку страницы - if (onSave && ipAddress) { - setError(false) - onSave(ipAddress); - onClose(); - } - }; - - return ( - - {/*
    */} - -

    Добавление узла

    -
    - - - setIpAddress(value)} - /> - {error && ( -

    - Некорректный адрес узла -

    - )} -
    - - - - - - {/*
    */} -
    - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/connectionError.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/connectionError.tsx deleted file mode 100644 index 224ba6e..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/connectionError.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { ModalContainer, ModalTitle, ModalContent, ModalText, ButtonContainer } from "../style" -import { useModalContext } from "../../../store" -import { useIpStore } from "../../../store" -import { MainButton } from "../../UI/buttons/mainButton" - -type Props={ - message: string -} - -export const ConnectionError = ({message}: Props)=>{ - const {closeModal} = useModalContext() - const { setIpAddress } = useIpStore(); - - const close = ()=>{ - setIpAddress('localhost') - closeModal() - } - - return( - - -

    Соединение прервано

    -
    - - - -

    Произошёл разрыв с сервером

    -

    Пожалуйста, проверьте доступ к адресу и попробуйте снова.

    -
    -
    - - - - - -
    - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/disconnectConfirm.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/disconnectConfirm.tsx deleted file mode 100644 index 148d657..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/disconnectConfirm.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { ModalContainer, ModalTitle, ModalContent, ModalText, ButtonContainer } from "../style" -import { useModalContext } from "../../../store" -import { useIpStore } from "../../../store" -import { MainButton } from "../../UI/buttons/mainButton" -import {useState} from "react"; -import {NetworkService} from "../../../api/request"; -import RouterLoader from "../../UI/routerLoader"; -import {useTheme} from "styled-components"; - -type Props={ - address: string, - onClose: () => void -} - -export const DisconnectConfirm = ({address, onClose}: Props)=>{ - const { ipAddress } = useIpStore(); - const theme = useTheme() - const [isLoading, setIsLoading] = useState(false); - - const handleDisconnect = async () => { - try { - setIsLoading(true); - const res = await NetworkService.disconnectNetwork(ipAddress, address); - if(res.status === 200) { - onClose() - } - } catch (error) { - console.error('Error connection:', error); - }finally { - setIsLoading(false); - } - }; - - return( - - -

    Отключение от Wi-Fi сети

    -
    - - - -

    Подтверждение отключения

    -

    Вы собираетесь отключиться от сети "{address}". Все активные подключения будут прерваны.

    -
    -
    - - - - - - {isLoading && } -
    - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/index.ts b/FRONT/DEV/src/components/modalwindows/modalContainers/index.ts deleted file mode 100644 index ed95168..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export {IpConfirm} from './ipConfirm' -export {ConnectionError} from './connectionError' -export {AddDevice} from './addDevice' -export {RightsConfirm} from './rightsConfirm' \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/ipConfirm.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/ipConfirm.tsx deleted file mode 100644 index 2e2b998..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/ipConfirm.tsx +++ /dev/null @@ -1,211 +0,0 @@ -import styled from "styled-components"; -import Loader from "../../UI/loader"; -import { useEffect, useState } from "react"; -import { changeIp } from '../../../const/types/types' -import { NetworkService } from '../../../api/request' -import { ModalContainer, ModalTitle, ModalContent, ModalText, ButtonContainer, ErrorMessage } from "../style" -import { useIpStore } from "../../../store"; -import { MainButton } from "../../UI/buttons/mainButton"; -import { useAdminStore } from "../../../store/adminStore"; -import { useDevicesStore } from "../../../store"; - -type Props = { - ipData: changeIp - onClose: () => void; - smoothClose: () => void; -} - -const Information = styled.div` - display: flex; - flex-direction: column; - gap: 15px; -` - -const Info = styled.div` - display: flex; - gap: 10px; -` - -const DataContainer = styled.div` - display: flex; - gap: 35px; -` - -const CurrentData = styled.div` - display: flex; - flex-direction: column; - gap: 10px; -` - -const NewData = styled.div` - display: flex; - flex-direction: column; - gap: 10px; -` - -export const IpConfirm = ({ ipData, onClose, smoothClose }: Props) => { - const [loader, setLoader] = useState(true) - const [newIP, setNewIp] = useState(null) - const [currentIp, setCurrentIP] = useState({}) - const [checkStatus, setcheckStatus] = useState(false) - const [message, setMessgae] = useState('') - const { ipAddress, setIpAddress } = useIpStore(); - const {isAdmin} = useAdminStore() - const { devices, addDevice, deleteDevice } = useDevicesStore(); - - useEffect(() => { - if (ipData && isAdmin) { - const data = { - "connection_id": ipData.connection, - "ipv4_updates": { - "ipv4.method": "manual", - "ipv4.address-data": [ - { - "address": ipData.newIp, - "prefix": ipData.prefix - } - ], - "ipv4.gateway": ipData.newGate, - "ipv4.dns-data": ipData.newDns - } - }; - - const oldData = { - "connection_id": ipData.connection, - "ipv4_updates": { - "ipv4.method": "manual", - "ipv4.address-data": [ - { - "address": ipData.currentIp, - "prefix": ipData.prefix - } - ], - "ipv4.gateway": ipData.currentGate, - "ipv4.dns-data": ipData.currentDns - } - } - - setCurrentIP(oldData) - - checkIp(data); - } - }, [ipData, isAdmin]); - - const checkIp = async (data: any) => { - try { - const result = await NetworkService.checkIp(ipAddress, data); - setcheckStatus(result.data.available) - setMessgae(result.data.message) - if (result.data.available) { - setNewIp(data) - } - } catch (err) { - console.error('Error:', err); - } finally { - setLoader(false); - } - }; - - const saveIp = async (data: any) => { - try { - const result = await NetworkService.saveIp(ipAddress, data); - if (result.status === 200) { - if(ipAddress!=='localhost'){ - setIpAddress(ipData.newIp) - - const updatedDevices = devices.map(device => - device.address === ipData.currentIp - ? { ...device, address: ipData.newIp } - : device - ); - useDevicesStore.setState({ devices: updatedDevices }); - } - - onClose() - } - } catch (err) { - console.error('Error:', err); - } finally { - setLoader(false); - } - }; - - const cancelIp = async (data: any) => { - try { - const result = await NetworkService.saveIp(ipAddress, data); - if (result.status === 200) { - onClose() - } - } catch (err) { - console.error('Error:', err); - } finally { - setLoader(false); - } - }; - - return ( - <> - {loader && isAdmin ? ( - - ) : ( - - -

    Изменение IP-Адреса

    -
    - {checkStatus ? ( - - -

    Общие сведения

    - -

    Интерфейс: {ipData.device}

    -

    --{'>'}

    -

    {ipData.connection}

    -
    -

    Сведения об IP

    - - -

    Текущий ip: {ipData.currentIp}

    -

    Текущий шлюз: {ipData.currentGate}

    -

    Текущий DNS: {ipData.currentDns}

    -
    - - -

    Новый ip: {ipData.newIp}

    -

    Новый шлюз: {ipData.newGate}

    -

    Новый DNS: {ipData.newDns}

    -
    -
    -
    - - - cancelIp(currentIp)}/> - saveIp(newIP)}/> - -
    - ) : ( - <> - - - {isAdmin ? ( - <> -

    Произошла ошибка проверки корректности

    - {message} - - - ):( -

    Для изменения сетевых настроек необходимо авторизироваться под администратором

    - )} - -
    -
    - - - - - - )} -
    - )} - - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalContainers/rightsConfirm.tsx b/FRONT/DEV/src/components/modalwindows/modalContainers/rightsConfirm.tsx deleted file mode 100644 index 24351dd..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalContainers/rightsConfirm.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { useEffect, useState } from "react" -import { ModalContainer, ModalTitle, ModalContent, ModalText, ButtonContainer } from "../style" -import Input from "../../UI/inputs/input" -import { MainButton } from "../../UI/buttons/mainButton" -import { NetworkService } from "../../../api/request" -import { useIpStore } from "../../../store" -import { useAdminStore } from "../../../store/adminStore" -import { useCheckAdmin } from "../../../utils/checkAdmin" - -import { buttonNames } from "../../../const/buttons/names" -import { IconComponent } from "../../../const/buttons/icons" - -interface Props { - onClose: () => void; -} - -export const RightsConfirm = ({ onClose }: Props) => { - - const { ipAddress } = useIpStore(); - const { isAdmin, setAdmin } = useAdminStore() - const checkAdmin = useCheckAdmin(); - const [error, setError] = useState(false) - const [success, setSuccess] = useState({ - message: '', - status: false - }) - - const [user, setUser] = useState({ - username: 'operator', - password: "" - }) - - const handleChange = (id: string, value: string) => { - setUser(prevData => ({ - ...prevData, - [id]: value - })); - } - - const login = async (user: object) => { - try { - const response = await NetworkService.login(ipAddress, user); - if(response.status === 200){ - await checkAdmin(); - setError(false) - setSuccess(prevData => ({ - ...prevData, - message: 'Успешный вход', - status: true - })); - await new Promise(resolve => setTimeout(resolve, 3000)); - onClose(); - }else{ - setError(true) - } - } catch (err) { - console.error('Error:', err); - } - } - - const logout = async () => { - await NetworkService.logout(ipAddress); - await checkAdmin(); - setSuccess(prevData => ({ - ...prevData, - message: 'Успешный выход', - status: true - })); - await new Promise(resolve => setTimeout(resolve, 3000)); - onClose(); - } - - return ( - - {!success.status ? ( - !isAdmin ? ( - <> - -

    Получение прав доступа

    -
    - - - -

    Включить административный доступ

    - handleChange('password', value)} - /> - - {error && ( -

    - Неверный пароль оператора -

    - )} - -
    - - - - login(user)} /> - - - ) : ( - <> - -

    Переключиться на ограниченный доступ

    -
    - - -

    В данном режиме доступа ограничиваются полномочия администратора.

    -
    - - - - - - - - ) - ):( - - -

    {success.message}

    -

    Это окно можно закрыть, либо оно пропадёт само

    - -
    - )} - - -
    - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/modalWindow.tsx b/FRONT/DEV/src/components/modalwindows/modalWindow.tsx deleted file mode 100644 index 7edf179..0000000 --- a/FRONT/DEV/src/components/modalwindows/modalWindow.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { useModalContext } from "../../store"; -import { IpConfirm, ConnectionError, AddDevice, RightsConfirm } from "./modalContainers"; -import { ModalMap } from "./windowsType"; -import Loader from "../UI/loader"; -import { ModalWindow } from "./style"; -import {NoteDevice} from "./modalContainers/NoteDevice"; -import { NoteWifi } from "./modalContainers/NoteWifi"; -import {ConnectNetwork} from "./modalContainers/ConnectNetwork"; -import {DisconnectConfirm} from "./modalContainers/disconnectConfirm"; - -type Props = { - isOpen: boolean, - type: string - data: any; -} - -export default function WindowComponent({ isOpen, type, data }: Props) { - - const { closeModal, closeLoader } = useModalContext() - - return ( - <> - {isOpen && - - {type == ModalMap['1'] && data && - - } - - {type == ModalMap['2'] && - - } - - {type === ModalMap['3'] && - - } - {type === ModalMap['6'] && ( - - )} - {type === ModalMap['7'] && ( - - )} - {type === ModalMap['8'] && ( - - )} - {type === ModalMap['9'] && ( - - )} - {type === ModalMap['4'] && ( - - )} - - {type === ModalMap['5'] && ( - - )} - - } - - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/style.ts b/FRONT/DEV/src/components/modalwindows/style.ts deleted file mode 100644 index 2b75bd3..0000000 --- a/FRONT/DEV/src/components/modalwindows/style.ts +++ /dev/null @@ -1,70 +0,0 @@ -import styled from "styled-components"; - -export const ModalWindow = styled.div` - width: 100%; - position: fixed; - top: 0; - left: 0; - z-index: 9999; - background-color: rgba(0, 0, 0, 0.8); - display: flex; - align-items: center; - justify-content: center; - height: 100%; -` - -export const ModalContainer = styled.div<{height?: string}>` - border-radius: 12px; - background: ${(props)=>props.theme.secondary}; - color: ${(props=>props.theme.textColor)}; - position: relative; - max-height: 100%; - overflow: auto; - display: flex; - flex-direction: column; - justify-content: space-between; - gap: 15px; - height: ${(props) => props.height ? props.height : '230px'}; - width: 520px; -` - -export const ModalTitle = styled.div` - padding: 20px; - border-bottom: 1px solid #9D9D9D; - display: flex; - justify-content: space-between; - - h3{ - font-size: 18px; - } -` - -export const ModalContent = styled.div` - padding: 0 20px; - - h3{ - font-size: 14px; - } - - p{ - font-size: 12px; - } -` - -export const ModalText = styled.div` - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 10px; -` - -export const ErrorMessage = styled.p` - color: #d95454; -` - -export const ButtonContainer = styled.div` - justify-content: flex-end; - display: flex; - gap: 10px; - padding: 10px 20px 20px; -` \ No newline at end of file diff --git a/FRONT/DEV/src/components/modalwindows/windowsType.ts b/FRONT/DEV/src/components/modalwindows/windowsType.ts deleted file mode 100644 index ae6d760..0000000 --- a/FRONT/DEV/src/components/modalwindows/windowsType.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type ModalType = Record; - -export const ModalMap: ModalType = { - '1': 'ipConfirm', - '2': 'loader', - '3': 'connectionError', - '4': 'addDevice', - '5': 'sudo', - '6': 'noteDevice', - '7': 'noteWifi', - '8': 'connectNetwork', - '9': 'disconnectConfirm', -} diff --git a/FRONT/DEV/src/components/register.tsx b/FRONT/DEV/src/components/register.tsx deleted file mode 100644 index a043285..0000000 --- a/FRONT/DEV/src/components/register.tsx +++ /dev/null @@ -1,194 +0,0 @@ -import { ModalContainer, ModalTitle, ModalContent, ModalText } from "./modalwindows/style" -import Input from "./UI/inputs/input" -import { MainButton } from "./UI/buttons/mainButton" -import styled from "styled-components" -import { useEffect, useState } from "react" -import { useIpStore } from "../store" -import { NetworkService } from "../api/request" -import { IconComponent } from "../const/buttons/icons" -import { buttonNames } from "../const/buttons/names" -import ThemeButton from "./UI/buttons/toggletheme" -import About from "./workSpace/modules/appModules/about" - -const Wrapper = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - background: ${(props) => props.theme.background}; -` - -const Container = styled.form` - display: flex; - flex-direction: column; - gap: 25px; - align-items: center; - background: ${(props) => props.theme.primary}; - padding: 25px; - border-radius: 18px; - width: 350px; -` - -const Title = styled.div` - display: flex; - flex-direction: column; - gap: 15px; - align-items: center; - text-align: center; - font-size: 20px; -` - -const Content = styled.div` - display: flex; - flex-direction: column; - gap: 25px; - text-align: center; -` - -const ButtonContainer = styled.div` - width: 100%; - display: flex; - justify-content: center; -` - -const Menu = styled.div` - display: flex; - align-items: center; -` - -const Button = styled.div` - width: 100%; - cursor: pointer; -` - -const IconContainer = styled.div` - padding: 10px; - color: ${props => props.theme.text}; -` - -export const CreateUser = () => { - - const { ipAddress, setIpAddress } = useIpStore(); - const [repeatPassword, setRepeatPassword] = useState(''); - const [passwordsMatch, setPasswordsMatch] = useState(true); - const [about, setAbout] = useState(false) - - const [user, setUser] = useState({ - username: 'operator', - password: '', - is_admin: true - }) - - const handleChange = (id: string, value: string) => { - if (id === 'repeatPassword') { - setRepeatPassword(value); - setPasswordsMatch(user.password === value); - } else { - setUser(prevData => ({ - ...prevData, - [id]: value - })); - if (id === 'password') { - setPasswordsMatch(value === repeatPassword); - } - } - } - - const handleSave = async (user: object) => { - try { - const result = await NetworkService.createUser(ipAddress, user); - if (result.status === 200) { window.location.reload() } - } catch (err) { - console.error('Error:', err); - } - } - - const handleSubmit = () => { - if (passwordsMatch) { - handleSave(user); - } - }; - - const back = ()=>{ - setIpAddress('localhost') - } - - const toAbout = ()=>{ - setAbout(true) - } - return ( - - <> - {!about ? ( - - - - - <IconComponent name={buttonNames[3]} width="52" height="52"></IconComponent> - <h3>Настройка оператора узла</h3> - {ipAddress != 'localhost' && - <p>{ipAddress}</p> - } - - - - - -
    -

    Перед началом работы необходимо создать пароль оператора приложения

    -
    - -
    - handleChange('password', value)} - /> - - handleChange('repeatPassword', value)} - style={{ marginTop: '10px' }} - /> - {!passwordsMatch && ( -

    - Пароли не совпадают! -

    - )} -
    - -
    - - - - - - -
    - - - - {ipAddress != 'localhost' && - - } - - - -
    - ): ( - setAbout(false)} /> - )} - - - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/about.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/about.tsx deleted file mode 100644 index 59a4c39..0000000 --- a/FRONT/DEV/src/components/workSpace/modules/appModules/about.tsx +++ /dev/null @@ -1,249 +0,0 @@ - -import { MainButton } from "../../../UI/buttons/mainButton" -import { workSpaceNames } from "../../../../const/workspace/names" -import { useWorkSpaceStore } from "../../../../store" -import styled, {useTheme} from "styled-components" -import ThemeButton from "../../../UI/buttons/toggletheme" -import {buttonNames} from "../../../../const/buttons/names"; -import {IconComponent} from "../../../../const/buttons/icons"; - -type Props = { - from: 'reg' | 'helloWindow' | 'workSpace' - onBack?: () => void -} - -const Wrapper = styled.div` - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - width: 100%; - background: ${(props => props.theme.background)}; - padding: 50px; - box-sizing: border-box; -` - -const Content = styled.div` - max-width: 1200px; - display: flex; - flex-direction: column; - justify-content: space-between; - height: 100%; - box-sizing: border-box; - padding: 40px 50px; - background: ${(props => props.theme.primary)}; - border-radius: 18px; - position: relative; -` - -const Listing = styled.div` - display: flex; - flex-direction: column; - background-color: ${(props => props.theme.secondary)}; - border-radius: 10px; - padding: 24px 20px; - p{ - font-weight: bold; - font-size: 24px; - } -` - -const List = styled.ul` - display: flex; - flex-direction: column; - margin: 10px 0; - padding: 0; - list-style-type: none; - font-size: 18px; - gap: 4px; - & li:before { - color: ${(props => props.theme.accent)}; - content: "•"; - font-size: 28px; - width: .8em; - display: inline-block; - position: relative; - top: 2px; - } -` - -const Title = styled.div` - font-size: 20px; -` - -const SubTitle = styled.div` - display: flex; - flex-direction: column; - gap: 24px; - background-color:rgba(255, 248, 225, 0.6); - border-left: #ff9800 solid 4px; - border-radius: 0 8px 8px 0; - padding: 20px 12px; - - a{ - text-decoration: none; - color: ${(props => props.theme.errorColor)}; - font-weight: 500; - font-size: 18px; - width: max-content; - } - p{ - font-size: 18px; - color: ${(props=>props.theme.textColor)}; - } - .icon{ - width: 32px; - height: 32px; - fill: #ff9800; - } -` - -const Links = styled.div` - display: flex; - justify-content: start; - gap: 20px; -` - -const LinkBlock = styled.a` - text-decoration: none; - color: ${(props => props.theme.accent)};; -` - -const Copyright = styled.div` - width: 100%; - text-align: start; - color: ${(props => props.theme.offlineColor)}; -` - -const ButtonContainer = styled.div` - position: absolute; - top: 12px; - right: 14px; -` -const AboutLine = styled.hr` - border: ${(props => props.theme.hoverBtn)} 1px solid; - width: 100%; -` - -const MainTitle = styled.div` - width: 100%; - display: flex; - gap: 15px; - align-items: center; - justify-content: space-between; - padding-top: 10px; - box-sizing: border-box; - - img{ - width: 50px; - height: 50px; - } - .version{ - text-wrap: nowrap; - background-color: ${(props => props.theme.hoverBtn)}; - color: ${(props => props.theme.borderColor)}; - border-radius: 20px; - font-size: 18px; - padding: 10px 18px; - line-height: 1; - } - .title{ - display: flex; - justify-content: center; - align-items: center; - gap: 24px; - } -` - -export default function About({ from, onBack }: Props) { - const { setWorkModule } = useWorkSpaceStore() - const getBackHandler = () => { - switch (from) { - case 'reg': - return onBack - case 'helloWindow': - return () => setWorkModule(workSpaceNames[1]) - case 'workSpace': - return () => setWorkModule(workSpaceNames[3]) - default: - return undefined - } - } - - const backHandler = getBackHandler() - const showBackButton = from !== 'reg' || (from === 'reg' && onBack) - - return ( - - - - -
    - -

    О приложении

    -
    -

    v 0.0.3

    -
    - - - - - <p>ГоNets — минимально работоспособный кроссплатформенный продукт (MVP) для демонстрации нашего подхода к управлению настройками ПК в корпоративной среде.</p> - - - -

    Возможности:

    - -
  • Визуализация активных сетевых ресурсов
  • -
  • Настройка параметров локальных и удалённых сетевых ресурсов
  • -
  • Управление взаимодействием ресурсов с Клиентом ГoNets
  • -
    -
    - - - - - -

    Программное обеспечение исключительно для ознакомления и домашнего использования.

    - Перейти на ГоNets-PRO -
    - - - - Домашняя страницa - - - - Документация - - - - Лицензия - - - - - Разработано и поддерживается ООО «Гибридные Офисные Системы» 2024-2025 г. Все права защищены. - - - - {showBackButton && backHandler && ( - - - )} - - {from == 'reg' && - - } - -
    - -
    - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/header.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/header.tsx deleted file mode 100644 index 356764b..0000000 --- a/FRONT/DEV/src/components/workSpace/modules/appModules/header.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import styled from "styled-components" -import { IconComponent } from "../../../../const/buttons/icons" -import { buttonNames } from "../../../../const/buttons/names" -import { useWorkSpaceStore } from "../../../../store" -import { useModalContext } from "../../../../store" -import { useAdminStore } from "../../../../store/adminStore" -import { ModalMap } from "../../../modalwindows/windowsType" -import { QuitButton } from "../../../UI/buttons/quitButton" -import { usePosStore } from "../../../../store/posStore" - -const Container = styled.div` - display: flex; - align-items: center; - justify-content: flex-end; - background-color: ${(props) => props.theme.primary}; - padding: 0 5px; -` - -const ButtonContainer = styled.div` - display: flex; - align-items: center; -` - -const IconContainer = styled.div` - padding: 10px; - - svg{ - cursor: pointer; - } -` - -export const Header = () => { - const {setNullPos} = usePosStore() - - return ( - - - - setNullPos(true)}/> - - - - - - ) -} \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/helloWindow.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/helloWindow.tsx deleted file mode 100644 index 0a09826..0000000 --- a/FRONT/DEV/src/components/workSpace/modules/appModules/helloWindow.tsx +++ /dev/null @@ -1,82 +0,0 @@ - import styled from "styled-components" - import { MainButton } from "../../../UI/buttons/mainButton" - import { useWorkSpaceStore } from "../../../../store" - import { workSpaceNames } from "../../../../const/workspace/names" - import { buttonNames } from "../../../../const/buttons/names" - - const Wrapper = styled.div` - width: 100%; - height: 100%; - display: flex; - justify-content: center; - align-items: center; - background-color: ${(props => props.theme.background)}; - background-image: url('./assets/images/back1.svg'); - background-size: 100%; - background-repeat: no-repeat; - background-position: bottom; - ` - - const Container = styled.div` - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 52px; - margin-bottom: 100px; - ` - - const ButtonWrapper = styled.div` - display: flex; - gap: 75px; - flex-direction: column; - ` - - const ButtonContainer = styled.div` - display: flex; - gap: 15px; - flex-direction: column; - ` - - const Title = styled.div` - display: flex; - align-items: flex-end; - gap: 10px; - - h1{ - font-size: 52px; - } - ` - - export const HelloWindow = () => { - - const { setWorkModule } = useWorkSpaceStore() - - return ( - - - - <img src="./assets/images/logo.svg" alt="" style={{width: '152px'}}/> - - - - - - setWorkModule(workSpaceNames[3])} - /> - setWorkModule(workSpaceNames[4])} - /> - - - - - ) - } \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx deleted file mode 100644 index 52f146e..0000000 --- a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/ListUsers.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React, { useState } from 'react'; -import styled from 'styled-components'; -import DeviceCard from "../../../../../UI/Dropdown/DeviceCard"; -import {DeviceUser} from "../../../../../../store/useDeviceStore"; - -const ScanBtn = styled.button` - position: relative; - padding: 14px 22px; - background-color: #4CAF50; - color: white; - border: none; - border-radius: 12px; - font-size: 18px; - transition: .4s ease; - &:hover{ - transform: scale(1.03); - } -` - -interface ListUsersProps { - loading: boolean; - handleScan: ()=>void; - devices: DeviceUser[]; - scanInitiated: boolean; -} - -const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps) => { - const activeDevices = devices.filter(device => device.status === 'online'); - const inactiveDevices = devices.filter(device => device.status !== 'online'); - - // Пагинация - const [currentPage, setCurrentPage] = useState(1); - const [devicesPerPage] = useState(10); - - - return ( - <> - - {devices.length > 0 ? 'Обновить список' : 'Сканировать узлы'} - - - {devices.length > 0 ? ( -
    - {/* Колонка активных устройств */} -
    -

    Активные узлы ({activeDevices.length})

    - {activeDevices.map((device, index) => ( - - ))} -
    - {/* Колонка неактивных устройств */} -
    -

    Неактивные узлы ({inactiveDevices.length})

    - {inactiveDevices.map((device, index) => ( - - ))} -
    -
    - ) : scanInitiated ? ( -

    Узлы не найдены

    - ) : null} - - ); -}; - -export default ListUsers; \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx deleted file mode 100644 index 77e064c..0000000 --- a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/modules/TableUsers.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import styled from 'styled-components'; -import DeviceCard from "../../../../../UI/Dropdown/DeviceCard"; -import {DeviceUser} from "../../../../../../store/useDeviceStore"; -import TableScanner from "../../../../../UI/tables/TableScanner"; - -const ScanBtn = styled.button` - position: relative; - padding: 14px 22px; - background-color: #4CAF50; - color: white; - border: none; - border-radius: 12px; - font-size: 18px; - transition: .4s ease; - &:hover{ - transform: scale(1.03); - } -` - -interface ListUsersProps { - loading: boolean; - handleScan: ()=>void; - devices: DeviceUser[]; - scanInitiated: boolean; -} - -const ListUsers = ({loading, handleScan, devices, scanInitiated}: ListUsersProps) => { - - return ( - <> - - {devices.length > 0 ? 'Обновить список' : 'Сканировать узлы'} - - - {devices.length > 0 ? ( - - ) : scanInitiated ? ( -

    Узлы не найдены

    - ) : null} - - ); -}; - -export default ListUsers; \ No newline at end of file diff --git a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx b/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx deleted file mode 100644 index 19ca497..0000000 --- a/FRONT/DEV/src/components/workSpace/modules/appModules/usersScanner/userScanner.tsx +++ /dev/null @@ -1,191 +0,0 @@ -import { useIpStore } from "../../../../../store"; -import styled, { keyframes } from "styled-components"; -import { useState } from "react"; -import { NetworkService } from "../../../../../api/request"; -import ListUsers from "./modules/ListUsers"; -import TableUsers from "./modules/TableUsers"; -import DropdownType from "../../../../UI/Dropdown/DropdownType"; -import useNetworkStore from "../../../../../store/useDeviceStore"; - -type Option ={ - value: number, - label: string, -} - -// Анимации -const ring1 = keyframes` - 0% { transform: translate(-50%, -50%) scale(1); opacity: 0.12; } - 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.2; } - 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.12; } -`; - -const ring2 = keyframes` - 0% { transform: translate(-50%, -50%) scale(1); opacity: 0.08; } - 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.15; } - 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.08; } -`; - -const ring3 = keyframes` - 0% { transform: translate(-50%, -50%) scale(1); opacity: 0.04; } - 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.1; } - 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.04; } -`; -const dotAnimation = keyframes` - 0% { content: '.'; } - 33% { content: '..'; } - 66% { content: '...'; } - 100% { content: '.'; } -`; -const pulse = keyframes` - 0% { transform: translate(-50%, -50%) scale(1); } - 50% { transform: translate(-50%, -50%) scale(1.1); } - 100% { transform: translate(-50%, -50%) scale(1); } -`; - -// Стили -const Wrapper = styled.div<{ scanInitiated: boolean, loading: boolean}>` - display: flex; - flex-direction: column; - align-items: center; - justify-content:${({scanInitiated, loading})=>(scanInitiated && !loading ? 'start' : 'center')}; - height: 100%; - width: 100%; - background: ${(props) => props.theme.background}; - padding: 50px; - box-sizing: border-box; - gap: 24px; - transition: justify-content .4s ease; - overflow-y: auto; - overflow-x: hidden; - position: relative; -`; -const TitleWrapper = styled.h2` - position: absolute; - top: 20px; - left: 50%; - transform: translateX(-50%); - font-size: 32px; - width: max-content; -` -const UserLocate = styled.div<{ loading: boolean, scanInitiated: boolean }>` - width: 60px; - height: 60px; - border-radius: 50%; - position: relative; - transition: .4s ease; - transform: ${({scanInitiated,loading})=>(scanInitiated && !loading ? 'scale(0)' : 'scale(1)')}; - span { - position: absolute; - display: inline-block; - background: ${(props) => props.theme.scannerColor}; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - border-radius: 50%; - &.center { - width: 60px; - height: 60px; - animation: ${({ loading }) => (loading ? pulse : "none")} 2s ease infinite; - } - &.ring1 { - opacity: 0.12; - width: 250px; - height: 250px; - animation: ${({ loading }) => (loading ? ring1 : "none")} 4s linear infinite; - } - - &.ring2 { - opacity: 0.08; - width: 400px; - height: 400px; - animation: ${({ loading }) => (loading ? ring2 : "none")} 4s linear infinite; - animation-delay: ${({ loading }) => (loading ? "0.1s" : "0")}; - } - - &.ring3 { - opacity: 0.04; - width: 550px; - height: 550px; - animation: ${({ loading }) => (loading ? ring3 : "none")} 4s linear infinite; - animation-delay: ${({ loading }) => (loading ? "0.2s" : "0")}; - } - } -`; - -const LoadingText = styled.div` - position: relative; - padding: 14px 22px; - background-color: #4CAF50; - color: white; - border: none; - border-radius: 12px; - font-size: 18px; -`; -const ScanningText = styled.span` - &::after { - content: '.'; - animation: ${dotAnimation} 1.5s infinite; - } -`; - - -export default function UserScanner() { - const { ipAddress } = useIpStore(); - const [loading, setLoading] = useState(false); - const { devices, setDevices } = useNetworkStore(); - const [scanInitiated, setScanInitiated] = useState(devices.length > 0); - - // Сканирование - const handleScan = async () => { - try { - setLoading(true); - setScanInitiated(true); - const res = await NetworkService.scanUser(ipAddress); - console.log(res); - setDevices(res.data.devices || []); - } catch (err) { - console.error("Ошибка сканирования сети:", err); - setDevices([]) - } finally { - setLoading(false); - } - }; - - // Способ отображения - const viewOptions: Option[] = [ - { value: 1, label: 'Таблица' }, - { value: 2, label: 'Список' }, - ]; - const [selectedView, setSelectedView] = useState