From 955d13e9aa85cfd9a032d2d91b98577cc19d81ab Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Mon, 22 Apr 2024 20:26:14 +0200 Subject: [PATCH] Update On Mon Apr 22 20:26:13 CEST 2024 --- .github/update.log | 1 + .../materialYou/components/baseCard/index.tsx | 40 +- .../components/baseCard/style.module.scss | 13 + .../baseCard/style.module.scss.d.ts | 4 + clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/package.json | 2 +- clash-nyanpasu/pnpm-lock.yaml | 2246 ++++++++--------- clash-verge-rev/src-tauri/Cargo.lock | 13 +- clash-verge-rev/src-tauri/Cargo.toml | 2 +- clash-verge-rev/src-tauri/src/cmds.rs | 10 +- clash-verge-rev/src-tauri/src/core/tray.rs | 30 +- clash-verge-rev/src-tauri/tauri.conf.json | 4 + .../components/setting/mods/layout-viewer.tsx | 43 +- clash-verge-rev/src/services/cmds.ts | 2 +- .../src/base/android/input_hint_checker.h | 2 +- .../src/net/android/network_library_stub.cc | 2 +- openwrt-packages/ddns-go/Makefile | 4 +- openwrt-packages/luci-app-amlogic/Makefile | 2 +- .../usr/share/amlogic/amlogic_check_kernel.sh | 10 +- openwrt-passwall2/luci-app-passwall2/Makefile | 2 +- .../luasrc/controller/passwall2.lua | 6 +- .../model/cbi/passwall2/client/global.lua | 3 +- .../luasrc/view/passwall2/global/status.htm | 2 +- .../luci-app-passwall2/po/zh-cn/passwall2.po | 4 +- .../root/etc/uci-defaults/luci-passwall2 | 4 + .../root/usr/share/passwall2/0_default_config | 2 +- .../root/usr/share/passwall2/app.sh | 2 +- .../root/usr/share/passwall2/subscribe.lua | 47 +- .../ucitrack/luci-app-passwall2-server.json | 4 + .../share/ucitrack/luci-app-passwall2.json | 4 + .../Jit/MemoryManagerHostTracked.cs | 64 + .../src/Ryujinx.Graphics.GAL/Capabilities.cs | 3 + .../Engine/Compute/ComputeClass.cs | 6 +- .../Engine/Threed/StateUpdater.cs | 13 +- .../Ryujinx.Graphics.Gpu/Image/PoolCache.cs | 7 +- .../Image/TextureBindingInfo.cs | 16 +- .../Image/TextureBindingsArrayCache.cs | 630 ++++- .../Image/TextureBindingsManager.cs | 16 +- .../Image/TextureManager.cs | 8 +- .../Shader/CachedShaderBindings.cs | 5 +- .../Shader/DiskCache/DiskCacheGpuAccessor.cs | 35 + .../Shader/DiskCache/DiskCacheHostStorage.cs | 2 +- .../Shader/GpuAccessor.cs | 18 + .../Shader/GpuAccessorBase.cs | 2 + .../Shader/GpuAccessorState.cs | 8 + .../Shader/GpuChannelPoolState.cs | 7 +- .../Shader/ShaderCache.cs | 8 +- .../Shader/ShaderInfoBuilder.cs | 38 +- .../Shader/ShaderSpecializationState.cs | 92 +- .../Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs | 1 + .../CodeGen/Glsl/Declarations.cs | 3 +- .../Glsl/Instructions/InstGenMemory.cs | 19 +- .../CodeGen/Spirv/Declarations.cs | 52 +- .../CodeGen/Spirv/Instructions.cs | 86 +- .../Ryujinx.Graphics.Shader/IGpuAccessor.cs | 35 +- .../IntermediateRepresentation/Operation.cs | 5 + .../TextureOperation.cs | 9 + .../Ryujinx.Graphics.Shader/SamplerType.cs | 26 + .../StructuredIr/AstTextureOperation.cs | 5 + .../StructuredIr/StructuredProgram.cs | 2 +- .../StructuredIr/TextureDefinition.cs | 18 +- .../TextureDescriptor.cs | 4 + .../Ryujinx.Graphics.Shader/TextureHandle.cs | 1 + .../Optimizations/BindlessElimination.cs | 86 +- .../Optimizations/BindlessToArray.cs | 2 +- .../Translation/ResourceManager.cs | 32 +- .../Translation/TranslatorContext.cs | 6 +- .../DescriptorSetTemplate.cs | 85 +- .../Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 1 + .../src/Ryujinx.Memory/NativeMemoryManager.cs | 5 + ryujinx/src/Ryujinx.ShaderTools/Program.cs | 10 + shadowsocks-rust/Cargo.lock | 63 +- small/luci-app-passwall2/Makefile | 2 +- .../luasrc/controller/passwall2.lua | 6 +- .../model/cbi/passwall2/client/global.lua | 3 +- .../luasrc/view/passwall2/global/status.htm | 2 +- .../luci-app-passwall2/po/zh-cn/passwall2.po | 4 +- .../root/etc/uci-defaults/luci-passwall2 | 4 + .../root/usr/share/passwall2/0_default_config | 2 +- .../root/usr/share/passwall2/app.sh | 2 +- .../root/usr/share/passwall2/subscribe.lua | 47 +- .../ucitrack/luci-app-passwall2-server.json | 4 + .../share/ucitrack/luci-app-passwall2.json | 4 + small/shadowsocks-rust/Makefile | 16 +- small/v2ray-geodata/Makefile | 8 +- .../com/v2ray/ang/receiver/WidgetProvider.kt | 8 +- .../kotlin/com/v2ray/ang/ui/MainActivity.kt | 4 +- .../main/res/drawable-night/ic_image_24dp.xml | 12 + .../res/drawable-night/ic_image_photo.xml | 9 - .../main/res/drawable-night/ic_info_24dp.xml | 9 - .../src/main/res/drawable/ic_image_24dp.xml | 12 + .../src/main/res/drawable/ic_image_photo.xml | 9 - .../src/main/res/drawable/ic_info_24dp.xml | 9 - .../res/drawable/ic_rounded_corner_active.xml | 10 + .../drawable/ic_rounded_corner_inactive.xml | 10 + .../app/src/main/res/layout/widget_switch.xml | 28 +- .../app/src/main/res/menu/menu_scanner.xml | 2 +- .../app/src/main/res/values-night/colors.xml | 4 +- .../app/src/main/res/values/colors.xml | 4 +- .../transport/internet/reality/reality.go | 3 + yass/CMakeLists.txt | 2 + yass/README.md | 2 +- .../main/java/it/gui/yass/MainActivity.java | 8 + .../yass/src/main/res/values-zh/strings.xml | 3 +- .../yass/src/main/res/values/strings.xml | 1 + .../entry/src/main/ets/pages/DetailPage.ets | 2 +- .../main/resources/zh_CN/element/string.json | 2 +- yass/src/cli/cli.cpp | 4 + yass/src/config/config.cpp | 175 +- yass/src/config/config.hpp | 34 +- yass/src/config/config_core.cpp | 173 ++ yass/src/config/config_core.hpp | 42 + yass/src/config/config_impl.cpp | 126 +- yass/src/config/config_impl.hpp | 12 +- yass/src/config/config_impl_apple.hpp | 2 +- yass/src/config/config_impl_local.hpp | 2 +- yass/src/config/config_impl_windows.hpp | 2 +- yass/src/config/config_version.cpp | 1 + yass/src/gtk/yass.cpp | 1 - yass/src/gtk/yass_window.cpp | 2 +- yass/src/gtk4/yass.cpp | 1 - yass/src/gtk4/yass_en.po | 8 + yass/src/gtk4/yass_window.cpp | 18 +- yass/src/gtk4/yass_zh_CN.po | 8 + yass/src/mac/YassAppDelegate.mm | 1 - yass/src/server/server.cpp | 4 + yass/src/win32/yass.cpp | 2 - yass/tools/build.go | 12 +- youtube-dl/test/test_download.py | 14 +- youtube-dl/youtube_dl/extractor/extractors.py | 10 +- youtube-dl/youtube_dl/extractor/youporn.py | 600 ++++- yt-dlp/yt_dlp/extractor/crunchyroll.py | 134 +- 132 files changed, 3595 insertions(+), 2098 deletions(-) create mode 100644 clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss create mode 100644 clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss.d.ts create mode 100644 openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json create mode 100644 openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json create mode 100644 small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json create mode 100644 small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json create mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_24dp.xml delete mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_photo.xml delete mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_info_24dp.xml create mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_24dp.xml delete mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_photo.xml delete mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable/ic_info_24dp.xml create mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_active.xml create mode 100644 v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_inactive.xml create mode 100644 yass/src/config/config_core.cpp create mode 100644 yass/src/config/config_core.hpp diff --git a/.github/update.log b/.github/update.log index 7f124271d6..bfac2b4660 100644 --- a/.github/update.log +++ b/.github/update.log @@ -624,3 +624,4 @@ Update On Thu Apr 18 20:29:16 CEST 2024 Update On Fri Apr 19 20:26:11 CEST 2024 Update On Sat Apr 20 20:26:45 CEST 2024 Update On Sun Apr 21 20:27:36 CEST 2024 +Update On Mon Apr 22 20:26:02 CEST 2024 diff --git a/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/index.tsx b/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/index.tsx index c4f7b02262..52807db08f 100644 --- a/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/index.tsx +++ b/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/index.tsx @@ -1,17 +1,31 @@ -import { Box, Card, CardContent, Typography } from "@mui/material"; +import { + alpha, + Box, + Card, + CardContent, + CircularProgress, + Typography, + useTheme, +} from "@mui/material"; import { ReactNode } from "react"; +import style from "./style.module.scss"; +import { motion } from "framer-motion"; export const BaseCard = ({ label, labelChildren, + loading, children, }: { label?: string; labelChildren?: ReactNode; + loading?: boolean; children?: ReactNode; }) => { + const { palette } = useTheme(); + return ( - + {label && ( + + +
+ +
+
); }; diff --git a/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss b/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss new file mode 100644 index 0000000000..7d35c4bd22 --- /dev/null +++ b/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss @@ -0,0 +1,13 @@ +.LoadingMask { + position: absolute; + top: 0; + left: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + backdrop-filter: blur(4px); + border-radius: 24px; +} diff --git a/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss.d.ts b/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss.d.ts new file mode 100644 index 0000000000..fdbf1c02a9 --- /dev/null +++ b/clash-nyanpasu/frontend/ui/materialYou/components/baseCard/style.module.scss.d.ts @@ -0,0 +1,4 @@ +declare const classNames: { + readonly LoadingMask: "LoadingMask"; +}; +export = classNames; diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 4528ea14ca..e961dd952d 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.18.3", - "mihomo_alpha": "alpha-99b274a", + "mihomo_alpha": "alpha-002b8af", "clash_rs": "v0.1.16", "clash_premium": "2023-09-05-gdcc8d87" }, @@ -36,5 +36,5 @@ "darwin-x64": "clash-darwin-amd64-n{}.gz" } }, - "updated_at": "2024-04-19T22:19:35.077Z" + "updated_at": "2024-04-21T22:19:48.926Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index e9d9ef17f0..ea3b4ae206 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -101,7 +101,7 @@ "tsx": "4.7.2", "typescript": "5.4.5" }, - "packageManager": "pnpm@9.0.4", + "packageManager": "pnpm@9.0.5", "engines": { "node": "21.7.3" }, diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 099b9126f6..211177ef84 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -47,7 +47,7 @@ importers: version: 7.0.3 dedent: specifier: 1.5.3 - version: 1.5.3(babel-plugin-macros@3.1.0) + version: 1.5.3 eslint: specifier: 8.57.0 version: 8.57.0 @@ -56,10 +56,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-config-standard: specifier: 17.1.0 - version: 17.1.0(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0) + version: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.57.0) eslint-import-resolver-alias: specifier: 1.1.2 - version: 1.1.2(eslint-plugin-import@2.29.1(eslint@8.57.0)) + version: 1.1.2(eslint-plugin-import@2.29.1) eslint-plugin-html: specifier: 8.1.0 version: 8.1.0 @@ -71,7 +71,7 @@ importers: version: 16.6.2(eslint@8.57.0) eslint-plugin-prettier: specifier: 5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) eslint-plugin-promise: specifier: 6.1.1 version: 6.1.1(eslint@8.57.0) @@ -107,22 +107,22 @@ importers: version: 16.3.1(typescript@5.4.5) stylelint-config-html: specifier: 1.1.0 - version: 1.1.0(postcss-html@1.6.0)(stylelint@16.3.1(typescript@5.4.5)) + version: 1.1.0(postcss-html@1.6.0)(stylelint@16.3.1) stylelint-config-recess-order: specifier: 5.0.1 - version: 5.0.1(stylelint@16.3.1(typescript@5.4.5)) + version: 5.0.1(stylelint@16.3.1) stylelint-config-standard: specifier: 36.0.0 - version: 36.0.0(stylelint@16.3.1(typescript@5.4.5)) + version: 36.0.0(stylelint@16.3.1) stylelint-declaration-block-no-ignored-properties: specifier: 2.8.0 - version: 2.8.0(stylelint@16.3.1(typescript@5.4.5)) + version: 2.8.0(stylelint@16.3.1) stylelint-order: specifier: 6.0.4 - version: 6.0.4(stylelint@16.3.1(typescript@5.4.5)) + version: 6.0.4(stylelint@16.3.1) stylelint-scss: specifier: 6.2.1 - version: 6.2.1(stylelint@16.3.1(typescript@5.4.5)) + version: 6.2.1(stylelint@16.3.1) tsx: specifier: 4.7.2 version: 4.7.2 @@ -146,10 +146,10 @@ importers: dependencies: '@dnd-kit/core': specifier: 6.1.0 - version: 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) '@dnd-kit/sortable': specifier: 8.0.0 - version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) '@dnd-kit/utilities': specifier: 3.2.2 version: 3.2.2(react@18.2.0) @@ -158,10 +158,10 @@ importers: version: 11.11.4(@types/react@18.2.79)(react@18.2.0) '@emotion/styled': specifier: 11.11.5 - version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.79)(react@18.2.0) '@generouted/react-router': specifier: 1.19.3 - version: 1.19.3(react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)) + version: 1.19.3(react-router-dom@6.22.3)(react@18.2.0)(vite@5.2.10) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -170,16 +170,16 @@ importers: version: 0.2.7 '@mui/icons-material': specifier: 5.15.15 - version: 5.15.15(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) + version: 5.15.15(@mui/material@5.15.15)(@types/react@18.2.79)(react@18.2.0) '@mui/lab': specifier: 5.0.0-alpha.170 - version: 5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) '@mui/material': specifier: 5.15.15 - version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) '@mui/x-data-grid': specifier: 7.3.0 - version: 7.3.0(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.3.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -200,7 +200,7 @@ importers: version: 1.11.10 framer-motion: specifier: 11.1.7 - version: 11.1.7(@emotion/is-prop-valid@1.2.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 11.1.7(react-dom@18.2.0)(react@18.2.0) i18next: specifier: 23.11.2 version: 23.11.2 @@ -209,7 +209,7 @@ importers: version: 0.47.0 mui-color-input: specifier: 2.0.3 - version: 2.0.3(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.0.3(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -221,28 +221,28 @@ importers: version: 4.0.13(react@18.2.0) react-fast-marquee: specifier: 1.6.4 - version: 1.6.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.6.4(react-dom@18.2.0)(react@18.2.0) react-hook-form: specifier: 7.51.3 version: 7.51.3(react@18.2.0) react-i18next: specifier: 14.1.0 - version: 14.1.0(i18next@23.11.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.1.0(i18next@23.11.2)(react-dom@18.2.0)(react@18.2.0) react-markdown: specifier: 9.0.1 version: 9.0.1(@types/react@18.2.79)(react@18.2.0) react-router-dom: specifier: 6.22.3 - version: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.22.3(react-dom@18.2.0)(react@18.2.0) react-transition-group: specifier: 4.4.5 - version: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.4.5(react-dom@18.2.0)(react@18.2.0) react-virtuoso: specifier: 4.7.10 - version: 4.7.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.7.10(react-dom@18.2.0)(react@18.2.0) recoil: specifier: 0.7.7 - version: 0.7.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.7.7(react-dom@18.2.0)(react@18.2.0) swr: specifier: 2.2.5 version: 2.2.5(react@18.2.0) @@ -261,13 +261,13 @@ importers: version: 4.4.10 '@typescript-eslint/eslint-plugin': specifier: 7.7.0 - version: 7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': specifier: 7.7.0 version: 7.7.0(eslint@8.57.0)(typescript@5.4.5) '@vitejs/plugin-react': specifier: 4.2.1 - version: 4.2.1(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)) + version: 4.2.1(vite@5.2.10) sass: specifier: 1.75.0 version: 1.75.0 @@ -276,19 +276,19 @@ importers: version: 1.3.0 vite: specifier: 5.2.10 - version: 5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0) + version: 5.2.10(@types/node@20.12.7)(sass@1.75.0) vite-plugin-monaco-editor: specifier: npm:vite-plugin-monaco-editor-new@1.1.3 version: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.47.0) vite-plugin-sass-dts: specifier: 1.3.17 - version: 1.3.17(postcss@8.4.38)(prettier@3.2.5)(sass@1.75.0)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)) + version: 1.3.17(postcss@8.4.38)(prettier@3.2.5)(sass@1.75.0)(vite@5.2.10) vite-plugin-svgr: specifier: 4.2.0 - version: 4.2.0(rollup@4.13.0)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)) + version: 4.2.0(typescript@5.4.5)(vite@5.2.10) vite-tsconfig-paths: specifier: 4.3.2 - version: 4.3.2(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)) + version: 4.3.2(typescript@5.4.5)(vite@5.2.10) frontend/ui: dependencies: @@ -297,13 +297,13 @@ importers: version: 0.2.7 '@mui/icons-material': specifier: 5.15.15 - version: 5.15.15(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) + version: 5.15.15(@mui/material@5.15.15)(@types/react@18.2.79)(react@18.2.0) '@mui/lab': specifier: 5.0.0-alpha.170 - version: 5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) '@mui/material': specifier: 5.15.15 - version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) '@types/react': specifier: 18.2.79 version: 18.2.79 @@ -312,7 +312,7 @@ importers: version: 3.7.11(react@18.2.0) framer-motion: specifier: 11.1.7 - version: 11.1.7(@emotion/is-prop-valid@1.2.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 11.1.7(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -370,30 +370,30 @@ packages: '@actions/github@6.0.0': resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==} - '@actions/http-client@2.2.0': - resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==} + '@actions/http-client@2.2.1': + resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==} '@adobe/css-tools@4.3.3': resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + '@babel/compat-data@7.24.4': + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.23.6': - resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + '@babel/core@7.24.4': + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.23.6': - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + '@babel/generator@7.24.4': + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.23.6': @@ -412,8 +412,8 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.23.3': @@ -422,8 +422,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.22.5': - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + '@babel/helper-plugin-utils@7.24.0': + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} '@babel/helper-simple-access@7.22.5': @@ -434,8 +434,8 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.22.20': @@ -446,45 +446,45 @@ packages: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.23.6': - resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + '@babel/helpers@7.24.4': + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.23.4': - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} - '@babel/parser@7.23.6': - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + '@babel/parser@7.24.4': + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.23.3': - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + '@babel/plugin-transform-react-jsx-self@7.24.1': + resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.23.3': - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + '@babel/plugin-transform-react-jsx-source@7.24.1': + resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.1': - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + '@babel/runtime@7.24.4': + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} - '@babel/template@7.22.15': - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.23.6': - resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + '@babel/traverse@7.24.1': + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.6': - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} '@commitlint/cli@19.2.2': @@ -573,14 +573,14 @@ packages: '@csstools/css-parser-algorithms': ^2.6.1 '@csstools/css-tokenizer': ^2.2.4 - '@csstools/selector-specificity@3.0.2': - resolution: {integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==} + '@csstools/selector-specificity@3.0.3': + resolution: {integrity: sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.13 - '@ctrl/tinycolor@4.0.3': - resolution: {integrity: sha512-e9nEVehVJwkymQpkGhdSNzLT2Lr9UTTby+JePq4Z2SxBbOQjY7pLgSouAaXvfaGQVSAaY0U4eJdwfSDmCbItcw==} + '@ctrl/tinycolor@4.1.0': + resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} '@dnd-kit/accessibility@3.1.0': @@ -662,8 +662,8 @@ packages: '@emotion/weak-memoize@0.3.1': resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - '@esbuild/aix-ppc64@0.19.10': - resolution: {integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==} + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -674,8 +674,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.10': - resolution: {integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==} + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -686,8 +686,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.10': - resolution: {integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==} + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -698,8 +698,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.10': - resolution: {integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==} + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -710,8 +710,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.10': - resolution: {integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==} + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -722,8 +722,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.10': - resolution: {integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==} + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -734,8 +734,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.10': - resolution: {integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==} + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -746,8 +746,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.10': - resolution: {integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==} + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -758,8 +758,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.10': - resolution: {integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==} + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -770,8 +770,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.10': - resolution: {integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==} + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -782,8 +782,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.10': - resolution: {integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==} + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -794,8 +794,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.10': - resolution: {integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==} + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -806,8 +806,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.10': - resolution: {integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==} + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -818,8 +818,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.10': - resolution: {integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==} + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -830,8 +830,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.10': - resolution: {integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==} + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -842,8 +842,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.10': - resolution: {integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==} + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -854,8 +854,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.10': - resolution: {integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==} + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -866,8 +866,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.10': - resolution: {integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==} + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -878,8 +878,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.10': - resolution: {integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==} + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -890,8 +890,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.10': - resolution: {integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==} + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -902,8 +902,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.10': - resolution: {integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==} + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -914,8 +914,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.10': - resolution: {integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==} + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -926,8 +926,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.10': - resolution: {integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==} + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -956,15 +956,15 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@fastify/busboy@2.1.0': - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} '@floating-ui/core@1.6.0': resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} - '@floating-ui/dom@1.6.1': - resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} + '@floating-ui/dom@1.6.3': + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} '@floating-ui/react-dom@2.0.8': resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} @@ -990,30 +990,26 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.2': - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.20': - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} @@ -1162,50 +1158,52 @@ packages: resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} engines: {node: '>= 18'} - '@octokit/core@5.0.2': - resolution: {integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==} + '@octokit/core@5.2.0': + resolution: {integrity: sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==} engines: {node: '>= 18'} - '@octokit/endpoint@9.0.4': - resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} + '@octokit/endpoint@9.0.5': + resolution: {integrity: sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==} engines: {node: '>= 18'} - '@octokit/graphql@7.0.2': - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + '@octokit/graphql@7.1.0': + resolution: {integrity: sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==} engines: {node: '>= 18'} - '@octokit/openapi-types@19.1.0': - resolution: {integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==} + '@octokit/openapi-types@20.0.0': + resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} - '@octokit/plugin-paginate-rest@9.1.5': - resolution: {integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==} + '@octokit/openapi-types@22.1.0': + resolution: {integrity: sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==} + + '@octokit/plugin-paginate-rest@9.2.1': + resolution: {integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==} engines: {node: '>= 18'} peerDependencies: - '@octokit/core': '>=5' + '@octokit/core': '5' - '@octokit/plugin-rest-endpoint-methods@10.2.0': - resolution: {integrity: sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==} + '@octokit/plugin-rest-endpoint-methods@10.4.1': + resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} engines: {node: '>= 18'} peerDependencies: - '@octokit/core': '>=5' + '@octokit/core': '5' - '@octokit/request-error@5.0.1': - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + '@octokit/request-error@5.1.0': + resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} engines: {node: '>= 18'} - '@octokit/request@8.1.6': - resolution: {integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==} + '@octokit/request@8.4.0': + resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} engines: {node: '>= 18'} - '@octokit/types@12.4.0': - resolution: {integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==} + '@octokit/types@12.6.0': + resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@octokit/types@13.4.1': + resolution: {integrity: sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==} - '@pkgr/utils@2.4.2': - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@popperjs/core@2.11.8': @@ -1215,8 +1213,8 @@ packages: resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} engines: {node: '>=14.0.0'} - '@rollup/pluginutils@5.0.5': - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1224,68 +1222,83 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.13.0': - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + '@rollup/rollup-android-arm-eabi@4.16.1': + resolution: {integrity: sha512-92/y0TqNLRYOTXpm6Z7mnpvKAG9P7qmK7yJeRJSdzElNCUnsgbpAsGqerUboYRIQKzgfq4pWu9xVkgpWLfmNsw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.13.0': - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + '@rollup/rollup-android-arm64@4.16.1': + resolution: {integrity: sha512-ttWB6ZCfRLuDIUiE0yiu5gcqOsYjA5F7kEV1ggHMj20FwLZ8A1FMeahZJFl/pnOmcnD2QL0z4AcDuo27utGU8A==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.13.0': - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + '@rollup/rollup-darwin-arm64@4.16.1': + resolution: {integrity: sha512-QLDvPLetbqjHojTGFw9+nuSP3YY/iz2k1cep6crYlr97sS+ZJ0W43b8Z0zC00+lnFZj6JSNxiA4DjboNQMuh1A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.13.0': - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + '@rollup/rollup-darwin-x64@4.16.1': + resolution: {integrity: sha512-TAUK/D8khRrRIa1KwRzo8JNKk3tcqaeXWdtsiLgA8zmACWwlWLjPCJ4DULGHQrMkeBjp1Cd3Yuwx04lZgFx5Vg==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.16.1': + resolution: {integrity: sha512-KO+WGZjrh6zyFTD1alIFkfdtxf8B4BC+hqd3kBZHscPLvE5FR/6QKsyuCT0JlERxxYBSUKNUQ/UHyX5uwO1x2A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.13.0': - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + '@rollup/rollup-linux-arm-musleabihf@4.16.1': + resolution: {integrity: sha512-NqxbllzIB1WoAo4ThUXVtd21iiM5IHMTTXmXySKBLVcZvkU0HIZmatlP7hLzb5yQubcmdIeWmncd2NdsjocEiw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.16.1': + resolution: {integrity: sha512-snma5NvV8y7IECQ5rq0sr0f3UUu+92NVmG/913JXJMcXo84h9ak9TA5UI9Cl2XRM9j3m37QwDBtEYnJzRkSmxA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.13.0': - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + '@rollup/rollup-linux-arm64-musl@4.16.1': + resolution: {integrity: sha512-KOvqGprlD84ueivhCi2flvcUwDRD20mAsE3vxQNVEI2Di9tnPGAfEu6UcrSPZbM+jG2w1oSr43hrPo0RNg6GGg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.13.0': - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.16.1': + resolution: {integrity: sha512-/gsNwtiGLqYwN4vP+EIdUC6Q6LTlpupWqokqIndvZcjn9ig/5P01WyaYCU2wvfL/2Z82jp5kX8c1mDBOvCP3zg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.16.1': + resolution: {integrity: sha512-uU8zuGkQfGqfD9w6VRJZI4IuG4JIfNxxJgEmLMAmPVHREKGsxFVfgHy5c6CexQF2vOfgjB33OsET3Vdn2lln9A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.13.0': - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + '@rollup/rollup-linux-s390x-gnu@4.16.1': + resolution: {integrity: sha512-lsjLtDgtcGFEuBP6yrXwkRN5/wKlvUZtfbKZZu0yaoNpiBL4epgnO21osAALIspVRnl4qZgyLFd8xjCYYWgwfw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.16.1': + resolution: {integrity: sha512-N2ZizKhUryqqrMfdCnjhJhZRgv61C6gK+hwVtCIKC8ts8J+go+vqENnGexwg21nHIOvLN5mBM8a7DI2vlyIOPg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.13.0': - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + '@rollup/rollup-linux-x64-musl@4.16.1': + resolution: {integrity: sha512-5ICeMxqg66FrOA2AbnBQ2TJVxfvZsKLxmof0ibvPLaYtbsJqnTUtJOofgWb46Gjd4uZcA4rdsp4JCxegzQPqCg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.13.0': - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + '@rollup/rollup-win32-arm64-msvc@4.16.1': + resolution: {integrity: sha512-1vIP6Ce02L+qWD7uZYRiFiuAJo3m9kARatWmFSnss0gZnVj2Id7OPUU9gm49JPGasgcR3xMqiH3fqBJ8t00yVg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.13.0': - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + '@rollup/rollup-win32-ia32-msvc@4.16.1': + resolution: {integrity: sha512-Y3M92DcVsT6LoP+wrKpoUWPaazaP1fzbNkp0a0ZSj5Y//+pQVfVe/tQdsYQQy7dwXR30ZfALUIc9PCh9Izir6w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.13.0': - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + '@rollup/rollup-win32-x64-msvc@4.16.1': + resolution: {integrity: sha512-x0fvpHMuF7fK5r8oZxSi8VYXkrVmRgubXpO/wcf15Lk3xZ4Jvvh5oG+u7Su1776A7XzVKZhD2eRc4t7H50gL3w==} cpu: [x64] os: [win32] @@ -1444,14 +1457,14 @@ packages: '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.6': - resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - '@types/babel__template@7.4.3': - resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.3': - resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} '@types/conventional-commits-parser@5.0.0': resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} @@ -1486,8 +1499,8 @@ packages: '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - '@types/lodash@4.14.202': - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + '@types/lodash@4.17.0': + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} '@types/mdast@4.0.3': resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} @@ -1498,8 +1511,8 @@ packages: '@types/node@20.12.7': resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} - '@types/parse-json@4.0.0': - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} '@types/postcss-modules-local-by-default@4.0.2': resolution: {integrity: sha512-CtYCcD+L+trB3reJPny+bKWKMzPfxEyQpKIwit7kErnOexf5/faaGpkFy4I5AwbV4hp1sk7/aTg0tt0B67VkLQ==} @@ -1507,8 +1520,8 @@ packages: '@types/postcss-modules-scope@3.0.4': resolution: {integrity: sha512-//ygSisVq9kVI0sqx3UPLzWIMCmtSVrzdljtuaAEJtGoGnpjBikZ2sXO5MpH9SnWX9HRfXxHifDAXcQjupWnIQ==} - '@types/prop-types@15.7.11': - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} '@types/react-dom@18.2.25': resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} @@ -1608,8 +1621,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1617,8 +1630,8 @@ packages: resolution: {integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==} engines: {node: '>=6.0'} - agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} ahooks@3.7.11: @@ -1633,8 +1646,8 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} ansi-regex@5.0.1: @@ -1657,8 +1670,8 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} argparse@2.0.1: @@ -1671,20 +1684,20 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlast@1.2.4: - resolution: {integrity: sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: @@ -1709,9 +1722,6 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1742,21 +1752,13 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - before-after-hook@2.2.2: - resolution: {integrity: sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==} + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1785,12 +1787,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} - - bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} @@ -1808,8 +1806,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001599: - resolution: {integrity: sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==} + caniuse-lite@1.0.30001612: + resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1838,8 +1836,8 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} cli-cursor@4.0.0: @@ -1917,8 +1915,8 @@ packages: engines: {node: '>=16'} hasBin: true - convert-source-map@1.8.0: - resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1934,8 +1932,8 @@ packages: cosmiconfig: '>=8.2' typescript: '>=4' - cosmiconfig@7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} cosmiconfig@8.3.6: @@ -1985,10 +1983,22 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} - data-uri-to-buffer@4.0.0: - resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} @@ -2023,22 +2033,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - - default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2099,11 +2097,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - electron-to-chromium@1.4.689: - resolution: {integrity: sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==} + electron-to-chromium@1.4.745: + resolution: {integrity: sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA==} emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -2111,9 +2106,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2129,8 +2121,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.22.5: - resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} es-define-property@1.0.0: @@ -2141,8 +2133,12 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.17: - resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.0.3: @@ -2156,8 +2152,8 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - esbuild@0.19.10: - resolution: {integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==} + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true @@ -2166,8 +2162,8 @@ packages: engines: {node: '>=12'} hasBin: true - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -2178,8 +2174,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-compat-utils@0.1.2: - resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + eslint-compat-utils@0.5.0: + resolution: {integrity: sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' @@ -2208,8 +2204,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2229,8 +2225,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-es-x@7.5.0: - resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + eslint-plugin-es-x@7.6.0: + resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -2327,14 +2323,6 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -2362,11 +2350,11 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fetch-blob@3.1.5: - resolution: {integrity: sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} file-entry-cache@6.0.1: @@ -2396,12 +2384,12 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@4.0.0: - resolution: {integrity: sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} @@ -2415,10 +2403,6 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -2487,10 +2471,6 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -2499,8 +2479,8 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} @@ -2515,11 +2495,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -2560,8 +2535,8 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - graceful-fs@4.2.9: - resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -2595,8 +2570,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} hast-util-to-jsx-runtime@2.3.0: @@ -2628,14 +2603,6 @@ packages: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -2667,8 +2634,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - immutable@4.0.0: - resolution: {integrity: sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==} + immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -2694,15 +2661,15 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inline-style-parser@0.2.2: - resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} - intersection-observer@0.12.0: - resolution: {integrity: sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ==} + intersection-observer@0.12.2: + resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2743,6 +2710,10 @@ packages: is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -2750,16 +2721,6 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2790,13 +2751,9 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} @@ -2830,17 +2787,14 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2861,22 +2815,20 @@ packages: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2886,10 +2838,6 @@ packages: iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true @@ -2900,8 +2848,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@8.0.2: - resolution: {integrity: sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==} + js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -3051,10 +2999,6 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3075,8 +3019,8 @@ packages: mdast-util-mdx-expression@2.0.0: resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} - mdast-util-mdx-jsx@3.1.0: - resolution: {integrity: sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==} + mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} mdast-util-mdxjs-esm@2.0.1: resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} @@ -3166,8 +3110,8 @@ packages: micromark-util-sanitize-uri@2.0.0: resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} micromark-util-symbol@2.0.0: resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} @@ -3213,10 +3157,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - monaco-editor@0.47.0: resolution: {integrity: sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==} @@ -3227,6 +3167,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mui-color-input@2.0.3: resolution: {integrity: sha512-rAd040qQ0Y+8dk4gE8kkCiJ/vCgA0j4vv1quJ43BfORTFE3uHarHj0xY1Vo9CPbojtx1f5vW+CjckYPRIZPIRg==} peerDependencies: @@ -3296,12 +3239,8 @@ packages: engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} hasBin: true - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} object-assign@4.1.1: @@ -3319,22 +3258,24 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} - object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} - object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} - object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} ofetch@1.3.4: @@ -3351,10 +3292,6 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -3417,10 +3354,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3557,8 +3490,8 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -3680,12 +3613,12 @@ packages: react-native: optional: true - reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} - regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} @@ -3741,37 +3674,25 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true - rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true - - rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + rollup@4.16.1: + resolution: {integrity: sha512-5CaD3MPDlPKfhqzRvWXK96G6ELJfPZNb3LHiZxTHgDdC6jvwfGz2E8nY+9g1ONk4ttHsK1WaFP19Js4PSr1E3g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-compare@1.1.4: resolution: {integrity: sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==} @@ -3814,12 +3735,12 @@ packages: engines: {node: '>=10'} hasBin: true - set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} shebang-command@2.0.0: @@ -3836,8 +3757,9 @@ packages: shiki@1.3.0: resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3896,29 +3818,27 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} - string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} - - string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -3932,10 +3852,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -3944,8 +3860,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - style-to-object@1.0.5: - resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} stylelint-config-html@1.1.0: resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} @@ -4027,12 +3943,12 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - synckit@0.8.6: - resolution: {integrity: sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==} + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} - table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} telegraf@4.16.3: @@ -4050,10 +3966,6 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -4114,10 +4026,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -4130,8 +4038,8 @@ packages: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} - typed-array-length@1.0.5: - resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} typescript-plugin-css-modules@5.1.0: @@ -4153,8 +4061,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.2: - resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} unicorn-magic@0.1.0: @@ -4182,17 +4090,13 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - universal-user-agent@6.0.0: - resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - update-browserslist-db@1.0.13: resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -4275,8 +4179,8 @@ packages: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - web-streams-polyfill@3.2.0: - resolution: {integrity: sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} webidl-conversions@3.0.1: @@ -4292,11 +4196,12 @@ packages: resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} - which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} which@1.3.1: @@ -4312,10 +4217,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrap-ansi@9.0.0: resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} @@ -4370,42 +4271,42 @@ snapshots: '@actions/github@6.0.0': dependencies: - '@actions/http-client': 2.2.0 - '@octokit/core': 5.0.2 - '@octokit/plugin-paginate-rest': 9.1.5(@octokit/core@5.0.2) - '@octokit/plugin-rest-endpoint-methods': 10.2.0(@octokit/core@5.0.2) + '@actions/http-client': 2.2.1 + '@octokit/core': 5.2.0 + '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) + '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) - '@actions/http-client@2.2.0': + '@actions/http-client@2.2.1': dependencies: tunnel: 0.0.6 - undici: 5.28.2 + undici: 5.28.4 '@adobe/css-tools@4.3.3': {} - '@ampproject/remapping@2.2.1': + '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.23.5': + '@babel/code-frame@7.24.2': dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 - '@babel/compat-data@7.23.5': {} + '@babel/compat-data@7.24.4': {} - '@babel/core@7.23.6': + '@babel/core@7.24.4': dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helpers': 7.23.6 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -4414,16 +4315,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.23.6': + '@babel/generator@7.24.4': dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/helper-compilation-targets@7.23.6': dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.24.4 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 @@ -4433,98 +4334,99 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 - '@babel/helper-module-imports@7.22.15': + '@babel/helper-module-imports@7.24.3': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6)': + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - '@babel/helper-plugin-utils@7.22.5': {} + '@babel/helper-plugin-utils@7.24.0': {} '@babel/helper-simple-access@7.22.5': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 - '@babel/helper-string-parser@7.23.4': {} + '@babel/helper-string-parser@7.24.1': {} '@babel/helper-validator-identifier@7.22.20': {} '@babel/helper-validator-option@7.23.5': {} - '@babel/helpers@7.23.6': + '@babel/helpers@7.24.4': dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color - '@babel/highlight@7.23.4': + '@babel/highlight@7.24.2': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.0 - '@babel/parser@7.23.6': + '@babel/parser@7.24.4': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 - '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.6)': + '@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.6)': + '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 - '@babel/runtime@7.24.1': + '@babel/runtime@7.24.4': dependencies: - regenerator-runtime: 0.14.0 + regenerator-runtime: 0.14.1 - '@babel/template@7.22.15': + '@babel/template@7.24.0': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 - '@babel/traverse@7.23.6': + '@babel/traverse@7.24.1': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.23.6': + '@babel/types@7.24.0': dependencies: - '@babel/helper-string-parser': 7.23.4 + '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 @@ -4587,7 +4489,7 @@ snapshots: '@commitlint/types': 19.0.3 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.4.5) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.7)(cosmiconfig@9.0.0(typescript@5.4.5))(typescript@5.4.5) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.7)(cosmiconfig@9.0.0)(typescript@5.4.5) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -4645,23 +4547,23 @@ snapshots: '@csstools/css-tokenizer@2.2.4': {} - '@csstools/media-query-list-parser@2.1.9(@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4))(@csstools/css-tokenizer@2.2.4)': + '@csstools/media-query-list-parser@2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4)': dependencies: '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) '@csstools/css-tokenizer': 2.2.4 - '@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.16)': + '@csstools/selector-specificity@3.0.3(postcss-selector-parser@6.0.16)': dependencies: postcss-selector-parser: 6.0.16 - '@ctrl/tinycolor@4.0.3': {} + '@ctrl/tinycolor@4.1.0': {} '@dnd-kit/accessibility@3.1.0(react@18.2.0)': dependencies: react: 18.2.0 tslib: 2.6.2 - '@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0)': dependencies: '@dnd-kit/accessibility': 3.1.0(react@18.2.0) '@dnd-kit/utilities': 3.2.2(react@18.2.0) @@ -4669,9 +4571,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 - '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0)': dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) '@dnd-kit/utilities': 3.2.2(react@18.2.0) react: 18.2.0 tslib: 2.6.2 @@ -4685,13 +4587,13 @@ snapshots: '@emotion/babel-plugin@11.11.0': dependencies: - '@babel/helper-module-imports': 7.22.15 - '@babel/runtime': 7.24.1 + '@babel/helper-module-imports': 7.24.3 + '@babel/runtime': 7.24.4 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.4 babel-plugin-macros: 3.1.0 - convert-source-map: 1.8.0 + convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 find-root: 1.1.0 source-map: 0.5.7 @@ -4715,17 +4617,16 @@ snapshots: '@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.79 hoist-non-react-statics: 3.3.2 react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.79 '@emotion/serialize@1.1.4': dependencies: @@ -4737,18 +4638,17 @@ snapshots: '@emotion/sheet@1.2.2': {} - '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0)': + '@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.2.79)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.2 '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) '@emotion/serialize': 1.1.4 '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 - react: 18.2.0 - optionalDependencies: '@types/react': 18.2.79 + react: 18.2.0 '@emotion/unitless@0.8.1': {} @@ -4760,139 +4660,139 @@ snapshots: '@emotion/weak-memoize@0.3.1': {} - '@esbuild/aix-ppc64@0.19.10': + '@esbuild/aix-ppc64@0.19.12': optional: true '@esbuild/aix-ppc64@0.20.2': optional: true - '@esbuild/android-arm64@0.19.10': + '@esbuild/android-arm64@0.19.12': optional: true '@esbuild/android-arm64@0.20.2': optional: true - '@esbuild/android-arm@0.19.10': + '@esbuild/android-arm@0.19.12': optional: true '@esbuild/android-arm@0.20.2': optional: true - '@esbuild/android-x64@0.19.10': + '@esbuild/android-x64@0.19.12': optional: true '@esbuild/android-x64@0.20.2': optional: true - '@esbuild/darwin-arm64@0.19.10': + '@esbuild/darwin-arm64@0.19.12': optional: true '@esbuild/darwin-arm64@0.20.2': optional: true - '@esbuild/darwin-x64@0.19.10': + '@esbuild/darwin-x64@0.19.12': optional: true '@esbuild/darwin-x64@0.20.2': optional: true - '@esbuild/freebsd-arm64@0.19.10': + '@esbuild/freebsd-arm64@0.19.12': optional: true '@esbuild/freebsd-arm64@0.20.2': optional: true - '@esbuild/freebsd-x64@0.19.10': + '@esbuild/freebsd-x64@0.19.12': optional: true '@esbuild/freebsd-x64@0.20.2': optional: true - '@esbuild/linux-arm64@0.19.10': + '@esbuild/linux-arm64@0.19.12': optional: true '@esbuild/linux-arm64@0.20.2': optional: true - '@esbuild/linux-arm@0.19.10': + '@esbuild/linux-arm@0.19.12': optional: true '@esbuild/linux-arm@0.20.2': optional: true - '@esbuild/linux-ia32@0.19.10': + '@esbuild/linux-ia32@0.19.12': optional: true '@esbuild/linux-ia32@0.20.2': optional: true - '@esbuild/linux-loong64@0.19.10': + '@esbuild/linux-loong64@0.19.12': optional: true '@esbuild/linux-loong64@0.20.2': optional: true - '@esbuild/linux-mips64el@0.19.10': + '@esbuild/linux-mips64el@0.19.12': optional: true '@esbuild/linux-mips64el@0.20.2': optional: true - '@esbuild/linux-ppc64@0.19.10': + '@esbuild/linux-ppc64@0.19.12': optional: true '@esbuild/linux-ppc64@0.20.2': optional: true - '@esbuild/linux-riscv64@0.19.10': + '@esbuild/linux-riscv64@0.19.12': optional: true '@esbuild/linux-riscv64@0.20.2': optional: true - '@esbuild/linux-s390x@0.19.10': + '@esbuild/linux-s390x@0.19.12': optional: true '@esbuild/linux-s390x@0.20.2': optional: true - '@esbuild/linux-x64@0.19.10': + '@esbuild/linux-x64@0.19.12': optional: true '@esbuild/linux-x64@0.20.2': optional: true - '@esbuild/netbsd-x64@0.19.10': + '@esbuild/netbsd-x64@0.19.12': optional: true '@esbuild/netbsd-x64@0.20.2': optional: true - '@esbuild/openbsd-x64@0.19.10': + '@esbuild/openbsd-x64@0.19.12': optional: true '@esbuild/openbsd-x64@0.20.2': optional: true - '@esbuild/sunos-x64@0.19.10': + '@esbuild/sunos-x64@0.19.12': optional: true '@esbuild/sunos-x64@0.20.2': optional: true - '@esbuild/win32-arm64@0.19.10': + '@esbuild/win32-arm64@0.19.12': optional: true '@esbuild/win32-arm64@0.20.2': optional: true - '@esbuild/win32-ia32@0.19.10': + '@esbuild/win32-ia32@0.19.12': optional: true '@esbuild/win32-ia32@0.20.2': optional: true - '@esbuild/win32-x64@0.19.10': + '@esbuild/win32-x64@0.19.12': optional: true '@esbuild/win32-x64@0.20.2': @@ -4921,36 +4821,36 @@ snapshots: '@eslint/js@8.57.0': {} - '@fastify/busboy@2.1.0': {} + '@fastify/busboy@2.1.1': {} '@floating-ui/core@1.6.0': dependencies: '@floating-ui/utils': 0.2.1 - '@floating-ui/dom@1.6.1': + '@floating-ui/dom@1.6.3': dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 - '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@floating-ui/dom': 1.6.1 + '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) '@floating-ui/utils@0.2.1': {} - '@generouted/react-router@1.19.3(react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0))': + '@generouted/react-router@1.19.3(react-router-dom@6.22.3)(react@18.2.0)(vite@5.2.10)': dependencies: fast-glob: 3.3.2 - generouted: 1.19.3(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)) + generouted: 1.19.3(vite@5.2.10) react: 18.2.0 - react-router-dom: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - vite: 5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0) + react-router-dom: 6.22.3(react-dom@18.2.0)(react@18.2.0) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.2 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -4958,87 +4858,78 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.2': {} + '@humanwhocodes/object-schema@2.0.3': {} - '@isaacs/cliui@8.0.2': + '@jridgewell/gen-mapping@0.3.5': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.3': - dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/trace-mapping@0.3.20': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@juggle/resize-observer@3.4.0': {} '@material/material-color-utilities@0.2.7': {} - '@mui/base@5.0.0-beta.40(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mui/base@5.0.0-beta.40(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.24.4 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.79) '@mui/utils': 5.15.14(@types/react@18.2.79)(react@18.2.0) '@popperjs/core': 2.11.8 + '@types/react': 18.2.79 clsx: 2.1.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.79 '@mui/core-downloads-tracker@5.15.15': {} - '@mui/icons-material@5.15.15(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react@18.2.0)': + '@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.2.79)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/material': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - optionalDependencies: + '@babel/runtime': 7.24.4 + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.79 + react: 18.2.0 - '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/base': 5.0.0-beta.40(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mui/material': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.79)(react@18.2.0) + '@mui/base': 5.0.0-beta.40(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.79) '@mui/utils': 5.15.14(@types/react@18.2.79)(react@18.2.0) + '@types/react': 18.2.79 clsx: 2.1.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/base': 5.0.0-beta.40(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.79)(react@18.2.0) + '@mui/base': 5.0.0-beta.40(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) '@mui/core-downloads-tracker': 5.15.15 - '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.79) '@mui/utils': 5.15.14(@types/react@18.2.79)(react@18.2.0) + '@types/react': 18.2.79 '@types/react-transition-group': 4.4.10 clsx: 2.1.0 csstype: 3.1.3 @@ -5046,67 +4937,59 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 - react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) '@mui/private-theming@5.15.14(@types/react@18.2.79)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@mui/utils': 5.15.14(@types/react@18.2.79)(react@18.2.0) + '@types/react': 18.2.79 prop-types: 15.8.1 react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.79 - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)': + '@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.79)(react@18.2.0) csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) - '@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0)': + '@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.79)(react@18.2.0) '@mui/private-theming': 5.15.14(@types/react@18.2.79)(react@18.2.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.79) '@mui/utils': 5.15.14(@types/react@18.2.79)(react@18.2.0) + '@types/react': 18.2.79 clsx: 2.1.0 csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 - optionalDependencies: - '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 '@mui/types@7.2.14(@types/react@18.2.79)': - optionalDependencies: + dependencies: '@types/react': 18.2.79 '@mui/utils@5.15.14(@types/react@18.2.79)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 - '@types/prop-types': 15.7.11 + '@babel/runtime': 7.24.4 + '@types/prop-types': 15.7.12 + '@types/react': 18.2.79 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 - optionalDependencies: - '@types/react': 18.2.79 - '@mui/x-data-grid@7.3.0(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mui/x-data-grid@7.3.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.1 - '@mui/material': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) + '@babel/runtime': 7.24.4 + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react@18.2.0) '@mui/utils': 5.15.14(@types/react@18.2.79)(react@18.2.0) clsx: 2.1.0 prop-types: 15.8.1 @@ -5128,173 +5011,176 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.17.1 '@octokit/auth-token@4.0.0': {} - '@octokit/core@5.0.2': + '@octokit/core@5.2.0': dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.0.2 - '@octokit/request': 8.1.6 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.4.0 - before-after-hook: 2.2.2 - universal-user-agent: 6.0.0 + '@octokit/graphql': 7.1.0 + '@octokit/request': 8.4.0 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.4.1 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 - '@octokit/endpoint@9.0.4': + '@octokit/endpoint@9.0.5': dependencies: - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.0 + '@octokit/types': 13.4.1 + universal-user-agent: 6.0.1 - '@octokit/graphql@7.0.2': + '@octokit/graphql@7.1.0': dependencies: - '@octokit/request': 8.1.6 - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.0 + '@octokit/request': 8.4.0 + '@octokit/types': 13.4.1 + universal-user-agent: 6.0.1 - '@octokit/openapi-types@19.1.0': {} + '@octokit/openapi-types@20.0.0': {} - '@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2)': + '@octokit/openapi-types@22.1.0': {} + + '@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.2.0)': dependencies: - '@octokit/core': 5.0.2 - '@octokit/types': 12.4.0 + '@octokit/core': 5.2.0 + '@octokit/types': 12.6.0 - '@octokit/plugin-rest-endpoint-methods@10.2.0(@octokit/core@5.0.2)': + '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.0)': dependencies: - '@octokit/core': 5.0.2 - '@octokit/types': 12.4.0 + '@octokit/core': 5.2.0 + '@octokit/types': 12.6.0 - '@octokit/request-error@5.0.1': + '@octokit/request-error@5.1.0': dependencies: - '@octokit/types': 12.4.0 + '@octokit/types': 13.4.1 deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@8.1.6': + '@octokit/request@8.4.0': dependencies: - '@octokit/endpoint': 9.0.4 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.0 + '@octokit/endpoint': 9.0.5 + '@octokit/request-error': 5.1.0 + '@octokit/types': 13.4.1 + universal-user-agent: 6.0.1 - '@octokit/types@12.4.0': + '@octokit/types@12.6.0': dependencies: - '@octokit/openapi-types': 19.1.0 + '@octokit/openapi-types': 20.0.0 - '@pkgjs/parseargs@0.11.0': - optional: true - - '@pkgr/utils@2.4.2': + '@octokit/types@13.4.1': dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.3.2 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.6.2 + '@octokit/openapi-types': 22.1.0 + + '@pkgr/core@0.1.1': {} '@popperjs/core@2.11.8': {} '@remix-run/router@1.15.3': {} - '@rollup/pluginutils@5.0.5(rollup@4.13.0)': + '@rollup/pluginutils@5.1.0': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - optionalDependencies: - rollup: 4.13.0 - '@rollup/rollup-android-arm-eabi@4.13.0': + '@rollup/rollup-android-arm-eabi@4.16.1': optional: true - '@rollup/rollup-android-arm64@4.13.0': + '@rollup/rollup-android-arm64@4.16.1': optional: true - '@rollup/rollup-darwin-arm64@4.13.0': + '@rollup/rollup-darwin-arm64@4.16.1': optional: true - '@rollup/rollup-darwin-x64@4.13.0': + '@rollup/rollup-darwin-x64@4.16.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': + '@rollup/rollup-linux-arm-gnueabihf@4.16.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.13.0': + '@rollup/rollup-linux-arm-musleabihf@4.16.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.13.0': + '@rollup/rollup-linux-arm64-gnu@4.16.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.13.0': + '@rollup/rollup-linux-arm64-musl@4.16.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.13.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.16.1': optional: true - '@rollup/rollup-linux-x64-musl@4.13.0': + '@rollup/rollup-linux-riscv64-gnu@4.16.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.13.0': + '@rollup/rollup-linux-s390x-gnu@4.16.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.13.0': + '@rollup/rollup-linux-x64-gnu@4.16.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.13.0': + '@rollup/rollup-linux-x64-musl@4.16.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.16.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.16.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.16.1': optional: true '@shikijs/core@1.3.0': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.6)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.4 - '@svgr/babel-preset@8.1.0(@babel/core@7.23.6)': + '@svgr/babel-preset@8.1.0(@babel/core@7.24.4)': dependencies: - '@babel/core': 7.23.6 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.6) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.6) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.6) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.23.6) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.23.6) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.6) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.23.6) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.6) + '@babel/core': 7.24.4 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.4) '@svgr/core@8.1.0(typescript@5.4.5)': dependencies: - '@babel/core': 7.23.6 - '@svgr/babel-preset': 8.1.0(@babel/core@7.23.6) + '@babel/core': 7.24.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.4) camelcase: 6.3.0 cosmiconfig: 8.3.6(typescript@5.4.5) snake-case: 3.0.4 @@ -5304,13 +5190,13 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.4.5))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0)': dependencies: - '@babel/core': 7.23.6 - '@svgr/babel-preset': 8.1.0(@babel/core@7.23.6) + '@babel/core': 7.24.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.4) '@svgr/core': 8.1.0(typescript@5.4.5) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 @@ -5376,24 +5262,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - '@types/babel__generator': 7.6.6 - '@types/babel__template': 7.4.3 - '@types/babel__traverse': 7.20.3 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 - '@types/babel__generator@7.6.6': + '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 - '@types/babel__template@7.4.3': + '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 - '@types/babel__traverse@7.20.3': + '@types/babel__traverse@7.20.5': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 '@types/conventional-commits-parser@5.0.0': dependencies: @@ -5430,9 +5316,9 @@ snapshots: '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.14.202 + '@types/lodash': 4.17.0 - '@types/lodash@4.14.202': {} + '@types/lodash@4.17.0': {} '@types/mdast@4.0.3': dependencies: @@ -5444,7 +5330,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/parse-json@4.0.0': {} + '@types/parse-json@4.0.2': {} '@types/postcss-modules-local-by-default@4.0.2': dependencies: @@ -5454,7 +5340,7 @@ snapshots: dependencies: postcss: 8.4.38 - '@types/prop-types@15.7.11': {} + '@types/prop-types@15.7.12': {} '@types/react-dom@18.2.25': dependencies: @@ -5466,7 +5352,7 @@ snapshots: '@types/react@18.2.79': dependencies: - '@types/prop-types': 15.7.11 + '@types/prop-types': 15.7.12 csstype: 3.1.3 '@types/semver@7.5.8': {} @@ -5475,7 +5361,7 @@ snapshots: '@types/unist@3.0.2': {} - '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) @@ -5490,7 +5376,6 @@ snapshots: natural-compare: 1.4.0 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5503,7 +5388,6 @@ snapshots: '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 8.57.0 - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5520,7 +5404,6 @@ snapshots: debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5537,7 +5420,6 @@ snapshots: minimatch: 9.0.4 semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -5563,14 +5445,14 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.2.1(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0))': + '@vitejs/plugin-react@4.2.1(vite@5.2.10)': dependencies: - '@babel/core': 7.23.6 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.6) + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) transitivePeerDependencies: - supports-color @@ -5583,15 +5465,15 @@ snapshots: dependencies: event-target-shim: 5.0.1 - acorn-jsx@5.3.2(acorn@8.11.2): + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: - acorn: 8.11.2 + acorn: 8.11.3 - acorn@8.11.2: {} + acorn@8.11.3: {} adm-zip@0.5.12: {} - agent-base@7.1.0: + agent-base@7.1.1: dependencies: debug: 4.3.4 transitivePeerDependencies: @@ -5599,9 +5481,9 @@ snapshots: ahooks@3.7.11(react@18.2.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dayjs: 1.11.10 - intersection-observer: 0.12.0 + intersection-observer: 0.12.2 js-cookie: 2.2.1 lodash: 4.17.21 react: 18.2.0 @@ -5624,9 +5506,7 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ansi-escapes@6.2.0: - dependencies: - type-fest: 3.13.1 + ansi-escapes@6.2.1: {} ansi-regex@5.0.1: {} @@ -5642,7 +5522,7 @@ snapshots: ansi-styles@6.2.1: {} - anymatch@3.1.2: + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 @@ -5656,58 +5536,61 @@ snapshots: array-ify@1.0.0: {} - array-includes@3.1.7: + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 array-union@2.1.0: {} - array.prototype.findlast@1.2.4: + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - array.prototype.findlastindex@1.2.3: + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.4 array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 @@ -5716,7 +5599,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -5724,16 +5607,12 @@ snapshots: astral-regex@2.0.0: {} - asynciterator.prototype@1.0.0: - dependencies: - has-symbols: 1.0.3 - asynckit@0.4.0: {} autoprefixer@10.4.19(postcss@8.4.38): dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001599 + caniuse-lite: 1.0.30001612 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -5754,8 +5633,8 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.24.1 - cosmiconfig: 7.0.1 + '@babel/runtime': 7.24.4 + cosmiconfig: 7.1.0 resolve: 1.22.8 bail@2.0.2: {} @@ -5764,15 +5643,9 @@ snapshots: balanced-match@2.0.0: {} - before-after-hook@2.2.2: {} + before-after-hook@2.2.3: {} - big-integer@1.6.52: {} - - binary-extensions@2.2.0: {} - - bplist-parser@0.2.0: - dependencies: - big-integer: 1.6.52 + binary-extensions@2.3.0: {} brace-expansion@1.1.11: dependencies: @@ -5789,8 +5662,8 @@ snapshots: browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001599 - electron-to-chromium: 1.4.689 + caniuse-lite: 1.0.30001612 + electron-to-chromium: 1.4.745 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -5805,21 +5678,17 @@ snapshots: builtin-modules@3.3.0: {} - builtins@5.0.1: + builtins@5.1.0: dependencies: semver: 7.6.0 - bundle-name@3.0.0: - dependencies: - run-applescript: 5.0.0 - call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + set-function-length: 1.2.2 callsites@3.1.0: {} @@ -5827,7 +5696,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001599: {} + caniuse-lite@1.0.30001612: {} ccount@2.0.1: {} @@ -5852,9 +5721,9 @@ snapshots: character-reference-invalid@2.0.1: {} - chokidar@3.5.3: + chokidar@3.6.0: dependencies: - anymatch: 3.1.2 + anymatch: 3.1.3 braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 @@ -5871,7 +5740,7 @@ snapshots: cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 - string-width: 7.0.0 + string-width: 7.1.0 client-only@0.0.1: {} @@ -5933,9 +5802,7 @@ snapshots: meow: 12.1.1 split2: 4.2.0 - convert-source-map@1.8.0: - dependencies: - safe-buffer: 5.1.2 + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -5943,16 +5810,16 @@ snapshots: dependencies: is-what: 3.14.1 - cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.7)(cosmiconfig@9.0.0(typescript@5.4.5))(typescript@5.4.5): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.7)(cosmiconfig@9.0.0)(typescript@5.4.5): dependencies: '@types/node': 20.12.7 cosmiconfig: 9.0.0(typescript@5.4.5) jiti: 1.21.0 typescript: 5.4.5 - cosmiconfig@7.0.1: + cosmiconfig@7.1.0: dependencies: - '@types/parse-json': 4.0.0 + '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -5964,7 +5831,6 @@ snapshots: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - optionalDependencies: typescript: 5.4.5 cosmiconfig@9.0.0(typescript@5.4.5): @@ -5973,7 +5839,6 @@ snapshots: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - optionalDependencies: typescript: 5.4.5 cross-env@7.0.3: @@ -5999,13 +5864,31 @@ snapshots: dargs@8.1.0: {} - data-uri-to-buffer@4.0.0: {} + data-uri-to-buffer@4.0.1: {} + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 dayjs@1.11.10: {} debug@3.2.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 debug@4.3.4: dependencies: @@ -6015,32 +5898,16 @@ snapshots: dependencies: character-entities: 2.0.2 - dedent@1.5.3(babel-plugin-macros@3.1.0): - optionalDependencies: - babel-plugin-macros: 3.1.0 + dedent@1.5.3: {} deep-is@0.1.4: {} - default-browser-id@3.0.0: - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - - default-browser@4.0.0: - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - define-lazy-prop@3.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -6073,7 +5940,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 csstype: 3.1.3 dom-serializer@2.0.0: @@ -6105,16 +5972,12 @@ snapshots: dotenv@16.4.5: {} - eastasianwidth@0.2.0: {} - - electron-to-chromium@1.4.689: {} + electron-to-chromium@1.4.745: {} emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - entities@4.5.0: {} env-paths@2.2.1: {} @@ -6128,14 +5991,18 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.22.5: + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 es-define-property: 1.0.0 es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 @@ -6146,10 +6013,11 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 + hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 + is-data-view: 1.0.1 is-negative-zero: 2.0.3 is-regex: 1.1.4 is-shared-array-buffer: 1.0.3 @@ -6160,17 +6028,17 @@ snapshots: object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.5 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 es-define-property@1.0.0: dependencies: @@ -6178,12 +6046,11 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.0.17: + es-iterator-helpers@1.0.18: dependencies: - asynciterator.prototype: 1.0.0 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 @@ -6194,17 +6061,21 @@ snapshots: has-symbols: 1.0.3 internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.1.0 + safe-array-concat: 1.1.2 + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 es-to-primitive@1.2.1: dependencies: @@ -6212,31 +6083,31 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - esbuild@0.19.10: + esbuild@0.19.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.10 - '@esbuild/android-arm': 0.19.10 - '@esbuild/android-arm64': 0.19.10 - '@esbuild/android-x64': 0.19.10 - '@esbuild/darwin-arm64': 0.19.10 - '@esbuild/darwin-x64': 0.19.10 - '@esbuild/freebsd-arm64': 0.19.10 - '@esbuild/freebsd-x64': 0.19.10 - '@esbuild/linux-arm': 0.19.10 - '@esbuild/linux-arm64': 0.19.10 - '@esbuild/linux-ia32': 0.19.10 - '@esbuild/linux-loong64': 0.19.10 - '@esbuild/linux-mips64el': 0.19.10 - '@esbuild/linux-ppc64': 0.19.10 - '@esbuild/linux-riscv64': 0.19.10 - '@esbuild/linux-s390x': 0.19.10 - '@esbuild/linux-x64': 0.19.10 - '@esbuild/netbsd-x64': 0.19.10 - '@esbuild/openbsd-x64': 0.19.10 - '@esbuild/sunos-x64': 0.19.10 - '@esbuild/win32-arm64': 0.19.10 - '@esbuild/win32-ia32': 0.19.10 - '@esbuild/win32-x64': 0.19.10 + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 esbuild@0.20.2: optionalDependencies: @@ -6264,28 +6135,29 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - escalade@3.1.1: {} + escalade@3.1.2: {} escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.1.2(eslint@8.57.0): + eslint-compat-utils@0.5.0(eslint@8.57.0): dependencies: eslint: 8.57.0 + semver: 7.6.0 eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint-plugin-n@16.6.2(eslint@8.57.0))(eslint-plugin-promise@6.1.1(eslint@8.57.0))(eslint@8.57.0): + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@16.6.2)(eslint-plugin-promise@6.1.1)(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-plugin-import: 2.29.1(eslint@8.57.0) eslint-plugin-n: 16.6.2(eslint@8.57.0) eslint-plugin-promise: 6.1.1(eslint@8.57.0) - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1(eslint@8.57.0)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1): dependencies: eslint-plugin-import: 2.29.1(eslint@8.57.0) @@ -6297,21 +6169,20 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: debug: 3.2.7 - optionalDependencies: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.5.0(eslint@8.57.0): + eslint-plugin-es-x@7.6.0(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 eslint: 8.57.0 - eslint-compat-utils: 0.1.2(eslint@8.57.0) + eslint-compat-utils: 0.5.0(eslint@8.57.0) eslint-plugin-html@8.1.0: dependencies: @@ -6319,22 +6190,22 @@ snapshots: eslint-plugin-import@2.29.1(eslint@8.57.0): dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) - hasown: 2.0.1 + eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 transitivePeerDependencies: @@ -6345,10 +6216,10 @@ snapshots: eslint-plugin-n@16.6.2(eslint@8.57.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - builtins: 5.0.1 + builtins: 5.1.0 eslint: 8.57.0 - eslint-plugin-es-x: 7.5.0(eslint@8.57.0) - get-tsconfig: 4.7.2 + eslint-plugin-es-x: 7.6.0(eslint@8.57.0) + get-tsconfig: 4.7.3 globals: 13.24.0 ignore: 5.3.1 is-builtin-module: 3.2.1 @@ -6357,14 +6228,13 @@ snapshots: resolve: 1.22.8 semver: 7.6.0 - eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): dependencies: eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 - synckit: 0.8.6 - optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@8.57.0) + synckit: 0.8.8 eslint-plugin-promise@6.1.1(eslint@8.57.0): dependencies: @@ -6372,25 +6242,25 @@ snapshots: eslint-plugin-react@7.34.1(eslint@8.57.0): dependencies: - array-includes: 3.1.7 - array.prototype.findlast: 1.2.4 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.17 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.11 eslint-scope@7.2.2: dependencies: @@ -6444,8 +6314,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 esquery@1.5.0: @@ -6468,30 +6338,6 @@ snapshots: eventemitter3@5.0.1: {} - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@7.2.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.3 @@ -6499,7 +6345,7 @@ snapshots: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -6524,14 +6370,14 @@ snapshots: fastest-levenshtein@1.0.16: {} - fastq@1.15.0: + fastq@1.17.1: dependencies: reusify: 1.0.4 - fetch-blob@3.1.5: + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 - web-streams-polyfill: 3.2.0 + web-streams-polyfill: 3.3.3 file-entry-cache@6.0.1: dependencies: @@ -6539,7 +6385,7 @@ snapshots: file-entry-cache@8.0.0: dependencies: - flat-cache: 4.0.0 + flat-cache: 4.0.1 fill-range@7.0.1: dependencies: @@ -6560,17 +6406,16 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - flat-cache@4.0.0: + flat-cache@4.0.1: dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 - rimraf: 5.0.5 - flatted@3.2.9: {} + flatted@3.3.1: {} follow-redirects@1.15.6: {} @@ -6578,11 +6423,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -6591,23 +6431,21 @@ snapshots: formdata-polyfill@4.0.10: dependencies: - fetch-blob: 3.1.5 + fetch-blob: 3.2.0 fraction.js@4.3.7: {} - framer-motion@11.1.7(@emotion/is-prop-valid@1.2.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + framer-motion@11.1.7(react-dom@18.2.0)(react@18.2.0): dependencies: - tslib: 2.6.2 - optionalDependencies: - '@emotion/is-prop-valid': 1.2.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 fs-extra@11.2.0: dependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 fs.realpath@1.0.0: {} @@ -6620,14 +6458,14 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} - generouted@1.19.3(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)): + generouted@1.19.3(vite@5.2.10): dependencies: - vite: 5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) gensync@1.0.0-beta.2: {} @@ -6641,9 +6479,7 @@ snapshots: function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.1 - - get-stream@6.0.1: {} + hasown: 2.0.2 get-stream@8.0.1: {} @@ -6653,7 +6489,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.2: + get-tsconfig@4.7.3: dependencies: resolve-pkg-maps: 1.0.0 @@ -6671,14 +6507,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -6729,7 +6557,7 @@ snapshots: dependencies: get-intrinsic: 1.2.4 - graceful-fs@4.2.9: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -6753,7 +6581,7 @@ snapshots: dependencies: has-symbols: 1.0.3 - hasown@2.0.1: + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -6767,11 +6595,11 @@ snapshots: estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.0 + mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.5 + style-to-object: 1.0.6 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -6809,22 +6637,18 @@ snapshots: https-proxy-agent@7.0.4: dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} - - human-signals@4.3.1: {} - human-signals@5.0.0: {} husky@9.0.11: {} i18next@23.11.2: dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 iconv-lite@0.6.3: dependencies: @@ -6840,7 +6664,7 @@ snapshots: image-size@0.5.5: optional: true - immutable@4.0.0: {} + immutable@4.3.5: {} import-fresh@3.3.0: dependencies: @@ -6862,15 +6686,15 @@ snapshots: ini@4.1.1: {} - inline-style-parser@0.2.2: {} + inline-style-parser@0.2.3: {} internal-slot@1.0.7: dependencies: es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.4 + hasown: 2.0.2 + side-channel: 1.0.6 - intersection-observer@0.12.0: {} + intersection-observer@0.12.2: {} is-alphabetical@2.0.1: {} @@ -6896,7 +6720,7 @@ snapshots: is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 is-boolean-object@1.1.2: dependencies: @@ -6911,7 +6735,11 @@ snapshots: is-core-module@2.13.1: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 is-date-object@1.0.5: dependencies: @@ -6919,10 +6747,6 @@ snapshots: is-decimal@2.0.1: {} - is-docker@2.2.1: {} - - is-docker@3.0.0: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -6947,11 +6771,7 @@ snapshots: is-hexadecimal@2.0.1: {} - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-map@2.0.2: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -6974,14 +6794,12 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-set@2.0.2: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - is-stream@2.0.1: {} - is-stream@3.0.0: {} is-string@1.0.7: @@ -6998,25 +6816,21 @@ snapshots: is-typed-array@1.1.13: dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.15 - is-weakmap@2.0.1: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - is-weakset@2.0.2: + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 is-what@3.14.1: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - isarray@2.0.5: {} isexe@2.0.0: {} @@ -7026,14 +6840,8 @@ snapshots: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 jiti@1.21.0: {} @@ -7041,7 +6849,7 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@8.0.2: {} + js-tokens@8.0.3: {} js-yaml@4.1.0: dependencies: @@ -7069,18 +6877,18 @@ snapshots: jsonfile@6.1.0: dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.11 jsonparse@1.3.1: {} jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 - object.values: 1.1.7 + object.values: 1.2.0 keyv@4.5.4: dependencies: @@ -7099,7 +6907,7 @@ snapshots: tslib: 2.6.2 optionalDependencies: errno: 0.1.8 - graceful-fs: 4.2.9 + graceful-fs: 4.2.11 image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 @@ -7138,7 +6946,7 @@ snapshots: colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.0.0 - rfdc: 1.3.0 + rfdc: 1.3.1 wrap-ansi: 9.0.0 locate-path@6.0.0: @@ -7175,7 +6983,7 @@ snapshots: log-update@6.0.0: dependencies: - ansi-escapes: 6.2.0 + ansi-escapes: 6.2.1 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 @@ -7191,8 +6999,6 @@ snapshots: dependencies: tslib: 2.6.2 - lru-cache@10.1.0: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -7237,7 +7043,7 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.1.0: + mdast-util-mdx-jsx@3.1.2: dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 @@ -7248,7 +7054,7 @@ snapshots: mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 - stringify-entities: 4.0.3 + stringify-entities: 4.0.4 unist-util-remove-position: 5.0.0 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -7325,7 +7131,7 @@ snapshots: micromark-util-html-tag-name: 2.0.0 micromark-util-normalize-identifier: 2.0.0 micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 + micromark-util-subtokenize: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 @@ -7410,7 +7216,7 @@ snapshots: micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - micromark-util-subtokenize@2.0.0: + micromark-util-subtokenize@2.0.1: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 @@ -7437,7 +7243,7 @@ snapshots: micromark-util-normalize-identifier: 2.0.0 micromark-util-resolve-all: 2.0.0 micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 + micromark-util-subtokenize: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 transitivePeerDependencies: @@ -7471,24 +7277,23 @@ snapshots: minimist@1.2.8: {} - minipass@7.0.4: {} - monaco-editor@0.47.0: {} mri@1.2.0: {} ms@2.1.2: {} - mui-color-input@2.0.3(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@mui/material@5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + ms@2.1.3: {} + + mui-color-input@2.0.3(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0): dependencies: - '@ctrl/tinycolor': 4.0.3 + '@ctrl/tinycolor': 4.1.0 '@emotion/react': 11.11.4(@types/react@18.2.79)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0) - '@mui/material': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react@18.2.0))(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.79)(react@18.2.0) + '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.79 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.79 nanoid@3.3.7: {} @@ -7515,8 +7320,8 @@ snapshots: node-fetch@3.3.2: dependencies: - data-uri-to-buffer: 4.0.0 - fetch-blob: 3.1.5 + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 node-releases@2.0.14: {} @@ -7537,11 +7342,7 @@ snapshots: read-package-json-fast: 3.0.2 shell-quote: 1.8.1 - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.1.0: + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -7558,35 +7359,36 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - object.entries@1.1.7: + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 - object.fromentries@2.0.7: + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - object.groupby@1.0.1: + object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 - get-intrinsic: 1.2.4 + es-abstract: 1.23.3 - object.hasown@1.1.3: + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - object.values@1.1.7: + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 ofetch@1.3.4: dependencies: @@ -7606,13 +7408,6 @@ snapshots: dependencies: mimic-fn: 4.0.0 - open@9.1.0: - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -7657,7 +7452,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -7676,11 +7471,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - path-type@4.0.0: {} picocolors@1.0.0: {} @@ -7699,7 +7489,7 @@ snapshots: postcss-html@1.6.0: dependencies: htmlparser2: 8.0.2 - js-tokens: 8.0.2 + js-tokens: 8.0.3 postcss: 8.4.38 postcss-safe-parser: 6.0.0(postcss@8.4.38) @@ -7718,9 +7508,8 @@ snapshots: postcss-load-config@3.1.4(postcss@8.4.38): dependencies: lilconfig: 2.1.0 - yaml: 1.10.2 - optionalDependencies: postcss: 8.4.38 + yaml: 1.10.2 postcss-media-query-parser@0.2.3: {} @@ -7790,7 +7579,7 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - property-information@6.4.1: {} + property-information@6.5.0: {} proxy-from-env@1.1.0: {} @@ -7809,12 +7598,12 @@ snapshots: react-error-boundary@4.0.13(react@18.2.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 react: 18.2.0 react-fast-compare@3.2.2: {} - react-fast-marquee@1.6.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-fast-marquee@1.6.4(react-dom@18.2.0)(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -7823,13 +7612,12 @@ snapshots: dependencies: react: 18.2.0 - react-i18next@14.1.0(i18next@23.11.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-i18next@14.1.0(i18next@23.11.2)(react-dom@18.2.0)(react@18.2.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 html-parse-stringify: 3.0.1 i18next: 23.11.2 react: 18.2.0 - optionalDependencies: react-dom: 18.2.0(react@18.2.0) react-is@16.13.1: {} @@ -7855,7 +7643,7 @@ snapshots: react-refresh@0.14.0: {} - react-router-dom@6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): dependencies: '@remix-run/router': 1.15.3 react: 18.2.0 @@ -7867,16 +7655,16 @@ snapshots: '@remix-run/router': 1.15.3 react: 18.2.0 - react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-virtuoso@4.7.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-virtuoso@4.7.10(react-dom@18.2.0)(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -7898,30 +7686,30 @@ snapshots: dependencies: picomatch: 2.3.1 - recoil@0.7.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + recoil@0.7.7(react-dom@18.2.0)(react@18.2.0): dependencies: hamt_plus: 1.0.2 react: 18.2.0 - optionalDependencies: react-dom: 18.2.0(react@18.2.0) - reflect.getprototypeof@1.0.4: + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 - regenerator-runtime@0.14.0: {} + regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 - set-function-name: 2.0.1 + set-function-name: 2.0.2 remark-parse@11.0.0: dependencies: @@ -7975,52 +7763,45 @@ snapshots: reusify@1.0.4: {} - rfdc@1.3.0: {} + rfdc@1.3.1: {} rimraf@3.0.2: dependencies: glob: 7.2.3 - rimraf@5.0.5: - dependencies: - glob: 10.3.10 - - rollup@4.13.0: + rollup@4.16.1: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 + '@rollup/rollup-android-arm-eabi': 4.16.1 + '@rollup/rollup-android-arm64': 4.16.1 + '@rollup/rollup-darwin-arm64': 4.16.1 + '@rollup/rollup-darwin-x64': 4.16.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.16.1 + '@rollup/rollup-linux-arm-musleabihf': 4.16.1 + '@rollup/rollup-linux-arm64-gnu': 4.16.1 + '@rollup/rollup-linux-arm64-musl': 4.16.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.16.1 + '@rollup/rollup-linux-riscv64-gnu': 4.16.1 + '@rollup/rollup-linux-s390x-gnu': 4.16.1 + '@rollup/rollup-linux-x64-gnu': 4.16.1 + '@rollup/rollup-linux-x64-musl': 4.16.1 + '@rollup/rollup-win32-arm64-msvc': 4.16.1 + '@rollup/rollup-win32-ia32-msvc': 4.16.1 + '@rollup/rollup-win32-x64-msvc': 4.16.1 fsevents: 2.3.3 - run-applescript@5.0.0: - dependencies: - execa: 5.1.1 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.0: + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - safe-buffer@5.1.2: {} - safe-compare@1.1.4: dependencies: buffer-alloc: 1.2.0 @@ -8038,8 +7819,8 @@ snapshots: sass@1.75.0: dependencies: - chokidar: 3.5.3 - immutable: 4.0.0 + chokidar: 3.6.0 + immutable: 4.3.5 source-map-js: 1.2.0 sax@1.3.0: {} @@ -8059,7 +7840,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - set-function-length@1.2.1: + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -8068,9 +7849,10 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.1: + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 @@ -8086,9 +7868,10 @@ snapshots: dependencies: '@shikijs/core': 1.3.0 - side-channel@1.0.4: + side-channel@1.0.6: dependencies: call-bind: 1.0.7 + es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 @@ -8140,49 +7923,47 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string-width@7.0.0: + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.10: + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 + gopd: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.7 regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.1 - side-channel: 1.0.4 + set-function-name: 2.0.2 + side-channel: 1.0.6 - string.prototype.trim@1.2.8: + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - string.prototype.trimend@1.0.7: + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.7: + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.5 + es-object-atoms: 1.0.0 - stringify-entities@4.0.3: + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 @@ -8197,46 +7978,44 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} strip-json-comments@3.1.1: {} - style-to-object@1.0.5: + style-to-object@1.0.6: dependencies: - inline-style-parser: 0.2.2 + inline-style-parser: 0.2.3 - stylelint-config-html@1.1.0(postcss-html@1.6.0)(stylelint@16.3.1(typescript@5.4.5)): + stylelint-config-html@1.1.0(postcss-html@1.6.0)(stylelint@16.3.1): dependencies: postcss-html: 1.6.0 stylelint: 16.3.1(typescript@5.4.5) - stylelint-config-recess-order@5.0.1(stylelint@16.3.1(typescript@5.4.5)): + stylelint-config-recess-order@5.0.1(stylelint@16.3.1): dependencies: stylelint: 16.3.1(typescript@5.4.5) - stylelint-order: 6.0.4(stylelint@16.3.1(typescript@5.4.5)) + stylelint-order: 6.0.4(stylelint@16.3.1) - stylelint-config-recommended@14.0.0(stylelint@16.3.1(typescript@5.4.5)): + stylelint-config-recommended@14.0.0(stylelint@16.3.1): dependencies: stylelint: 16.3.1(typescript@5.4.5) - stylelint-config-standard@36.0.0(stylelint@16.3.1(typescript@5.4.5)): + stylelint-config-standard@36.0.0(stylelint@16.3.1): dependencies: stylelint: 16.3.1(typescript@5.4.5) - stylelint-config-recommended: 14.0.0(stylelint@16.3.1(typescript@5.4.5)) + stylelint-config-recommended: 14.0.0(stylelint@16.3.1) - stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@16.3.1(typescript@5.4.5)): + stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@16.3.1): dependencies: stylelint: 16.3.1(typescript@5.4.5) - stylelint-order@6.0.4(stylelint@16.3.1(typescript@5.4.5)): + stylelint-order@6.0.4(stylelint@16.3.1): dependencies: postcss: 8.4.38 postcss-sorting: 8.0.2(postcss@8.4.38) stylelint: 16.3.1(typescript@5.4.5) - stylelint-scss@6.2.1(stylelint@16.3.1(typescript@5.4.5)): + stylelint-scss@6.2.1(stylelint@16.3.1): dependencies: known-css-properties: 0.29.0 postcss-media-query-parser: 0.2.3 @@ -8249,8 +8028,8 @@ snapshots: dependencies: '@csstools/css-parser-algorithms': 2.6.1(@csstools/css-tokenizer@2.2.4) '@csstools/css-tokenizer': 2.2.4 - '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1(@csstools/css-tokenizer@2.2.4))(@csstools/css-tokenizer@2.2.4) - '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.16) + '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4) + '@csstools/selector-specificity': 3.0.3(postcss-selector-parser@6.0.16) '@dual-bundle/import-meta-resolve': 4.0.0 balanced-match: 2.0.0 colord: 2.9.3 @@ -8284,7 +8063,7 @@ snapshots: strip-ansi: 7.1.0 supports-hyperlinks: 3.0.0 svg-tags: 1.0.0 - table: 6.8.1 + table: 6.8.2 write-file-atomic: 5.0.1 transitivePeerDependencies: - supports-color @@ -8327,12 +8106,12 @@ snapshots: react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) - synckit@0.8.6: + synckit@0.8.8: dependencies: - '@pkgr/utils': 2.4.2 + '@pkgr/core': 0.1.1 tslib: 2.6.2 - table@6.8.1: + table@6.8.2: dependencies: ajv: 8.12.0 lodash.truncate: 4.4.2 @@ -8360,8 +8139,6 @@ snapshots: through@2.3.8: {} - titleize@3.0.0: {} - to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -8379,7 +8156,7 @@ snapshots: typescript: 5.4.5 tsconfck@3.0.3(typescript@5.4.5): - optionalDependencies: + dependencies: typescript: 5.4.5 tsconfig-paths@3.15.0: @@ -8399,8 +8176,8 @@ snapshots: tsx@4.7.2: dependencies: - esbuild: 0.19.10 - get-tsconfig: 4.7.2 + esbuild: 0.19.12 + get-tsconfig: 4.7.3 optionalDependencies: fsevents: 2.3.3 @@ -8412,8 +8189,6 @@ snapshots: type-fest@0.20.2: {} - type-fest@3.13.1: {} - typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -8437,7 +8212,7 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 - typed-array-length@1.0.5: + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -8482,9 +8257,9 @@ snapshots: undici-types@5.26.5: {} - undici@5.28.2: + undici@5.28.4: dependencies: - '@fastify/busboy': 2.1.0 + '@fastify/busboy': 2.1.1 unicorn-magic@0.1.0: {} @@ -8526,16 +8301,14 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - universal-user-agent@6.0.0: {} + universal-user-agent@6.0.1: {} - universalify@2.0.0: {} - - untildify@4.0.0: {} + universalify@2.0.1: {} update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 - escalade: 3.1.1 + escalade: 3.1.2 picocolors: 1.0.0 uri-js@4.4.1: @@ -8561,54 +8334,51 @@ snapshots: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.47.0): dependencies: - esbuild: 0.19.10 + esbuild: 0.19.12 monaco-editor: 0.47.0 - vite-plugin-sass-dts@1.3.17(postcss@8.4.38)(prettier@3.2.5)(sass@1.75.0)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)): + vite-plugin-sass-dts@1.3.17(postcss@8.4.38)(prettier@3.2.5)(sass@1.75.0)(vite@5.2.10): dependencies: postcss: 8.4.38 postcss-js: 4.0.1(postcss@8.4.38) prettier: 3.2.5 sass: 1.75.0 - vite: 5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) - vite-plugin-svgr@4.2.0(rollup@4.13.0)(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)): + vite-plugin-svgr@4.2.0(typescript@5.4.5)(vite@5.2.10): dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.13.0) + '@rollup/pluginutils': 5.1.0 '@svgr/core': 8.1.0(typescript@5.4.5) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.4.5)) - vite: 5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0)): + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.10): dependencies: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.4.5) - optionalDependencies: - vite: 5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0) + vite: 5.2.10(@types/node@20.12.7)(sass@1.75.0) transitivePeerDependencies: - supports-color - typescript - vite@5.2.10(@types/node@20.12.7)(less@4.2.0)(sass@1.75.0)(stylus@0.62.0): + vite@5.2.10(@types/node@20.12.7)(sass@1.75.0): dependencies: + '@types/node': 20.12.7 esbuild: 0.20.2 postcss: 8.4.38 - rollup: 4.13.0 - optionalDependencies: - '@types/node': 20.12.7 - fsevents: 2.3.3 - less: 4.2.0 + rollup: 4.16.1 sass: 1.75.0 - stylus: 0.62.0 + optionalDependencies: + fsevents: 2.3.3 void-elements@3.1.0: {} - web-streams-polyfill@3.2.0: {} + web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} @@ -8637,17 +8407,17 @@ snapshots: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.14 + which-collection: 1.0.2 + which-typed-array: 1.1.15 - which-collection@1.0.1: + which-collection@1.0.2: dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 - which-typed-array@1.1.14: + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -8669,16 +8439,10 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 - string-width: 7.0.0 + string-width: 7.1.0 strip-ansi: 7.1.0 wrappy@1.0.2: {} @@ -8703,7 +8467,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/clash-verge-rev/src-tauri/Cargo.lock b/clash-verge-rev/src-tauri/Cargo.lock index 7411cb2c19..ddae4170a3 100644 --- a/clash-verge-rev/src-tauri/Cargo.lock +++ b/clash-verge-rev/src-tauri/Cargo.lock @@ -2411,6 +2411,16 @@ dependencies = [ "cc", ] +[[package]] +name = "ico" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd" +dependencies = [ + "byteorder", + "png", +] + [[package]] name = "ico" version = "0.3.0" @@ -5248,6 +5258,7 @@ dependencies = [ "gtk", "heck 0.4.1", "http 0.2.11", + "ico 0.2.0", "ignore", "indexmap 1.9.3", "infer 0.9.0", @@ -5316,7 +5327,7 @@ checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" dependencies = [ "base64 0.21.7", "brotli", - "ico", + "ico 0.3.0", "json-patch", "plist", "png", diff --git a/clash-verge-rev/src-tauri/Cargo.toml b/clash-verge-rev/src-tauri/Cargo.toml index 350a2379d3..ff1d09e74e 100644 --- a/clash-verge-rev/src-tauri/Cargo.toml +++ b/clash-verge-rev/src-tauri/Cargo.toml @@ -37,7 +37,7 @@ serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.12", features = ["json", "rustls-tls"] } sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" } auto-launch = { git="https://github.com/zzzgydi/auto-launch", branch = "main" } -tauri = { version = "1.6", features = [ "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } +tauri = { version = "1.6", features = [ "fs-exists", "path-all", "protocol-asset", "dialog-open", "notification-all", "icon-png", "icon-ico", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "devtools"] } [target.'cfg(windows)'.dependencies] runas = "=1.2.0" diff --git a/clash-verge-rev/src-tauri/src/cmds.rs b/clash-verge-rev/src-tauri/src/cmds.rs index eb6c001028..8f5d43025a 100644 --- a/clash-verge-rev/src-tauri/src/cmds.rs +++ b/clash-verge-rev/src-tauri/src/cmds.rs @@ -299,9 +299,17 @@ pub fn copy_icon_file(path: String, name: String) -> CmdResult { if !icon_dir.exists() { let _ = std::fs::create_dir_all(&icon_dir); } - let dest_path = icon_dir.join(name); + let ext = match file_path.extension() { + Some(e) => e.to_string_lossy().to_string(), + None => "ico".to_string(), + }; + let png_dest_path = icon_dir.join(format!("{name}.png")); + let ico_dest_path = icon_dir.join(format!("{name}.ico")); + let dest_path = icon_dir.join(format!("{name}.{ext}")); if file_path.exists() { + std::fs::remove_file(png_dest_path).unwrap_or_default(); + std::fs::remove_file(ico_dest_path).unwrap_or_default(); match std::fs::copy(file_path, &dest_path) { Ok(_) => Ok(dest_path.to_string_lossy().to_string()), Err(err) => Err(err.to_string()), diff --git a/clash-verge-rev/src-tauri/src/core/tray.rs b/clash-verge-rev/src-tauri/src/core/tray.rs index a0e0e1680b..055b3d58f1 100644 --- a/clash-verge-rev/src-tauri/src/core/tray.rs +++ b/clash-verge-rev/src-tauri/src/core/tray.rs @@ -182,9 +182,13 @@ impl Tray { #[cfg(target_os = "macos")] let mut icon = include_bytes!("../../icons/mac-tray-icon-sys.png").to_vec(); if *sysproxy_tray_icon { - let path = dirs::app_home_dir()?.join("icons").join("sysproxy.png"); - if path.exists() { - icon = std::fs::read(path).unwrap(); + let icon_dir_path = dirs::app_home_dir()?.join("icons"); + let png_path = icon_dir_path.join("sysproxy.png"); + let ico_path = icon_dir_path.join("sysproxy.ico"); + if ico_path.exists() { + icon = std::fs::read(ico_path).unwrap(); + } else if png_path.exists() { + icon = std::fs::read(png_path).unwrap(); } } icon @@ -194,9 +198,13 @@ impl Tray { #[cfg(target_os = "macos")] let mut icon = include_bytes!("../../icons/mac-tray-icon.png").to_vec(); if *common_tray_icon { - let path = dirs::app_home_dir()?.join("icons").join("common.png"); - if path.exists() { - icon = std::fs::read(path).unwrap(); + let icon_dir_path = dirs::app_home_dir()?.join("icons"); + let png_path = icon_dir_path.join("common.png"); + let ico_path = icon_dir_path.join("common.ico"); + if ico_path.exists() { + icon = std::fs::read(ico_path).unwrap(); + } else if png_path.exists() { + icon = std::fs::read(png_path).unwrap(); } } icon @@ -208,9 +216,13 @@ impl Tray { #[cfg(target_os = "macos")] let mut icon = include_bytes!("../../icons/mac-tray-icon-tun.png").to_vec(); if *tun_tray_icon { - let path = dirs::app_home_dir()?.join("icons").join("tun.png"); - if path.exists() { - icon = std::fs::read(path).unwrap(); + let icon_dir_path = dirs::app_home_dir()?.join("icons"); + let png_path = icon_dir_path.join("tun.png"); + let ico_path = icon_dir_path.join("tun.ico"); + if ico_path.exists() { + icon = std::fs::read(ico_path).unwrap(); + } else if png_path.exists() { + icon = std::fs::read(png_path).unwrap(); } } indication_icon = icon diff --git a/clash-verge-rev/src-tauri/tauri.conf.json b/clash-verge-rev/src-tauri/tauri.conf.json index f6e062b8a1..9bcd97e575 100644 --- a/clash-verge-rev/src-tauri/tauri.conf.json +++ b/clash-verge-rev/src-tauri/tauri.conf.json @@ -66,6 +66,10 @@ }, "path": { "all": true + }, + "fs": { + "exists": true, + "scope": ["$APPDATA/**", "$RESOURCE/../**"] } }, "windows": [], diff --git a/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx b/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx index 154d2baf2c..222c7a1c9f 100644 --- a/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx +++ b/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx @@ -9,6 +9,7 @@ import { open as openDialog } from "@tauri-apps/api/dialog"; import { convertFileSrc } from "@tauri-apps/api/tauri"; import { copyIconFile, getAppDir } from "@/services/cmds"; import { join } from "@tauri-apps/api/path"; +import { exists } from "@tauri-apps/api/fs"; export const LayoutViewer = forwardRef((props, ref) => { const { t } = useTranslation(); @@ -26,12 +27,27 @@ export const LayoutViewer = forwardRef((props, ref) => { async function initIconPath() { const appDir = await getAppDir(); const icon_dir = await join(appDir, "icons"); - const common_icon = await join(icon_dir, "common.png"); - const sysproxy_icon = await join(icon_dir, "sysproxy.png"); - const tun_icon = await join(icon_dir, "tun.png"); - setCommonIcon(common_icon); - setSysproxyIcon(sysproxy_icon); - setTunIcon(tun_icon); + const common_icon_png = await join(icon_dir, "common.png"); + const common_icon_ico = await join(icon_dir, "common.ico"); + const sysproxy_icon_png = await join(icon_dir, "sysproxy.png"); + const sysproxy_icon_ico = await join(icon_dir, "sysproxy.ico"); + const tun_icon_png = await join(icon_dir, "tun.png"); + const tun_icon_ico = await join(icon_dir, "tun.ico"); + if (await exists(common_icon_ico)) { + setCommonIcon(common_icon_ico); + } else { + setCommonIcon(common_icon_png); + } + if (await exists(sysproxy_icon_ico)) { + setSysproxyIcon(sysproxy_icon_ico); + } else { + setSysproxyIcon(sysproxy_icon_png); + } + if (await exists(tun_icon_ico)) { + setTunIcon(tun_icon_ico); + } else { + setTunIcon(tun_icon_png); + } } useImperativeHandle(ref, () => ({ @@ -140,12 +156,13 @@ export const LayoutViewer = forwardRef((props, ref) => { filters: [ { name: "Tray Icon Image", - extensions: ["png"], + extensions: ["png", "ico"], }, ], }); if (path?.length) { - await copyIconFile(`${path}`, "common.png"); + await copyIconFile(`${path}`, "common"); + await initIconPath(); onChangeData({ common_tray_icon: true }); patchVerge({ common_tray_icon: true }); } @@ -184,12 +201,13 @@ export const LayoutViewer = forwardRef((props, ref) => { filters: [ { name: "Tray Icon Image", - extensions: ["png"], + extensions: ["png", "ico"], }, ], }); if (path?.length) { - await copyIconFile(`${path}`, "sysproxy.png"); + await copyIconFile(`${path}`, "sysproxy"); + await initIconPath(); onChangeData({ sysproxy_tray_icon: true }); patchVerge({ sysproxy_tray_icon: true }); } @@ -226,12 +244,13 @@ export const LayoutViewer = forwardRef((props, ref) => { filters: [ { name: "Tray Icon Image", - extensions: ["png"], + extensions: ["png", "ico"], }, ], }); if (path?.length) { - await copyIconFile(`${path}`, "tun.png"); + await copyIconFile(`${path}`, "tun"); + await initIconPath(); onChangeData({ tun_tray_icon: true }); patchVerge({ tun_tray_icon: true }); } diff --git a/clash-verge-rev/src/services/cmds.ts b/clash-verge-rev/src/services/cmds.ts index ceae0915f9..9b7ac1b9cc 100644 --- a/clash-verge-rev/src/services/cmds.ts +++ b/clash-verge-rev/src/services/cmds.ts @@ -223,7 +223,7 @@ export async function exitApp() { export async function copyIconFile( path: string, - name: "common.png" | "sysproxy.png" | "tun.png" + name: "common" | "sysproxy" | "tun" ) { return invoke("copy_icon_file", { path, name }); } diff --git a/naiveproxy/src/base/android/input_hint_checker.h b/naiveproxy/src/base/android/input_hint_checker.h index 06d69ee6ff..ce1199c2a7 100644 --- a/naiveproxy/src/base/android/input_hint_checker.h +++ b/naiveproxy/src/base/android/input_hint_checker.h @@ -46,7 +46,7 @@ class BASE_EXPORT InputHintChecker { // Fetches and returns the input hint from the Android Framework. Throttles // the calls to one every few milliseconds. When a call is made before the // minimal time interval passed since the previous call, returns false. - static bool HasInput(); + static bool HasInput() { return false; } // RAII override of GetInstance() for testing. struct ScopedOverrideInstance { diff --git a/naiveproxy/src/net/android/network_library_stub.cc b/naiveproxy/src/net/android/network_library_stub.cc index 2c12aa2fd3..5a391da45c 100644 --- a/naiveproxy/src/net/android/network_library_stub.cc +++ b/naiveproxy/src/net/android/network_library_stub.cc @@ -56,7 +56,7 @@ std::string GetWifiSSID() { return {}; } -absl::optional GetWifiSignalLevel() { +std::optional GetWifiSignalLevel() { return {}; } diff --git a/openwrt-packages/ddns-go/Makefile b/openwrt-packages/ddns-go/Makefile index 4205d068ee..62275f1969 100644 --- a/openwrt-packages/ddns-go/Makefile +++ b/openwrt-packages/ddns-go/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ddns-go -PKG_VERSION:=6.3.2 +PKG_VERSION:=6.3.3 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=7643dea28dfaae0923aa895797649c063c27cae4dbb1bfdecd5ede0ff68c9f0c +PKG_HASH:=fee40e6a9abc8313632b29ccc9b71184a3f8f9377986de5d2773374ad4b99173 PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE diff --git a/openwrt-packages/luci-app-amlogic/Makefile b/openwrt-packages/luci-app-amlogic/Makefile index 2879357050..e210e10aaf 100644 --- a/openwrt-packages/luci-app-amlogic/Makefile +++ b/openwrt-packages/luci-app-amlogic/Makefile @@ -16,7 +16,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-amlogic -PKG_VERSION:=3.1.230 +PKG_VERSION:=3.1.232 PKG_RELEASE:=1 PKG_LICENSE:=GPL-2.0 License diff --git a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh index 812562c02e..432d470f90 100755 --- a/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh +++ b/openwrt-packages/luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh @@ -132,8 +132,14 @@ kernel_tag="${kernel_tag/kernel_/}" check_kernel() { # 02. Query local version information tolog "02. Start checking the kernel version." + # 02.01 Query the current version - current_kernel_v=$(uname -r 2>/dev/null | grep -oE '^[1-9]\.[0-9]{1,2}\.[0-9]+') + if [[ "${kernel_tag}" == "rk3588" || "${kernel_tag}" == "rk35xx" ]]; then + current_kernel_v=$(uname -r 2>/dev/null) + else + current_kernel_v=$(uname -r 2>/dev/null | grep -oE '^[1-9]\.[0-9]{1,2}\.[0-9]+') + fi + [[ -n "${current_kernel_v}" ]] || tolog "02.01 The current kernel version is not detected." "1" tolog "02.01 current version: ${current_kernel_v}" sleep 2 @@ -159,7 +165,7 @@ check_kernel() { latest_version="$( curl -fsSL -m 10 \ ${kernel_api}/releases/expanded_assets/kernel_${kernel_tag} | - grep -oE "${main_line_version}.[0-9]+.tar.gz" | sed 's/.tar.gz//' | + grep -oE "${main_line_version}.[0-9]+.*.tar.gz" | sed 's/.tar.gz//' | sort -urV | head -n 1 )" [[ -n "${latest_version}" ]] || tolog "02.03 No kernel available, please use another kernel branch." "1" diff --git a/openwrt-passwall2/luci-app-passwall2/Makefile b/openwrt-passwall2/luci-app-passwall2/Makefile index 03a39fafa1..92c5ab9336 100644 --- a/openwrt-passwall2/luci-app-passwall2/Makefile +++ b/openwrt-passwall2/luci-app-passwall2/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall2 -PKG_VERSION:=1.28-7 +PKG_VERSION:=1.29-1 PKG_RELEASE:= PKG_CONFIG_DEPENDS:= \ diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua index fe9c763399..14fed7fec9 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua @@ -55,7 +55,7 @@ function index() entry({"admin", "services", appname, "get_socks_log"}, call("get_socks_log")).leaf = true entry({"admin", "services", appname, "get_log"}, call("get_log")).leaf = true entry({"admin", "services", appname, "clear_log"}, call("clear_log")).leaf = true - entry({"admin", "services", appname, "status"}, call("status")).leaf = true + entry({"admin", "services", appname, "index_status"}, call("index_status")).leaf = true entry({"admin", "services", appname, "haproxy_status"}, call("haproxy_status")).leaf = true entry({"admin", "services", appname, "socks_status"}, call("socks_status")).leaf = true entry({"admin", "services", appname, "connect_status"}, call("connect_status")).leaf = true @@ -189,9 +189,9 @@ function clear_log() luci.sys.call("echo '' > /tmp/log/passwall2.log") end -function status() +function index_status() local e = {} - e["global_status"] = luci.sys.call("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall2/bin/' | grep -v '_acl_' | grep 'global' >/dev/null") == 0 + e["global_status"] = luci.sys.call("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall2/bin/' | grep 'default' | grep 'global' >/dev/null") == 0 luci.http.prepare_content("application/json") luci.http.write_json(e) end diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua index e80474d438..29823e1c26 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua @@ -329,7 +329,8 @@ for k, v in pairs(nodes_table) do end s:tab("log", translate("Log")) -o = s:taboption("log", Flag, "close_log", translate("Close Node Log")) +o = s:taboption("log", Flag, "log_node", translate("Enable Node Log")) +o.default = "1" o.rmempty = false loglevel = s:taboption("log", ListValue, "loglevel", translate("Log Level")) diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/global/status.htm b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/global/status.htm index 66ede85458..03b2e56d0a 100644 --- a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/global/status.htm +++ b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/global/status.htm @@ -139,7 +139,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md document.getElementsByTagName('img')[i].setAttribute("oncontextmenu","return false;"); document.getElementsByTagName('img')[i].setAttribute("ondragstart","return false;"); } - XHR.poll(5, '<%=api.url("status")%>', null, + XHR.poll(5, '<%=api.url("index_status")%>', null, function (x, data) { if (data) { if (true) { diff --git a/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po b/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po index 261539e98d..fabe10e8e6 100644 --- a/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po +++ b/openwrt-passwall2/luci-app-passwall2/po/zh-cn/passwall2.po @@ -1288,8 +1288,8 @@ msgstr "日志" msgid "Log" msgstr "日志" -msgid "Close Node Log" -msgstr "关闭节点日志" +msgid "Enable Node Log" +msgstr "启用节点日志" msgid "Log Level" msgstr "日志等级" diff --git a/openwrt-passwall2/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 b/openwrt-passwall2/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 index f49a4eca52..6ec65ccd33 100755 --- a/openwrt-passwall2/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 +++ b/openwrt-passwall2/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 @@ -3,20 +3,24 @@ uci -q batch <<-EOF >/dev/null set dhcp.@dnsmasq[0].localuse=1 commit dhcp + [ -e "/etc/config/ucitrack" ] && { delete ucitrack.@passwall2[-1] add ucitrack passwall2 set ucitrack.@passwall2[-1].init=passwall2 commit ucitrack + } delete firewall.passwall2 set firewall.passwall2=include set firewall.passwall2.type=script set firewall.passwall2.path=/var/etc/passwall2.include set firewall.passwall2.reload=1 commit firewall + [ -e "/etc/config/ucitrack" ] && { delete ucitrack.@passwall2_server[-1] add ucitrack passwall2_server set ucitrack.@passwall2_server[-1].init=passwall2_server commit ucitrack + } delete firewall.passwall2_server set firewall.passwall2_server=include set firewall.passwall2_server.type=script diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/0_default_config b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/0_default_config index 464f5c84e8..f129cc36be 100644 --- a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/0_default_config +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/0_default_config @@ -14,7 +14,7 @@ config global option remote_dns_query_strategy 'UseIPv4' option dns_hosts 'cloudflare-dns.com 1.1.1.1 dns.google.com 8.8.8.8' - option close_log '0' + option log_node '1' option loglevel 'error' config global_haproxy diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/app.sh b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/app.sh index 3d653b6757..22aa7b41c2 100644 --- a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/app.sh +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/app.sh @@ -688,7 +688,7 @@ run_global() { V2RAY_CONFIG=$TMP_ACL_PATH/default/global.json V2RAY_LOG=$TMP_ACL_PATH/default/global.log - [ "$(config_t_get global close_log 1)" = "1" ] && V2RAY_LOG="/dev/null" + [ "$(config_t_get global log_node 1)" != "1" ] && V2RAY_LOG="/dev/null" V2RAY_ARGS="${V2RAY_ARGS} log_file=${V2RAY_LOG} config_file=${V2RAY_CONFIG}" node_socks_port=$(config_t_get global node_socks_port 1070) diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua index bce5a2c7aa..6c6a5cdf79 100755 --- a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua @@ -220,9 +220,8 @@ do end) uci:foreach(appname, "nodes", function(node) + local node_id = node[".name"] if node.protocol and node.protocol == '_shunt' then - local node_id = node[".name"] - local rules = {} uci:foreach(appname, "shunt_rules", function(e) if e[".name"] and e.remarks then @@ -256,7 +255,6 @@ do end elseif node.protocol and node.protocol == '_balancing' then - local node_id = node[".name"] local nodes = {} local new_nodes = {} if node.balancing_node then @@ -268,7 +266,7 @@ do remarks = node, set = function(o, server) for kk, vv in pairs(CONFIG) do - if (vv.remarks == "负载均衡节点列表" .. node_id) then + if (vv.remarks == "Xray负载均衡节点[" .. node_id .. "]列表") then table.insert(vv.new_nodes, server) end end @@ -277,13 +275,12 @@ do end end CONFIG[#CONFIG + 1] = { - remarks = "负载均衡节点列表" .. node_id, + remarks = "Xray负载均衡节点[" .. node_id .. "]列表", nodes = nodes, new_nodes = new_nodes, set = function(o) for kk, vv in pairs(CONFIG) do - if (vv.remarks == "负载均衡节点列表" .. node_id) then - --log("刷新负载均衡节点列表") + if (vv.remarks == "Xray负载均衡节点[" .. node_id .. "]列表") then uci:foreach(appname, "nodes", function(node2) if node2[".name"] == node[".name"] then local section = uci:section(appname, "nodes", node_id) @@ -294,6 +291,42 @@ do end end } + + --后备节点 + local currentNode = uci:get_all(appname, node_id) or nil + if currentNode and currentNode.fallback_node then + CONFIG[#CONFIG + 1] = { + log = true, + id = node_id, + remarks = "Xray负载均衡节点[" .. node_id .. "]后备节点", + currentNode = uci:get_all(appname, currentNode.fallback_node) or nil, + set = function(o, server) + uci:set(appname, node_id, "fallback_node", server) + o.newNodeId = server + end, + delete = function(o) + uci:delete(appname, node_id, "fallback_node") + end + } + end + else + --落地节点 + local currentNode = uci:get_all(appname, node_id) or nil + if currentNode and currentNode.to_node then + CONFIG[#CONFIG + 1] = { + log = true, + id = node_id, + remarks = "节点[" .. node_id .. "]落地节点", + currentNode = uci:get_all(appname, currentNode.to_node) or nil, + set = function(o, server) + uci:set(appname, node_id, "to_node", server) + o.newNodeId = server + end, + delete = function(o) + uci:delete(appname, node_id, "to_node") + end + } + end end end) diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json b/openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json new file mode 100644 index 0000000000..d73b5d1094 --- /dev/null +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json @@ -0,0 +1,4 @@ +{ + "config": "passwall2_server", + "init": "passwall2_server" +} diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json b/openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json new file mode 100644 index 0000000000..2ff857b0d1 --- /dev/null +++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json @@ -0,0 +1,4 @@ +{ + "config": "passwall2", + "init": "passwall2" +} diff --git a/ryujinx/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs b/ryujinx/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs index 0acb57be42..663d0aeb15 100644 --- a/ryujinx/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs +++ b/ryujinx/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs @@ -85,6 +85,70 @@ namespace Ryujinx.Cpu.Jit _addressSpace = new(Tracking, backingMemory, _nativePageTable, useProtectionMirrors); } + public override ReadOnlySequence GetReadOnlySequence(ulong va, int size, bool tracked = false) + { + if (size == 0) + { + return ReadOnlySequence.Empty; + } + + try + { + if (tracked) + { + SignalMemoryTracking(va, (ulong)size, false); + } + else + { + AssertValidAddressAndSize(va, (ulong)size); + } + + ulong endVa = va + (ulong)size; + int offset = 0; + + BytesReadOnlySequenceSegment first = null, last = null; + + while (va < endVa) + { + (MemoryBlock memory, ulong rangeOffset, ulong copySize) = GetMemoryOffsetAndSize(va, (ulong)(size - offset)); + + Memory physicalMemory = memory.GetMemory(rangeOffset, (int)copySize); + + if (first is null) + { + first = last = new BytesReadOnlySequenceSegment(physicalMemory); + } + else + { + if (last.IsContiguousWith(physicalMemory, out nuint contiguousStart, out int contiguousSize)) + { + Memory contiguousPhysicalMemory = new NativeMemoryManager(contiguousStart, contiguousSize).Memory; + + last.Replace(contiguousPhysicalMemory); + } + else + { + last = last.Append(physicalMemory); + } + } + + va += copySize; + offset += (int)copySize; + } + + return new ReadOnlySequence(first, 0, last, (int)(size - last.RunningIndex)); + } + catch (InvalidMemoryRegionException) + { + if (_invalidAccessHandler == null || !_invalidAccessHandler(va)) + { + throw; + } + + return ReadOnlySequence.Empty; + } + } + /// public void Map(ulong va, ulong pa, ulong size, MemoryMapFlags flags) { diff --git a/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs b/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs index dc927eaba1..70736fbd61 100644 --- a/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs +++ b/ryujinx/src/Ryujinx.Graphics.GAL/Capabilities.cs @@ -36,6 +36,7 @@ namespace Ryujinx.Graphics.GAL public readonly bool SupportsMismatchingViewFormat; public readonly bool SupportsCubemapView; public readonly bool SupportsNonConstantTextureOffset; + public readonly bool SupportsSeparateSampler; public readonly bool SupportsShaderBallot; public readonly bool SupportsShaderBarrierDivergence; public readonly bool SupportsShaderFloat64; @@ -92,6 +93,7 @@ namespace Ryujinx.Graphics.GAL bool supportsMismatchingViewFormat, bool supportsCubemapView, bool supportsNonConstantTextureOffset, + bool supportsSeparateSampler, bool supportsShaderBallot, bool supportsShaderBarrierDivergence, bool supportsShaderFloat64, @@ -144,6 +146,7 @@ namespace Ryujinx.Graphics.GAL SupportsMismatchingViewFormat = supportsMismatchingViewFormat; SupportsCubemapView = supportsCubemapView; SupportsNonConstantTextureOffset = supportsNonConstantTextureOffset; + SupportsSeparateSampler = supportsSeparateSampler; SupportsShaderBallot = supportsShaderBallot; SupportsShaderBarrierDivergence = supportsShaderBarrierDivergence; SupportsShaderFloat64 = supportsShaderFloat64; diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs index ccdbe4748b..cd81447240 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs @@ -126,6 +126,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute ulong samplerPoolGpuVa = ((ulong)_state.State.SetTexSamplerPoolAOffsetUpper << 32) | _state.State.SetTexSamplerPoolB; ulong texturePoolGpuVa = ((ulong)_state.State.SetTexHeaderPoolAOffsetUpper << 32) | _state.State.SetTexHeaderPoolB; + int samplerPoolMaximumId = _state.State.SetTexSamplerPoolCMaximumIndex; + GpuChannelPoolState poolState = new( texturePoolGpuVa, _state.State.SetTexHeaderPoolCMaximumIndex, @@ -139,7 +141,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute sharedMemorySize, _channel.BufferManager.HasUnalignedStorageBuffers); - CachedShaderProgram cs = memoryManager.Physical.ShaderCache.GetComputeShader(_channel, poolState, computeState, shaderGpuVa); + CachedShaderProgram cs = memoryManager.Physical.ShaderCache.GetComputeShader(_channel, samplerPoolMaximumId, poolState, computeState, shaderGpuVa); _context.Renderer.Pipeline.SetProgram(cs.HostProgram); @@ -184,7 +186,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute sharedMemorySize, _channel.BufferManager.HasUnalignedStorageBuffers); - cs = memoryManager.Physical.ShaderCache.GetComputeShader(_channel, poolState, computeState, shaderGpuVa); + cs = memoryManager.Physical.ShaderCache.GetComputeShader(_channel, samplerPoolMaximumId, poolState, computeState, shaderGpuVa); _context.Renderer.Pipeline.SetProgram(cs.HostProgram); } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs index b3eb62185a..1dc77b52df 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs @@ -1429,7 +1429,18 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed addressesSpan[index] = baseAddress + shader.Offset; } - CachedShaderProgram gs = shaderCache.GetGraphicsShader(ref _state.State, ref _pipeline, _channel, ref _currentSpecState.GetPoolState(), ref _currentSpecState.GetGraphicsState(), addresses); + int samplerPoolMaximumId = _state.State.SamplerIndex == SamplerIndex.ViaHeaderIndex + ? _state.State.TexturePoolState.MaximumId + : _state.State.SamplerPoolState.MaximumId; + + CachedShaderProgram gs = shaderCache.GetGraphicsShader( + ref _state.State, + ref _pipeline, + _channel, + samplerPoolMaximumId, + ref _currentSpecState.GetPoolState(), + ref _currentSpecState.GetGraphicsState(), + addresses); // Consume the modified flag for spec state so that it isn't checked again. _currentSpecState.SetShader(gs); diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs index d9881f897e..50872ab632 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/PoolCache.cs @@ -62,8 +62,9 @@ namespace Ryujinx.Graphics.Gpu.Image /// GPU channel that the texture pool cache belongs to /// Start address of the texture pool /// Maximum ID of the texture pool + /// Cache of texture array bindings /// The found or newly created texture pool - public T FindOrCreate(GpuChannel channel, ulong address, int maximumId) + public T FindOrCreate(GpuChannel channel, ulong address, int maximumId, TextureBindingsArrayCache bindingsArrayCache) { // Remove old entries from the cache, if possible. while (_pools.Count > MaxCapacity && (_currentTimestamp - _pools.First.Value.CacheTimestamp) >= MinDeltaForRemoval) @@ -73,6 +74,7 @@ namespace Ryujinx.Graphics.Gpu.Image _pools.RemoveFirst(); oldestPool.Dispose(); oldestPool.CacheNode = null; + bindingsArrayCache.RemoveAllWithPool(oldestPool); } T pool; @@ -87,8 +89,7 @@ namespace Ryujinx.Graphics.Gpu.Image if (pool.CacheNode != _pools.Last) { _pools.Remove(pool.CacheNode); - - pool.CacheNode = _pools.AddLast(pool); + _pools.AddLast(pool.CacheNode); } pool.CacheTimestamp = _currentTimestamp; diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs index 12a457dbcb..ba895c60a8 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs @@ -44,6 +44,11 @@ namespace Ryujinx.Graphics.Gpu.Image /// public TextureUsageFlags Flags { get; } + /// + /// Indicates that the binding is for a sampler. + /// + public bool IsSamplerOnly { get; } + /// /// Constructs the texture binding information structure. /// @@ -74,8 +79,17 @@ namespace Ryujinx.Graphics.Gpu.Image /// Constant buffer slot where the texture handle is located /// The shader texture handle (read index into the texture constant buffer) /// The texture's usage flags, indicating how it is used in the shader - public TextureBindingInfo(Target target, int binding, int arrayLength, int cbufSlot, int handle, TextureUsageFlags flags) : this(target, (Format)0, binding, arrayLength, cbufSlot, handle, flags) + /// Indicates that the binding is for a sampler + public TextureBindingInfo( + Target target, + int binding, + int arrayLength, + int cbufSlot, + int handle, + TextureUsageFlags flags, + bool isSamplerOnly) : this(target, 0, binding, arrayLength, cbufSlot, handle, flags) { + IsSamplerOnly = isSamplerOnly; } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs index 4645317c4f..7e486e0a84 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsArrayCache.cs @@ -21,12 +21,98 @@ namespace Ryujinx.Graphics.Gpu.Image private readonly GpuContext _context; private readonly GpuChannel _channel; - private readonly bool _isCompute; /// /// Array cache entry key. /// - private readonly struct CacheEntryKey : IEquatable + private readonly struct CacheEntryFromPoolKey : IEquatable + { + /// + /// Whether the entry is for an image. + /// + public readonly bool IsImage; + + /// + /// Whether the entry is for a sampler. + /// + public readonly bool IsSampler; + + /// + /// Texture or image target type. + /// + public readonly Target Target; + + /// + /// Number of entries of the array. + /// + public readonly int ArrayLength; + + private readonly TexturePool _texturePool; + private readonly SamplerPool _samplerPool; + + /// + /// Creates a new array cache entry. + /// + /// Whether the entry is for an image + /// Binding information for the array + /// Texture pool where the array textures are located + /// Sampler pool where the array samplers are located + public CacheEntryFromPoolKey(bool isImage, TextureBindingInfo bindingInfo, TexturePool texturePool, SamplerPool samplerPool) + { + IsImage = isImage; + IsSampler = bindingInfo.IsSamplerOnly; + Target = bindingInfo.Target; + ArrayLength = bindingInfo.ArrayLength; + + _texturePool = texturePool; + _samplerPool = samplerPool; + } + + /// + /// Checks if the pool matches the cached pool. + /// + /// Texture or sampler pool instance + /// True if the pool matches, false otherwise + public bool MatchesPool(IPool pool) + { + return _texturePool == pool || _samplerPool == pool; + } + + /// + /// Checks if the texture and sampler pools matches the cached pools. + /// + /// Texture pool instance + /// Sampler pool instance + /// True if the pools match, false otherwise + private bool MatchesPools(TexturePool texturePool, SamplerPool samplerPool) + { + return _texturePool == texturePool && _samplerPool == samplerPool; + } + + public bool Equals(CacheEntryFromPoolKey other) + { + return IsImage == other.IsImage && + IsSampler == other.IsSampler && + Target == other.Target && + ArrayLength == other.ArrayLength && + MatchesPools(other._texturePool, other._samplerPool); + } + + public override bool Equals(object obj) + { + return obj is CacheEntryFromBufferKey other && Equals(other); + } + + public override int GetHashCode() + { + return HashCode.Combine(_texturePool, _samplerPool, IsSampler); + } + } + + /// + /// Array cache entry key. + /// + private readonly struct CacheEntryFromBufferKey : IEquatable { /// /// Whether the entry is for an image. @@ -61,7 +147,7 @@ namespace Ryujinx.Graphics.Gpu.Image /// Texture pool where the array textures are located /// Sampler pool where the array samplers are located /// Constant buffer bounds with the texture handles - public CacheEntryKey( + public CacheEntryFromBufferKey( bool isImage, TextureBindingInfo bindingInfo, TexturePool texturePool, @@ -100,7 +186,7 @@ namespace Ryujinx.Graphics.Gpu.Image return _textureBufferBounds.Equals(textureBufferBounds); } - public bool Equals(CacheEntryKey other) + public bool Equals(CacheEntryFromBufferKey other) { return IsImage == other.IsImage && Target == other.Target && @@ -112,7 +198,7 @@ namespace Ryujinx.Graphics.Gpu.Image public override bool Equals(object obj) { - return obj is CacheEntryKey other && Equals(other); + return obj is CacheEntryFromBufferKey other && Equals(other); } public override int GetHashCode() @@ -122,40 +208,15 @@ namespace Ryujinx.Graphics.Gpu.Image } /// - /// Array cache entry. + /// Array cache entry from pool. /// private class CacheEntry { - /// - /// Key for this entry on the cache. - /// - public readonly CacheEntryKey Key; - - /// - /// Linked list node used on the texture bindings array cache. - /// - public LinkedListNode CacheNode; - - /// - /// Timestamp set on the last use of the array by the cache. - /// - public int CacheTimestamp; - /// /// All cached textures, along with their invalidated sequence number as value. /// public readonly Dictionary Textures; - /// - /// All pool texture IDs along with their textures. - /// - public readonly Dictionary TextureIds; - - /// - /// All pool sampler IDs along with their samplers. - /// - public readonly Dictionary SamplerIds; - /// /// Backend texture array if the entry is for a texture, otherwise null. /// @@ -166,44 +227,39 @@ namespace Ryujinx.Graphics.Gpu.Image /// public readonly IImageArray ImageArray; - private readonly TexturePool _texturePool; - private readonly SamplerPool _samplerPool; + /// + /// Texture pool where the array textures are located. + /// + protected readonly TexturePool TexturePool; + + /// + /// Sampler pool where the array samplers are located. + /// + protected readonly SamplerPool SamplerPool; private int _texturePoolSequence; private int _samplerPoolSequence; - private int[] _cachedTextureBuffer; - private int[] _cachedSamplerBuffer; - - private int _lastSequenceNumber; - /// /// Creates a new array cache entry. /// - /// Key for this entry on the cache /// Texture pool where the array textures are located /// Sampler pool where the array samplers are located - private CacheEntry(ref CacheEntryKey key, TexturePool texturePool, SamplerPool samplerPool) + private CacheEntry(TexturePool texturePool, SamplerPool samplerPool) { - Key = key; Textures = new Dictionary(); - TextureIds = new Dictionary(); - SamplerIds = new Dictionary(); - _texturePool = texturePool; - _samplerPool = samplerPool; - - _lastSequenceNumber = -1; + TexturePool = texturePool; + SamplerPool = samplerPool; } /// /// Creates a new array cache entry. /// - /// Key for this entry on the cache /// Backend texture array /// Texture pool where the array textures are located /// Sampler pool where the array samplers are located - public CacheEntry(ref CacheEntryKey key, ITextureArray array, TexturePool texturePool, SamplerPool samplerPool) : this(ref key, texturePool, samplerPool) + public CacheEntry(ITextureArray array, TexturePool texturePool, SamplerPool samplerPool) : this(texturePool, samplerPool) { TextureArray = array; } @@ -211,11 +267,10 @@ namespace Ryujinx.Graphics.Gpu.Image /// /// Creates a new array cache entry. /// - /// Key for this entry on the cache /// Backend image array /// Texture pool where the array textures are located /// Sampler pool where the array samplers are located - public CacheEntry(ref CacheEntryKey key, IImageArray array, TexturePool texturePool, SamplerPool samplerPool) : this(ref key, texturePool, samplerPool) + public CacheEntry(IImageArray array, TexturePool texturePool, SamplerPool samplerPool) : this(texturePool, samplerPool) { ImageArray = array; } @@ -248,23 +303,9 @@ namespace Ryujinx.Graphics.Gpu.Image /// /// Clears all cached texture instances. /// - public void Reset() + public virtual void Reset() { Textures.Clear(); - TextureIds.Clear(); - SamplerIds.Clear(); - } - - /// - /// Updates the cached constant buffer data. - /// - /// Constant buffer data with the texture handles (and sampler handles, if they are combined) - /// Constant buffer data with the sampler handles - /// Whether and comes from different buffers - public void UpdateData(ReadOnlySpan cachedTextureBuffer, ReadOnlySpan cachedSamplerBuffer, bool separateSamplerBuffer) - { - _cachedTextureBuffer = cachedTextureBuffer.ToArray(); - _cachedSamplerBuffer = separateSamplerBuffer ? cachedSamplerBuffer.ToArray() : _cachedTextureBuffer; } /// @@ -287,39 +328,105 @@ namespace Ryujinx.Graphics.Gpu.Image /// /// Checks if the cached texture or sampler pool has been modified since the last call to this method. /// - /// True if any used entries of the pools might have been modified, false otherwise - public bool PoolsModified() + /// True if any used entries of the pool might have been modified, false otherwise + public bool TexturePoolModified() { - bool texturePoolModified = _texturePool.WasModified(ref _texturePoolSequence); - bool samplerPoolModified = _samplerPool.WasModified(ref _samplerPoolSequence); + return TexturePool.WasModified(ref _texturePoolSequence); + } - // If both pools were not modified since the last check, we have nothing else to check. - if (!texturePoolModified && !samplerPoolModified) - { - return false; - } + /// + /// Checks if the cached texture or sampler pool has been modified since the last call to this method. + /// + /// True if any used entries of the pool might have been modified, false otherwise + public bool SamplerPoolModified() + { + return SamplerPool.WasModified(ref _samplerPoolSequence); + } + } - // If the pools were modified, let's check if any of the entries we care about changed. + /// + /// Array cache entry from constant buffer. + /// + private class CacheEntryFromBuffer : CacheEntry + { + /// + /// Key for this entry on the cache. + /// + public readonly CacheEntryFromBufferKey Key; - // Check if any of our cached textures changed on the pool. - foreach ((int textureId, Texture texture) in TextureIds) - { - if (_texturePool.GetCachedItem(textureId) != texture) - { - return true; - } - } + /// + /// Linked list node used on the texture bindings array cache. + /// + public LinkedListNode CacheNode; - // Check if any of our cached samplers changed on the pool. - foreach ((int samplerId, Sampler sampler) in SamplerIds) - { - if (_samplerPool.GetCachedItem(samplerId) != sampler) - { - return true; - } - } + /// + /// Timestamp set on the last use of the array by the cache. + /// + public int CacheTimestamp; - return false; + /// + /// All pool texture IDs along with their textures. + /// + public readonly Dictionary TextureIds; + + /// + /// All pool sampler IDs along with their samplers. + /// + public readonly Dictionary SamplerIds; + + private int[] _cachedTextureBuffer; + private int[] _cachedSamplerBuffer; + + private int _lastSequenceNumber; + + /// + /// Creates a new array cache entry. + /// + /// Key for this entry on the cache + /// Backend texture array + /// Texture pool where the array textures are located + /// Sampler pool where the array samplers are located + public CacheEntryFromBuffer(ref CacheEntryFromBufferKey key, ITextureArray array, TexturePool texturePool, SamplerPool samplerPool) : base(array, texturePool, samplerPool) + { + Key = key; + _lastSequenceNumber = -1; + TextureIds = new Dictionary(); + SamplerIds = new Dictionary(); + } + + /// + /// Creates a new array cache entry. + /// + /// Key for this entry on the cache + /// Backend image array + /// Texture pool where the array textures are located + /// Sampler pool where the array samplers are located + public CacheEntryFromBuffer(ref CacheEntryFromBufferKey key, IImageArray array, TexturePool texturePool, SamplerPool samplerPool) : base(array, texturePool, samplerPool) + { + Key = key; + _lastSequenceNumber = -1; + TextureIds = new Dictionary(); + SamplerIds = new Dictionary(); + } + + /// + public override void Reset() + { + base.Reset(); + TextureIds.Clear(); + SamplerIds.Clear(); + } + + /// + /// Updates the cached constant buffer data. + /// + /// Constant buffer data with the texture handles (and sampler handles, if they are combined) + /// Constant buffer data with the sampler handles + /// Whether and comes from different buffers + public void UpdateData(ReadOnlySpan cachedTextureBuffer, ReadOnlySpan cachedSamplerBuffer, bool separateSamplerBuffer) + { + _cachedTextureBuffer = cachedTextureBuffer.ToArray(); + _cachedSamplerBuffer = separateSamplerBuffer ? cachedSamplerBuffer.ToArray() : _cachedTextureBuffer; } /// @@ -380,10 +487,51 @@ namespace Ryujinx.Graphics.Gpu.Image return true; } + + /// + /// Checks if the cached texture or sampler pool has been modified since the last call to this method. + /// + /// True if any used entries of the pools might have been modified, false otherwise + public bool PoolsModified() + { + bool texturePoolModified = TexturePoolModified(); + bool samplerPoolModified = SamplerPoolModified(); + + // If both pools were not modified since the last check, we have nothing else to check. + if (!texturePoolModified && !samplerPoolModified) + { + return false; + } + + // If the pools were modified, let's check if any of the entries we care about changed. + + // Check if any of our cached textures changed on the pool. + foreach ((int textureId, (Texture texture, TextureDescriptor descriptor)) in TextureIds) + { + if (TexturePool.GetCachedItem(textureId) != texture || + (texture == null && TexturePool.IsValidId(textureId) && !TexturePool.GetDescriptorRef(textureId).Equals(descriptor))) + { + return true; + } + } + + // Check if any of our cached samplers changed on the pool. + foreach ((int samplerId, (Sampler sampler, SamplerDescriptor descriptor)) in SamplerIds) + { + if (SamplerPool.GetCachedItem(samplerId) != sampler || + (sampler == null && SamplerPool.IsValidId(samplerId) && !SamplerPool.GetDescriptorRef(samplerId).Equals(descriptor))) + { + return true; + } + } + + return false; + } } - private readonly Dictionary _cache; - private readonly LinkedList _lruCache; + private readonly Dictionary _cacheFromBuffer; + private readonly Dictionary _cacheFromPool; + private readonly LinkedList _lruCache; private int _currentTimestamp; @@ -392,14 +540,13 @@ namespace Ryujinx.Graphics.Gpu.Image /// /// GPU context /// GPU channel - /// Whether the bindings will be used for compute or graphics pipelines - public TextureBindingsArrayCache(GpuContext context, GpuChannel channel, bool isCompute) + public TextureBindingsArrayCache(GpuContext context, GpuChannel channel) { _context = context; _channel = channel; - _isCompute = isCompute; - _cache = new Dictionary(); - _lruCache = new LinkedList(); + _cacheFromBuffer = new Dictionary(); + _cacheFromPool = new Dictionary(); + _lruCache = new LinkedList(); } /// @@ -457,15 +604,180 @@ namespace Ryujinx.Graphics.Gpu.Image bool isImage, SamplerIndex samplerIndex, TextureBindingInfo bindingInfo) + { + if (IsDirectHandleType(bindingInfo.Handle)) + { + UpdateFromPool(texturePool, samplerPool, stage, isImage, bindingInfo); + } + else + { + UpdateFromBuffer(texturePool, samplerPool, stage, stageIndex, textureBufferIndex, isImage, samplerIndex, bindingInfo); + } + } + + /// + /// Updates a texture or image array bindings and textures from a texture or sampler pool. + /// + /// Texture pool + /// Sampler pool + /// Shader stage where the array is used + /// Whether the array is a image or texture array + /// Array binding information + private void UpdateFromPool(TexturePool texturePool, SamplerPool samplerPool, ShaderStage stage, bool isImage, TextureBindingInfo bindingInfo) + { + CacheEntry entry = GetOrAddEntry(texturePool, samplerPool, bindingInfo, isImage, out bool isNewEntry); + + bool isSampler = bindingInfo.IsSamplerOnly; + bool poolModified = isSampler ? entry.SamplerPoolModified() : entry.TexturePoolModified(); + bool isStore = bindingInfo.Flags.HasFlag(TextureUsageFlags.ImageStore); + bool resScaleUnsupported = bindingInfo.Flags.HasFlag(TextureUsageFlags.ResScaleUnsupported); + + if (!poolModified && !isNewEntry && entry.ValidateTextures()) + { + entry.SynchronizeMemory(isStore, resScaleUnsupported); + + if (isImage) + { + _context.Renderer.Pipeline.SetImageArray(stage, bindingInfo.Binding, entry.ImageArray); + } + else + { + _context.Renderer.Pipeline.SetTextureArray(stage, bindingInfo.Binding, entry.TextureArray); + } + + return; + } + + if (!isNewEntry) + { + entry.Reset(); + } + + int length = (isSampler ? samplerPool.MaximumId : texturePool.MaximumId) + 1; + length = Math.Min(length, bindingInfo.ArrayLength); + + Format[] formats = isImage ? new Format[bindingInfo.ArrayLength] : null; + ISampler[] samplers = isImage ? null : new ISampler[bindingInfo.ArrayLength]; + ITexture[] textures = new ITexture[bindingInfo.ArrayLength]; + + for (int index = 0; index < length; index++) + { + Texture texture = null; + Sampler sampler = null; + + if (isSampler) + { + sampler = samplerPool?.Get(index); + } + else + { + ref readonly TextureDescriptor descriptor = ref texturePool.GetForBinding(index, out texture); + + if (texture != null) + { + entry.Textures[texture] = texture.InvalidatedSequence; + + if (isStore) + { + texture.SignalModified(); + } + + if (resScaleUnsupported && texture.ScaleMode != TextureScaleMode.Blacklisted) + { + // Scaling textures used on arrays is currently not supported. + + texture.BlacklistScale(); + } + } + } + + ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target); + ISampler hostSampler = sampler?.GetHostSampler(texture); + + Format format = bindingInfo.Format; + + if (hostTexture != null && texture.Target == Target.TextureBuffer) + { + // Ensure that the buffer texture is using the correct buffer as storage. + // Buffers are frequently re-created to accommodate larger data, so we need to re-bind + // to ensure we're not using a old buffer that was already deleted. + if (isImage) + { + if (format == 0 && texture != null) + { + format = texture.Format; + } + + _channel.BufferManager.SetBufferTextureStorage(entry.ImageArray, hostTexture, texture.Range, bindingInfo, index, format); + } + else + { + _channel.BufferManager.SetBufferTextureStorage(entry.TextureArray, hostTexture, texture.Range, bindingInfo, index, format); + } + } + else if (isImage) + { + if (format == 0 && texture != null) + { + format = texture.Format; + } + + formats[index] = format; + textures[index] = hostTexture; + } + else + { + samplers[index] = hostSampler; + textures[index] = hostTexture; + } + } + + if (isImage) + { + entry.ImageArray.SetFormats(0, formats); + entry.ImageArray.SetImages(0, textures); + + _context.Renderer.Pipeline.SetImageArray(stage, bindingInfo.Binding, entry.ImageArray); + } + else + { + entry.TextureArray.SetSamplers(0, samplers); + entry.TextureArray.SetTextures(0, textures); + + _context.Renderer.Pipeline.SetTextureArray(stage, bindingInfo.Binding, entry.TextureArray); + } + } + + /// + /// Updates a texture or image array bindings and textures from constant buffer handles. + /// + /// Texture pool + /// Sampler pool + /// Shader stage where the array is used + /// Shader stage index where the array is used + /// Texture constant buffer index + /// Whether the array is a image or texture array + /// Sampler handles source + /// Array binding information + private void UpdateFromBuffer( + TexturePool texturePool, + SamplerPool samplerPool, + ShaderStage stage, + int stageIndex, + int textureBufferIndex, + bool isImage, + SamplerIndex samplerIndex, + TextureBindingInfo bindingInfo) { (textureBufferIndex, int samplerBufferIndex) = TextureHandle.UnpackSlots(bindingInfo.CbufSlot, textureBufferIndex); bool separateSamplerBuffer = textureBufferIndex != samplerBufferIndex; + bool isCompute = stage == ShaderStage.Compute; - ref BufferBounds textureBufferBounds = ref _channel.BufferManager.GetUniformBufferBounds(_isCompute, stageIndex, textureBufferIndex); - ref BufferBounds samplerBufferBounds = ref _channel.BufferManager.GetUniformBufferBounds(_isCompute, stageIndex, samplerBufferIndex); + ref BufferBounds textureBufferBounds = ref _channel.BufferManager.GetUniformBufferBounds(isCompute, stageIndex, textureBufferIndex); + ref BufferBounds samplerBufferBounds = ref _channel.BufferManager.GetUniformBufferBounds(isCompute, stageIndex, samplerBufferIndex); - CacheEntry entry = GetOrAddEntry( + CacheEntryFromBuffer entry = GetOrAddEntry( texturePool, samplerPool, bindingInfo, @@ -589,8 +901,8 @@ namespace Ryujinx.Graphics.Gpu.Image Sampler sampler = samplerPool?.Get(samplerId); - entry.TextureIds[textureId] = texture; - entry.SamplerIds[samplerId] = sampler; + entry.TextureIds[textureId] = (texture, descriptor); + entry.SamplerIds[samplerId] = (sampler, samplerPool?.GetDescriptorRef(samplerId) ?? default); ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target); ISampler hostSampler = sampler?.GetHostSampler(texture); @@ -650,13 +962,12 @@ namespace Ryujinx.Graphics.Gpu.Image } /// - /// Gets a cached texture entry, or creates a new one if not found. + /// Gets a cached texture entry from pool, or creates a new one if not found. /// /// Texture pool /// Sampler pool /// Array binding information /// Whether the array is a image or texture array - /// Constant buffer bounds with the texture handles /// Whether a new entry was created, or an existing one was returned /// Cache entry private CacheEntry GetOrAddEntry( @@ -664,17 +975,11 @@ namespace Ryujinx.Graphics.Gpu.Image SamplerPool samplerPool, TextureBindingInfo bindingInfo, bool isImage, - ref BufferBounds textureBufferBounds, out bool isNew) { - CacheEntryKey key = new CacheEntryKey( - isImage, - bindingInfo, - texturePool, - samplerPool, - ref textureBufferBounds); + CacheEntryFromPoolKey key = new CacheEntryFromPoolKey(isImage, bindingInfo, texturePool, samplerPool); - isNew = !_cache.TryGetValue(key, out CacheEntry entry); + isNew = !_cacheFromPool.TryGetValue(key, out CacheEntry entry); if (isNew) { @@ -684,13 +989,61 @@ namespace Ryujinx.Graphics.Gpu.Image { IImageArray array = _context.Renderer.CreateImageArray(arrayLength, bindingInfo.Target == Target.TextureBuffer); - _cache.Add(key, entry = new CacheEntry(ref key, array, texturePool, samplerPool)); + _cacheFromPool.Add(key, entry = new CacheEntry(array, texturePool, samplerPool)); } else { ITextureArray array = _context.Renderer.CreateTextureArray(arrayLength, bindingInfo.Target == Target.TextureBuffer); - _cache.Add(key, entry = new CacheEntry(ref key, array, texturePool, samplerPool)); + _cacheFromPool.Add(key, entry = new CacheEntry(array, texturePool, samplerPool)); + } + } + + return entry; + } + + /// + /// Gets a cached texture entry from constant buffer, or creates a new one if not found. + /// + /// Texture pool + /// Sampler pool + /// Array binding information + /// Whether the array is a image or texture array + /// Constant buffer bounds with the texture handles + /// Whether a new entry was created, or an existing one was returned + /// Cache entry + private CacheEntryFromBuffer GetOrAddEntry( + TexturePool texturePool, + SamplerPool samplerPool, + TextureBindingInfo bindingInfo, + bool isImage, + ref BufferBounds textureBufferBounds, + out bool isNew) + { + CacheEntryFromBufferKey key = new CacheEntryFromBufferKey( + isImage, + bindingInfo, + texturePool, + samplerPool, + ref textureBufferBounds); + + isNew = !_cacheFromBuffer.TryGetValue(key, out CacheEntryFromBuffer entry); + + if (isNew) + { + int arrayLength = bindingInfo.ArrayLength; + + if (isImage) + { + IImageArray array = _context.Renderer.CreateImageArray(arrayLength, bindingInfo.Target == Target.TextureBuffer); + + _cacheFromBuffer.Add(key, entry = new CacheEntryFromBuffer(ref key, array, texturePool, samplerPool)); + } + else + { + ITextureArray array = _context.Renderer.CreateTextureArray(arrayLength, bindingInfo.Target == Target.TextureBuffer); + + _cacheFromBuffer.Add(key, entry = new CacheEntryFromBuffer(ref key, array, texturePool, samplerPool)); } } @@ -716,15 +1069,52 @@ namespace Ryujinx.Graphics.Gpu.Image /// private void RemoveLeastUsedEntries() { - LinkedListNode nextNode = _lruCache.First; + LinkedListNode nextNode = _lruCache.First; while (nextNode != null && _currentTimestamp - nextNode.Value.CacheTimestamp >= MinDeltaForRemoval) { - LinkedListNode toRemove = nextNode; + LinkedListNode toRemove = nextNode; nextNode = nextNode.Next; - _cache.Remove(toRemove.Value.Key); + _cacheFromBuffer.Remove(toRemove.Value.Key); _lruCache.Remove(toRemove); } } + + /// + /// Removes all cached texture arrays matching the specified texture pool. + /// + /// Texture pool + public void RemoveAllWithPool(IPool pool) + { + List keysToRemove = null; + + foreach (CacheEntryFromPoolKey key in _cacheFromPool.Keys) + { + if (key.MatchesPool(pool)) + { + (keysToRemove ??= new()).Add(key); + } + } + + if (keysToRemove != null) + { + foreach (CacheEntryFromPoolKey key in keysToRemove) + { + _cacheFromPool.Remove(key); + } + } + } + + /// + /// Checks if a handle indicates the binding should have all its textures sourced directly from a pool. + /// + /// Handle to check + /// True if the handle represents direct pool access, false otherwise + private static bool IsDirectHandleType(int handle) + { + (_, _, TextureHandleType type) = TextureHandle.UnpackOffsets(handle); + + return type == TextureHandleType.Direct; + } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs index a1dde673b9..9f1f60d956 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs @@ -34,7 +34,7 @@ namespace Ryujinx.Graphics.Gpu.Image private readonly TexturePoolCache _texturePoolCache; private readonly SamplerPoolCache _samplerPoolCache; - private readonly TextureBindingsArrayCache _arrayBindingsCache; + private readonly TextureBindingsArrayCache _bindingsArrayCache; private TexturePool _cachedTexturePool; private SamplerPool _cachedSamplerPool; @@ -72,12 +72,14 @@ namespace Ryujinx.Graphics.Gpu.Image /// /// The GPU context that the texture bindings manager belongs to /// The GPU channel that the texture bindings manager belongs to + /// Cache of texture array bindings /// Texture pools cache used to get texture pools from /// Sampler pools cache used to get sampler pools from /// True if the bindings manager is used for the compute engine public TextureBindingsManager( GpuContext context, GpuChannel channel, + TextureBindingsArrayCache bindingsArrayCache, TexturePoolCache texturePoolCache, SamplerPoolCache samplerPoolCache, bool isCompute) @@ -89,7 +91,7 @@ namespace Ryujinx.Graphics.Gpu.Image _isCompute = isCompute; - _arrayBindingsCache = new TextureBindingsArrayCache(context, channel, isCompute); + _bindingsArrayCache = bindingsArrayCache; int stages = isCompute ? 1 : Constants.ShaderStages; @@ -456,7 +458,7 @@ namespace Ryujinx.Graphics.Gpu.Image if (bindingInfo.ArrayLength > 1) { - _arrayBindingsCache.UpdateTextureArray(texturePool, samplerPool, stage, stageIndex, _textureBufferIndex, _samplerIndex, bindingInfo); + _bindingsArrayCache.UpdateTextureArray(texturePool, samplerPool, stage, stageIndex, _textureBufferIndex, _samplerIndex, bindingInfo); continue; } @@ -594,7 +596,7 @@ namespace Ryujinx.Graphics.Gpu.Image if (bindingInfo.ArrayLength > 1) { - _arrayBindingsCache.UpdateImageArray(pool, stage, stageIndex, _textureBufferIndex, bindingInfo); + _bindingsArrayCache.UpdateImageArray(pool, stage, stageIndex, _textureBufferIndex, bindingInfo); continue; } @@ -732,7 +734,7 @@ namespace Ryujinx.Graphics.Gpu.Image ulong poolAddress = _channel.MemoryManager.Translate(poolGpuVa); - TexturePool texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, maximumId); + TexturePool texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, maximumId, _bindingsArrayCache); TextureDescriptor descriptor; @@ -828,7 +830,7 @@ namespace Ryujinx.Graphics.Gpu.Image if (poolAddress != MemoryManager.PteUnmapped) { - texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, _texturePoolMaximumId); + texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, _texturePoolMaximumId, _bindingsArrayCache); _texturePool = texturePool; } } @@ -839,7 +841,7 @@ namespace Ryujinx.Graphics.Gpu.Image if (poolAddress != MemoryManager.PteUnmapped) { - samplerPool = _samplerPoolCache.FindOrCreate(_channel, poolAddress, _samplerPoolMaximumId); + samplerPool = _samplerPoolCache.FindOrCreate(_channel, poolAddress, _samplerPoolMaximumId, _bindingsArrayCache); _samplerPool = samplerPool; } } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureManager.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureManager.cs index 8c2a887271..db2921468a 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureManager.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Image/TextureManager.cs @@ -15,6 +15,7 @@ namespace Ryujinx.Graphics.Gpu.Image private readonly TextureBindingsManager _cpBindingsManager; private readonly TextureBindingsManager _gpBindingsManager; + private readonly TextureBindingsArrayCache _bindingsArrayCache; private readonly TexturePoolCache _texturePoolCache; private readonly SamplerPoolCache _samplerPoolCache; @@ -46,8 +47,9 @@ namespace Ryujinx.Graphics.Gpu.Image TexturePoolCache texturePoolCache = new(context); SamplerPoolCache samplerPoolCache = new(context); - _cpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, isCompute: true); - _gpBindingsManager = new TextureBindingsManager(context, channel, texturePoolCache, samplerPoolCache, isCompute: false); + _bindingsArrayCache = new TextureBindingsArrayCache(context, channel); + _cpBindingsManager = new TextureBindingsManager(context, channel, _bindingsArrayCache, texturePoolCache, samplerPoolCache, isCompute: true); + _gpBindingsManager = new TextureBindingsManager(context, channel, _bindingsArrayCache, texturePoolCache, samplerPoolCache, isCompute: false); _texturePoolCache = texturePoolCache; _samplerPoolCache = samplerPoolCache; @@ -384,7 +386,7 @@ namespace Ryujinx.Graphics.Gpu.Image { ulong poolAddress = _channel.MemoryManager.Translate(poolGpuVa); - TexturePool texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, maximumId); + TexturePool texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, maximumId, _bindingsArrayCache); return texturePool; } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs index 6e36753e85..a80dcbc875 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/CachedShaderBindings.cs @@ -58,7 +58,7 @@ namespace Ryujinx.Graphics.Gpu.Shader TextureBindings[i] = stage.Info.Textures.Select(descriptor => { - Target target = ShaderTexture.GetTarget(descriptor.Type); + Target target = descriptor.Type != SamplerType.None ? ShaderTexture.GetTarget(descriptor.Type) : default; var result = new TextureBindingInfo( target, @@ -66,7 +66,8 @@ namespace Ryujinx.Graphics.Gpu.Shader descriptor.ArrayLength, descriptor.CbufSlot, descriptor.HandleIndex, - descriptor.Flags); + descriptor.Flags, + descriptor.Type == SamplerType.None); if (descriptor.ArrayLength <= 1) { diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGpuAccessor.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGpuAccessor.cs index 681838a9b2..45f32e2d39 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGpuAccessor.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGpuAccessor.cs @@ -109,6 +109,13 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache return _oldSpecState.GraphicsState.HasConstantBufferDrawParameters; } + /// + /// Pool length is not available on the cache + public int QuerySamplerArrayLengthFromPool() + { + return QueryArrayLengthFromPool(isSampler: true); + } + /// public SamplerType QuerySamplerType(int handle, int cbufSlot) { @@ -117,6 +124,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache } /// + /// Constant buffer derived length is not available on the cache public int QueryTextureArrayLengthFromBuffer(int slot) { if (!_oldSpecState.TextureArrayFromBufferRegistered(_stageIndex, 0, slot)) @@ -130,6 +138,13 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache return arrayLength; } + /// + /// Pool length is not available on the cache + public int QueryTextureArrayLengthFromPool() + { + return QueryArrayLengthFromPool(isSampler: false); + } + /// public TextureFormat QueryTextureFormat(int handle, int cbufSlot) { @@ -170,6 +185,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache } /// + /// Texture information is not available on the cache public void RegisterTexture(int handle, int cbufSlot) { if (!_oldSpecState.TextureRegistered(_stageIndex, handle, cbufSlot)) @@ -182,5 +198,24 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache bool coordNormalized = _oldSpecState.GetCoordNormalized(_stageIndex, handle, cbufSlot); _newSpecState.RegisterTexture(_stageIndex, handle, cbufSlot, format, formatSrgb, target, coordNormalized); } + + /// + /// Gets the cached texture or sampler pool capacity. + /// + /// True to get sampler pool length, false for texture pool length + /// Pool length + /// Pool length is not available on the cache + private int QueryArrayLengthFromPool(bool isSampler) + { + if (!_oldSpecState.TextureArrayFromPoolRegistered(isSampler)) + { + throw new DiskCacheLoadException(DiskCacheLoadResult.MissingTextureArrayLength); + } + + int arrayLength = _oldSpecState.GetTextureArrayFromPoolLength(isSampler); + _newSpecState.RegisterTextureArrayLengthFromPool(isSampler, arrayLength); + + return arrayLength; + } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs index b6a277a2af..2c19cc4b98 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs @@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache private const ushort FileFormatVersionMajor = 1; private const ushort FileFormatVersionMinor = 2; private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor; - private const uint CodeGenVersion = 6489; + private const uint CodeGenVersion = 6577; private const string SharedTocFileName = "shared.toc"; private const string SharedDataFileName = "shared.data"; diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs index 1d22ab9332..04949690a2 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs @@ -120,6 +120,15 @@ namespace Ryujinx.Graphics.Gpu.Shader return _state.GraphicsState.HasUnalignedStorageBuffer || _state.ComputeState.HasUnalignedStorageBuffer; } + /// + public int QuerySamplerArrayLengthFromPool() + { + int length = _state.SamplerPoolMaximumId + 1; + _state.SpecializationState?.RegisterTextureArrayLengthFromPool(isSampler: true, length); + + return length; + } + /// public SamplerType QuerySamplerType(int handle, int cbufSlot) { @@ -141,6 +150,15 @@ namespace Ryujinx.Graphics.Gpu.Shader return arrayLength; } + /// + public int QueryTextureArrayLengthFromPool() + { + int length = _state.PoolState.TexturePoolMaximumId + 1; + _state.SpecializationState?.RegisterTextureArrayLengthFromPool(isSampler: false, length); + + return length; + } + //// public TextureFormat QueryTextureFormat(int handle, int cbufSlot) { diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs index 06e5edf1eb..0d562b0da2 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorBase.cs @@ -213,6 +213,8 @@ namespace Ryujinx.Graphics.Gpu.Shader public bool QueryHostSupportsScaledVertexFormats() => _context.Capabilities.SupportsScaledVertexFormats; + public bool QueryHostSupportsSeparateSampler() => _context.Capabilities.SupportsSeparateSampler; + public bool QueryHostSupportsShaderBallot() => _context.Capabilities.SupportsShaderBallot; public bool QueryHostSupportsShaderBarrierDivergence() => _context.Capabilities.SupportsShaderBarrierDivergence; diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorState.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorState.cs index cfc4a2cccc..808bf18514 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorState.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuAccessorState.cs @@ -5,6 +5,11 @@ namespace Ryujinx.Graphics.Gpu.Shader /// class GpuAccessorState { + /// + /// Maximum ID that a sampler pool entry may have. + /// + public readonly int SamplerPoolMaximumId; + /// /// GPU texture pool state. /// @@ -38,18 +43,21 @@ namespace Ryujinx.Graphics.Gpu.Shader /// /// Creates a new GPU accessor state. /// + /// Maximum ID that a sampler pool entry may have /// GPU texture pool state /// GPU compute state, for compute shaders /// GPU graphics state, for vertex, tessellation, geometry and fragment shaders /// Shader specialization state (shared by all stages) /// Transform feedback information, if the shader uses transform feedback. Otherwise, should be null public GpuAccessorState( + int samplerPoolMaximumId, GpuChannelPoolState poolState, GpuChannelComputeState computeState, GpuChannelGraphicsState graphicsState, ShaderSpecializationState specializationState, TransformFeedbackDescriptor[] transformFeedbackDescriptors = null) { + SamplerPoolMaximumId = samplerPoolMaximumId; PoolState = poolState; GraphicsState = graphicsState; ComputeState = computeState; diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelPoolState.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelPoolState.cs index ddb45152ef..a2ab993358 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelPoolState.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/GpuChannelPoolState.cs @@ -2,7 +2,6 @@ using System; namespace Ryujinx.Graphics.Gpu.Shader { -#pragma warning disable CS0659 // Class overrides Object.Equals(object o) but does not override Object.GetHashCode() /// /// State used by the . /// @@ -52,6 +51,10 @@ namespace Ryujinx.Graphics.Gpu.Shader { return obj is GpuChannelPoolState state && Equals(state); } + + public override int GetHashCode() + { + return HashCode.Combine(TexturePoolGpuVa, TexturePoolMaximumId, TextureBufferIndex); + } } -#pragma warning restore CS0659 } diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 0b17af8b27..31cc94a25c 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -192,12 +192,14 @@ namespace Ryujinx.Graphics.Gpu.Shader /// This automatically translates, compiles and adds the code to the cache if not present. /// /// GPU channel + /// Maximum ID that an entry in the sampler pool may have /// Texture pool state /// Compute engine state /// GPU virtual address of the binary shader code /// Compiled compute shader code public CachedShaderProgram GetComputeShader( GpuChannel channel, + int samplerPoolMaximumId, GpuChannelPoolState poolState, GpuChannelComputeState computeState, ulong gpuVa) @@ -214,7 +216,7 @@ namespace Ryujinx.Graphics.Gpu.Shader } ShaderSpecializationState specState = new(ref computeState); - GpuAccessorState gpuAccessorState = new(poolState, computeState, default, specState); + GpuAccessorState gpuAccessorState = new(samplerPoolMaximumId, poolState, computeState, default, specState); GpuAccessor gpuAccessor = new(_context, channel, gpuAccessorState); gpuAccessor.InitializeReservedCounts(tfEnabled: false, vertexAsCompute: false); @@ -291,6 +293,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// GPU state /// Pipeline state /// GPU channel + /// Maximum ID that an entry in the sampler pool may have /// Texture pool state /// 3D engine state /// Addresses of the shaders for each stage @@ -299,6 +302,7 @@ namespace Ryujinx.Graphics.Gpu.Shader ref ThreedClassState state, ref ProgramPipelineState pipeline, GpuChannel channel, + int samplerPoolMaximumId, ref GpuChannelPoolState poolState, ref GpuChannelGraphicsState graphicsState, ShaderAddresses addresses) @@ -319,7 +323,7 @@ namespace Ryujinx.Graphics.Gpu.Shader UpdatePipelineInfo(ref state, ref pipeline, graphicsState, channel); ShaderSpecializationState specState = new(ref graphicsState, ref pipeline, transformFeedbackDescriptors); - GpuAccessorState gpuAccessorState = new(poolState, default, graphicsState, specState, transformFeedbackDescriptors); + GpuAccessorState gpuAccessorState = new(samplerPoolMaximumId, poolState, default, graphicsState, specState, transformFeedbackDescriptors); ReadOnlySpan addressesSpan = addresses.AsSpan(); diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs index ea8f164f10..ed56db3b30 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderInfoBuilder.cs @@ -185,11 +185,7 @@ namespace Ryujinx.Graphics.Gpu.Shader { if (texture.ArrayLength > 1) { - bool isBuffer = (texture.Type & SamplerType.Mask) == SamplerType.TextureBuffer; - - ResourceType type = isBuffer - ? (isImage ? ResourceType.BufferImage : ResourceType.BufferTexture) - : (isImage ? ResourceType.Image : ResourceType.TextureAndSampler); + ResourceType type = GetTextureResourceType(texture, isImage); _resourceDescriptors[setIndex].Add(new ResourceDescriptor(texture.Binding, texture.ArrayLength, type, stages)); } @@ -242,16 +238,38 @@ namespace Ryujinx.Graphics.Gpu.Shader { foreach (TextureDescriptor texture in textures) { - bool isBuffer = (texture.Type & SamplerType.Mask) == SamplerType.TextureBuffer; - - ResourceType type = isBuffer - ? (isImage ? ResourceType.BufferImage : ResourceType.BufferTexture) - : (isImage ? ResourceType.Image : ResourceType.TextureAndSampler); + ResourceType type = GetTextureResourceType(texture, isImage); _resourceUsages[setIndex].Add(new ResourceUsage(texture.Binding, texture.ArrayLength, type, stages)); } } + private static ResourceType GetTextureResourceType(TextureDescriptor texture, bool isImage) + { + bool isBuffer = (texture.Type & SamplerType.Mask) == SamplerType.TextureBuffer; + + if (isBuffer) + { + return isImage ? ResourceType.BufferImage : ResourceType.BufferTexture; + } + else if (isImage) + { + return ResourceType.Image; + } + else if (texture.Type == SamplerType.None) + { + return ResourceType.Sampler; + } + else if (texture.Separate) + { + return ResourceType.Texture; + } + else + { + return ResourceType.TextureAndSampler; + } + } + /// /// Creates a new shader information structure from the added information. /// diff --git a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs index c90a0b8f4b..98acb6f27d 100644 --- a/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs +++ b/ryujinx/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs @@ -31,6 +31,7 @@ namespace Ryujinx.Graphics.Gpu.Shader PrimitiveTopology = 1 << 1, TransformFeedback = 1 << 3, TextureArrayFromBuffer = 1 << 4, + TextureArrayFromPool = 1 << 5, } private QueriedStateFlags _queriedState; @@ -154,7 +155,8 @@ namespace Ryujinx.Graphics.Gpu.Shader } private readonly Dictionary> _textureSpecialization; - private readonly Dictionary _textureArraySpecialization; + private readonly Dictionary _textureArrayFromBufferSpecialization; + private readonly Dictionary _textureArrayFromPoolSpecialization; private KeyValuePair>[] _allTextures; private Box[][] _textureByBinding; private Box[][] _imageByBinding; @@ -165,7 +167,8 @@ namespace Ryujinx.Graphics.Gpu.Shader private ShaderSpecializationState() { _textureSpecialization = new Dictionary>(); - _textureArraySpecialization = new Dictionary(); + _textureArrayFromBufferSpecialization = new Dictionary(); + _textureArrayFromPoolSpecialization = new Dictionary(); } /// @@ -327,7 +330,7 @@ namespace Ryujinx.Graphics.Gpu.Shader } /// - /// Indicates that the coordinate normalization state of a given texture was used during the shader translation process. + /// Registers the length of a texture array calculated from a constant buffer size. /// /// Shader stage where the texture is used /// Offset in words of the texture handle on the texture buffer @@ -335,10 +338,21 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Number of elements in the texture array public void RegisterTextureArrayLengthFromBuffer(int stageIndex, int handle, int cbufSlot, int length) { - _textureArraySpecialization[new TextureKey(stageIndex, handle, cbufSlot)] = length; + _textureArrayFromBufferSpecialization[new TextureKey(stageIndex, handle, cbufSlot)] = length; _queriedState |= QueriedStateFlags.TextureArrayFromBuffer; } + /// + /// Registers the length of a texture array calculated from a texture or sampler pool capacity. + /// + /// True for sampler pool, false for texture pool + /// Number of elements in the texture array + public void RegisterTextureArrayLengthFromPool(bool isSampler, int length) + { + _textureArrayFromPoolSpecialization[isSampler] = length; + _queriedState |= QueriedStateFlags.TextureArrayFromPool; + } + /// /// Indicates that the format of a given texture was used during the shader translation process. /// @@ -385,7 +399,7 @@ namespace Ryujinx.Graphics.Gpu.Shader } /// - /// Checks if a given texture was registerd on this specialization state. + /// Checks if a given texture was registered on this specialization state. /// /// Shader stage where the texture is used /// Offset in words of the texture handle on the texture buffer @@ -396,14 +410,25 @@ namespace Ryujinx.Graphics.Gpu.Shader } /// - /// Checks if a given texture array (from constant buffer) was registerd on this specialization state. + /// Checks if a given texture array (from constant buffer) was registered on this specialization state. /// /// Shader stage where the texture is used /// Offset in words of the texture handle on the texture buffer /// Slot of the texture buffer constant buffer + /// True if the length for the given buffer and stage exists, false otherwise public bool TextureArrayFromBufferRegistered(int stageIndex, int handle, int cbufSlot) { - return _textureArraySpecialization.ContainsKey(new TextureKey(stageIndex, handle, cbufSlot)); + return _textureArrayFromBufferSpecialization.ContainsKey(new TextureKey(stageIndex, handle, cbufSlot)); + } + + /// + /// Checks if a given texture array (from a sampler pool or texture pool) was registered on this specialization state. + /// + /// True for sampler pool, false for texture pool + /// True if the length for the given pool, false otherwise + public bool TextureArrayFromPoolRegistered(bool isSampler) + { + return _textureArrayFromPoolSpecialization.ContainsKey(isSampler); } /// @@ -412,6 +437,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Shader stage where the texture is used /// Offset in words of the texture handle on the texture buffer /// Slot of the texture buffer constant buffer + /// Format and sRGB tuple public (uint, bool) GetFormat(int stageIndex, int handle, int cbufSlot) { TextureSpecializationState state = GetTextureSpecState(stageIndex, handle, cbufSlot).Value; @@ -424,6 +450,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Shader stage where the texture is used /// Offset in words of the texture handle on the texture buffer /// Slot of the texture buffer constant buffer + /// Texture target public TextureTarget GetTextureTarget(int stageIndex, int handle, int cbufSlot) { return GetTextureSpecState(stageIndex, handle, cbufSlot).Value.TextureTarget; @@ -435,6 +462,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Shader stage where the texture is used /// Offset in words of the texture handle on the texture buffer /// Slot of the texture buffer constant buffer + /// True if coordinates are normalized, false otherwise public bool GetCoordNormalized(int stageIndex, int handle, int cbufSlot) { return GetTextureSpecState(stageIndex, handle, cbufSlot).Value.CoordNormalized; @@ -446,9 +474,20 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Shader stage where the texture is used /// Offset in words of the texture handle on the texture buffer /// Slot of the texture buffer constant buffer + /// Texture array length public int GetTextureArrayFromBufferLength(int stageIndex, int handle, int cbufSlot) { - return _textureArraySpecialization[new TextureKey(stageIndex, handle, cbufSlot)]; + return _textureArrayFromBufferSpecialization[new TextureKey(stageIndex, handle, cbufSlot)]; + } + + /// + /// Gets the recorded length of a given texture array (from a sampler or texture pool). + /// + /// True to get the sampler pool length, false to get the texture pool length + /// Texture array length + public int GetTextureArrayFromPoolLength(bool isSampler) + { + return _textureArrayFromPoolSpecialization[isSampler]; } /// @@ -894,7 +933,23 @@ namespace Ryujinx.Graphics.Gpu.Shader dataReader.ReadWithMagicAndSize(ref textureKey, TexkMagic); dataReader.Read(ref length); - specState._textureArraySpecialization[textureKey] = length; + specState._textureArrayFromBufferSpecialization[textureKey] = length; + } + } + + if (specState._queriedState.HasFlag(QueriedStateFlags.TextureArrayFromPool)) + { + dataReader.Read(ref count); + + for (int index = 0; index < count; index++) + { + bool textureKey = default; + int length = 0; + + dataReader.ReadWithMagicAndSize(ref textureKey, TexkMagic); + dataReader.Read(ref length); + + specState._textureArrayFromPoolSpecialization[textureKey] = length; } } @@ -965,10 +1020,25 @@ namespace Ryujinx.Graphics.Gpu.Shader if (_queriedState.HasFlag(QueriedStateFlags.TextureArrayFromBuffer)) { - count = (ushort)_textureArraySpecialization.Count; + count = (ushort)_textureArrayFromBufferSpecialization.Count; dataWriter.Write(ref count); - foreach (var kv in _textureArraySpecialization) + foreach (var kv in _textureArrayFromBufferSpecialization) + { + var textureKey = kv.Key; + var length = kv.Value; + + dataWriter.WriteWithMagicAndSize(ref textureKey, TexkMagic); + dataWriter.Write(ref length); + } + } + + if (_queriedState.HasFlag(QueriedStateFlags.TextureArrayFromPool)) + { + count = (ushort)_textureArrayFromPoolSpecialization.Count; + dataWriter.Write(ref count); + + foreach (var kv in _textureArrayFromPoolSpecialization) { var textureKey = kv.Key; var length = kv.Value; diff --git a/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs b/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs index a945cbf202..d56c40af46 100644 --- a/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs +++ b/ryujinx/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs @@ -176,6 +176,7 @@ namespace Ryujinx.Graphics.OpenGL supportsCubemapView: true, supportsNonConstantTextureOffset: HwCapabilities.SupportsNonConstantTextureOffset, supportsScaledVertexFormats: true, + supportsSeparateSampler: false, supportsShaderBallot: HwCapabilities.SupportsShaderBallot, supportsShaderBarrierDivergence: !(intelWindows || intelUnix), supportsShaderFloat64: true, diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs index 763487dac6..eb6c689b88 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs @@ -6,7 +6,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Numerics; namespace Ryujinx.Graphics.Shader.CodeGen.Glsl { @@ -352,7 +351,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl arrayDecl = "[]"; } - string samplerTypeName = definition.Type.ToGlslSamplerType(); + string samplerTypeName = definition.Separate ? definition.Type.ToGlslTextureType() : definition.Type.ToGlslSamplerType(); string layout = string.Empty; diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs index b4773b819c..f0e57b534b 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs @@ -639,14 +639,27 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions private static string GetSamplerName(CodeGenContext context, AstTextureOperation texOp, ref int srcIndex) { - TextureDefinition definition = context.Properties.Textures[texOp.Binding]; - string name = definition.Name; + TextureDefinition textureDefinition = context.Properties.Textures[texOp.Binding]; + string name = textureDefinition.Name; - if (definition.ArrayLength != 1) + if (textureDefinition.ArrayLength != 1) { name = $"{name}[{GetSourceExpr(context, texOp.GetSource(srcIndex++), AggregateType.S32)}]"; } + if (texOp.IsSeparate) + { + TextureDefinition samplerDefinition = context.Properties.Textures[texOp.SamplerBinding]; + string samplerName = samplerDefinition.Name; + + if (samplerDefinition.ArrayLength != 1) + { + samplerName = $"{samplerName}[{GetSourceExpr(context, texOp.GetSource(srcIndex++), AggregateType.S32)}]"; + } + + name = $"{texOp.Type.ToGlslSamplerType()}({name}, {samplerName})"; + } + return name; } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs index 9633c522ea..37df4df802 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Declarations.cs @@ -160,37 +160,49 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { int setIndex = context.TargetApi == TargetApi.Vulkan ? sampler.Set : 0; - var dim = (sampler.Type & SamplerType.Mask) switch + SpvInstruction imageType; + SpvInstruction sampledImageType; + + if (sampler.Type != SamplerType.None) { - SamplerType.Texture1D => Dim.Dim1D, - SamplerType.Texture2D => Dim.Dim2D, - SamplerType.Texture3D => Dim.Dim3D, - SamplerType.TextureCube => Dim.Cube, - SamplerType.TextureBuffer => Dim.Buffer, - _ => throw new InvalidOperationException($"Invalid sampler type \"{sampler.Type & SamplerType.Mask}\"."), - }; + var dim = (sampler.Type & SamplerType.Mask) switch + { + SamplerType.Texture1D => Dim.Dim1D, + SamplerType.Texture2D => Dim.Dim2D, + SamplerType.Texture3D => Dim.Dim3D, + SamplerType.TextureCube => Dim.Cube, + SamplerType.TextureBuffer => Dim.Buffer, + _ => throw new InvalidOperationException($"Invalid sampler type \"{sampler.Type & SamplerType.Mask}\"."), + }; - var imageType = context.TypeImage( - context.TypeFP32(), - dim, - sampler.Type.HasFlag(SamplerType.Shadow), - sampler.Type.HasFlag(SamplerType.Array), - sampler.Type.HasFlag(SamplerType.Multisample), - 1, - ImageFormat.Unknown); + imageType = context.TypeImage( + context.TypeFP32(), + dim, + sampler.Type.HasFlag(SamplerType.Shadow), + sampler.Type.HasFlag(SamplerType.Array), + sampler.Type.HasFlag(SamplerType.Multisample), + 1, + ImageFormat.Unknown); - var sampledImageType = context.TypeSampledImage(imageType); - var sampledImagePointerType = context.TypePointer(StorageClass.UniformConstant, sampledImageType); + sampledImageType = context.TypeSampledImage(imageType); + } + else + { + imageType = sampledImageType = context.TypeSampler(); + } + + var sampledOrSeparateImageType = sampler.Separate ? imageType : sampledImageType; + var sampledImagePointerType = context.TypePointer(StorageClass.UniformConstant, sampledOrSeparateImageType); var sampledImageArrayPointerType = sampledImagePointerType; if (sampler.ArrayLength == 0) { - var sampledImageArrayType = context.TypeRuntimeArray(sampledImageType); + var sampledImageArrayType = context.TypeRuntimeArray(sampledOrSeparateImageType); sampledImageArrayPointerType = context.TypePointer(StorageClass.UniformConstant, sampledImageArrayType); } else if (sampler.ArrayLength != 1) { - var sampledImageArrayType = context.TypeArray(sampledImageType, context.Constant(context.TypeU32(), sampler.ArrayLength)); + var sampledImageArrayType = context.TypeArray(sampledOrSeparateImageType, context.Constant(context.TypeU32(), sampler.ArrayLength)); sampledImageArrayPointerType = context.TypePointer(StorageClass.UniformConstant, sampledImageArrayType); } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs index 409e466cd7..34f8532a65 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs @@ -838,16 +838,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } SamplerDeclaration declaration = context.Samplers[texOp.Binding]; - SpvInstruction image = declaration.Image; - - if (declaration.IsIndexed) - { - SpvInstruction textureIndex = Src(AggregateType.S32); - - image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex); - } - - image = context.Load(declaration.SampledImageType, image); + SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex); int pCount = texOp.Type.GetDimensions(); @@ -1171,16 +1162,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } SamplerDeclaration declaration = context.Samplers[texOp.Binding]; - SpvInstruction image = declaration.Image; - - if (declaration.IsIndexed) - { - SpvInstruction textureIndex = Src(AggregateType.S32); - - image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex); - } - - image = context.Load(declaration.SampledImageType, image); + SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex); int coordsCount = texOp.Type.GetDimensions(); @@ -1449,17 +1431,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { AstTextureOperation texOp = (AstTextureOperation)operation; + int srcIndex = 0; + SamplerDeclaration declaration = context.Samplers[texOp.Binding]; - SpvInstruction image = declaration.Image; + SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex); - if (declaration.IsIndexed) - { - SpvInstruction textureIndex = context.GetS32(texOp.GetSource(0)); - - image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex); - } - - image = context.Load(declaration.SampledImageType, image); image = context.Image(declaration.ImageType, image); SpvInstruction result = context.ImageQuerySamples(context.TypeS32(), image); @@ -1471,17 +1447,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv { AstTextureOperation texOp = (AstTextureOperation)operation; + int srcIndex = 0; + SamplerDeclaration declaration = context.Samplers[texOp.Binding]; - SpvInstruction image = declaration.Image; + SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex); - if (declaration.IsIndexed) - { - SpvInstruction textureIndex = context.GetS32(texOp.GetSource(0)); - - image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex); - } - - image = context.Load(declaration.SampledImageType, image); image = context.Image(declaration.ImageType, image); if (texOp.Index == 3) @@ -1506,8 +1476,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv if (hasLod) { - int lodSrcIndex = declaration.IsIndexed ? 1 : 0; - var lod = context.GetS32(operation.GetSource(lodSrcIndex)); + var lod = context.GetS32(operation.GetSource(srcIndex)); result = context.ImageQuerySizeLod(resultType, image, lod); } else @@ -1905,6 +1874,43 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv } } + private static SpvInstruction GenerateSampledImageLoad(CodeGenContext context, AstTextureOperation texOp, SamplerDeclaration declaration, ref int srcIndex) + { + SpvInstruction image = declaration.Image; + + if (declaration.IsIndexed) + { + SpvInstruction textureIndex = context.Get(AggregateType.S32, texOp.GetSource(srcIndex++)); + + image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex); + } + + if (texOp.IsSeparate) + { + image = context.Load(declaration.ImageType, image); + + SamplerDeclaration samplerDeclaration = context.Samplers[texOp.SamplerBinding]; + + SpvInstruction sampler = samplerDeclaration.Image; + + if (samplerDeclaration.IsIndexed) + { + SpvInstruction samplerIndex = context.Get(AggregateType.S32, texOp.GetSource(srcIndex++)); + + sampler = context.AccessChain(samplerDeclaration.SampledImagePointerType, sampler, samplerIndex); + } + + sampler = context.Load(samplerDeclaration.ImageType, sampler); + image = context.SampledImage(declaration.SampledImageType, image, sampler); + } + else + { + image = context.Load(declaration.SampledImageType, image); + } + + return image; + } + private static OperationResult GenerateUnary( CodeGenContext context, AstOperation operation, diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs b/ryujinx/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs index 99366ad67e..b1a9f9f842 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/IGpuAccessor.cs @@ -26,13 +26,6 @@ namespace Ryujinx.Graphics.Shader /// Span of the memory location ReadOnlySpan GetCode(ulong address, int minimumSize); - /// - /// Gets the size in bytes of a bound constant buffer for the current shader stage. - /// - /// The number of the constant buffer to get the size from - /// Size in bytes - int QueryTextureArrayLengthFromBuffer(int slot); - /// /// Queries the binding number of a constant buffer. /// @@ -298,6 +291,15 @@ namespace Ryujinx.Graphics.Shader return true; } + /// + /// Queries host API support for separate textures and samplers. + /// + /// True if the API supports samplers and textures to be combined on the shader, false otherwise + bool QueryHostSupportsSeparateSampler() + { + return true; + } + /// /// Queries host GPU shader ballot support. /// @@ -388,6 +390,12 @@ namespace Ryujinx.Graphics.Shader return true; } + /// + /// Gets the maximum number of samplers that the bound texture pool may have. + /// + /// Maximum amount of samplers that the pool may have + int QuerySamplerArrayLengthFromPool(); + /// /// Queries sampler type information. /// @@ -399,6 +407,19 @@ namespace Ryujinx.Graphics.Shader return SamplerType.Texture2D; } + /// + /// Gets the size in bytes of a bound constant buffer for the current shader stage. + /// + /// The number of the constant buffer to get the size from + /// Size in bytes + int QueryTextureArrayLengthFromBuffer(int slot); + + /// + /// Gets the maximum number of textures that the bound texture pool may have. + /// + /// Maximum amount of textures that the pool may have + int QueryTextureArrayLengthFromPool(); + /// /// Queries texture coordinate normalization information. /// diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs b/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs index 0c1b2a3f35..713e8a4fb7 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs @@ -216,6 +216,11 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation newSources[index] = source; + if (source != null && source.Type == OperandType.LocalVariable) + { + source.UseOps.Add(this); + } + _sources = newSources; } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs b/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs index 1b82e2945b..74ec5ca611 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs @@ -9,6 +9,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation public TextureFlags Flags { get; private set; } public int Binding { get; private set; } + public int SamplerBinding { get; private set; } public TextureOperation( Instruction inst, @@ -24,6 +25,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation Format = format; Flags = flags; Binding = binding; + SamplerBinding = -1; } public void TurnIntoArray(int binding) @@ -32,6 +34,13 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation Binding = binding; } + public void TurnIntoArray(int textureBinding, int samplerBinding) + { + TurnIntoArray(textureBinding); + + SamplerBinding = samplerBinding; + } + public void SetBinding(int binding) { if ((Flags & TextureFlags.Bindless) != 0) diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/SamplerType.cs b/ryujinx/src/Ryujinx.Graphics.Shader/SamplerType.cs index 66c748bf3a..a693495fa5 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/SamplerType.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/SamplerType.cs @@ -69,6 +69,7 @@ namespace Ryujinx.Graphics.Shader { string typeName = (type & SamplerType.Mask) switch { + SamplerType.None => "sampler", SamplerType.Texture1D => "sampler1D", SamplerType.TextureBuffer => "samplerBuffer", SamplerType.Texture2D => "sampler2D", @@ -95,6 +96,31 @@ namespace Ryujinx.Graphics.Shader return typeName; } + public static string ToGlslTextureType(this SamplerType type) + { + string typeName = (type & SamplerType.Mask) switch + { + SamplerType.Texture1D => "texture1D", + SamplerType.TextureBuffer => "textureBuffer", + SamplerType.Texture2D => "texture2D", + SamplerType.Texture3D => "texture3D", + SamplerType.TextureCube => "textureCube", + _ => throw new ArgumentException($"Invalid texture type \"{type}\"."), + }; + + if ((type & SamplerType.Multisample) != 0) + { + typeName += "MS"; + } + + if ((type & SamplerType.Array) != 0) + { + typeName += "Array"; + } + + return typeName; + } + public static string ToGlslImageType(this SamplerType type, AggregateType componentType) { string typeName = (type & SamplerType.Mask) switch diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/AstTextureOperation.cs b/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/AstTextureOperation.cs index 3970df1e94..4068c41271 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/AstTextureOperation.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/AstTextureOperation.cs @@ -9,6 +9,9 @@ namespace Ryujinx.Graphics.Shader.StructuredIr public TextureFlags Flags { get; } public int Binding { get; } + public int SamplerBinding { get; } + + public bool IsSeparate => SamplerBinding >= 0; public AstTextureOperation( Instruction inst, @@ -16,6 +19,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr TextureFormat format, TextureFlags flags, int binding, + int samplerBinding, int index, params IAstNode[] sources) : base(inst, StorageKind.None, false, index, sources, sources.Length) { @@ -23,6 +27,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Format = format; Flags = flags; Binding = binding; + SamplerBinding = samplerBinding; } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs b/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs index 2e2df75468..c4ebaee73f 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs @@ -169,7 +169,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr AstTextureOperation GetAstTextureOperation(TextureOperation texOp) { - return new AstTextureOperation(inst, texOp.Type, texOp.Format, texOp.Flags, texOp.Binding, texOp.Index, sources); + return new AstTextureOperation(inst, texOp.Type, texOp.Format, texOp.Flags, texOp.Binding, texOp.SamplerBinding, texOp.Index, sources); } int componentsCount = BitOperations.PopCount((uint)operation.Index); diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/TextureDefinition.cs b/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/TextureDefinition.cs index bdd3a2ed14..1021dff0e8 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/TextureDefinition.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/StructuredIr/TextureDefinition.cs @@ -5,25 +5,39 @@ namespace Ryujinx.Graphics.Shader public int Set { get; } public int Binding { get; } public int ArrayLength { get; } + public bool Separate { get; } public string Name { get; } public SamplerType Type { get; } public TextureFormat Format { get; } public TextureUsageFlags Flags { get; } - public TextureDefinition(int set, int binding, int arrayLength, string name, SamplerType type, TextureFormat format, TextureUsageFlags flags) + public TextureDefinition( + int set, + int binding, + int arrayLength, + bool separate, + string name, + SamplerType type, + TextureFormat format, + TextureUsageFlags flags) { Set = set; Binding = binding; ArrayLength = arrayLength; + Separate = separate; Name = name; Type = type; Format = format; Flags = flags; } + public TextureDefinition(int set, int binding, string name, SamplerType type) : this(set, binding, 1, false, name, type, TextureFormat.Unknown, TextureUsageFlags.None) + { + } + public TextureDefinition SetFlag(TextureUsageFlags flag) { - return new TextureDefinition(Set, Binding, ArrayLength, Name, Type, Format, Flags | flag); + return new TextureDefinition(Set, Binding, ArrayLength, Separate, Name, Type, Format, Flags | flag); } } } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/TextureDescriptor.cs b/ryujinx/src/Ryujinx.Graphics.Shader/TextureDescriptor.cs index 38834da726..d287a1aa7b 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/TextureDescriptor.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/TextureDescriptor.cs @@ -13,6 +13,8 @@ namespace Ryujinx.Graphics.Shader public readonly int HandleIndex; public readonly int ArrayLength; + public readonly bool Separate; + public readonly TextureUsageFlags Flags; public TextureDescriptor( @@ -22,6 +24,7 @@ namespace Ryujinx.Graphics.Shader int cbufSlot, int handleIndex, int arrayLength, + bool separate, TextureUsageFlags flags) { Binding = binding; @@ -30,6 +33,7 @@ namespace Ryujinx.Graphics.Shader CbufSlot = cbufSlot; HandleIndex = handleIndex; ArrayLength = arrayLength; + Separate = separate; Flags = flags; } } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/TextureHandle.cs b/ryujinx/src/Ryujinx.Graphics.Shader/TextureHandle.cs index 7df9c8e47b..3aaceac480 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/TextureHandle.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/TextureHandle.cs @@ -9,6 +9,7 @@ namespace Ryujinx.Graphics.Shader SeparateSamplerHandle = 1, SeparateSamplerId = 2, SeparateConstantSamplerHandle = 3, + Direct = 4, } public static class TextureHandle diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs index ad955278fe..223215439f 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs @@ -1,6 +1,7 @@ using Ryujinx.Graphics.Shader.Instructions; using Ryujinx.Graphics.Shader.IntermediateRepresentation; using Ryujinx.Graphics.Shader.StructuredIr; +using System; using System.Collections.Generic; namespace Ryujinx.Graphics.Shader.Translation.Optimizations @@ -31,7 +32,8 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations continue; } - if (!TryConvertBindless(block, resourceManager, gpuAccessor, texOp)) + if (!TryConvertBindless(block, resourceManager, gpuAccessor, texOp) && + !GenerateBindlessAccess(block, resourceManager, gpuAccessor, texOp, node)) { // If we can't do bindless elimination, remove the texture operation. // Set any destination variables to zero. @@ -46,6 +48,88 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations } } + private static bool GenerateBindlessAccess( + BasicBlock block, + ResourceManager resourceManager, + IGpuAccessor gpuAccessor, + TextureOperation texOp, + LinkedListNode node) + { + if (!gpuAccessor.QueryHostSupportsSeparateSampler()) + { + // We depend on combining samplers and textures in the shader being supported for this. + + return false; + } + + Operand nvHandle = texOp.GetSource(0); + + if (nvHandle.AsgOp is not Operation handleOp || + handleOp.Inst != Instruction.Load || + handleOp.StorageKind != StorageKind.Input) + { + // Right now, we only allow bindless access when the handle comes from a shader input. + // This is an artificial limitation to prevent it from being used in cases where it + // would have a large performance impact of loading all textures in the pool. + // It might be removed in the future, if we can mitigate the performance impact. + + return false; + } + + Operand textureHandle = OperandHelper.Local(); + Operand samplerHandle = OperandHelper.Local(); + Operand textureIndex = OperandHelper.Local(); + + block.Operations.AddBefore(node, new Operation(Instruction.BitwiseAnd, textureHandle, nvHandle, OperandHelper.Const(0xfffff))); + block.Operations.AddBefore(node, new Operation(Instruction.ShiftRightU32, samplerHandle, nvHandle, OperandHelper.Const(20))); + + int texturePoolLength = Math.Max(BindlessToArray.MinimumArrayLength, gpuAccessor.QueryTextureArrayLengthFromPool()); + + block.Operations.AddBefore(node, new Operation(Instruction.MinimumU32, textureIndex, textureHandle, OperandHelper.Const(texturePoolLength - 1))); + + texOp.SetSource(0, textureIndex); + + bool hasSampler = !texOp.Inst.IsImage(); + + int textureBinding = resourceManager.GetTextureOrImageBinding( + texOp.Inst, + texOp.Type, + texOp.Format, + texOp.Flags & ~TextureFlags.Bindless, + 0, + TextureHandle.PackOffsets(0, 0, TextureHandleType.Direct), + texturePoolLength, + hasSampler); + + if (hasSampler) + { + Operand samplerIndex = OperandHelper.Local(); + + int samplerPoolLength = Math.Max(BindlessToArray.MinimumArrayLength, gpuAccessor.QuerySamplerArrayLengthFromPool()); + + block.Operations.AddBefore(node, new Operation(Instruction.MinimumU32, samplerIndex, samplerHandle, OperandHelper.Const(samplerPoolLength - 1))); + + texOp.InsertSource(1, samplerIndex); + + int samplerBinding = resourceManager.GetTextureOrImageBinding( + texOp.Inst, + SamplerType.None, + texOp.Format, + TextureFlags.None, + 0, + TextureHandle.PackOffsets(0, 0, TextureHandleType.Direct), + samplerPoolLength); + + texOp.TurnIntoArray(textureBinding, samplerBinding); + } + else + { + texOp.TurnIntoArray(textureBinding); + } + + return true; + } + private static bool TryConvertBindless(BasicBlock block, ResourceManager resourceManager, IGpuAccessor gpuAccessor, TextureOperation texOp) { if (texOp.Inst == Instruction.TextureSample || texOp.Inst.IsTextureQuery()) diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessToArray.cs b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessToArray.cs index 7543d1c242..f2be7975da 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessToArray.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessToArray.cs @@ -11,7 +11,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations private const int HardcodedArrayLengthOgl = 4; // 1 and 0 elements are not considered arrays anymore. - private const int MinimumArrayLength = 2; + public const int MinimumArrayLength = 2; public static void RunPassOgl(BasicBlock block, ResourceManager resourceManager) { diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs index e9fe0b1ee5..890501c919 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/ResourceManager.cs @@ -29,7 +29,7 @@ namespace Ryujinx.Graphics.Shader.Translation private readonly HashSet _usedConstantBufferBindings; - private readonly record struct TextureInfo(int CbufSlot, int Handle, int ArrayLength, SamplerType Type, TextureFormat Format); + private readonly record struct TextureInfo(int CbufSlot, int Handle, int ArrayLength, bool Separate, SamplerType Type, TextureFormat Format); private struct TextureMeta { @@ -225,7 +225,8 @@ namespace Ryujinx.Graphics.Shader.Translation TextureFlags flags, int cbufSlot, int handle, - int arrayLength = 1) + int arrayLength = 1, + bool separate = false) { inst &= Instruction.Mask; bool isImage = inst.IsImage(); @@ -239,7 +240,18 @@ namespace Ryujinx.Graphics.Shader.Translation format = TextureFormat.Unknown; } - int binding = GetTextureOrImageBinding(cbufSlot, handle, arrayLength, type, format, isImage, intCoords, isWrite, accurateType, coherent); + int binding = GetTextureOrImageBinding( + cbufSlot, + handle, + arrayLength, + type, + format, + isImage, + intCoords, + isWrite, + accurateType, + coherent, + separate); _gpuAccessor.RegisterTexture(handle, cbufSlot); @@ -256,9 +268,10 @@ namespace Ryujinx.Graphics.Shader.Translation bool intCoords, bool write, bool accurateType, - bool coherent) + bool coherent, + bool separate) { - var dimensions = type.GetDimensions(); + var dimensions = type == SamplerType.None ? 0 : type.GetDimensions(); var dict = isImage ? _usedImages : _usedTextures; var usageFlags = TextureUsageFlags.None; @@ -290,7 +303,7 @@ namespace Ryujinx.Graphics.Shader.Translation // For array textures, we also want to use type as key, // since we may have texture handles stores in the same buffer, but for textures with different types. var keyType = arrayLength > 1 ? type : SamplerType.None; - var info = new TextureInfo(cbufSlot, handle, arrayLength, keyType, format); + var info = new TextureInfo(cbufSlot, handle, arrayLength, separate, keyType, format); var meta = new TextureMeta() { AccurateType = accurateType, @@ -332,6 +345,10 @@ namespace Ryujinx.Graphics.Shader.Translation ? $"{prefix}_tcb_{handle:X}_{format.ToGlslFormat()}" : $"{prefix}_cb{cbufSlot}_{handle:X}_{format.ToGlslFormat()}"; } + else if (type == SamplerType.None) + { + nameSuffix = cbufSlot < 0 ? $"s_tcb_{handle:X}" : $"s_cb{cbufSlot}_{handle:X}"; + } else { nameSuffix = cbufSlot < 0 ? $"{prefix}_tcb_{handle:X}" : $"{prefix}_cb{cbufSlot}_{handle:X}"; @@ -341,6 +358,7 @@ namespace Ryujinx.Graphics.Shader.Translation isImage ? 3 : 2, binding, arrayLength, + separate, $"{_stagePrefix}_{nameSuffix}", meta.Type, info.Format, @@ -495,6 +513,7 @@ namespace Ryujinx.Graphics.Shader.Translation info.CbufSlot, info.Handle, info.ArrayLength, + info.Separate, meta.UsageFlags)); } @@ -514,6 +533,7 @@ namespace Ryujinx.Graphics.Shader.Translation info.CbufSlot, info.Handle, info.ArrayLength, + info.Separate, meta.UsageFlags)); } } diff --git a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs index 581f4372c4..1065355886 100644 --- a/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs +++ b/ryujinx/src/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs @@ -413,7 +413,7 @@ namespace Ryujinx.Graphics.Shader.Translation if (Stage == ShaderStage.Vertex) { int ibBinding = resourceManager.Reservations.IndexBufferTextureBinding; - TextureDefinition indexBuffer = new(2, ibBinding, 1, "ib_data", SamplerType.TextureBuffer, TextureFormat.Unknown, TextureUsageFlags.None); + TextureDefinition indexBuffer = new(2, ibBinding, "ib_data", SamplerType.TextureBuffer); resourceManager.Properties.AddOrUpdateTexture(indexBuffer); int inputMap = _program.AttributeUsage.UsedInputAttributes; @@ -422,7 +422,7 @@ namespace Ryujinx.Graphics.Shader.Translation { int location = BitOperations.TrailingZeroCount(inputMap); int binding = resourceManager.Reservations.GetVertexBufferTextureBinding(location); - TextureDefinition vaBuffer = new(2, binding, 1, $"vb_data{location}", SamplerType.TextureBuffer, TextureFormat.Unknown, TextureUsageFlags.None); + TextureDefinition vaBuffer = new(2, binding, $"vb_data{location}", SamplerType.TextureBuffer); resourceManager.Properties.AddOrUpdateTexture(vaBuffer); inputMap &= ~(1 << location); @@ -431,7 +431,7 @@ namespace Ryujinx.Graphics.Shader.Translation else if (Stage == ShaderStage.Geometry) { int trbBinding = resourceManager.Reservations.TopologyRemapBufferTextureBinding; - TextureDefinition remapBuffer = new(2, trbBinding, 1, "trb_data", SamplerType.TextureBuffer, TextureFormat.Unknown, TextureUsageFlags.None); + TextureDefinition remapBuffer = new(2, trbBinding, "trb_data", SamplerType.TextureBuffer); resourceManager.Properties.AddOrUpdateTexture(remapBuffer); int geometryVbOutputSbBinding = resourceManager.Reservations.GeometryVertexOutputStorageBufferBinding; diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs index b9abd8fcd3..117f79bb44 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs @@ -43,11 +43,11 @@ namespace Ryujinx.Graphics.Vulkan int binding = segment.Binding; int count = segment.Count; - if (setIndex == PipelineBase.UniformSetIndex) + if (IsBufferType(segment.Type)) { entries[seg] = new DescriptorUpdateTemplateEntry() { - DescriptorType = DescriptorType.UniformBuffer, + DescriptorType = segment.Type.Convert(), DstBinding = (uint)binding, DescriptorCount = (uint)count, Offset = structureOffset, @@ -56,76 +56,31 @@ namespace Ryujinx.Graphics.Vulkan structureOffset += (nuint)(Unsafe.SizeOf() * count); } - else if (setIndex == PipelineBase.StorageSetIndex) + else if (IsBufferTextureType(segment.Type)) { entries[seg] = new DescriptorUpdateTemplateEntry() { - DescriptorType = DescriptorType.StorageBuffer, + DescriptorType = segment.Type.Convert(), DstBinding = (uint)binding, DescriptorCount = (uint)count, Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf() + Stride = (nuint)Unsafe.SizeOf() }; - structureOffset += (nuint)(Unsafe.SizeOf() * count); + structureOffset += (nuint)(Unsafe.SizeOf() * count); } - else if (setIndex == PipelineBase.TextureSetIndex) + else { - if (segment.Type != ResourceType.BufferTexture) + entries[seg] = new DescriptorUpdateTemplateEntry() { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.CombinedImageSampler, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf() - }; + DescriptorType = segment.Type.Convert(), + DstBinding = (uint)binding, + DescriptorCount = (uint)count, + Offset = structureOffset, + Stride = (nuint)Unsafe.SizeOf() + }; - structureOffset += (nuint)(Unsafe.SizeOf() * count); - } - else - { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.UniformTexelBuffer, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf() - }; - - structureOffset += (nuint)(Unsafe.SizeOf() * count); - } - } - else if (setIndex == PipelineBase.ImageSetIndex) - { - if (segment.Type != ResourceType.BufferImage) - { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.StorageImage, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf() - }; - - structureOffset += (nuint)(Unsafe.SizeOf() * count); - } - else - { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.StorageTexelBuffer, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf() - }; - - structureOffset += (nuint)(Unsafe.SizeOf() * count); - } + structureOffset += (nuint)(Unsafe.SizeOf() * count); } } @@ -237,6 +192,16 @@ namespace Ryujinx.Graphics.Vulkan Template = result; } + private static bool IsBufferType(ResourceType type) + { + return type == ResourceType.UniformBuffer || type == ResourceType.StorageBuffer; + } + + private static bool IsBufferTextureType(ResourceType type) + { + return type == ResourceType.BufferTexture || type == ResourceType.BufferImage; + } + public unsafe void Dispose() { _gd.Api.DestroyDescriptorUpdateTemplate(_device, Template, null); diff --git a/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index e75e7f4b4c..b46ba9c461 100644 --- a/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/ryujinx/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -706,6 +706,7 @@ namespace Ryujinx.Graphics.Vulkan supportsCubemapView: !IsAmdGcn, supportsNonConstantTextureOffset: false, supportsScaledVertexFormats: FormatCapabilities.SupportsScaledVertexFormats(), + supportsSeparateSampler: true, supportsShaderBallot: false, supportsShaderBarrierDivergence: Vendor != Vendor.Intel, supportsShaderFloat64: Capabilities.SupportsShaderFloat64, diff --git a/ryujinx/src/Ryujinx.Memory/NativeMemoryManager.cs b/ryujinx/src/Ryujinx.Memory/NativeMemoryManager.cs index 9ca6329382..cb8d5c243d 100644 --- a/ryujinx/src/Ryujinx.Memory/NativeMemoryManager.cs +++ b/ryujinx/src/Ryujinx.Memory/NativeMemoryManager.cs @@ -8,6 +8,11 @@ namespace Ryujinx.Memory private readonly T* _pointer; private readonly int _length; + public NativeMemoryManager(nuint pointer, int length) + : this((T*)pointer, length) + { + } + public NativeMemoryManager(T* pointer, int length) { _pointer = pointer; diff --git a/ryujinx/src/Ryujinx.ShaderTools/Program.cs b/ryujinx/src/Ryujinx.ShaderTools/Program.cs index 4252f1b258..d2c6bd59e4 100644 --- a/ryujinx/src/Ryujinx.ShaderTools/Program.cs +++ b/ryujinx/src/Ryujinx.ShaderTools/Program.cs @@ -58,10 +58,20 @@ namespace Ryujinx.ShaderTools return MemoryMarshal.Cast(new ReadOnlySpan(_data)[(int)address..]); } + public int QuerySamplerArrayLengthFromPool() + { + return DefaultArrayLength; + } + public int QueryTextureArrayLengthFromBuffer(int slot) { return DefaultArrayLength; } + + public int QueryTextureArrayLengthFromPool() + { + return DefaultArrayLength; + } } private class Options diff --git a/shadowsocks-rust/Cargo.lock b/shadowsocks-rust/Cargo.lock index e6864052a8..aa65047231 100644 --- a/shadowsocks-rust/Cargo.lock +++ b/shadowsocks-rust/Cargo.lock @@ -389,12 +389,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -1254,7 +1255,7 @@ dependencies = [ "once_cell", "quinn", "rand", - "rustls 0.21.10", + "rustls 0.21.11", "rustls-native-certs 0.6.3", "rustls-pemfile 1.0.4", "serde", @@ -1283,7 +1284,7 @@ dependencies = [ "parking_lot 0.12.1", "rand", "resolv-conf", - "rustls 0.21.10", + "rustls 0.21.11", "rustls-native-certs 0.6.3", "serde", "smallvec", @@ -1427,7 +1428,7 @@ dependencies = [ "http 1.1.0", "hyper", "hyper-util", - "rustls 0.22.3", + "rustls 0.22.4", "rustls-pki-types", "tokio", "tokio-rustls 0.25.0", @@ -2443,7 +2444,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.21.10", + "rustls 0.21.11", "thiserror", "tokio", "tracing", @@ -2459,7 +2460,7 @@ dependencies = [ "rand", "ring 0.16.20", "rustc-hash", - "rustls 0.21.10", + "rustls 0.21.11", "slab", "thiserror", "tinyvec", @@ -2593,9 +2594,9 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "reqwest" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" dependencies = [ "base64 0.22.0", "bytes", @@ -2619,7 +2620,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.22.3", + "rustls 0.22.4", "rustls-native-certs 0.7.0", "rustls-pemfile 2.1.2", "rustls-pki-types", @@ -2754,9 +2755,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "e3cc72858054fcff6d7dea32df2aeaee6a7c24227366d7ea429aada2f26b16ad" dependencies = [ "bitflags 2.5.0", "errno", @@ -2767,9 +2768,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4" dependencies = [ "log", "ring 0.17.8", @@ -2779,29 +2780,29 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.3", "subtle", "zeroize", ] [[package]] name = "rustls" -version = "0.23.4" +version = "0.23.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4d6d8ad9f2492485e13453acbb291dd08f64441b6609c491f1c2cd2c6b4fe1" +checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" dependencies = [ "aws-lc-rs", "log", "once_cell", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.3", "subtle", "zeroize", ] @@ -2868,9 +2869,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" dependencies = [ "aws-lc-rs", "ring 0.17.8", @@ -3223,9 +3224,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -3466,18 +3467,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", @@ -3598,7 +3599,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.10", + "rustls 0.21.11", "tokio", ] @@ -3608,7 +3609,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.22.3", + "rustls 0.22.4", "rustls-pki-types", "tokio", ] @@ -3619,7 +3620,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.4", + "rustls 0.23.5", "rustls-pki-types", "tokio", ] diff --git a/small/luci-app-passwall2/Makefile b/small/luci-app-passwall2/Makefile index 03a39fafa1..92c5ab9336 100644 --- a/small/luci-app-passwall2/Makefile +++ b/small/luci-app-passwall2/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall2 -PKG_VERSION:=1.28-7 +PKG_VERSION:=1.29-1 PKG_RELEASE:= PKG_CONFIG_DEPENDS:= \ diff --git a/small/luci-app-passwall2/luasrc/controller/passwall2.lua b/small/luci-app-passwall2/luasrc/controller/passwall2.lua index fe9c763399..14fed7fec9 100644 --- a/small/luci-app-passwall2/luasrc/controller/passwall2.lua +++ b/small/luci-app-passwall2/luasrc/controller/passwall2.lua @@ -55,7 +55,7 @@ function index() entry({"admin", "services", appname, "get_socks_log"}, call("get_socks_log")).leaf = true entry({"admin", "services", appname, "get_log"}, call("get_log")).leaf = true entry({"admin", "services", appname, "clear_log"}, call("clear_log")).leaf = true - entry({"admin", "services", appname, "status"}, call("status")).leaf = true + entry({"admin", "services", appname, "index_status"}, call("index_status")).leaf = true entry({"admin", "services", appname, "haproxy_status"}, call("haproxy_status")).leaf = true entry({"admin", "services", appname, "socks_status"}, call("socks_status")).leaf = true entry({"admin", "services", appname, "connect_status"}, call("connect_status")).leaf = true @@ -189,9 +189,9 @@ function clear_log() luci.sys.call("echo '' > /tmp/log/passwall2.log") end -function status() +function index_status() local e = {} - e["global_status"] = luci.sys.call("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall2/bin/' | grep -v '_acl_' | grep 'global' >/dev/null") == 0 + e["global_status"] = luci.sys.call("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall2/bin/' | grep 'default' | grep 'global' >/dev/null") == 0 luci.http.prepare_content("application/json") luci.http.write_json(e) end diff --git a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua index e80474d438..29823e1c26 100644 --- a/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua +++ b/small/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua @@ -329,7 +329,8 @@ for k, v in pairs(nodes_table) do end s:tab("log", translate("Log")) -o = s:taboption("log", Flag, "close_log", translate("Close Node Log")) +o = s:taboption("log", Flag, "log_node", translate("Enable Node Log")) +o.default = "1" o.rmempty = false loglevel = s:taboption("log", ListValue, "loglevel", translate("Log Level")) diff --git a/small/luci-app-passwall2/luasrc/view/passwall2/global/status.htm b/small/luci-app-passwall2/luasrc/view/passwall2/global/status.htm index 66ede85458..03b2e56d0a 100644 --- a/small/luci-app-passwall2/luasrc/view/passwall2/global/status.htm +++ b/small/luci-app-passwall2/luasrc/view/passwall2/global/status.htm @@ -139,7 +139,7 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md document.getElementsByTagName('img')[i].setAttribute("oncontextmenu","return false;"); document.getElementsByTagName('img')[i].setAttribute("ondragstart","return false;"); } - XHR.poll(5, '<%=api.url("status")%>', null, + XHR.poll(5, '<%=api.url("index_status")%>', null, function (x, data) { if (data) { if (true) { diff --git a/small/luci-app-passwall2/po/zh-cn/passwall2.po b/small/luci-app-passwall2/po/zh-cn/passwall2.po index 261539e98d..fabe10e8e6 100644 --- a/small/luci-app-passwall2/po/zh-cn/passwall2.po +++ b/small/luci-app-passwall2/po/zh-cn/passwall2.po @@ -1288,8 +1288,8 @@ msgstr "日志" msgid "Log" msgstr "日志" -msgid "Close Node Log" -msgstr "关闭节点日志" +msgid "Enable Node Log" +msgstr "启用节点日志" msgid "Log Level" msgstr "日志等级" diff --git a/small/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 b/small/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 index f49a4eca52..6ec65ccd33 100755 --- a/small/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 +++ b/small/luci-app-passwall2/root/etc/uci-defaults/luci-passwall2 @@ -3,20 +3,24 @@ uci -q batch <<-EOF >/dev/null set dhcp.@dnsmasq[0].localuse=1 commit dhcp + [ -e "/etc/config/ucitrack" ] && { delete ucitrack.@passwall2[-1] add ucitrack passwall2 set ucitrack.@passwall2[-1].init=passwall2 commit ucitrack + } delete firewall.passwall2 set firewall.passwall2=include set firewall.passwall2.type=script set firewall.passwall2.path=/var/etc/passwall2.include set firewall.passwall2.reload=1 commit firewall + [ -e "/etc/config/ucitrack" ] && { delete ucitrack.@passwall2_server[-1] add ucitrack passwall2_server set ucitrack.@passwall2_server[-1].init=passwall2_server commit ucitrack + } delete firewall.passwall2_server set firewall.passwall2_server=include set firewall.passwall2_server.type=script diff --git a/small/luci-app-passwall2/root/usr/share/passwall2/0_default_config b/small/luci-app-passwall2/root/usr/share/passwall2/0_default_config index 464f5c84e8..f129cc36be 100644 --- a/small/luci-app-passwall2/root/usr/share/passwall2/0_default_config +++ b/small/luci-app-passwall2/root/usr/share/passwall2/0_default_config @@ -14,7 +14,7 @@ config global option remote_dns_query_strategy 'UseIPv4' option dns_hosts 'cloudflare-dns.com 1.1.1.1 dns.google.com 8.8.8.8' - option close_log '0' + option log_node '1' option loglevel 'error' config global_haproxy diff --git a/small/luci-app-passwall2/root/usr/share/passwall2/app.sh b/small/luci-app-passwall2/root/usr/share/passwall2/app.sh index 3d653b6757..22aa7b41c2 100644 --- a/small/luci-app-passwall2/root/usr/share/passwall2/app.sh +++ b/small/luci-app-passwall2/root/usr/share/passwall2/app.sh @@ -688,7 +688,7 @@ run_global() { V2RAY_CONFIG=$TMP_ACL_PATH/default/global.json V2RAY_LOG=$TMP_ACL_PATH/default/global.log - [ "$(config_t_get global close_log 1)" = "1" ] && V2RAY_LOG="/dev/null" + [ "$(config_t_get global log_node 1)" != "1" ] && V2RAY_LOG="/dev/null" V2RAY_ARGS="${V2RAY_ARGS} log_file=${V2RAY_LOG} config_file=${V2RAY_CONFIG}" node_socks_port=$(config_t_get global node_socks_port 1070) diff --git a/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua b/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua index bce5a2c7aa..6c6a5cdf79 100755 --- a/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua +++ b/small/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua @@ -220,9 +220,8 @@ do end) uci:foreach(appname, "nodes", function(node) + local node_id = node[".name"] if node.protocol and node.protocol == '_shunt' then - local node_id = node[".name"] - local rules = {} uci:foreach(appname, "shunt_rules", function(e) if e[".name"] and e.remarks then @@ -256,7 +255,6 @@ do end elseif node.protocol and node.protocol == '_balancing' then - local node_id = node[".name"] local nodes = {} local new_nodes = {} if node.balancing_node then @@ -268,7 +266,7 @@ do remarks = node, set = function(o, server) for kk, vv in pairs(CONFIG) do - if (vv.remarks == "负载均衡节点列表" .. node_id) then + if (vv.remarks == "Xray负载均衡节点[" .. node_id .. "]列表") then table.insert(vv.new_nodes, server) end end @@ -277,13 +275,12 @@ do end end CONFIG[#CONFIG + 1] = { - remarks = "负载均衡节点列表" .. node_id, + remarks = "Xray负载均衡节点[" .. node_id .. "]列表", nodes = nodes, new_nodes = new_nodes, set = function(o) for kk, vv in pairs(CONFIG) do - if (vv.remarks == "负载均衡节点列表" .. node_id) then - --log("刷新负载均衡节点列表") + if (vv.remarks == "Xray负载均衡节点[" .. node_id .. "]列表") then uci:foreach(appname, "nodes", function(node2) if node2[".name"] == node[".name"] then local section = uci:section(appname, "nodes", node_id) @@ -294,6 +291,42 @@ do end end } + + --后备节点 + local currentNode = uci:get_all(appname, node_id) or nil + if currentNode and currentNode.fallback_node then + CONFIG[#CONFIG + 1] = { + log = true, + id = node_id, + remarks = "Xray负载均衡节点[" .. node_id .. "]后备节点", + currentNode = uci:get_all(appname, currentNode.fallback_node) or nil, + set = function(o, server) + uci:set(appname, node_id, "fallback_node", server) + o.newNodeId = server + end, + delete = function(o) + uci:delete(appname, node_id, "fallback_node") + end + } + end + else + --落地节点 + local currentNode = uci:get_all(appname, node_id) or nil + if currentNode and currentNode.to_node then + CONFIG[#CONFIG + 1] = { + log = true, + id = node_id, + remarks = "节点[" .. node_id .. "]落地节点", + currentNode = uci:get_all(appname, currentNode.to_node) or nil, + set = function(o, server) + uci:set(appname, node_id, "to_node", server) + o.newNodeId = server + end, + delete = function(o) + uci:delete(appname, node_id, "to_node") + end + } + end end end) diff --git a/small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json b/small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json new file mode 100644 index 0000000000..d73b5d1094 --- /dev/null +++ b/small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json @@ -0,0 +1,4 @@ +{ + "config": "passwall2_server", + "init": "passwall2_server" +} diff --git a/small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json b/small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json new file mode 100644 index 0000000000..2ff857b0d1 --- /dev/null +++ b/small/luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json @@ -0,0 +1,4 @@ +{ + "config": "passwall2", + "init": "passwall2" +} diff --git a/small/shadowsocks-rust/Makefile b/small/shadowsocks-rust/Makefile index e19fa24b1e..1d673dedd1 100644 --- a/small/shadowsocks-rust/Makefile +++ b/small/shadowsocks-rust/Makefile @@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=shadowsocks-rust -PKG_VERSION:=1.18.2 +PKG_VERSION:=1.18.3 PKG_RELEASE:=1 PKG_SOURCE_HEADER:=shadowsocks-v$(PKG_VERSION) @@ -21,29 +21,29 @@ endif ifeq ($(ARCH),aarch64) PKG_SOURCE:=$(PKG_SOURCE_HEADER).aarch64-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=cdafb055f6dd64a21d1032b128227a03ce4f695e2b13ec25f935111b381f6d61 + PKG_HASH:=2ca23d4ea356634dc6f005da334125a564f5e2dad08c987582e3887fdc89ae91 else ifeq ($(ARCH),arm) # Referred to golang/golang-values.mk ARM_CPU_FEATURES:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE)))) ifeq ($(ARM_CPU_FEATURES),) PKG_SOURCE:=$(PKG_SOURCE_HEADER).arm-$(PKG_SOURCE_BODY)eabi.$(PKG_SOURCE_FOOTER) - PKG_HASH:=fb6244e4046785b48f31d5dfb430319cff3c5d6a715335a6a4b28471105415aa + PKG_HASH:=1169dce76405ea5bf903d37a0c2657bfef6fa0a19671f3316a5d2d9b96d00680 else PKG_SOURCE:=$(PKG_SOURCE_HEADER).arm-$(PKG_SOURCE_BODY)eabihf.$(PKG_SOURCE_FOOTER) - PKG_HASH:=b12327532fa37eeac4b806388106124d2f43aed79fba2c671e384cee9b7b8672 + PKG_HASH:=2d3ca7df8e99a3a1d398f3a28eef48f1c3b1ad74c630554af72f3063f3dc25fe endif else ifeq ($(ARCH),i386) PKG_SOURCE:=$(PKG_SOURCE_HEADER).i686-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=6be4b052ee82c6dd0d7549bf62f27965f38c1fa87964decc50dba42efc014b0c + PKG_HASH:=af121839c1b7d5b85959890f0895550bd48c6015ec2329f5ff3cabae006d722d else ifeq ($(ARCH),x86_64) PKG_SOURCE:=$(PKG_SOURCE_HEADER).x86_64-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=206d1f0a95c6964c7d03bc9779e1d75ff332518a6bc5656a5893c3f025cbcb88 + PKG_HASH:=8763b933919d8e557d910c34deb77962b151e86fcb873b56da6f4a03666d0db6 else ifeq ($(ARCH),mips) PKG_SOURCE:=$(PKG_SOURCE_HEADER).mips-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=4bb3eca57ae06682b5bc107e9cbf0518ba2602c0330652290828019862aebbdd + PKG_HASH:=89d6f5dbecf79022404137772c21cb8c77372166092b1d805d87620d1f50bbb1 else ifeq ($(ARCH),mipsel) PKG_SOURCE:=$(PKG_SOURCE_HEADER).mipsel-$(PKG_SOURCE_BODY).$(PKG_SOURCE_FOOTER) - PKG_HASH:=80759bd4262e6597dadd303d3b9026b65e26cd7b0f5e229b6044d6838ba51fcb + PKG_HASH:=aa2ecb8312f22be2eed0ede56ab173194498f4df16afdc66409803e91b76f06b # Set the default value to make OpenWrt Package Checker happy else PKG_SOURCE:=dummy diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index 8d4dd63bc3..df129de48b 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -21,22 +21,22 @@ define Download/geoip HASH:=a0ba7f1aa6fc85c20d6e17c4696cee28bc45784cf2b04c2891f8b6f2eb653d9a endef -GEOSITE_VER:=20240416175239 +GEOSITE_VER:=20240422085908 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=2fab74f2b2d47c9c3bdc3031a8a2b4ec32f60fcf43009e525376be852d8bce0a + HASH:=18b5b7f44471d27781a53933bd71e2d9fddf5549c06003aadfda8afca3c3eb1e endef -GEOSITE_IRAN_VER:=202404150255 +GEOSITE_IRAN_VER:=202404220027 GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER) define Download/geosite-ir URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/ URL_FILE:=iran.dat FILE:=$(GEOSITE_IRAN_FILE) - HASH:=7b29fd53c2a25c6d79eeb6f76cc4b0a0770fe00eee1ea4d7a4a9f77d49ca44ad + HASH:=4d219a4d40c2692b2c791c9794fd828c079fff8c3e0b6272af8c851b4490e753 endef define Package/v2ray-geodata/template diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt index 46b4d078bb..52dacf0489 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt @@ -38,11 +38,11 @@ class WidgetProvider : AppWidgetProvider() { }) remoteViews.setOnClickPendingIntent(R.id.layout_switch, pendingIntent) if (isRunning) { - remoteViews.setInt(R.id.image_switch, "setImageResource", R.drawable.ic_stat_name) - remoteViews.setInt(R.id.layout_switch, "setBackgroundResource", R.color.color_fab_orange) + remoteViews.setInt(R.id.image_switch, "setImageResource", R.drawable.ic_stop_24dp) + remoteViews.setInt(R.id.layout_background, "setBackgroundResource", R.drawable.ic_rounded_corner_active) } else { - remoteViews.setInt(R.id.image_switch, "setImageResource", R.drawable.ic_stat_name_black) - remoteViews.setInt(R.id.layout_switch, "setBackgroundResource", R.color.color_fab_grey) + remoteViews.setInt(R.id.image_switch, "setImageResource", R.drawable.ic_play_24dp) + remoteViews.setInt(R.id.layout_background, "setBackgroundResource", R.drawable.ic_rounded_corner_inactive) } for (appWidgetId in appWidgetIds) { diff --git a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index 5f335ec466..cd33f7f2e1 100644 --- a/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -147,12 +147,12 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList adapter.isRunning = isRunning if (isRunning) { binding.fab.setImageResource(R.drawable.ic_stop_24dp) - binding.fab.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_orange)) + binding.fab.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_active)) setTestState(getString(R.string.connection_connected)) binding.layoutTest.isFocusable = true } else { binding.fab.setImageResource(R.drawable.ic_play_24dp) - binding.fab.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_grey)) + binding.fab.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_inactive)) setTestState(getString(R.string.connection_not_connected)) binding.layoutTest.isFocusable = false } diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_24dp.xml b/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_24dp.xml new file mode 100644 index 0000000000..00449aaf41 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_photo.xml b/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_photo.xml deleted file mode 100644 index c701a63f48..0000000000 --- a/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_image_photo.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_info_24dp.xml b/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_info_24dp.xml deleted file mode 100644 index f7b49e8e0b..0000000000 --- a/v2rayng/V2rayNG/app/src/main/res/drawable-night/ic_info_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_24dp.xml b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_24dp.xml new file mode 100644 index 0000000000..e2ff6078c0 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_photo.xml b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_photo.xml deleted file mode 100644 index 913d9d8b38..0000000000 --- a/v2rayng/V2rayNG/app/src/main/res/drawable/ic_image_photo.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable/ic_info_24dp.xml b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_info_24dp.xml deleted file mode 100644 index 34b8202e9e..0000000000 --- a/v2rayng/V2rayNG/app/src/main/res/drawable/ic_info_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_active.xml b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_active.xml new file mode 100644 index 0000000000..3dcd95f744 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_active.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_inactive.xml b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_inactive.xml new file mode 100644 index 0000000000..96a98158d5 --- /dev/null +++ b/v2rayng/V2rayNG/app/src/main/res/drawable/ic_rounded_corner_inactive.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/res/layout/widget_switch.xml b/v2rayng/V2rayNG/app/src/main/res/layout/widget_switch.xml index 32c608aafa..444970a8be 100644 --- a/v2rayng/V2rayNG/app/src/main/res/layout/widget_switch.xml +++ b/v2rayng/V2rayNG/app/src/main/res/layout/widget_switch.xml @@ -2,16 +2,30 @@ + + + android:layout_gravity="center"> - + + + diff --git a/v2rayng/V2rayNG/app/src/main/res/menu/menu_scanner.xml b/v2rayng/V2rayNG/app/src/main/res/menu/menu_scanner.xml index 216ad34798..5a51ffc749 100644 --- a/v2rayng/V2rayNG/app/src/main/res/menu/menu_scanner.xml +++ b/v2rayng/V2rayNG/app/src/main/res/menu/menu_scanner.xml @@ -8,7 +8,7 @@ app:showAsAction="always" /> \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/res/values-night/colors.xml b/v2rayng/V2rayNG/app/src/main/res/values-night/colors.xml index 39e1a38a50..06af7bfa68 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-night/colors.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-night/colors.xml @@ -1,7 +1,7 @@ - #f97910 - #646464 + #f97910 + #646464 #BDBDBD #FFFFFF #222222 diff --git a/v2rayng/V2rayNG/app/src/main/res/values/colors.xml b/v2rayng/V2rayNG/app/src/main/res/values/colors.xml index 3d53c1e5c2..8835e864e5 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values/colors.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values/colors.xml @@ -4,8 +4,8 @@ #FF0099 #f97910 - #f97910 - #9C9C9C + #f97910 + #9C9C9C #727272 #000000 #FFFFFF diff --git a/xray-core/transport/internet/reality/reality.go b/xray-core/transport/internet/reality/reality.go index 5548580c1e..0cc6950d5e 100644 --- a/xray-core/transport/internet/reality/reality.go +++ b/xray-core/transport/internet/reality/reality.go @@ -206,6 +206,9 @@ func UClient(c net.Conn, config *Config, ctx context.Context, dest net.Destinati req, _ = http.NewRequest("GET", string(prefix)+getPathLocked(paths), nil) maps.Unlock() } + if req == nil { + return + } req.Header.Set("User-Agent", fingerprint.Client) // TODO: User-Agent map if first && config.Show { newError(fmt.Sprintf("REALITY localAddr: %v\treq.UserAgent(): %v\n", localAddr, req.UserAgent())).WriteToLog(session.ExportIDToError(ctx)) diff --git a/yass/CMakeLists.txt b/yass/CMakeLists.txt index add23b2103..c1ea5be442 100644 --- a/yass/CMakeLists.txt +++ b/yass/CMakeLists.txt @@ -3620,6 +3620,7 @@ endif() add_library(yass_core STATIC src/config/config.cpp + src/config/config_core.cpp src/config/config_network.cpp src/config/config_tls.cpp src/config/config_impl.cpp @@ -3628,6 +3629,7 @@ add_library(yass_core STATIC src/config/config_impl.hpp src/config/config_impl_local.hpp src/config/config_impl_windows.hpp + src/config/config_core.hpp src/config/config_network.hpp src/config/config_tls.hpp src/core/logging.cpp diff --git a/yass/README.md b/yass/README.md index 2a1e9bc618..b991021a82 100644 --- a/yass/README.md +++ b/yass/README.md @@ -47,7 +47,7 @@ Visit wiki's [Usages](https://github.com/Chilledheart/yass/wiki/Usage) and [Serv #### NaïveProxy Protocol Support It refers to [http2 cipher](https://github.com/Chilledheart/yass/wiki/Supported-Operating-System#screenshot-on-na%C3%AFveproxy-support) as [NaïveProxy][naiveproxy]-compatible protocol support. #### Fix disk space occupation issue for mobile users -Starting with release 1.9.2 and 1.8.5, it will no longer keep log file and occupy extra disk space for Android/iOS/HarmonyOS client. +Starting with release 1.9.2 and 1.8.5, it will no longer keep log file and will not occupy extra disk space for Android/iOS/HarmonyOS client. #### Android vpn service support Android releases from 1.5.24 are signed and have been updated to add [VpnService](https://developer.android.com/reference/android/net/VpnService) support. #### iOS packet tunnel support diff --git a/yass/android/yass/src/main/java/it/gui/yass/MainActivity.java b/yass/android/yass/src/main/java/it/gui/yass/MainActivity.java index cf9a8932c9..305c120256 100644 --- a/yass/android/yass/src/main/java/it/gui/yass/MainActivity.java +++ b/yass/android/yass/src/main/java/it/gui/yass/MainActivity.java @@ -3,6 +3,8 @@ package it.gui.yass; import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; import android.app.UiModeManager; import android.content.Context; import android.content.Intent; @@ -223,6 +225,12 @@ public class MainActivity extends Activity { TextView statusTextView = findViewById(R.id.statusTextView); statusTextView.setText(String.format(getString(R.string.status_started_with_error_msg), error_msg)); + + Dialog alertDialog = new AlertDialog.Builder(this) + .setTitle(getString(R.string.status_start_failed)) + .setMessage(String.format(getString(R.string.status_started_with_error_msg), error_msg)) + .create(); + alertDialog.show(); } private int nativeLocalPort = 0; diff --git a/yass/android/yass/src/main/res/values-zh/strings.xml b/yass/android/yass/src/main/res/values-zh/strings.xml index 729d05f002..3d365d99b9 100644 --- a/yass/android/yass/src/main/res/values-zh/strings.xml +++ b/yass/android/yass/src/main/res/values-zh/strings.xml @@ -19,8 +19,9 @@ 就绪 超时时间 本地IP地址: %s:%d - 无法连接因: %s + 无法连接因为 %s 服务器名称指示 基于 HTTPS 的 DNS (DoH) URL 基于 TLS 的 DNS (DoT) 域名 + 启动失败 \ No newline at end of file diff --git a/yass/android/yass/src/main/res/values/strings.xml b/yass/android/yass/src/main/res/values/strings.xml index c1eee98c81..ff218691df 100644 --- a/yass/android/yass/src/main/res/values/strings.xml +++ b/yass/android/yass/src/main/res/values/strings.xml @@ -22,4 +22,5 @@ Server SNI DNS over HTTPS URL DNS over TLS Host + Start Failed diff --git a/yass/harmony/entry/src/main/ets/pages/DetailPage.ets b/yass/harmony/entry/src/main/ets/pages/DetailPage.ets index b3b5239236..7eafc2b611 100644 --- a/yass/harmony/entry/src/main/ets/pages/DetailPage.ets +++ b/yass/harmony/entry/src/main/ets/pages/DetailPage.ets @@ -189,7 +189,7 @@ struct DetailPage { this.status = $r('app.string.status_started_with_error_msg', err_msg); this.start_btn_status = true; this.stop_btn_status = false; - AlertDialog.show({ message: 'The start failed: ' + err_msg }); + AlertDialog.show({ message: $r('app.string.status_started_with_error_msg', err_msg) }); } onStopClicked() { diff --git a/yass/harmony/entry/src/main/resources/zh_CN/element/string.json b/yass/harmony/entry/src/main/resources/zh_CN/element/string.json index 29fd659032..8b76593cf0 100644 --- a/yass/harmony/entry/src/main/resources/zh_CN/element/string.json +++ b/yass/harmony/entry/src/main/resources/zh_CN/element/string.json @@ -82,7 +82,7 @@ }, { "name": "status_started_with_error_msg", - "value": "无法连接因: %s" + "value": "无法连接因为 %s" }, { "name": "status_stopping", diff --git a/yass/src/cli/cli.cpp b/yass/src/cli/cli.cpp index 8b258f5fad..53aec416d2 100644 --- a/yass/src/cli/cli.cpp +++ b/yass/src/cli/cli.cpp @@ -115,6 +115,10 @@ int main(int argc, const char* argv[]) { std::string remote_host_ips; uint16_t remote_port = absl::GetFlag(FLAGS_server_port); + if (remote_port == 0u) { + LOG(WARNING) << "Invalid server port: " << remote_port; + return -1; + } auto results = ResolveAddress(remote_host_name, remote_port); if (results.empty()) { diff --git a/yass/src/config/config.cpp b/yass/src/config/config.cpp index 68f29f5371..cdc8a80051 100644 --- a/yass/src/config/config.cpp +++ b/yass/src/config/config.cpp @@ -2,15 +2,13 @@ /* Copyright (c) 2019-2024 Chilledheart */ #include "config/config.hpp" -#include "config/config_impl.hpp" #include -#include #include #include -#include #include +#include "config/config_impl.hpp" #include "core/utils.hpp" #include "url/gurl.h" @@ -18,169 +16,6 @@ #define TLSEXT_MAXLEN_host_name 255 #endif -bool AbslParseFlag(absl::string_view text, PortFlag* flag, std::string* err); - -std::string AbslUnparseFlag(const PortFlag&); - -bool AbslParseFlag(absl::string_view text, CipherMethodFlag* flag, std::string* err); - -std::string AbslUnparseFlag(const CipherMethodFlag&); - -bool AbslParseFlag(absl::string_view text, RateFlag* flag, std::string* err); - -std::string AbslUnparseFlag(const RateFlag&); - -// Within the implementation, `AbslParseFlag()` will, in turn invoke -// `absl::ParseFlag()` on its constituent `int` and `std::string` types -// (which have built-in Abseil flag support. - -bool AbslParseFlag(absl::string_view text, PortFlag* flag, std::string* err) { - std::optional p = StringToIntegerU64(std::string(text)); - if (!p.has_value() || p.value() > UINT16_MAX) { - *err = absl::StrCat("bad port number: ", text); - return false; - } - flag->port = static_cast(p.value()); - return true; -} - -// Similarly, for unparsing, we can simply invoke `absl::UnparseFlag()` on -// the constituent types. -std::string AbslUnparseFlag(const PortFlag& flag) { - return std::to_string(flag.port); -} - -bool AbslParseFlag(absl::string_view text, CipherMethodFlag* flag, std::string* err) { - flag->method = to_cipher_method(std::string(text)); - if (flag->method == CRYPTO_INVALID) { - *err = absl::StrCat("bad cipher_method: ", text); - return false; - } - return true; -} - -// Similarly, for unparsing, we can simply invoke `absl::UnparseFlag()` on -// the constituent types. -std::string AbslUnparseFlag(const CipherMethodFlag& flag) { - assert(is_valid_cipher_method(flag.method) && "Invalid cipher_method"); - return std::string(to_cipher_method_str(flag.method)); -} - -// Within the implementation, `AbslParseFlag()` will, in turn invoke -// `absl::ParseFlag()` on its constituent `int` and `std::string` types -// (which have built-in Abseil flag support. - -static int64_t ngx_atosz(const char* line, size_t n) { - int64_t value, cutoff, cutlim; - - if (n == 0) { - return -1; - } - - cutoff = INT64_MAX / 10; - cutlim = INT64_MAX % 10; - - for (value = 0; n--; line++) { - if (*line < '0' || *line > '9') { - return -1; - } - - if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { - return -1; - } - - value = value * 10 + (*line - '0'); - } - - return value; -} - -static int64_t ngx_parse_size(const char* line, size_t len) { - char unit; - int64_t size, scale, max; - - if (len == 0) { - return -1; - } - - unit = line[len - 1]; - - switch (unit) { - case 'K': - case 'k': - len--; - max = INT64_MAX / 1024; - scale = 1024; - break; - - case 'M': - case 'm': - len--; - max = INT64_MAX / (1024 * 1024); - scale = 1024 * 1024; - break; - - default: - max = INT64_MAX; - scale = 1; - } - - size = ngx_atosz(line, len); - if (size < 0 || size > max) { - return -1; - } - - size *= scale; - - return size; -} - -bool AbslParseFlag(absl::string_view text, RateFlag* flag, std::string* err) { - int64_t size = ngx_parse_size(text.data(), text.size()); - if (size < 0) { - *err = absl::StrCat("bad size: ", text); - return false; - } - flag->rate = size; - return true; -} - -static void humanReadableByteCountBin(std::ostream* ss, uint64_t bytes) { - if (bytes < 1024) { - *ss << bytes; - return; - } - if (bytes < 1024 * 1024) { - *ss << bytes / 1024 << "k"; - return; - } - *ss << bytes / 1024 / 1024 << "m"; -} - -// Similarly, for unparsing, we can simply invoke `absl::UnparseFlag()` on -// the constituent types. -std::string AbslUnparseFlag(const RateFlag& flag) { - std::ostringstream os; - humanReadableByteCountBin(&os, flag.rate); - return os.str(); -} - -ABSL_FLAG(std::string, server_host, "http2.github.io", "Remote server on given host"); -ABSL_FLAG(std::string, server_sni, "", "Remote server on given sni"); -ABSL_FLAG(PortFlag, server_port, PortFlag(443), "Remote server on given port"); -ABSL_FLAG(std::string, local_host, "127.0.0.1", "Local proxy server on given host (Client Only)"); -ABSL_FLAG(PortFlag, local_port, PortFlag(1080), "Local proxy server on given port (Client Only)"); - -ABSL_FLAG(std::string, username, "username", "Server user"); -ABSL_FLAG(std::string, password, "password", "Server password"); -static const std::string kCipherMethodHelpMessage = - absl::StrCat("Specify encrypt of method to use, one of ", kCipherMethodsStr); -ABSL_FLAG(CipherMethodFlag, method, CipherMethodFlag(CRYPTO_DEFAULT), kCipherMethodHelpMessage); - -ABSL_FLAG(uint32_t, parallel_max, 512, "Maximum concurrency for parallel connections"); - -ABSL_FLAG(RateFlag, limit_rate, RateFlag(0), "Limit transfer speed to RATE"); - namespace config { bool ReadConfig() { @@ -200,7 +35,7 @@ bool ReadConfig() { required_fields_loaded &= config_impl->Read("server_port", &FLAGS_server_port); required_fields_loaded &= config_impl->Read("method", &FLAGS_method); required_fields_loaded &= config_impl->Read("username", &FLAGS_username); - required_fields_loaded &= config_impl->Read("password", &FLAGS_password); + required_fields_loaded &= config_impl->Read("password", &FLAGS_password, true); client_required_fields_loaded &= config_impl->Read("local", &FLAGS_local_host); client_required_fields_loaded &= config_impl->Read("local_port", &FLAGS_local_port); @@ -258,7 +93,7 @@ bool SaveConfig() { all_fields_written &= config_impl->Write("server_port", FLAGS_server_port); all_fields_written &= config_impl->Write("method", FLAGS_method); all_fields_written &= config_impl->Write("username", FLAGS_username); - all_fields_written &= config_impl->Write("password", FLAGS_password); + all_fields_written &= config_impl->Write("password", FLAGS_password, true); all_fields_written &= config_impl->Write("local", FLAGS_local_host); all_fields_written &= config_impl->Write("local_port", FLAGS_local_port); @@ -304,7 +139,7 @@ std::string ReadConfigFromArgument(std::string_view server_host, } auto server_port = StringToIntegerU(_server_port); - if (!server_port.has_value() || server_port.value() > 65535u) { + if (!server_port.has_value() || server_port.value() == 0u || server_port.value() > 65535u) { err_msg << ",Invalid Server Port: " << _server_port; } @@ -383,7 +218,7 @@ std::string ReadConfigFromArgument(std::string_view server_host, } auto server_port = StringToIntegerU(_server_port); - if (!server_port.has_value() || server_port.value() > 65535u) { + if (!server_port.has_value() || server_port.value() == 0u || server_port.value() > 65535u) { err_msg << ",Invalid Server Port: " << _server_port; } diff --git a/yass/src/config/config.hpp b/yass/src/config/config.hpp index 7d453972d7..ac08c932d7 100644 --- a/yass/src/config/config.hpp +++ b/yass/src/config/config.hpp @@ -4,45 +4,15 @@ #ifndef H_CONFIG_CONFIG #define H_CONFIG_CONFIG -#include -#include #include #include -#include "crypto/crypter_export.hpp" - +#include "config/config_core.hpp" #include "config/config_network.hpp" #include "config/config_tls.hpp" -struct PortFlag { - explicit PortFlag(uint16_t p) : port(p) {} - operator uint16_t() const { return port; } - uint16_t port; -}; - -struct CipherMethodFlag { - explicit CipherMethodFlag(cipher_method m) : method(m) {} - cipher_method method; -}; - -ABSL_DECLARE_FLAG(std::string, server_host); -ABSL_DECLARE_FLAG(std::string, server_sni); -ABSL_DECLARE_FLAG(PortFlag, server_port); -ABSL_DECLARE_FLAG(std::string, username); -ABSL_DECLARE_FLAG(std::string, password); -ABSL_DECLARE_FLAG(CipherMethodFlag, method); -ABSL_DECLARE_FLAG(std::string, local_host); -ABSL_DECLARE_FLAG(PortFlag, local_port); - -ABSL_DECLARE_FLAG(uint32_t, parallel_max); - -struct RateFlag { - explicit RateFlag(uint64_t r) : rate(r) {} - uint64_t rate; -}; -ABSL_DECLARE_FLAG(RateFlag, limit_rate); // bytes per second - namespace config { + bool ReadConfig(); bool SaveConfig(); diff --git a/yass/src/config/config_core.cpp b/yass/src/config/config_core.cpp new file mode 100644 index 0000000000..523e269941 --- /dev/null +++ b/yass/src/config/config_core.cpp @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#include "config/config_core.hpp" + +#include +#include +#include +#include +#include + +#include "core/utils.hpp" + +bool AbslParseFlag(absl::string_view text, PortFlag* flag, std::string* err); + +std::string AbslUnparseFlag(const PortFlag&); + +bool AbslParseFlag(absl::string_view text, CipherMethodFlag* flag, std::string* err); + +std::string AbslUnparseFlag(const CipherMethodFlag&); + +bool AbslParseFlag(absl::string_view text, RateFlag* flag, std::string* err); + +std::string AbslUnparseFlag(const RateFlag&); + +// Within the implementation, `AbslParseFlag()` will, in turn invoke +// `absl::ParseFlag()` on its constituent `int` and `std::string` types +// (which have built-in Abseil flag support. + +bool AbslParseFlag(absl::string_view text, PortFlag* flag, std::string* err) { + std::optional p = StringToIntegerU64(std::string(text)); + if (!p.has_value() || p.value() > UINT16_MAX) { + *err = absl::StrCat("bad port number: ", text); + return false; + } + flag->port = static_cast(p.value()); + return true; +} + +// Similarly, for unparsing, we can simply invoke `absl::UnparseFlag()` on +// the constituent types. +std::string AbslUnparseFlag(const PortFlag& flag) { + return std::to_string(flag.port); +} + +bool AbslParseFlag(absl::string_view text, CipherMethodFlag* flag, std::string* err) { + flag->method = to_cipher_method(std::string(text)); + if (flag->method == CRYPTO_INVALID) { + *err = absl::StrCat("bad cipher_method: ", text); + return false; + } + return true; +} + +// Similarly, for unparsing, we can simply invoke `absl::UnparseFlag()` on +// the constituent types. +std::string AbslUnparseFlag(const CipherMethodFlag& flag) { + assert(is_valid_cipher_method(flag.method) && "Invalid cipher_method"); + return std::string(to_cipher_method_str(flag.method)); +} + +// Within the implementation, `AbslParseFlag()` will, in turn invoke +// `absl::ParseFlag()` on its constituent `int` and `std::string` types +// (which have built-in Abseil flag support. + +static int64_t ngx_atosz(const char* line, size_t n) { + int64_t value, cutoff, cutlim; + + if (n == 0) { + return -1; + } + + cutoff = INT64_MAX / 10; + cutlim = INT64_MAX % 10; + + for (value = 0; n--; line++) { + if (*line < '0' || *line > '9') { + return -1; + } + + if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { + return -1; + } + + value = value * 10 + (*line - '0'); + } + + return value; +} + +static int64_t ngx_parse_size(const char* line, size_t len) { + char unit; + int64_t size, scale, max; + + if (len == 0) { + return -1; + } + + unit = line[len - 1]; + + switch (unit) { + case 'K': + case 'k': + len--; + max = INT64_MAX / 1024; + scale = 1024; + break; + + case 'M': + case 'm': + len--; + max = INT64_MAX / (1024 * 1024); + scale = 1024 * 1024; + break; + + default: + max = INT64_MAX; + scale = 1; + } + + size = ngx_atosz(line, len); + if (size < 0 || size > max) { + return -1; + } + + size *= scale; + + return size; +} + +static void humanReadableByteCountBin(std::ostream* ss, uint64_t bytes) { + if (bytes < 1024) { + *ss << bytes; + return; + } + if (bytes < 1024 * 1024) { + *ss << bytes / 1024 << "k"; + return; + } + *ss << bytes / 1024 / 1024 << "m"; +} + +bool AbslParseFlag(absl::string_view text, RateFlag* flag, std::string* err) { + int64_t size = ngx_parse_size(text.data(), text.size()); + if (size < 0) { + *err = absl::StrCat("bad size: ", text); + return false; + } + flag->rate = size; + return true; +} + +// Similarly, for unparsing, we can simply invoke `absl::UnparseFlag()` on +// the constituent types. +std::string AbslUnparseFlag(const RateFlag& flag) { + std::ostringstream os; + humanReadableByteCountBin(&os, flag.rate); + return os.str(); +} + +ABSL_FLAG(std::string, server_host, "http2.github.io", "Remote server on given host"); +ABSL_FLAG(std::string, server_sni, "", "Remote server on given sni"); +ABSL_FLAG(PortFlag, server_port, PortFlag(443), "Remote server on given port"); +ABSL_FLAG(std::string, local_host, "127.0.0.1", "Local proxy server on given host (Client Only)"); +ABSL_FLAG(PortFlag, local_port, PortFlag(1080), "Local proxy server on given port (Client Only)"); +ABSL_FLAG(std::string, username, "username", "Server user"); +ABSL_FLAG(std::string, password, "password", "Server password"); +static const std::string kCipherMethodHelpMessage = + absl::StrCat("Specify encrypt of method to use, one of ", kCipherMethodsStr); +ABSL_FLAG(CipherMethodFlag, method, CipherMethodFlag(CRYPTO_DEFAULT), kCipherMethodHelpMessage); + +ABSL_FLAG(uint32_t, parallel_max, 512, "Maximum concurrency for parallel connections"); +ABSL_FLAG(RateFlag, limit_rate, RateFlag(0), "Limit transfer speed to RATE"); diff --git a/yass/src/config/config_core.hpp b/yass/src/config/config_core.hpp new file mode 100644 index 0000000000..9f8dc8db44 --- /dev/null +++ b/yass/src/config/config_core.hpp @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2024 Chilledheart */ + +#ifndef H_CONFIG_CONFIG_CORE +#define H_CONFIG_CONFIG_CORE + +#include +#include +#include +#include + +#include "crypto/crypter_export.hpp" + +struct PortFlag { + explicit PortFlag(uint16_t p) : port(p) {} + operator uint16_t() const { return port; } + uint16_t port; +}; + +struct CipherMethodFlag { + explicit CipherMethodFlag(cipher_method m) : method(m) {} + cipher_method method; +}; + +struct RateFlag { + explicit RateFlag(uint64_t r) : rate(r) {} + uint64_t rate; +}; + +ABSL_DECLARE_FLAG(std::string, server_host); +ABSL_DECLARE_FLAG(std::string, server_sni); +ABSL_DECLARE_FLAG(PortFlag, server_port); +ABSL_DECLARE_FLAG(std::string, username); +ABSL_DECLARE_FLAG(std::string, password); +ABSL_DECLARE_FLAG(CipherMethodFlag, method); +ABSL_DECLARE_FLAG(std::string, local_host); +ABSL_DECLARE_FLAG(PortFlag, local_port); + +ABSL_DECLARE_FLAG(uint32_t, parallel_max); +ABSL_DECLARE_FLAG(RateFlag, limit_rate); // bytes per second + +#endif // H_CONFIG_CONFIG_CORE diff --git a/yass/src/config/config_impl.cpp b/yass/src/config/config_impl.cpp index 0cce49f15f..4b2da41079 100644 --- a/yass/src/config/config_impl.cpp +++ b/yass/src/config/config_impl.cpp @@ -8,24 +8,65 @@ #include #include +#include "config/config_core.hpp" #include "config/config_impl_apple.hpp" #include "config/config_impl_local.hpp" #include "config/config_impl_windows.hpp" #include "crypto/crypter_export.hpp" -struct PortFlag { - explicit PortFlag(uint16_t p) : port(p) {} - operator uint16_t() const { return port; } - uint16_t port; -}; - -struct CipherMethodFlag { - explicit CipherMethodFlag(cipher_method m) : method(m) {} - cipher_method method; -}; +using namespace std::string_literals; namespace config { +namespace { + +template +std::string to_masked_string(T value, bool is_masked); + +template <> +std::string to_masked_string(std::string value, bool is_masked) { + if (value.empty()) { + value = "(nil)"s; + } + std::string mask_value = value; + if (is_masked) { + mask_value = std::string(mask_value.size(), '*'); + } + return mask_value; +} + +template <> +std::string to_masked_string(std::string_view value, bool is_masked) { + if (value.empty()) { + value = "(nil)"s; + } + std::string mask_value = std::string(value); + if (is_masked) { + mask_value = std::string(mask_value.size(), '*'); + } + return mask_value; +} + +template <> +std::string to_masked_string(bool value, bool is_masked) { + std::string mask_value = value ? "true"s : "false"s; + if (is_masked) { + mask_value = std::string(mask_value.size(), '*'); + } + return mask_value; +} + +template +std::string to_masked_string(T value, bool is_masked) { + std::string mask_value = std::to_string(value); + if (is_masked) { + mask_value = std::string(mask_value.size(), '*'); + } + return mask_value; +} + +} // namespace + std::string g_configfile; ConfigImpl::~ConfigImpl() = default; @@ -79,7 +120,7 @@ bool ConfigImpl::Close() { } template -bool ConfigImpl::Read(const std::string& key, absl::Flag* value) { +bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked) { // Use an int instead of a bool to guarantee that a non-zero value has // a bit set. @@ -89,31 +130,31 @@ bool ConfigImpl::Read(const std::string& key, absl::Flag* value) { return false; } absl::SetFlag(value, real_value); - std::cerr << "loaded option " << key << ": " << real_value << std::endl; + std::cerr << "loaded option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } -template bool ConfigImpl::Read(const std::string& key, absl::Flag* value); +template bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked); template <> -bool ConfigImpl::Read(const std::string& key, absl::Flag* value) { +bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked) { alignas(std::string) alignas(8) int32_t real_value; if (!ReadImpl(key, &real_value)) { std::cerr << "failed to load option " << key << std::endl; return false; } if (real_value < 0 || real_value > UINT16_MAX) { - std::cerr << "invalid value for key: " << key << " value: " << real_value << std::endl; + std::cerr << "invalid value for key: " << key << " value: " << to_masked_string(real_value, is_masked) << std::endl; return false; } PortFlag p(static_cast(real_value)); absl::SetFlag(value, p); - std::cerr << "loaded option " << key << ": " << real_value << std::endl; + std::cerr << "loaded option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } template <> -bool ConfigImpl::Read(const std::string& key, absl::Flag* value) { +bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked) { alignas(std::string) alignas(8) std::string real_value; if (!ReadImpl(key, &real_value)) { std::cerr << "failed to load option " << key << std::endl; @@ -121,17 +162,17 @@ bool ConfigImpl::Read(const std::string& key, absl::Flag* valu } auto cipher_method = to_cipher_method(real_value); if (cipher_method == CRYPTO_INVALID) { - std::cerr << "invalid value for key: " << key << " value: " << real_value << std::endl; + std::cerr << "invalid value for key: " << key << " value: " << to_masked_string(real_value, is_masked) << std::endl; return false; } CipherMethodFlag method(cipher_method); absl::SetFlag(value, method); - std::cerr << "loaded option " << key << ": " << real_value << std::endl; + std::cerr << "loaded option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } template <> -bool ConfigImpl::Read(const std::string& key, absl::Flag* value) { +bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked) { // Use an int instead of a bool to guarantee that a non-zero value has // a bit set. @@ -141,74 +182,73 @@ bool ConfigImpl::Read(const std::string& key, absl::Flag* value) { return false; } absl::SetFlag(value, real_value); - std::cerr << "loaded option " << key << ": " << std::boolalpha << real_value << std::noboolalpha << std::endl; + std::cerr << "loaded option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } -template bool ConfigImpl::Read(const std::string& key, absl::Flag* value); +template bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked); -template bool ConfigImpl::Read(const std::string& key, absl::Flag* value); +template bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked); -template bool ConfigImpl::Read(const std::string& key, absl::Flag* value); +template bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked); -template bool ConfigImpl::Read(const std::string& key, absl::Flag* value); +template bool ConfigImpl::Read(const std::string& key, absl::Flag* value, bool is_masked); template -bool ConfigImpl::Write(const std::string& key, const absl::Flag& value) { +bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked) { alignas(T) alignas(8) T real_value = absl::GetFlag(value); if (!WriteImpl(key, real_value)) { - std::cerr << "failed to saved option " << key << ": " << real_value << std::endl; + std::cerr << "failed to saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return false; } - std::cerr << "saved option " << key << ": " << real_value << std::endl; + std::cerr << "saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } -template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value); +template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked); template <> -bool ConfigImpl::Write(const std::string& key, const absl::Flag& value) { +bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked) { int32_t real_value = absl::GetFlag(value); if (!WriteImpl(key, real_value)) { - std::cerr << "failed to saved option " << key << ": " << real_value << std::endl; + std::cerr << "failed to saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return false; } - std::cerr << "saved option " << key << ": " << real_value << std::endl; + std::cerr << "saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } template <> -bool ConfigImpl::Write(const std::string& key, const absl::Flag& value) { +bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked) { auto cipher_method = absl::GetFlag(value).method; assert(is_valid_cipher_method(cipher_method) && "Invalid cipher_method"); auto real_value = to_cipher_method_str(cipher_method); if (!WriteImpl(key, real_value)) { - std::cerr << "failed to saved option " << key << ": " << real_value << std::endl; + std::cerr << "failed to saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return false; } - std::cerr << "saved option " << key << ": " << real_value << std::endl; + std::cerr << "saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } template <> -bool ConfigImpl::Write(const std::string& key, const absl::Flag& value) { +bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked) { alignas(bool) alignas(8) bool real_value = absl::GetFlag(value); if (!WriteImpl(key, real_value)) { - std::cerr << "failed to saved option " << key << ": " << std::boolalpha << real_value << std::noboolalpha - << std::endl; + std::cerr << "failed to saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return false; } - std::cerr << "saved option " << key << ": " << std::boolalpha << real_value << std::noboolalpha << std::endl; + std::cerr << "saved option " << key << ": " << to_masked_string(real_value, is_masked) << std::endl; return true; } -template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value); +template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked); -template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value); +template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked); -template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value); +template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked); -template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value); +template bool ConfigImpl::Write(const std::string& key, const absl::Flag& value, bool is_masked); bool ConfigImpl::Delete(const std::string& key) { if (DeleteImpl(key)) { diff --git a/yass/src/config/config_impl.hpp b/yass/src/config/config_impl.hpp index 1ef593f941..481d8458d9 100644 --- a/yass/src/config/config_impl.hpp +++ b/yass/src/config/config_impl.hpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2019-2023 Chilledheart */ +/* Copyright (c) 2019-2024 Chilledheart */ #ifndef H_CONFIG_CONFIG_IMPL #define H_CONFIG_CONFIG_IMPL @@ -43,16 +43,18 @@ class ConfigImpl { /// Read the key from ConfigTree /// /// \param key the key value - /// \param absl flag + /// \param value absl flag + /// \param is_masked don't print directly template - bool Read(const std::string& key, absl::Flag* value); + bool Read(const std::string& key, absl::Flag* value, bool is_masked = false); /// Write the key,value into ConfigTree /// /// \param key the key value - /// \param absl flag + /// \param value absl flag + /// \param is_masked don't print directly template - bool Write(const std::string& key, const absl::Flag& value); + bool Write(const std::string& key, const absl::Flag& value, bool is_masked = false); /// Dlete the key /// diff --git a/yass/src/config/config_impl_apple.hpp b/yass/src/config/config_impl_apple.hpp index 133b50216e..c8938bd01f 100644 --- a/yass/src/config/config_impl_apple.hpp +++ b/yass/src/config/config_impl_apple.hpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2022-2023 Chilledheart */ +/* Copyright (c) 2022-2024 Chilledheart */ #ifndef H_CONFIG_CONFIG_IMPL_APPLE #define H_CONFIG_CONFIG_IMPL_APPLE diff --git a/yass/src/config/config_impl_local.hpp b/yass/src/config/config_impl_local.hpp index adf12b6835..4eada57d4d 100644 --- a/yass/src/config/config_impl_local.hpp +++ b/yass/src/config/config_impl_local.hpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2019-2023 Chilledheart */ +/* Copyright (c) 2019-2024 Chilledheart */ #ifndef H_CONFIG_CONFIG_IMPL_POSIX #define H_CONFIG_CONFIG_IMPL_POSIX diff --git a/yass/src/config/config_impl_windows.hpp b/yass/src/config/config_impl_windows.hpp index 79e1a91caa..a8a73345f4 100644 --- a/yass/src/config/config_impl_windows.hpp +++ b/yass/src/config/config_impl_windows.hpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2019-2023 Chilledheart */ +/* Copyright (c) 2019-2024 Chilledheart */ #ifndef H_CONFIG_CONFIG_IMPL_WINDOWS #define H_CONFIG_CONFIG_IMPL_WINDOWS diff --git a/yass/src/config/config_version.cpp b/yass/src/config/config_version.cpp index 80d1fb23df..e6788f34a7 100644 --- a/yass/src/config/config_version.cpp +++ b/yass/src/config/config_version.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "core/logging.hpp" #include "core/utils.hpp" #include "feature.h" diff --git a/yass/src/gtk/yass.cpp b/yass/src/gtk/yass.cpp index 3402a9b7ed..dd6b4ad873 100644 --- a/yass/src/gtk/yass.cpp +++ b/yass/src/gtk/yass.cpp @@ -267,7 +267,6 @@ void YASSApp::OnStartFailed(const std::string& error_msg) { state_ = START_FAILED; error_msg_ = error_msg; - LOG(ERROR) << "worker failed due to: " << error_msg_; main_window_->StartFailed(); } diff --git a/yass/src/gtk/yass_window.cpp b/yass/src/gtk/yass_window.cpp index ec3fda600b..848e23182d 100644 --- a/yass/src/gtk/yass_window.cpp +++ b/yass/src/gtk/yass_window.cpp @@ -377,7 +377,7 @@ void YASSWindow::StartFailed() { gtk_widget_set_sensitive(GTK_WIDGET(dot_host_), true); gtk_widget_set_sensitive(GTK_WIDGET(timeout_), true); - GtkDialog* alert_dialog = GTK_DIALOG(gtk_message_dialog_new(impl_, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, + GtkDialog* alert_dialog = GTK_DIALOG(gtk_message_dialog_new(impl_, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", mApp->GetStatus().c_str())); gtk_dialog_run(GTK_DIALOG(alert_dialog)); diff --git a/yass/src/gtk4/yass.cpp b/yass/src/gtk4/yass.cpp index 9d3708f74d..f3ec143c63 100644 --- a/yass/src/gtk4/yass.cpp +++ b/yass/src/gtk4/yass.cpp @@ -310,7 +310,6 @@ void YASSApp::OnStartFailed(const std::string& error_msg) { state_ = START_FAILED; error_msg_ = error_msg; - LOG(ERROR) << "worker failed due to: " << error_msg_; main_window_->StartFailed(); } diff --git a/yass/src/gtk4/yass_en.po b/yass/src/gtk4/yass_en.po index 183df6080f..7b99220399 100644 --- a/yass/src/gtk4/yass_en.po +++ b/yass/src/gtk4/yass_en.po @@ -89,6 +89,14 @@ msgstr "DNS over HTTPS URL:" msgid "DNS over TLS Host:" msgstr "DNS over TLS Host:" +#: yass_window.cpp:298 +msgid "Start Failed" +msgstr "Start Failed" + +#: yass_window.cpp:298 +msgid "OK" +msgstr "OK" + #: yass_window.ui:101 msgid "Timeout:" msgstr "Timeout:" diff --git a/yass/src/gtk4/yass_window.cpp b/yass/src/gtk4/yass_window.cpp index bb72c913d2..b3b3ea6947 100644 --- a/yass/src/gtk4/yass_window.cpp +++ b/yass/src/gtk4/yass_window.cpp @@ -295,10 +295,22 @@ void YASSWindow::StartFailed() { gtk_widget_set_sensitive(impl_->dot_host, true); gtk_widget_set_sensitive(impl_->timeout, true); - GtkDialog* dialog = GTK_DIALOG(gtk_message_dialog_new(GTK_WINDOW(impl_), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, - GTK_BUTTONS_CLOSE, "%s", mApp->GetStatus().c_str())); + // Gtk4 Message Dialog is deprecated since 4.10 +#if GTK_CHECK_VERSION(4, 10, 0) + GtkAlertDialog* dialog = gtk_alert_dialog_new("%s", _("Start Failed")); + const char* buttons[] = {_("OK"), nullptr}; + gtk_alert_dialog_set_detail(dialog, mApp->GetStatus().c_str()); + gtk_alert_dialog_set_buttons(dialog, buttons); + gtk_window_present(GTK_WINDOW(impl_)); + gtk_alert_dialog_choose(dialog, GTK_WINDOW(impl_), nullptr, nullptr, nullptr); +#else + GtkDialogFlags flags = (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL); + GtkDialog* dialog = GTK_DIALOG(gtk_message_dialog_new(GTK_WINDOW(impl_), flags, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, + "%s", mApp->GetStatus().c_str())); - g_signal_connect(dialog, "response", G_CALLBACK(gtk_window_destroy), NULL); + g_signal_connect(dialog, "response", G_CALLBACK(gtk_window_destroy), nullptr); + gtk_widget_show(GTK_WIDGET(dialog)); +#endif } void YASSWindow::Stopped() { diff --git a/yass/src/gtk4/yass_zh_CN.po b/yass/src/gtk4/yass_zh_CN.po index 3715169fa3..cb59cb8c08 100644 --- a/yass/src/gtk4/yass_zh_CN.po +++ b/yass/src/gtk4/yass_zh_CN.po @@ -90,6 +90,14 @@ msgstr "基于 HTTPS 的 DNS (DoH) URL:" msgid "DNS over TLS Host:" msgstr "基于 TLS 的 DNS (DoT) 域名:" +#: yass_window.cpp:298 +msgid "Start Failed" +msgstr "启动失败" + +#: yass_window.cpp:298 +msgid "OK" +msgstr "确认" + #: yass_window.ui:101 msgid "Timeout:" msgstr "超时时间:" diff --git a/yass/src/mac/YassAppDelegate.mm b/yass/src/mac/YassAppDelegate.mm index d594dd6963..15893c52e3 100644 --- a/yass/src/mac/YassAppDelegate.mm +++ b/yass/src/mac/YassAppDelegate.mm @@ -168,7 +168,6 @@ state_ = START_FAILED; error_msg_ = error_msg; - LOG(ERROR) << "worker failed due to: " << error_msg_; YassWindowController* windowController = (YassWindowController*)NSApplication.sharedApplication.mainWindow.windowController; [windowController StartFailed]; diff --git a/yass/src/server/server.cpp b/yass/src/server/server.cpp index 5d79dbe03e..99b5a13928 100644 --- a/yass/src/server/server.cpp +++ b/yass/src/server/server.cpp @@ -120,6 +120,10 @@ int main(int argc, const char* argv[]) { std::string host_name = absl::GetFlag(FLAGS_server_host); std::string host_sni = host_name; uint16_t port = absl::GetFlag(FLAGS_server_port); + if (port == 0u) { + LOG(WARNING) << "Invalid server port: " << port; + return -1; + } asio::error_code ec; auto addr = asio::ip::make_address(host_name.c_str(), ec); diff --git a/yass/src/win32/yass.cpp b/yass/src/win32/yass.cpp index abc3256922..0ec4adf91c 100644 --- a/yass/src/win32/yass.cpp +++ b/yass/src/win32/yass.cpp @@ -365,8 +365,6 @@ void CYassApp::OnStartFailed(WPARAM w, LPARAM l) { std::unique_ptr message_ptr(reinterpret_cast(l)); error_msg_ = std::move(message_ptr.operator*()); - - LOG(ERROR) << "worker failed due to: " << error_msg_; frame_->OnStartFailed(); } diff --git a/yass/tools/build.go b/yass/tools/build.go index d598cb3d7d..e5fef04a0f 100644 --- a/yass/tools/build.go +++ b/yass/tools/build.go @@ -2111,13 +2111,21 @@ func postStateArchives() map[string][]string { if systemNameFlag == "windows" { osName := "win" if msvcAllowXpFlag { - osName = "winxp" + if msvcTargetArchFlag == "x86" { + osName = "winxp" + } else { + osName = "win7" + } } archiveFormat = fmt.Sprintf("%%s-%s-release-%s-%s-%s%%s%%s", osName, msvcTargetArchFlag, msvcCrtLinkageFlag, tag) } else if systemNameFlag == "mingw" { osName := "mingw" if mingwAllowXpFlag { - osName = "mingw-winxp" + if archFlag == "x86" || archFlag == "i686" { + osName = "mingw-winxp" + } else { + osName = "mingw-win7" + } } archiveFormat = fmt.Sprintf("%%s-%s-release-%s-%s%%s%%s", osName, archFlag, tag) } else if systemNameFlag == "darwin" { diff --git a/youtube-dl/test/test_download.py b/youtube-dl/test/test_download.py index e0bc8cb954..df8b370cfd 100644 --- a/youtube-dl/test/test_download.py +++ b/youtube-dl/test/test_download.py @@ -10,6 +10,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from test.helper import ( assertGreaterEqual, + assertLessEqual, expect_warnings, get_params, gettestcases, @@ -122,7 +123,10 @@ def generator(test_case, tname): params['outtmpl'] = tname + '_' + params['outtmpl'] if is_playlist and 'playlist' not in test_case: params.setdefault('extract_flat', 'in_playlist') - params.setdefault('playlistend', test_case.get('playlist_mincount')) + params.setdefault('playlistend', + test_case['playlist_maxcount'] + 1 + if test_case.get('playlist_maxcount') + else test_case.get('playlist_mincount')) params.setdefault('skip_download', True) ydl = YoutubeDL(params, auto_init=False) @@ -190,6 +194,14 @@ def generator(test_case, tname): 'Expected at least %d in playlist %s, but got only %d' % ( test_case['playlist_mincount'], test_case['url'], len(res_dict['entries']))) + if 'playlist_maxcount' in test_case: + assertLessEqual( + self, + len(res_dict['entries']), + test_case['playlist_maxcount'], + 'Expected at most %d in playlist %s, but got %d' % ( + test_case['playlist_maxcount'], test_case['url'], + len(res_dict['entries']))) if 'playlist_count' in test_case: self.assertEqual( len(res_dict['entries']), diff --git a/youtube-dl/youtube_dl/extractor/extractors.py b/youtube-dl/youtube_dl/extractor/extractors.py index a56a7c52f3..03d035a275 100644 --- a/youtube-dl/youtube_dl/extractor/extractors.py +++ b/youtube-dl/youtube_dl/extractor/extractors.py @@ -1653,7 +1653,15 @@ from .younow import ( YouNowChannelIE, YouNowMomentIE, ) -from .youporn import YouPornIE +from .youporn import ( + YouPornIE, + YouPornCategoryIE, + YouPornChannelIE, + YouPornCollectionIE, + YouPornStarIE, + YouPornTagIE, + YouPornVideosIE, +) from .yourporn import YourPornIE from .yourupload import YourUploadIE from .youtube import ( diff --git a/youtube-dl/youtube_dl/extractor/youporn.py b/youtube-dl/youtube_dl/extractor/youporn.py index 31e8abb729..ec6125a79c 100644 --- a/youtube-dl/youtube_dl/extractor/youporn.py +++ b/youtube-dl/youtube_dl/extractor/youporn.py @@ -1,20 +1,38 @@ # coding: utf-8 from __future__ import unicode_literals +import itertools import re +from time import sleep from .common import InfoExtractor from ..utils import ( + clean_html, extract_attributes, + ExtractorError, + get_element_by_class, + get_element_by_id, int_or_none, - str_to_int, + merge_dicts, + parse_count, + parse_qs, + T, + traverse_obj, unified_strdate, url_or_none, + urljoin, ) class YouPornIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?youporn\.com/(?:watch|embed)/(?P\d+)(?:/(?P[^/?#&]+))?' + _VALID_URL = ( + r'youporn:(?P\d+)', + r'''(?x) + https?://(?:www\.)?youporn\.com/(?:watch|embed)/(?P\d+) + (?:/(?:(?P[^/?#&]+)/?)?)?(?:[#?]|$) + ''' + ) + _EMBED_REGEX = [r']+\bsrc=["\'](?P(?:https?:)?//(?:www\.)?youporn\.com/embed/\d+)'] _TESTS = [{ 'url': 'http://www.youporn.com/watch/505835/sex-ed-is-it-safe-to-masturbate-daily/', 'md5': '3744d24c50438cf5b6f6d59feb5055c2', @@ -34,7 +52,7 @@ class YouPornIE(InfoExtractor): 'tags': list, 'age_limit': 18, }, - 'skip': 'This video has been disabled', + 'skip': 'This video has been deactivated', }, { # Unknown uploader 'url': 'http://www.youporn.com/watch/561726/big-tits-awesome-brunette-on-amazing-webcam-show/?from=related3&al=2&from_id=561726&pos=4', @@ -66,57 +84,104 @@ class YouPornIE(InfoExtractor): }, { 'url': 'https://www.youporn.com/watch/13922959/femdom-principal/', 'only_matching': True, + }, { + 'url': 'https://www.youporn.com/watch/16290308/tinderspecial-trailer1/', + 'info_dict': { + 'id': '16290308', + 'age_limit': 18, + 'categories': [], + 'description': None, # SEO spam using title removed + 'display_id': 'tinderspecial-trailer1', + 'duration': 298.0, + 'ext': 'mp4', + 'upload_date': '20201123', + 'uploader': 'Ersties', + 'tags': [], + 'thumbnail': 'https://fi1.ypncdn.com/m=eaSaaTbWx/202011/23/16290308/original/3.jpg', + 'timestamp': 1606147564, + 'title': 'Tinder In Real Life', + 'view_count': int, + } }] - @staticmethod - def _extract_urls(webpage): - return re.findall( - r']+\bsrc=["\']((?:https?:)?//(?:www\.)?youporn\.com/embed/\d+)', - webpage) + @classmethod + def _extract_urls(cls, webpage): + def yield_urls(): + for p in cls._EMBED_REGEX: + for m in re.finditer(p, webpage): + yield m.group('url') + + return list(yield_urls()) def _real_extract(self, url): - mobj = re.match(self._VALID_URL, url) - video_id = mobj.group('id') - display_id = mobj.group('display_id') or video_id + # A different video ID (data-video-id) is hidden in the page but + # never seems to be used + video_id, display_id = self._match_valid_url(url).group('id', 'display_id') + url = 'http://www.youporn.com/watch/%s' % (video_id,) + webpage = self._download_webpage( + url, video_id, headers={'Cookie': 'age_verified=1'}) - definitions = self._download_json( - 'https://www.youporn.com/api/video/media_definitions/%s/' % video_id, - display_id) + watchable = self._search_regex( + r'''(]*\bid\s*=\s*('|")?watch-container(?(2)\2|(?!-)\b)[^>]*>)''', + webpage, 'watchability', default=None) + if not watchable: + msg = re.split(r'\s{4}', clean_html(get_element_by_id( + 'mainContent', webpage)) or '')[0] + raise ExtractorError( + ('%s says: %s' % (self.IE_NAME, msg)) + if msg else 'Video unavailable: no reason found', + expected=True) + # internal ID ? + # video_id = extract_attributes(watchable).get('data-video-id') + + playervars = self._search_json( + r'\bplayervars\s*:', webpage, 'playervars', video_id) + + def get_fmt(x): + v_url = url_or_none(x.get('videoUrl')) + if v_url: + x['videoUrl'] = v_url + return (x['format'], x) + + defs_by_format = dict(traverse_obj(playervars, ( + 'mediaDefinitions', lambda _, v: v.get('format'), T(get_fmt)))) + + def get_format_data(f): + if f not in defs_by_format: + return [] + return self._download_json( + defs_by_format[f]['videoUrl'], video_id, '{0}-formats'.format(f)) formats = [] - for definition in definitions: - if not isinstance(definition, dict): - continue - video_url = url_or_none(definition.get('videoUrl')) - if not video_url: - continue - f = { - 'url': video_url, - 'filesize': int_or_none(definition.get('videoSize')), - } - height = int_or_none(definition.get('quality')) + # Try to extract only the actual master m3u8 first, avoiding the duplicate single resolution "master" m3u8s + for hls_url in traverse_obj( + get_format_data('hls'), + (lambda _, v: not isinstance(v['defaultQuality'], bool), 'videoUrl'), + (Ellipsis, 'videoUrl')): + formats.extend(self._extract_m3u8_formats( + hls_url, video_id, 'mp4', fatal=False, m3u8_id='hls', + entry_protocol='m3u8_native')) + + for f in traverse_obj(get_format_data('mp4'), ( + lambda _, v: v.get('videoUrl'), { + 'url': ('videoUrl', T(url_or_none)), + 'filesize': ('videoSize', T(int_or_none)), + 'height': ('quality', T(int_or_none)), + }, T(lambda x: x.get('videoUrl') and x))): # Video URL's path looks like this: # /201012/17/505835/720p_1500k_505835/YouPorn%20-%20Sex%20Ed%20Is%20It%20Safe%20To%20Masturbate%20Daily.mp4 # /201012/17/505835/vl_240p_240k_505835/YouPorn%20-%20Sex%20Ed%20Is%20It%20Safe%20To%20Masturbate%20Daily.mp4 # /videos/201703/11/109285532/1080P_4000K_109285532.mp4 # We will benefit from it by extracting some metadata - mobj = re.search(r'(?P\d{3,4})[pP]_(?P\d+)[kK]_\d+', video_url) + mobj = re.search(r'(?P\d{3,4})[pP]_(?P\d+)[kK]_\d+', f['videoUrl']) if mobj: - if not height: - height = int(mobj.group('height')) - bitrate = int(mobj.group('bitrate')) - f.update({ - 'format_id': '%dp-%dk' % (height, bitrate), - 'tbr': bitrate, - }) - f['height'] = height + if not f.get('height'): + f['height'] = int(mobj.group('height')) + f['tbr'] = int(mobj.group('bitrate')) + f['format_id'] = '%dp-%dk' % (f['height'], f['tbr']) formats.append(f) self._sort_formats(formats) - webpage = self._download_webpage( - 'http://www.youporn.com/watch/%s' % video_id, display_id, - headers={'Cookie': 'age_verified=1'}) - title = self._html_search_regex( r'(?s)]+class=["\']watchVideoTitle[^>]+>(.+?)', webpage, 'title', default=None) or self._og_search_title( @@ -131,8 +196,10 @@ class YouPornIE(InfoExtractor): thumbnail = self._search_regex( r'(?:imageurl\s*=|poster\s*:)\s*(["\'])(?P.+?)\1', webpage, 'thumbnail', fatal=False, group='thumbnail') - duration = int_or_none(self._html_search_meta( - 'video:duration', webpage, 'duration', fatal=False)) + duration = traverse_obj(playervars, ('duration', T(int_or_none))) + if duration is None: + duration = int_or_none(self._html_search_meta( + 'video:duration', webpage, 'duration', fatal=False)) uploader = self._html_search_regex( r'(?s)]+class=["\']submitByLink["\'][^>]*>(.+?)', @@ -148,11 +215,11 @@ class YouPornIE(InfoExtractor): view_count = None views = self._search_regex( - r'(]+\bclass=["\']js_videoInfoViews["\']>)', webpage, - 'views', default=None) + r'(]*\bdata-value\s*=[^>]+>)\s*', + webpage, 'views', default=None) if views: - view_count = str_to_int(extract_attributes(views).get('data-value')) - comment_count = str_to_int(self._search_regex( + view_count = parse_count(extract_attributes(views).get('data-value')) + comment_count = parse_count(self._search_regex( r'>All [Cc]omments? \(([\d,.]+)\)', webpage, 'comment count', default=None)) @@ -168,7 +235,10 @@ class YouPornIE(InfoExtractor): r'(?s)Tags:.*?\s*]+class=["\']tagBoxContent["\'][^>]*>(.+?)', 'tags') - return { + data = self._search_json_ld(webpage, video_id, expected_type='VideoObject', fatal=False) or {} + data.pop('url', None) + + result = merge_dicts(data, { 'id': video_id, 'display_id': display_id, 'title': title, @@ -183,4 +253,442 @@ class YouPornIE(InfoExtractor): 'tags': tags, 'age_limit': age_limit, 'formats': formats, - } + }) + # Remove promotional non-description + if result.get('description', '').startswith( + 'Watch %s online' % (result['title'],)): + del result['description'] + return result + + +class YouPornListBase(InfoExtractor): + # pattern in '.title-text' element of page section containing videos + _PLAYLIST_TITLEBAR_RE = r'\s+[Vv]ideos\s*$' + _PAGE_RETRY_COUNT = 0 # ie, no retry + _PAGE_RETRY_DELAY = 2 # seconds + + def _get_next_url(self, url, pl_id, html): + return urljoin(url, self._search_regex( + r''']*?\bhref\s*=\s*("|')(?P(?:(?!\1)[^>])+)\1''', + get_element_by_id('next', html) or '', 'next page', + group='url', default=None)) + + @classmethod + def _get_title_from_slug(cls, title_slug): + return re.sub(r'[_-]', ' ', title_slug) + + def _entries(self, url, pl_id, html=None, page_num=None): + + # separates page sections + PLAYLIST_SECTION_RE = ( + r''']*\bclass\s*=\s*('|")(?:[\w$-]+\s+|\s)*?title-bar(?:\s+[\w$-]+|\s)*\1[^>]*>''' + ) + # contains video link + VIDEO_URL_RE = r'''(?x) + ]*\bdata-video-id\s*=\s*('|")\d+\1[^>]*>\s* + (?:\s*)* + ]*\bhref\s*=\s*('|")(?P(?:(?!\2)[^>])+)\2 + ''' + + def yield_pages(url, html=html, page_num=page_num): + fatal = not html + for pnum in itertools.count(start=page_num or 1): + if not html: + html = self._download_webpage( + url, pl_id, note='Downloading page %d' % pnum, + fatal=fatal) + if not html: + break + fatal = False + yield (url, html, pnum) + # explicit page: extract just that page + if page_num is not None: + break + next_url = self._get_next_url(url, pl_id, html) + if not next_url or next_url == url: + break + url, html = next_url, None + + def retry_page(msg, tries_left, page_data): + if tries_left <= 0: + return + self.report_warning(msg, pl_id) + sleep(self._PAGE_RETRY_DELAY) + return next( + yield_pages(page_data[0], page_num=page_data[2]), None) + + def yield_entries(html): + for frag in re.split(PLAYLIST_SECTION_RE, html): + if not frag: + continue + t_text = get_element_by_class('title-text', frag or '') + if not (t_text and re.search(self._PLAYLIST_TITLEBAR_RE, t_text)): + continue + for m in re.finditer(VIDEO_URL_RE, frag): + video_url = urljoin(url, m.group('url')) + if video_url: + yield self.url_result(video_url) + + last_first_url = None + for page_data in yield_pages(url, html=html, page_num=page_num): + # page_data: url, html, page_num + first_url = None + tries_left = self._PAGE_RETRY_COUNT + 1 + while tries_left > 0: + tries_left -= 1 + for from_ in yield_entries(page_data[1]): + # may get the same page twice instead of empty page + # or (site bug) intead of actual next page + if not first_url: + first_url = from_['url'] + if first_url == last_first_url: + # sometimes (/porntags/) the site serves the previous page + # instead but may provide the correct page after a delay + page_data = retry_page( + 'Retrying duplicate page...', tries_left, page_data) + if page_data: + first_url = None + break + continue + yield from_ + else: + if not first_url and 'no-result-paragarph1' in page_data[1]: + page_data = retry_page( + 'Retrying empty page...', tries_left, page_data) + if page_data: + continue + else: + # success/failure + break + # may get an infinite (?) sequence of empty pages + if not first_url: + break + last_first_url = first_url + + def _real_extract(self, url, html=None): + # exceptionally, id may be None + m_dict = self._match_valid_url(url).groupdict() + pl_id, page_type, sort = (m_dict.get(k) for k in ('id', 'type', 'sort')) + + qs = parse_qs(url) + for q, v in qs.items(): + if v: + qs[q] = v[-1] + else: + del qs[q] + + base_id = pl_id or 'YouPorn' + title = self._get_title_from_slug(base_id) + if page_type: + title = '%s %s' % (page_type.capitalize(), title) + base_id = [base_id.lower()] + if sort is None: + title += ' videos' + else: + title = '%s videos by %s' % (title, re.sub(r'[_-]', ' ', sort)) + base_id.append(sort) + if qs: + ps = ['%s=%s' % item for item in sorted(qs.items())] + title += ' (%s)' % ','.join(ps) + base_id.extend(ps) + pl_id = '/'.join(base_id) + + return self.playlist_result( + self._entries(url, pl_id, html=html, + page_num=int_or_none(qs.get('page'))), + playlist_id=pl_id, playlist_title=title) + + +class YouPornCategoryIE(YouPornListBase): + IE_DESC = 'YouPorn category, with sorting, filtering and pagination' + _VALID_URL = r'''(?x) + https?://(?:www\.)?youporn\.com/ + (?Pcategory)/(?P[^/?#&]+) + (?:/(?Ppopular|views|rating|time|duration))?/?(?:[#?]|$) + ''' + _TESTS = [{ + 'note': 'Full list with pagination', + 'url': 'https://www.youporn.com/category/lingerie/popular/', + 'info_dict': { + 'id': 'lingerie/popular', + 'title': 'Category lingerie videos by popular', + }, + 'playlist_mincount': 39, + }, { + 'note': 'Filtered paginated list with single page result', + 'url': 'https://www.youporn.com/category/lingerie/duration/?min_minutes=10', + 'info_dict': { + 'id': 'lingerie/duration/min_minutes=10', + 'title': 'Category lingerie videos by duration (min_minutes=10)', + }, + 'playlist_maxcount': 30, + }, { + 'note': 'Single page of full list', + 'url': 'https://www.youporn.com/category/lingerie/popular?page=1', + 'info_dict': { + 'id': 'lingerie/popular/page=1', + 'title': 'Category lingerie videos by popular (page=1)', + }, + 'playlist_count': 30, + }] + + +class YouPornChannelIE(YouPornListBase): + IE_DESC = 'YouPorn channel, with sorting and pagination' + _VALID_URL = r'''(?x) + https?://(?:www\.)?youporn\.com/ + (?Pchannel)/(?P[^/?#&]+) + (?:/(?Prating|views|duration))?/?(?:[#?]|$) + ''' + _TESTS = [{ + 'note': 'Full list with pagination', + 'url': 'https://www.youporn.com/channel/x-feeds/', + 'info_dict': { + 'id': 'x-feeds', + 'title': 'Channel X-Feeds videos', + }, + 'playlist_mincount': 37, + }, { + 'note': 'Single page of full list (no filters here)', + 'url': 'https://www.youporn.com/channel/x-feeds/duration?page=1', + 'info_dict': { + 'id': 'x-feeds/duration/page=1', + 'title': 'Channel X-Feeds videos by duration (page=1)', + }, + 'playlist_count': 24, + }] + + @staticmethod + def _get_title_from_slug(title_slug): + return re.sub(r'_', ' ', title_slug).title() + + +class YouPornCollectionIE(YouPornListBase): + IE_DESC = 'YouPorn collection (user playlist), with sorting and pagination' + _VALID_URL = r'''(?x) + https?://(?:www\.)?youporn\.com/ + (?Pcollection)s/videos/(?P\d+) + (?:/(?Prating|views|time|duration))?/?(?:[#?]|$) + ''' + _PLAYLIST_TITLEBAR_RE = r'^\s*Videos\s+in\s' + _TESTS = [{ + 'note': 'Full list with pagination', + 'url': 'https://www.youporn.com/collections/videos/33044251/', + 'info_dict': { + 'id': '33044251', + 'title': 'Collection Sexy Lips videos', + 'uploader': 'ph-littlewillyb', + }, + 'playlist_mincount': 50, + }, { + 'note': 'Single page of full list (no filters here)', + 'url': 'https://www.youporn.com/collections/videos/33044251/time?page=1', + 'info_dict': { + 'id': '33044251/time/page=1', + 'title': 'Collection Sexy Lips videos by time (page=1)', + 'uploader': 'ph-littlewillyb', + }, + 'playlist_count': 20, + }] + + def _real_extract(self, url): + pl_id = self._match_id(url) + html = self._download_webpage(url, pl_id) + playlist = super(YouPornCollectionIE, self)._real_extract(url, html=html) + infos = re.sub(r'\s+', ' ', clean_html(get_element_by_class( + 'collection-infos', html)) or '') + title, uploader = self._search_regex( + r'^\s*Collection: (?P.+?) \d+ VIDEOS \d+ VIEWS \d+ days LAST UPDATED From: (?P<uploader>[\w_-]+)', + infos, 'title/uploader', group=('title', 'uploader'), default=(None, None)) + + return merge_dicts({ + 'title': playlist['title'].replace(playlist['id'].split('/')[0], title), + 'uploader': uploader, + }, playlist) if title else playlist + + +class YouPornTagIE(YouPornListBase): + IE_DESC = 'YouPorn tag (porntags), with sorting, filtering and pagination' + _VALID_URL = r'''(?x) + https?://(?:www\.)?youporn\.com/ + porn(?P<type>tag)s/(?P<id>[^/?#&]+) + (?:/(?P<sort>views|rating|time|duration))?/?(?:[#?]|$) + ''' + _PLAYLIST_TITLEBAR_RE = r'^\s*Videos\s+tagged\s' + _PAGE_RETRY_COUNT = 1 + _TESTS = [{ + 'note': 'Full list with pagination', + 'url': 'https://www.youporn.com/porntags/austrian', + 'info_dict': { + 'id': 'austrian', + 'title': 'Tag austrian videos', + }, + 'playlist_mincount': 35, + 'expected_warnings': ['Retrying duplicate page'], + }, { + 'note': 'Filtered paginated list with single page result', + 'url': 'https://www.youporn.com/porntags/austrian/duration/?min_minutes=10', + 'info_dict': { + 'id': 'austrian/duration/min_minutes=10', + 'title': 'Tag austrian videos by duration (min_minutes=10)', + }, + # number of videos per page is (row x col) 2x3 + 6x4 + 2, or + 3, + # or more, varying with number of ads; let's set max as 9x4 + # NB col 1 may not be shown in non-JS page with site CSS and zoom 100% + 'playlist_maxcount': 32, + 'expected_warnings': ['Retrying duplicate page', 'Retrying empty page'], + }, { + 'note': 'Single page of full list', + 'url': 'https://www.youporn.com/porntags/austrian/?page=1', + 'info_dict': { + 'id': 'austrian/page=1', + 'title': 'Tag austrian videos (page=1)', + }, + 'playlist_mincount': 32, + 'playlist_maxcount': 34, + 'expected_warnings': ['Retrying duplicate page', 'Retrying empty page'], + }] + + # YP tag navigation is broken, loses sort + def _get_next_url(self, url, pl_id, html): + next_url = super(YouPornTagIE, self)._get_next_url(url, pl_id, html) + if next_url: + n = self._match_valid_url(next_url) + if n: + s = n.groupdict().get('sort') + if s: + u = self._match_valid_url(url) + if u: + u = u.groupdict().get('sort') + if s and not u: + n = n.end('sort') + next_url = next_url[:n] + '/' + u + next_url[n:] + return next_url + + +class YouPornStarIE(YouPornListBase): + IE_DESC = 'YouPorn Pornstar, with description, sorting and pagination' + _VALID_URL = r'''(?x) + https?://(?:www\.)?youporn\.com/ + (?P<type>pornstar)/(?P<id>[^/?#&]+) + (?:/(?P<sort>rating|views|duration))?/?(?:[#?]|$) + ''' + _PLAYLIST_TITLEBAR_RE = r'^\s*Videos\s+[fF]eaturing\s' + _TESTS = [{ + 'note': 'Full list with pagination', + 'url': 'https://www.youporn.com/pornstar/daynia/', + 'info_dict': { + 'id': 'daynia', + 'title': 'Pornstar Daynia videos', + 'description': r're:Daynia Rank \d+ Videos \d+ Views [\d,.]+ .+ Subscribers \d+', + }, + 'playlist_mincount': 45, + }, { + 'note': 'Single page of full list (no filters here)', + 'url': 'https://www.youporn.com/pornstar/daynia/?page=1', + 'info_dict': { + 'id': 'daynia/page=1', + 'title': 'Pornstar Daynia videos (page=1)', + 'description': 're:.{180,}', + }, + 'playlist_count': 26, + }] + + @staticmethod + def _get_title_from_slug(title_slug): + return re.sub(r'_', ' ', title_slug).title() + + def _real_extract(self, url): + pl_id = self._match_id(url) + html = self._download_webpage(url, pl_id) + playlist = super(YouPornStarIE, self)._real_extract(url, html=html) + INFO_ELEMENT_RE = r'''(?x) + <div\s[^>]*\bclass\s*=\s*('|")(?:[\w$-]+\s+|\s)*?pornstar-info-wrapper(?:\s+[\w$-]+|\s)*\1[^>]*> + (?P<info>[\s\S]+?)(?:</div>\s*){6,} + ''' + + infos = self._search_regex(INFO_ELEMENT_RE, html, 'infos', group='info', default='') + if infos: + infos = re.sub( + r'(?:\s*nl=nl)+\s*', ' ', + re.sub(r'(?u)\s+', ' ', clean_html( + re.sub('\n', 'nl=nl', infos)))).replace('ribe Subsc', '') + + return merge_dicts({ + 'description': infos.strip() or None, + }, playlist) + + +class YouPornVideosIE(YouPornListBase): + IE_DESC = 'YouPorn video (browse) playlists, with sorting, filtering and pagination' + _VALID_URL = r'''(?x) + https?://(?:www\.)?youporn\.com/ + (?:(?P<id>browse)/)? + (?P<sort>(?(id) + (?:duration|rating|time|views)| + (?:most_(?:favou?rit|view)ed|recommended|top_rated)?)) + (?:[/#?]|$) + ''' + _PLAYLIST_TITLEBAR_RE = r'\s+(?:[Vv]ideos|VIDEOS)\s*$' + _TESTS = [{ + 'note': 'Full list with pagination (too long for test)', + 'url': 'https://www.youporn.com/', + 'info_dict': { + 'id': 'youporn', + 'title': 'YouPorn videos', + }, + 'only_matching': True, + }, { + 'note': 'Full list with pagination (too long for test)', + 'url': 'https://www.youporn.com/recommended', + 'info_dict': { + 'id': 'youporn/recommended', + 'title': 'YouPorn videos by recommended', + }, + 'only_matching': True, + }, { + 'note': 'Full list with pagination (too long for test)', + 'url': 'https://www.youporn.com/top_rated', + 'info_dict': { + 'id': 'youporn/top_rated', + 'title': 'YouPorn videos by top rated', + }, + 'only_matching': True, + }, { + 'note': 'Full list with pagination (too long for test)', + 'url': 'https://www.youporn.com/browse/time', + 'info_dict': { + 'id': 'browse/time', + 'title': 'YouPorn videos by time', + }, + 'only_matching': True, + }, { + 'note': 'Filtered paginated list with single page result', + 'url': 'https://www.youporn.com/most_favorited/?res=VR&max_minutes=2', + 'info_dict': { + 'id': 'youporn/most_favorited/max_minutes=2/res=VR', + 'title': 'YouPorn videos by most favorited (max_minutes=2,res=VR)', + }, + 'playlist_mincount': 10, + 'playlist_maxcount': 28, + }, { + 'note': 'Filtered paginated list with several pages', + 'url': 'https://www.youporn.com/most_favorited/?res=VR&max_minutes=5', + 'info_dict': { + 'id': 'youporn/most_favorited/max_minutes=5/res=VR', + 'title': 'YouPorn videos by most favorited (max_minutes=5,res=VR)', + }, + 'playlist_mincount': 45, + }, { + 'note': 'Single page of full list', + 'url': 'https://www.youporn.com/browse/time?page=1', + 'info_dict': { + 'id': 'browse/time/page=1', + 'title': 'YouPorn videos by time (page=1)', + }, + 'playlist_count': 36, + }] + + @staticmethod + def _get_title_from_slug(title_slug): + return 'YouPorn' if title_slug == 'browse' else title_slug diff --git a/yt-dlp/yt_dlp/extractor/crunchyroll.py b/yt-dlp/yt_dlp/extractor/crunchyroll.py index 118b575ab2..385a3c2d34 100644 --- a/yt-dlp/yt_dlp/extractor/crunchyroll.py +++ b/yt-dlp/yt_dlp/extractor/crunchyroll.py @@ -24,11 +24,15 @@ class CrunchyrollBaseIE(InfoExtractor): _BASE_URL = 'https://www.crunchyroll.com' _API_BASE = 'https://api.crunchyroll.com' _NETRC_MACHINE = 'crunchyroll' + _REFRESH_TOKEN = None _AUTH_HEADERS = None + _AUTH_EXPIRY = None _API_ENDPOINT = None - _BASIC_AUTH = None + _BASIC_AUTH = 'Basic ' + base64.b64encode(':'.join(( + 't-kdgp2h8c3jub8fn0fq', + 'yfLDfMfrYvKXh4JXS1LEI2cCqu1v5Wan', + )).encode()).decode() _IS_PREMIUM = None - _CLIENT_ID = ('cr_web', 'noaihdevm_6iyg0a8l0q') _LOCALE_LOOKUP = { 'ar': 'ar-SA', 'de': 'de-DE', @@ -43,69 +47,74 @@ class CrunchyrollBaseIE(InfoExtractor): 'hi': 'hi-IN', } - @property - def is_logged_in(self): - return bool(self._get_cookies(self._BASE_URL).get('etp_rt')) + def _set_auth_info(self, response): + CrunchyrollBaseIE._IS_PREMIUM = 'cr_premium' in traverse_obj(response, ('access_token', {jwt_decode_hs256}, 'benefits', ...)) + CrunchyrollBaseIE._AUTH_HEADERS = {'Authorization': response['token_type'] + ' ' + response['access_token']} + CrunchyrollBaseIE._AUTH_EXPIRY = time_seconds(seconds=traverse_obj(response, ('expires_in', {float_or_none}), default=300) - 10) + + def _request_token(self, headers, data, note='Requesting token', errnote='Failed to request token'): + try: # TODO: Add impersonation support here + return self._download_json( + f'{self._BASE_URL}/auth/v1/token', None, note=note, errnote=errnote, + headers=headers, data=urlencode_postdata(data)) + except ExtractorError as error: + if not isinstance(error.cause, HTTPError) or error.cause.status != 403: + raise + raise ExtractorError( + 'Request blocked by Cloudflare; navigate to Crunchyroll in your browser, ' + 'then pass the fresh cookies (with --cookies-from-browser or --cookies) ' + 'and your browser\'s User-Agent (with --user-agent)', expected=True) def _perform_login(self, username, password): - if self.is_logged_in: + if not CrunchyrollBaseIE._REFRESH_TOKEN: + CrunchyrollBaseIE._REFRESH_TOKEN = self.cache.load(self._NETRC_MACHINE, username) + if CrunchyrollBaseIE._REFRESH_TOKEN: return - upsell_response = self._download_json( - f'{self._API_BASE}/get_upsell_data.0.json', None, 'Getting session id', - query={ - 'sess_id': 1, - 'device_id': 'whatvalueshouldbeforweb', - 'device_type': 'com.crunchyroll.static', - 'access_token': 'giKq5eY27ny3cqz', - 'referer': f'{self._BASE_URL}/welcome/login' - }) - if upsell_response['code'] != 'ok': - raise ExtractorError('Could not get session id') - session_id = upsell_response['data']['session_id'] - - login_response = self._download_json( - f'{self._API_BASE}/login.1.json', None, 'Logging in', - data=urlencode_postdata({ - 'account': username, - 'password': password, - 'session_id': session_id - })) - if login_response['code'] != 'ok': - raise ExtractorError('Login failed. Server message: %s' % login_response['message'], expected=True) - if not self.is_logged_in: - raise ExtractorError('Login succeeded but did not set etp_rt cookie') - - def _update_auth(self): - if CrunchyrollBaseIE._AUTH_HEADERS and CrunchyrollBaseIE._AUTH_REFRESH > time_seconds(): - return - - if not CrunchyrollBaseIE._BASIC_AUTH: - cx_api_param = self._CLIENT_ID[self.is_logged_in] - self.write_debug(f'Using cxApiParam={cx_api_param}') - CrunchyrollBaseIE._BASIC_AUTH = 'Basic ' + base64.b64encode(f'{cx_api_param}:'.encode()).decode() - - auth_headers = {'Authorization': CrunchyrollBaseIE._BASIC_AUTH} - if self.is_logged_in: - grant_type = 'etp_rt_cookie' - else: - grant_type = 'client_id' - auth_headers['ETP-Anonymous-ID'] = uuid.uuid4() try: - auth_response = self._download_json( - f'{self._BASE_URL}/auth/v1/token', None, note=f'Authenticating with grant_type={grant_type}', - headers=auth_headers, data=f'grant_type={grant_type}'.encode()) + login_response = self._request_token( + headers={'Authorization': self._BASIC_AUTH}, data={ + 'username': username, + 'password': password, + 'grant_type': 'password', + 'scope': 'offline_access', + }, note='Logging in', errnote='Failed to log in') except ExtractorError as error: - if isinstance(error.cause, HTTPError) and error.cause.status == 403: - raise ExtractorError( - 'Request blocked by Cloudflare; navigate to Crunchyroll in your browser, ' - 'then pass the fresh cookies (with --cookies-from-browser or --cookies) ' - 'and your browser\'s User-Agent (with --user-agent)', expected=True) + if isinstance(error.cause, HTTPError) and error.cause.status == 401: + raise ExtractorError('Invalid username and/or password', expected=True) raise - CrunchyrollBaseIE._IS_PREMIUM = 'cr_premium' in traverse_obj(auth_response, ('access_token', {jwt_decode_hs256}, 'benefits', ...)) - CrunchyrollBaseIE._AUTH_HEADERS = {'Authorization': auth_response['token_type'] + ' ' + auth_response['access_token']} - CrunchyrollBaseIE._AUTH_REFRESH = time_seconds(seconds=traverse_obj(auth_response, ('expires_in', {float_or_none}), default=300) - 10) + CrunchyrollBaseIE._REFRESH_TOKEN = login_response['refresh_token'] + self.cache.store(self._NETRC_MACHINE, username, CrunchyrollBaseIE._REFRESH_TOKEN) + self._set_auth_info(login_response) + + def _update_auth(self): + if CrunchyrollBaseIE._AUTH_HEADERS and CrunchyrollBaseIE._AUTH_EXPIRY > time_seconds(): + return + + auth_headers = {'Authorization': self._BASIC_AUTH} + if CrunchyrollBaseIE._REFRESH_TOKEN: + data = { + 'refresh_token': CrunchyrollBaseIE._REFRESH_TOKEN, + 'grant_type': 'refresh_token', + 'scope': 'offline_access', + } + else: + data = {'grant_type': 'client_id'} + auth_headers['ETP-Anonymous-ID'] = uuid.uuid4() + try: + auth_response = self._request_token(auth_headers, data) + except ExtractorError as error: + username, password = self._get_login_info() + if not username or not isinstance(error.cause, HTTPError) or error.cause.status != 400: + raise + self.to_screen('Refresh token has expired. Re-logging in') + CrunchyrollBaseIE._REFRESH_TOKEN = None + self.cache.store(self._NETRC_MACHINE, username, None) + self._perform_login(username, password) + return + + self._set_auth_info(auth_response) def _locale_from_language(self, language): config_locale = self._configuration_arg('metadata', ie_key=CrunchyrollBetaIE, casesense=True) @@ -168,7 +177,8 @@ class CrunchyrollBaseIE(InfoExtractor): self._update_auth() stream_response = self._download_json( f'https://cr-play-service.prd.crunchyrollsvc.com/v1/{identifier}/console/switch/play', - display_id, note='Downloading stream info', headers=CrunchyrollBaseIE._AUTH_HEADERS) + display_id, note='Downloading stream info', errnote='Failed to download stream info', + headers=CrunchyrollBaseIE._AUTH_HEADERS) available_formats = {'': ('', '', stream_response['url'])} for hardsub_lang, stream in traverse_obj(stream_response, ('hardSubs', {dict.items}, lambda _, v: v[1]['url'])): @@ -383,9 +393,9 @@ class CrunchyrollBetaIE(CrunchyrollCmsBaseIE): if not self._IS_PREMIUM and traverse_obj(response, (f'{object_type}_metadata', 'is_premium_only')): message = f'This {object_type} is for premium members only' - if self.is_logged_in: + if CrunchyrollBaseIE._REFRESH_TOKEN: raise ExtractorError(message, expected=True) - self.raise_login_required(message) + self.raise_login_required(message, method='password') result['formats'], result['subtitles'] = self._extract_stream(internal_id) @@ -575,9 +585,9 @@ class CrunchyrollMusicIE(CrunchyrollBaseIE): if not self._IS_PREMIUM and response.get('isPremiumOnly'): message = f'This {response.get("type") or "media"} is for premium members only' - if self.is_logged_in: + if CrunchyrollBaseIE._REFRESH_TOKEN: raise ExtractorError(message, expected=True) - self.raise_login_required(message) + self.raise_login_required(message, method='password') result = self._transform_music_response(response) result['formats'], _ = self._extract_stream(f'music/{internal_id}', internal_id)