From 443688d1bb5c22f09f9832172b7fe14a8ebc078a Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Wed, 13 Aug 2025 20:43:55 +0200 Subject: [PATCH] Update On Wed Aug 13 20:43:54 CEST 2025 --- .github/update.log | 1 + .../.github/workflows/build-debug.yaml | 2 +- .../.github/workflows/build-pre-release.yaml | 2 +- .../.github/workflows/build-release.yaml | 2 +- .../workflows/update-dependencies.yaml | 2 +- clash-meta/.github/workflows/build.yml | 35 +- clash-meta/.github/workflows/test.yml | 19 + clash-meta/docs/config.yaml | 4 +- clash-meta/go.mod | 2 +- clash-meta/go.sum | 4 +- clash-meta/listener/anytls/server.go | 4 +- clash-meta/listener/inbound/vless_test.go | 6 +- clash-meta/transport/anytls/client.go | 4 +- .../transport/anytls/padding/padding.go | 4 +- clash-meta/transport/anytls/session/client.go | 6 +- .../transport/anytls/session/session.go | 8 +- .../transport/vless/encryption/client.go | 106 ++- .../transport/vless/encryption/common.go | 59 +- clash-meta/transport/vless/encryption/doc.go | 4 + .../transport/vless/encryption/factory.go | 4 +- .../transport/vless/encryption/server.go | 137 +-- clash-meta/transport/vless/encryption/xor.go | 43 +- clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/package.json | 20 +- clash-nyanpasu/pnpm-lock.yaml | 547 ++++++------ lede/package/boot/uboot-rockchip/Makefile | 1 + .../armv8/base-files/etc/board.d/02_network | 2 + .../boot/dts/rockchip/rk3568-xiguapi-v3.dts | 800 ++++++++++++++++++ lede/target/linux/rockchip/image/armv8.mk | 30 +- mihomo/.github/workflows/build.yml | 35 +- mihomo/.github/workflows/test.yml | 19 + mihomo/docs/config.yaml | 4 +- mihomo/go.mod | 2 +- mihomo/go.sum | 4 +- mihomo/listener/anytls/server.go | 4 +- mihomo/listener/inbound/vless_test.go | 6 +- mihomo/transport/anytls/client.go | 4 +- mihomo/transport/anytls/padding/padding.go | 4 +- mihomo/transport/anytls/session/client.go | 6 +- mihomo/transport/anytls/session/session.go | 8 +- mihomo/transport/vless/encryption/client.go | 106 ++- mihomo/transport/vless/encryption/common.go | 59 +- mihomo/transport/vless/encryption/doc.go | 4 + mihomo/transport/vless/encryption/factory.go | 4 +- mihomo/transport/vless/encryption/server.go | 137 +-- mihomo/transport/vless/encryption/xor.go | 43 +- sing-box/common/tls/client.go | 1 - sing-box/experimental/libbox/config.go | 5 +- sing-box/experimental/libbox/service.go | 2 - sing-box/protocol/tun/inbound.go | 3 + sing-box/service/ssmapi/api.go | 3 +- v2rayn/.github/workflows/build-linux.yml | 2 +- v2rayn/.github/workflows/build-osx.yml | 2 +- .../workflows/build-windows-desktop.yml | 2 +- v2rayn/.github/workflows/build-windows.yml | 2 +- v2rayn/v2rayN/Directory.Packages.props | 2 +- .../CoreConfig/CoreConfigSingboxService.cs | 14 +- .../ViewModels/DNSSettingViewModel.cs | 2 +- v2rayng/.github/workflows/build.yml | 2 +- v2rayng/V2rayNG/app/build.gradle.kts | 4 +- .../src/main/java/com/v2ray/ang/AppConfig.kt | 2 + .../java/com/v2ray/ang/dto/V2rayConfig.kt | 1 + .../v2ray/ang/handler/V2rayConfigManager.kt | 40 +- .../java/com/v2ray/ang/ui/MainActivity.kt | 3 + .../v2ray/ang/viewmodel/SettingsViewModel.kt | 1 + .../app/src/main/res/values-ar/strings.xml | 1 + .../app/src/main/res/values-bn/strings.xml | 1 + .../src/main/res/values-bqi-rIR/strings.xml | 1 + .../app/src/main/res/values-fa/strings.xml | 1 + .../app/src/main/res/values-ru/strings.xml | 5 +- .../app/src/main/res/values-vi/strings.xml | 1 + .../src/main/res/values-zh-rCN/strings.xml | 1 + .../src/main/res/values-zh-rTW/strings.xml | 1 + .../app/src/main/res/values/strings.xml | 3 + yt-dlp/.github/workflows/build.yml | 4 +- yt-dlp/test/test_youtube_signature.py | 18 + yt-dlp/yt_dlp/extractor/youtube/_video.py | 2 + 77 files changed, 1800 insertions(+), 643 deletions(-) create mode 100644 lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-xiguapi-v3.dts diff --git a/.github/update.log b/.github/update.log index 9fc4ae0bb6..3cee21c6be 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1088,3 +1088,4 @@ Update On Sat Aug 9 20:40:00 CEST 2025 Update On Sun Aug 10 20:40:02 CEST 2025 Update On Mon Aug 11 20:43:53 CEST 2025 Update On Tue Aug 12 20:40:42 CEST 2025 +Update On Wed Aug 13 20:43:46 CEST 2025 diff --git a/clash-meta-android/.github/workflows/build-debug.yaml b/clash-meta-android/.github/workflows/build-debug.yaml index e2cf8dde3c..ea6009be3b 100644 --- a/clash-meta-android/.github/workflows/build-debug.yaml +++ b/clash-meta-android/.github/workflows/build-debug.yaml @@ -29,7 +29,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.24" + go-version: "1.25" - uses: actions/cache@v4 with: diff --git a/clash-meta-android/.github/workflows/build-pre-release.yaml b/clash-meta-android/.github/workflows/build-pre-release.yaml index 70aadbbea6..9ad6243bac 100644 --- a/clash-meta-android/.github/workflows/build-pre-release.yaml +++ b/clash-meta-android/.github/workflows/build-pre-release.yaml @@ -27,7 +27,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.24" + go-version: "1.25" - uses: actions/cache@v4 with: diff --git a/clash-meta-android/.github/workflows/build-release.yaml b/clash-meta-android/.github/workflows/build-release.yaml index 9718c9a5ff..f292cf7618 100644 --- a/clash-meta-android/.github/workflows/build-release.yaml +++ b/clash-meta-android/.github/workflows/build-release.yaml @@ -31,7 +31,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.24" + go-version: "1.25" - uses: actions/cache@v4 with: diff --git a/clash-meta-android/.github/workflows/update-dependencies.yaml b/clash-meta-android/.github/workflows/update-dependencies.yaml index f3f35057e2..f017918853 100644 --- a/clash-meta-android/.github/workflows/update-dependencies.yaml +++ b/clash-meta-android/.github/workflows/update-dependencies.yaml @@ -24,7 +24,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.24" + go-version: "1.25" - uses: actions/cache@v4 with: diff --git a/clash-meta/.github/workflows/build.yml b/clash-meta/.github/workflows/build.yml index 9ddf316014..64cf15bd37 100644 --- a/clash-meta/.github/workflows/build.yml +++ b/clash-meta/.github/workflows/build.yml @@ -80,6 +80,13 @@ jobs: - { goos: android, goarch: arm, ndk: armv7a-linux-androideabi34, output: armv7 } - { goos: android, goarch: arm64, ndk: aarch64-linux-android34, output: arm64-v8 } + # Go 1.24 with special patch can work on Windows 7 + # https://github.com/MetaCubeX/go/commits/release-branch.go1.24/ + - { goos: windows, goarch: '386', output: '386-go124', goversion: '1.24' } + - { goos: windows, goarch: amd64, goamd64: v1, output: amd64-v1-go124, goversion: '1.24' } + - { goos: windows, goarch: amd64, goamd64: v2, output: amd64-v2-go124, goversion: '1.24' } + - { goos: windows, goarch: amd64, goamd64: v3, output: amd64-v3-go124, goversion: '1.24' } + # Go 1.23 with special patch can work on Windows 7 # https://github.com/MetaCubeX/go/commits/release-branch.go1.23/ - { goos: windows, goarch: '386', output: '386-go123', goversion: '1.23' } @@ -108,6 +115,12 @@ jobs: - { goos: windows, goarch: amd64, goamd64: v2, output: amd64-v2-go120, goversion: '1.20' } - { goos: windows, goarch: amd64, goamd64: v3, output: amd64-v3-go120, goversion: '1.20' } + # Go 1.24 is the last release that will run on macOS 11 Big Sur. Go 1.25 will require macOS 12 Monterey or later. + - { goos: darwin, goarch: arm64, output: arm64-go124, goversion: '1.24' } + - { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-v1-go124, goversion: '1.24' } + - { goos: darwin, goarch: amd64, goamd64: v2, output: amd64-v2-go124, goversion: '1.24' } + - { goos: darwin, goarch: amd64, goamd64: v3, output: amd64-v3-go124, goversion: '1.24' } + # Go 1.22 is the last release that will run on macOS 10.15 Catalina. Go 1.23 will require macOS 11 Big Sur or later. - { goos: darwin, goarch: arm64, output: arm64-go122, goversion: '1.22' } - { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-v1-go122, goversion: '1.22' } @@ -139,7 +152,7 @@ jobs: if: ${{ matrix.jobs.goversion == '' && matrix.jobs.abi != '1' }} uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version: '1.25' - name: Set up Go if: ${{ matrix.jobs.goversion != '' && matrix.jobs.abi != '1' }} @@ -154,6 +167,24 @@ jobs: sudo tar zxf go1.24.0.linux-amd64-abi1.tar.gz -C /usr/local echo "/usr/local/go/bin" >> $GITHUB_PATH + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 + # this patch file only works on golang1.25.x + # that means after golang1.26 release it must be changed + # see: https://github.com/MetaCubeX/go/commits/release-branch.go1.25/ + # revert: + # 693def151adff1af707d82d28f55dba81ceb08e1: "crypto/rand,runtime: switch RtlGenRandom for ProcessPrng" + # 7c1157f9544922e96945196b47b95664b1e39108: "net: remove sysSocket fallback for Windows 7" + # 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround" + # a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries" + - name: Revert Golang1.25 commit for Windows7/8 + if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '' }} + run: | + cd $(go env GOROOT) + curl https://github.com/MetaCubeX/go/commit/8cb5472d94c34b88733a81091bd328e70ee565a4.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/6788c4c6f9fafb56729bad6b660f7ee2272d699f.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/a5b2168bb836ed9d6601c626f95e56c07923f906.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/f56f1e23507e646c85243a71bde7b9629b2f970c.diff | patch --verbose -p 1 + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 # this patch file only works on golang1.24.x # that means after golang1.25 release it must be changed @@ -164,7 +195,7 @@ jobs: # 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround" # a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries" - name: Revert Golang1.24 commit for Windows7/8 - if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '' }} + if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '1.24' }} run: | cd $(go env GOROOT) curl https://github.com/MetaCubeX/go/commit/2a406dc9f1ea7323d6ca9fccb2fe9ddebb6b1cc8.diff | patch --verbose -p 1 diff --git a/clash-meta/.github/workflows/test.yml b/clash-meta/.github/workflows/test.yml index db7ac0373e..28af5e76d3 100644 --- a/clash-meta/.github/workflows/test.yml +++ b/clash-meta/.github/workflows/test.yml @@ -24,6 +24,7 @@ jobs: - 'ubuntu-24.04-arm' # arm64 linux - 'macos-13' # amd64 macos go-version: + - '1.25' - '1.24' - '1.23' - '1.22' @@ -47,6 +48,24 @@ jobs: with: go-version: ${{ matrix.go-version }} + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 + # this patch file only works on golang1.25.x + # that means after golang1.26 release it must be changed + # see: https://github.com/MetaCubeX/go/commits/release-branch.go1.25/ + # revert: + # 693def151adff1af707d82d28f55dba81ceb08e1: "crypto/rand,runtime: switch RtlGenRandom for ProcessPrng" + # 7c1157f9544922e96945196b47b95664b1e39108: "net: remove sysSocket fallback for Windows 7" + # 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround" + # a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries" + - name: Revert Golang1.25 commit for Windows7/8 + if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '1.25' }} + run: | + cd $(go env GOROOT) + curl https://github.com/MetaCubeX/go/commit/8cb5472d94c34b88733a81091bd328e70ee565a4.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/6788c4c6f9fafb56729bad6b660f7ee2272d699f.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/a5b2168bb836ed9d6601c626f95e56c07923f906.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/f56f1e23507e646c85243a71bde7b9629b2f970c.diff | patch --verbose -p 1 + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 # this patch file only works on golang1.24.x # that means after golang1.25 release it must be changed diff --git a/clash-meta/docs/config.yaml b/clash-meta/docs/config.yaml index 245b38e8b0..e4c5e7534a 100644 --- a/clash-meta/docs/config.yaml +++ b/clash-meta/docs/config.yaml @@ -639,7 +639,7 @@ proxies: # socks5 uuid: uuid network: tcp encryption: "8min-vless-mlkem768client-bas64RawURLEncoding" # 复用八分钟后协商新的 sharedKey,需小于服务端的值 - # encryption: "8min-aes128xor-mlkem768client-bas64RawURLEncoding" + # encryption: "8min-xored-mlkem768client-bas64RawURLEncoding" tls: false #可以不开启tls udp: true @@ -1348,7 +1348,7 @@ listeners: # ws-path: "/" # 如果不为空则开启 websocket 传输层 # grpc-service-name: "GunService" # 如果不为空则开启 grpc 传输层 # decryption: "10min-vless-mlkem768seed-bas64RawURLEncoding" # 同时允许 1-RTT 模式与十分钟复用的 0-RTT 模式, 后面base64字符串可由可由 mihomo generate vless-mlkem768 命令生成 - # decryption: "10min-aes128xor-mlkem768seed-bas64RawURLEncoding" + # decryption: "10min-xored-mlkem768seed-bas64RawURLEncoding" # 下面两项如果填写则开启 tls(需要同时填写) # certificate: ./server.crt # private-key: ./server.key diff --git a/clash-meta/go.mod b/clash-meta/go.mod index 4ba0c3ebbe..c218528072 100644 --- a/clash-meta/go.mod +++ b/clash-meta/go.mod @@ -25,7 +25,7 @@ require ( github.com/metacubex/quic-go v0.54.1-0.20250730114134-a1ae705fe295 github.com/metacubex/randv2 v0.2.0 github.com/metacubex/sing v0.5.4 - github.com/metacubex/sing-mux v0.3.2 + github.com/metacubex/sing-mux v0.3.3-0.20250813083925-d7c9aeaeeaac github.com/metacubex/sing-quic v0.0.0-20250718154553-1b193bec4cbb github.com/metacubex/sing-shadowsocks v0.2.11 github.com/metacubex/sing-shadowsocks2 v0.2.5 diff --git a/clash-meta/go.sum b/clash-meta/go.sum index 92d52230d4..4acd1b8706 100644 --- a/clash-meta/go.sum +++ b/clash-meta/go.sum @@ -119,8 +119,8 @@ github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFq github.com/metacubex/sing v0.5.2/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w= github.com/metacubex/sing v0.5.4 h1:a4kAOZmF+OXosbzPEcrSc5QD35/ex+MNuZsrcuWskHk= github.com/metacubex/sing v0.5.4/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w= -github.com/metacubex/sing-mux v0.3.2 h1:nJv52pyRivHcaZJKk2JgxpaVvj1GAXG81scSa9N7ncw= -github.com/metacubex/sing-mux v0.3.2/go.mod h1:3rt1soewn0O6j89GCLmwAQFsq257u0jf2zQSPhTL3Bw= +github.com/metacubex/sing-mux v0.3.3-0.20250813083925-d7c9aeaeeaac h1:wDH/Jh/yqWbzPktqJP+Y1cUG8hchcrzKzUxJiSpnaQs= +github.com/metacubex/sing-mux v0.3.3-0.20250813083925-d7c9aeaeeaac/go.mod h1:3rt1soewn0O6j89GCLmwAQFsq257u0jf2zQSPhTL3Bw= github.com/metacubex/sing-quic v0.0.0-20250718154553-1b193bec4cbb h1:U/m3h8lp/j7i8zFgfvScLdZa1/Y8dd74oO7iZaQq80s= github.com/metacubex/sing-quic v0.0.0-20250718154553-1b193bec4cbb/go.mod h1:B60FxaPHjR1SeQB0IiLrgwgvKsaoASfOWdiqhLjmMGA= github.com/metacubex/sing-shadowsocks v0.2.11 h1:p2NGNOdF95e6XvdDKipLj1FRRqR8dnbfC/7pw2CCTlw= diff --git a/clash-meta/listener/anytls/server.go b/clash-meta/listener/anytls/server.go index ae6af171e2..ccbc47a2c0 100644 --- a/clash-meta/listener/anytls/server.go +++ b/clash-meta/listener/anytls/server.go @@ -7,9 +7,9 @@ import ( "errors" "net" "strings" + "sync/atomic" "github.com/metacubex/mihomo/adapter/inbound" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/buf" "github.com/metacubex/mihomo/component/ca" "github.com/metacubex/mihomo/component/ech" @@ -31,7 +31,7 @@ type Listener struct { listeners []net.Listener tlsConfig *tlsC.Config userMap map[[32]byte]string - padding atomic.TypedValue[*padding.PaddingFactory] + padding atomic.Pointer[padding.PaddingFactory] } func New(config LC.AnyTLSServer, tunnel C.Tunnel, additions ...inbound.Addition) (sl *Listener, err error) { diff --git a/clash-meta/listener/inbound/vless_test.go b/clash-meta/listener/inbound/vless_test.go index 2ef1212669..e344aa2e88 100644 --- a/clash-meta/listener/inbound/vless_test.go +++ b/clash-meta/listener/inbound/vless_test.go @@ -103,12 +103,12 @@ func TestInboundVless_Encryption(t *testing.T) { } testInboundVless(t, inboundOptions, outboundOptions) }) - t.Run("-aes128xor-", func(t *testing.T) { + t.Run("-xored-", func(t *testing.T) { inboundOptions := inbound.VlessOption{ - Decryption: "10min-aes128xor-mlkem768seed-" + seedBase64, + Decryption: "10min-xored-mlkem768seed-" + seedBase64, } outboundOptions := outbound.VlessOption{ - Encryption: "8min-aes128xor-mlkem768client-" + clientBase64, + Encryption: "8min-xored-mlkem768client-" + clientBase64, } testInboundVless(t, inboundOptions, outboundOptions) }) diff --git a/clash-meta/transport/anytls/client.go b/clash-meta/transport/anytls/client.go index 44633ae345..4e74c9272c 100644 --- a/clash-meta/transport/anytls/client.go +++ b/clash-meta/transport/anytls/client.go @@ -5,9 +5,9 @@ import ( "crypto/sha256" "encoding/binary" "net" + "sync/atomic" "time" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/buf" "github.com/metacubex/mihomo/transport/anytls/padding" "github.com/metacubex/mihomo/transport/anytls/session" @@ -33,7 +33,7 @@ type Client struct { dialer N.Dialer server M.Socksaddr sessionClient *session.Client - padding atomic.TypedValue[*padding.PaddingFactory] + padding atomic.Pointer[padding.PaddingFactory] } func NewClient(ctx context.Context, config ClientConfig) *Client { diff --git a/clash-meta/transport/anytls/padding/padding.go b/clash-meta/transport/anytls/padding/padding.go index 498feb05c0..76b3c0ef91 100644 --- a/clash-meta/transport/anytls/padding/padding.go +++ b/clash-meta/transport/anytls/padding/padding.go @@ -7,8 +7,8 @@ import ( "math/big" "strconv" "strings" + "sync/atomic" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/transport/anytls/util" ) @@ -31,7 +31,7 @@ type PaddingFactory struct { Md5 string } -func UpdatePaddingScheme(rawScheme []byte, to *atomic.TypedValue[*PaddingFactory]) bool { +func UpdatePaddingScheme(rawScheme []byte, to *atomic.Pointer[PaddingFactory]) bool { if p := NewPaddingFactory(rawScheme); p != nil { to.Store(p) return true diff --git a/clash-meta/transport/anytls/session/client.go b/clash-meta/transport/anytls/session/client.go index 50fd7b42ef..0698bd5006 100644 --- a/clash-meta/transport/anytls/session/client.go +++ b/clash-meta/transport/anytls/session/client.go @@ -7,9 +7,9 @@ import ( "math" "net" "sync" + "sync/atomic" "time" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/transport/anytls/padding" "github.com/metacubex/mihomo/transport/anytls/skiplist" "github.com/metacubex/mihomo/transport/anytls/util" @@ -29,13 +29,13 @@ type Client struct { sessions map[uint64]*Session sessionsLock sync.Mutex - padding *atomic.TypedValue[*padding.PaddingFactory] + padding *atomic.Pointer[padding.PaddingFactory] idleSessionTimeout time.Duration minIdleSession int } -func NewClient(ctx context.Context, dialOut util.DialOutFunc, _padding *atomic.TypedValue[*padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration, minIdleSession int) *Client { +func NewClient(ctx context.Context, dialOut util.DialOutFunc, _padding *atomic.Pointer[padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration, minIdleSession int) *Client { c := &Client{ sessions: make(map[uint64]*Session), dialOut: dialOut, diff --git a/clash-meta/transport/anytls/session/session.go b/clash-meta/transport/anytls/session/session.go index c80639ce3b..23c3a087dc 100644 --- a/clash-meta/transport/anytls/session/session.go +++ b/clash-meta/transport/anytls/session/session.go @@ -9,9 +9,9 @@ import ( "runtime/debug" "strconv" "sync" + "sync/atomic" "time" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/buf" "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/constant" @@ -38,7 +38,7 @@ type Session struct { // pool seq uint64 idleSince time.Time - padding *atomic.TypedValue[*padding.PaddingFactory] + padding *atomic.Pointer[padding.PaddingFactory] peerVersion byte @@ -53,7 +53,7 @@ type Session struct { onNewStream func(stream *Stream) } -func NewClientSession(conn net.Conn, _padding *atomic.TypedValue[*padding.PaddingFactory]) *Session { +func NewClientSession(conn net.Conn, _padding *atomic.Pointer[padding.PaddingFactory]) *Session { s := &Session{ conn: conn, isClient: true, @@ -65,7 +65,7 @@ func NewClientSession(conn net.Conn, _padding *atomic.TypedValue[*padding.Paddin return s } -func NewServerSession(conn net.Conn, onNewStream func(stream *Stream), _padding *atomic.TypedValue[*padding.PaddingFactory]) *Session { +func NewServerSession(conn net.Conn, onNewStream func(stream *Stream), _padding *atomic.Pointer[padding.PaddingFactory]) *Session { s := &Session{ conn: conn, onNewStream: onNewStream, diff --git a/clash-meta/transport/vless/encryption/client.go b/clash-meta/transport/vless/encryption/client.go index 726e98d87c..3bef4d94eb 100644 --- a/clash-meta/transport/vless/encryption/client.go +++ b/clash-meta/transport/vless/encryption/client.go @@ -5,6 +5,7 @@ import ( "crypto/cipher" "crypto/rand" "errors" + "fmt" "io" "net" "runtime" @@ -95,24 +96,36 @@ func (i *ClientInstance) Handshake(conn net.Conn) (net.Conn, error) { nfsKey, encapsulatedNfsKey := i.nfsEKey.Encapsulate() paddingLen := randBetween(100, 1000) - clientHello := make([]byte, 1+1184+1088+5+paddingLen) - clientHello[0] = ClientCipher - copy(clientHello[1:], pfsEKeyBytes) - copy(clientHello[1185:], encapsulatedNfsKey) - EncodeHeader(clientHello[2273:], int(paddingLen)) - rand.Read(clientHello[2278:]) + clientHello := make([]byte, 5+1+1184+1088+5+paddingLen) + EncodeHeader(clientHello, 1, 1+1184+1088) + clientHello[5] = ClientCipher + copy(clientHello[5+1:], pfsEKeyBytes) + copy(clientHello[5+1+1184:], encapsulatedNfsKey) + EncodeHeader(clientHello[5+1+1184+1088:], 23, int(paddingLen)) + rand.Read(clientHello[5+1+1184+1088+5:]) if _, err := c.Conn.Write(clientHello); err != nil { return nil, err } - // we can send more padding if needed + // client can send more padding / NFS AEAD messages if needed - peerServerHello := make([]byte, 1088+21) - if _, err := io.ReadFull(c.Conn, peerServerHello); err != nil { + _, t, l, err := ReadAndDecodeHeader(c.Conn) + if err != nil { return nil, err } - encapsulatedPfsKey := peerServerHello[:1088] - c.ticket = peerServerHello[1088:] + if t != 1 { + return nil, fmt.Errorf("unexpected type %v, expect random hello", t) + } + + peerRandomHello := make([]byte, 1088+21) + if l != len(peerRandomHello) { + return nil, fmt.Errorf("unexpected length %v for random hello", l) + } + if _, err := io.ReadFull(c.Conn, peerRandomHello); err != nil { + return nil, err + } + encapsulatedPfsKey := peerRandomHello[:1088] + c.ticket = peerRandomHello[1088:] pfsKey, err := pfsDKey.Decapsulate(encapsulatedPfsKey) if err != nil { @@ -122,7 +135,7 @@ func (i *ClientInstance) Handshake(conn net.Conn) (net.Conn, error) { nonce := [12]byte{ClientCipher} VLESS, _ := NewAead(ClientCipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Open(nil, nonce[:], c.ticket, pfsEKeyBytes) - if !bytes.Equal(VLESS, []byte("VLESS")) { // TODO: more messages + if !bytes.Equal(VLESS, []byte("VLESS")) { return nil, errors.New("invalid server") } @@ -153,14 +166,15 @@ func (c *ClientConn) Write(b []byte) (int, error) { rand.Read(c.random) c.aead = NewAead(ClientCipher, c.baseKey, c.random, c.ticket) c.nonce = make([]byte, 12) - data = make([]byte, 21+32+5+len(b)+16) - copy(data, c.ticket) - copy(data[21:], c.random) - EncodeHeader(data[53:], len(b)+16) - c.aead.Seal(data[:58], c.nonce, b, data[53:58]) + data = make([]byte, 5+21+32+5+len(b)+16) + EncodeHeader(data, 0, 21+32) + copy(data[5:], c.ticket) + copy(data[5+21:], c.random) + EncodeHeader(data[5+21+32:], 23, len(b)+16) + c.aead.Seal(data[:5+21+32+5], c.nonce, b, data[5+21+32:5+21+32+5]) } else { data = make([]byte, 5+len(b)+16) - EncodeHeader(data, len(b)+16) + EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { c.aead = NewAead(ClientCipher, c.baseKey, data[5:], data[:5]) @@ -178,29 +192,44 @@ func (c *ClientConn) Read(b []byte) (int, error) { if len(b) == 0 { return 0, nil } - peerHeader := make([]byte, 5) if c.peerAead == nil { - if c.instance == nil { + var t byte + var l int + var err error + if c.instance == nil { // from 1-RTT for { - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { + if _, t, l, err = ReadAndDecodeHeader(c.Conn); err != nil { return 0, err } - peerPaddingLen, _ := DecodeHeader(peerHeader) - if peerPaddingLen == 0 { + if t != 23 { break } - if _, err := io.ReadFull(c.Conn, make([]byte, peerPaddingLen)); err != nil { + if _, err := io.ReadFull(c.Conn, make([]byte, l)); err != nil { return 0, err } } } else { - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { + h := make([]byte, 5) + if _, err := io.ReadFull(c.Conn, h); err != nil { return 0, err } + if t, l, err = DecodeHeader(h); err != nil { + c.instance.Lock() + if bytes.Equal(c.ticket, c.instance.ticket) { + c.instance.expire = time.Now() // expired + } + c.instance.Unlock() + return 0, errors.New("new handshake needed") + } + } + if t != 0 { + return 0, fmt.Errorf("unexpected type %v, expect server random", t) } peerRandom := make([]byte, 32) - copy(peerRandom, peerHeader) - if _, err := io.ReadFull(c.Conn, peerRandom[5:]); err != nil { + if l != len(peerRandom) { + return 0, fmt.Errorf("unexpected length %v for server random", l) + } + if _, err := io.ReadFull(c.Conn, peerRandom); err != nil { return 0, err } if c.random == nil { @@ -214,33 +243,26 @@ func (c *ClientConn) Read(b []byte) (int, error) { c.peerCache = c.peerCache[n:] return n, nil } - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { - return 0, err - } - peerLength, err := DecodeHeader(peerHeader) // 17~17000 + h, t, l, err := ReadAndDecodeHeader(c.Conn) // l: 17~17000 if err != nil { - if c.instance != nil { - c.instance.Lock() - if bytes.Equal(c.ticket, c.instance.ticket) { - c.instance.expire = time.Now() // expired - } - c.instance.Unlock() - } return 0, err } - peerData := make([]byte, peerLength) + if t != 23 { + return 0, fmt.Errorf("unexpected type %v, expect encrypted data", t) + } + peerData := make([]byte, l) if _, err := io.ReadFull(c.Conn, peerData); err != nil { return 0, err } - dst := peerData[:peerLength-16] + dst := peerData[:l-16] if len(dst) <= len(b) { dst = b[:len(dst)] // avoids another copy() } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(ClientCipher, c.baseKey, peerData, peerHeader) + peerAead = NewAead(ClientCipher, c.baseKey, peerData, h) } - _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, peerHeader) + _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { c.peerAead = peerAead } diff --git a/clash-meta/transport/vless/encryption/common.go b/clash-meta/transport/vless/encryption/common.go index 32222f1851..cd4a93c5de 100644 --- a/clash-meta/transport/vless/encryption/common.go +++ b/clash-meta/transport/vless/encryption/common.go @@ -6,9 +6,10 @@ import ( "crypto/cipher" "crypto/rand" "crypto/sha256" - "errors" + "fmt" + "io" "math/big" - "strconv" + "net" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" @@ -16,23 +17,49 @@ import ( var MaxNonce = bytes.Repeat([]byte{255}, 12) -func EncodeHeader(b []byte, l int) { - b[0] = 23 - b[1] = 3 - b[2] = 3 - b[3] = byte(l >> 8) - b[4] = byte(l) +func EncodeHeader(h []byte, t byte, l int) { + switch t { + case 1: + h[0] = 1 + h[1] = 1 + h[2] = 1 + case 0: + h[0] = 0 + h[1] = 0 + h[2] = 0 + case 23: + h[0] = 23 + h[1] = 3 + h[2] = 3 + } + h[3] = byte(l >> 8) + h[4] = byte(l) } -func DecodeHeader(b []byte) (int, error) { - if b[0] == 23 && b[1] == 3 && b[2] == 3 { - l := int(b[3])<<8 | int(b[4]) - if l < 17 || l > 17000 { // TODO: TLSv1.3 max length - return 0, errors.New("invalid length in record's header: " + strconv.Itoa(l)) - } - return l, nil +func DecodeHeader(h []byte) (t byte, l int, err error) { + l = int(h[3])<<8 | int(h[4]) + if h[0] == 23 && h[1] == 3 && h[2] == 3 { + t = 23 + } else if h[0] == 0 && h[1] == 0 && h[2] == 0 { + t = 0 + } else if h[0] == 1 && h[1] == 1 && h[2] == 1 { + t = 1 + } else { + h = nil } - return 0, errors.New("invalid record's header") + if h == nil || l < 17 || l > 17000 { // TODO: TLSv1.3 max length + err = fmt.Errorf("invalid header: %v", h[:5]) + } + return +} + +func ReadAndDecodeHeader(conn net.Conn) (h []byte, t byte, l int, err error) { + h = make([]byte, 5) + if _, err = io.ReadFull(conn, h); err != nil { + return + } + t, l, err = DecodeHeader(h) + return } func NewAead(c byte, secret, salt, info []byte) (aead cipher.AEAD) { diff --git a/clash-meta/transport/vless/encryption/doc.go b/clash-meta/transport/vless/encryption/doc.go index d6aeb93efd..96976ed920 100644 --- a/clash-meta/transport/vless/encryption/doc.go +++ b/clash-meta/transport/vless/encryption/doc.go @@ -5,4 +5,8 @@ // https://github.com/XTLS/Xray-core/commit/ec1cc35188c1a5f38a2ff75e88b5d043ffdc59da // https://github.com/XTLS/Xray-core/commit/5c611420487a92f931faefc01d4bf03869f477f6 // https://github.com/XTLS/Xray-core/commit/23d7aad461d232bc5bed52dd6aaa731ecd88ad35 +// https://github.com/XTLS/Xray-core/commit/3c20bddfcfd8999be5f9a2ac180dc959950e4c61 +// https://github.com/XTLS/Xray-core/commit/1720be168fa069332c418503d30341fc6e01df7f +// https://github.com/XTLS/Xray-core/commit/0fd7691d6b28e05922d7a5a9313d97745a51ea63 +// https://github.com/XTLS/Xray-core/commit/09cc92c61d9067e0d65c1cae9124664ecfc78f43 package encryption diff --git a/clash-meta/transport/vless/encryption/factory.go b/clash-meta/transport/vless/encryption/factory.go index 18b88c2e3e..4988dbbfb9 100644 --- a/clash-meta/transport/vless/encryption/factory.go +++ b/clash-meta/transport/vless/encryption/factory.go @@ -31,7 +31,7 @@ func NewClient(encryption string) (*ClientInstance, error) { var xor uint32 switch s[1] { case "vless": - case "aes128xor": + case "xored": xor = 1 default: return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) @@ -76,7 +76,7 @@ func NewServer(decryption string) (*ServerInstance, error) { var xor uint32 switch s[1] { case "vless": - case "aes128xor": + case "xored": xor = 1 default: return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) diff --git a/clash-meta/transport/vless/encryption/server.go b/clash-meta/transport/vless/encryption/server.go index b42db3fdc5..2accabe7ca 100644 --- a/clash-meta/transport/vless/encryption/server.go +++ b/clash-meta/transport/vless/encryption/server.go @@ -5,6 +5,7 @@ import ( "crypto/cipher" "crypto/rand" "errors" + "fmt" "io" "net" "sync" @@ -55,12 +56,12 @@ func (i *ServerInstance) Init(nfsDKeySeed []byte, xor uint32, minutes time.Durat go func() { for { time.Sleep(time.Minute) - now := time.Now() i.Lock() if i.closed { i.Unlock() return } + now := time.Now() for ticket, session := range i.sessions { if now.After(session.expire) { delete(i.sessions, ticket) @@ -89,40 +90,49 @@ func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) { } c := &ServerConn{Conn: conn} - peerTicketHello := make([]byte, 21+32) - if _, err := io.ReadFull(c.Conn, peerTicketHello); err != nil { + _, t, l, err := ReadAndDecodeHeader(c.Conn) + if err != nil { return nil, err } - if i.minutes > 0 { + if t == 23 { + return nil, errors.New("unexpected data") + } + + if t == 0 { + if i.minutes == 0 { + return nil, errors.New("0-RTT is not allowed") + } + peerTicketHello := make([]byte, 21+32) + if l != len(peerTicketHello) { + return nil, fmt.Errorf("unexpected length %v for ticket hello", l) + } + if _, err := io.ReadFull(c.Conn, peerTicketHello); err != nil { + return nil, err + } i.RLock() s := i.sessions[[21]byte(peerTicketHello)] i.RUnlock() - if s != nil { - if _, replay := s.randoms.LoadOrStore([32]byte(peerTicketHello[21:]), true); !replay { - c.cipher = s.cipher - c.baseKey = s.baseKey - c.ticket = peerTicketHello[:21] - c.peerRandom = peerTicketHello[21:] - return c, nil - } + if s == nil { + noise := make([]byte, randBetween(100, 1000)) + rand.Read(noise) + c.Conn.Write(noise) // make client do new handshake + return nil, errors.New("expired ticket") } - } - - peerHeader := make([]byte, 5) - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { - return nil, err - } - if l, _ := DecodeHeader(peerHeader); l != 0 { - noise := make([]byte, randBetween(100, 1000)) - rand.Read(noise) - c.Conn.Write(noise) // make client do new handshake - return nil, errors.New("invalid ticket") + if _, replay := s.randoms.LoadOrStore([32]byte(peerTicketHello[21:]), true); replay { + return nil, errors.New("replay detected") + } + c.cipher = s.cipher + c.baseKey = s.baseKey + c.ticket = peerTicketHello[:21] + c.peerRandom = peerTicketHello[21:] + return c, nil } peerClientHello := make([]byte, 1+1184+1088) - copy(peerClientHello, peerTicketHello) - copy(peerClientHello[53:], peerHeader) - if _, err := io.ReadFull(c.Conn, peerClientHello[58:]); err != nil { + if l != len(peerClientHello) { + return nil, fmt.Errorf("unexpected length %v for client hello", l) + } + if _, err := io.ReadFull(c.Conn, peerClientHello); err != nil { return nil, err } c.cipher = peerClientHello[0] @@ -145,16 +155,17 @@ func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) { paddingLen := randBetween(100, 1000) - serverHello := make([]byte, 1088+21+5+paddingLen) - copy(serverHello, encapsulatedPfsKey) - copy(serverHello[1088:], c.ticket) - EncodeHeader(serverHello[1109:], int(paddingLen)) - rand.Read(serverHello[1114:]) + serverHello := make([]byte, 5+1088+21+5+paddingLen) + EncodeHeader(serverHello, 1, 1088+21) + copy(serverHello[5:], encapsulatedPfsKey) + copy(serverHello[5+1088:], c.ticket) + EncodeHeader(serverHello[5+1088+21:], 23, int(paddingLen)) + rand.Read(serverHello[5+1088+21+5:]) if _, err := c.Conn.Write(serverHello); err != nil { return nil, err } - // we can send more padding if needed + // server can send more padding / PFS AEAD messages if needed if i.minutes > 0 { i.Lock() @@ -173,33 +184,36 @@ func (c *ServerConn) Read(b []byte) (int, error) { if len(b) == 0 { return 0, nil } - peerHeader := make([]byte, 5) if c.peerAead == nil { - if c.peerRandom == nil { + if c.peerRandom == nil { // from 1-RTT + var t byte + var l int + var err error for { - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { + if _, t, l, err = ReadAndDecodeHeader(c.Conn); err != nil { return 0, err } - peerPaddingLen, _ := DecodeHeader(peerHeader) - if peerPaddingLen == 0 { + if t != 23 { break } - if _, err := io.ReadFull(c.Conn, make([]byte, peerPaddingLen)); err != nil { + if _, err := io.ReadFull(c.Conn, make([]byte, l)); err != nil { return 0, err } } - peerTicket := make([]byte, 21) - copy(peerTicket, peerHeader) - if _, err := io.ReadFull(c.Conn, peerTicket[5:]); err != nil { + if t != 0 { + return 0, fmt.Errorf("unexpected type %v, expect ticket hello", t) + } + peerTicketHello := make([]byte, 21+32) + if l != len(peerTicketHello) { + return 0, fmt.Errorf("unexpected length %v for ticket hello", l) + } + if _, err := io.ReadFull(c.Conn, peerTicketHello); err != nil { return 0, err } - if !bytes.Equal(peerTicket, c.ticket) { + if !bytes.Equal(peerTicketHello[:21], c.ticket) { return 0, errors.New("naughty boy") } - c.peerRandom = make([]byte, 32) - if _, err := io.ReadFull(c.Conn, c.peerRandom); err != nil { - return 0, err - } + c.peerRandom = peerTicketHello[21:] } c.peerAead = NewAead(c.cipher, c.baseKey, c.peerRandom, c.ticket) c.peerNonce = make([]byte, 12) @@ -209,32 +223,32 @@ func (c *ServerConn) Read(b []byte) (int, error) { c.peerCache = c.peerCache[n:] return n, nil } - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { - return 0, err - } - peerLength, err := DecodeHeader(peerHeader) // 17~17000 + h, t, l, err := ReadAndDecodeHeader(c.Conn) // l: 17~17000 if err != nil { return 0, err } - peerData := make([]byte, peerLength) + if t != 23 { + return 0, fmt.Errorf("unexpected type %v, expect encrypted data", t) + } + peerData := make([]byte, l) if _, err := io.ReadFull(c.Conn, peerData); err != nil { return 0, err } - dst := peerData[:peerLength-16] + dst := peerData[:l-16] if len(dst) <= len(b) { dst = b[:len(dst)] // avoids another copy() } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(c.cipher, c.baseKey, peerData, peerHeader) + peerAead = NewAead(c.cipher, c.baseKey, peerData, h) } - _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, peerHeader) + _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { c.peerAead = peerAead } IncreaseNonce(c.peerNonce) if err != nil { - return 0, errors.New("error") + return 0, err } if len(dst) > len(b) { c.peerCache = dst[copy(b, dst):] @@ -258,15 +272,16 @@ func (c *ServerConn) Write(b []byte) (int, error) { if c.peerRandom == nil { return 0, errors.New("empty c.peerRandom") } - data = make([]byte, 32+5+len(b)+16) - rand.Read(data[:32]) - c.aead = NewAead(c.cipher, c.baseKey, data[:32], c.peerRandom) + data = make([]byte, 5+32+5+len(b)+16) + EncodeHeader(data, 0, 32) + rand.Read(data[5 : 5+32]) + c.aead = NewAead(c.cipher, c.baseKey, data[5:5+32], c.peerRandom) c.nonce = make([]byte, 12) - EncodeHeader(data[32:], len(b)+16) - c.aead.Seal(data[:37], c.nonce, b, data[32:37]) + EncodeHeader(data[5+32:], 23, len(b)+16) + c.aead.Seal(data[:5+32+5], c.nonce, b, data[5+32:5+32+5]) } else { data = make([]byte, 5+len(b)+16) - EncodeHeader(data, len(b)+16) + EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { c.aead = NewAead(c.cipher, c.baseKey, data[5:], data[:5]) diff --git a/clash-meta/transport/vless/encryption/xor.go b/clash-meta/transport/vless/encryption/xor.go index 296fdd637a..696702bc69 100644 --- a/clash-meta/transport/vless/encryption/xor.go +++ b/clash-meta/transport/vless/encryption/xor.go @@ -10,16 +10,19 @@ import ( type XorConn struct { net.Conn - key []byte - ctr cipher.Stream - peerCtr cipher.Stream + key []byte + ctr cipher.Stream + peerCtr cipher.Stream + isHeader bool + skipNext bool } func NewXorConn(conn net.Conn, key []byte) *XorConn { return &XorConn{Conn: conn, key: key[:16]} + //chacha20.NewUnauthenticatedCipher() } -func (c *XorConn) Write(b []byte) (int, error) { +func (c *XorConn) Write(b []byte) (int, error) { // two records at most if len(b) == 0 { return 0, nil } @@ -30,7 +33,13 @@ func (c *XorConn) Write(b []byte) (int, error) { rand.Read(iv) c.ctr = cipher.NewCTR(block, iv) } - c.ctr.XORKeyStream(b, b) // caller MUST discard b + t, l, _ := DecodeHeader(b) + if t != 23 { + l += 10 // 5+l+5 + } else { + l = 5 + } + c.ctr.XORKeyStream(b[:l], b[:l]) // caller MUST discard b if iv != nil { b = append(iv, b...) } @@ -43,7 +52,7 @@ func (c *XorConn) Write(b []byte) (int, error) { return len(b), nil } -func (c *XorConn) Read(b []byte) (int, error) { +func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... if len(b) == 0 { return 0, nil } @@ -54,10 +63,24 @@ func (c *XorConn) Read(b []byte) (int, error) { } block, _ := aes.NewCipher(c.key) c.peerCtr = cipher.NewCTR(block, peerIv) + c.isHeader = true } - n, err := c.Conn.Read(b) - if n > 0 { - c.peerCtr.XORKeyStream(b[:n], b[:n]) + if _, err := io.ReadFull(c.Conn, b); err != nil { + return 0, err } - return n, err + if c.skipNext { + c.skipNext = false + return len(b), nil + } + c.peerCtr.XORKeyStream(b, b) + if c.isHeader { + if t, _, _ := DecodeHeader(b); t == 23 { // always 5-bytes + c.skipNext = true + } else { + c.isHeader = false + } + } else { + c.isHeader = true + } + return len(b), nil } diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 3762c29ecd..9a935369b3 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.19.12", - "mihomo_alpha": "alpha-eca5a27", + "mihomo_alpha": "alpha-0e9102d", "clash_rs": "v0.8.2", "clash_premium": "2023-09-05-gdcc8d87", "clash_rs_alpha": "0.8.2-alpha+sha.df9f591" @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-08-11T22:21:19.847Z" + "updated_at": "2025-08-12T22:21:09.244Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 387443bd33..8e9786c23c 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -60,33 +60,33 @@ "devDependencies": { "@commitlint/cli": "19.8.1", "@commitlint/config-conventional": "19.8.1", - "@eslint/compat": "1.3.1", + "@eslint/compat": "1.3.2", "@eslint/eslintrc": "3.3.1", - "@ianvs/prettier-plugin-sort-imports": "4.5.1", + "@ianvs/prettier-plugin-sort-imports": "4.6.2", "@tauri-apps/cli": "2.6.2", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", "@types/node": "22.17.1", - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", + "@typescript-eslint/eslint-plugin": "8.39.1", + "@typescript-eslint/parser": "8.39.1", "autoprefixer": "10.4.21", "conventional-changelog-conventionalcommits": "9.1.0", "cross-env": "10.0.0", "dedent": "1.6.0", - "eslint": "9.32.0", + "eslint": "9.33.0", "eslint-config-prettier": "10.1.8", "eslint-import-resolver-alias": "1.1.2", "eslint-plugin-html": "8.1.3", "eslint-plugin-import": "2.32.0", "eslint-plugin-n": "17.21.3", - "eslint-plugin-prettier": "5.5.3", + "eslint-plugin-prettier": "5.5.4", "eslint-plugin-promise": "7.2.1", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "5.2.0", "globals": "16.3.0", "knip": "5.62.0", - "lint-staged": "16.1.4", + "lint-staged": "16.1.5", "neostandard": "0.12.2", "npm-run-all2": "8.0.4", "postcss": "8.5.6", @@ -97,9 +97,9 @@ "prettier-plugin-tailwindcss": "0.6.14", "prettier-plugin-toml": "2.0.6", "react-devtools": "6.1.5", - "stylelint": "16.23.0", + "stylelint": "16.23.1", "stylelint-config-html": "1.1.0", - "stylelint-config-recess-order": "7.1.0", + "stylelint-config-recess-order": "7.2.0", "stylelint-config-standard": "39.0.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", "stylelint-order": "7.0.0", @@ -107,7 +107,7 @@ "tailwindcss": "4.1.11", "tsx": "4.20.3", "typescript": "5.9.2", - "typescript-eslint": "8.39.0" + "typescript-eslint": "8.39.1" }, "packageManager": "pnpm@10.14.0", "engines": { diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index ac663307b6..d1a5dbdc01 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -29,14 +29,14 @@ importers: specifier: 19.8.1 version: 19.8.1 '@eslint/compat': - specifier: 1.3.1 - version: 1.3.1(eslint@9.32.0(jiti@2.4.2)) + specifier: 1.3.2 + version: 1.3.2(eslint@9.33.0(jiti@2.4.2)) '@eslint/eslintrc': specifier: 3.3.1 version: 3.3.1 '@ianvs/prettier-plugin-sort-imports': - specifier: 4.5.1 - version: 4.5.1(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2) + specifier: 4.6.2 + version: 4.6.2(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2) '@tauri-apps/cli': specifier: 2.6.2 version: 2.6.2 @@ -50,11 +50,11 @@ importers: specifier: 22.17.1 version: 22.17.1 '@typescript-eslint/eslint-plugin': - specifier: 8.39.0 - version: 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + specifier: 8.39.1 + version: 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) '@typescript-eslint/parser': - specifier: 8.39.0 - version: 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + specifier: 8.39.1 + version: 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) @@ -68,38 +68,38 @@ importers: specifier: 1.6.0 version: 1.6.0(babel-plugin-macros@3.1.0) eslint: - specifier: 9.32.0 - version: 9.32.0(jiti@2.4.2) + specifier: 9.33.0 + version: 9.33.0(jiti@2.4.2) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.32.0(jiti@2.4.2)) + version: 10.1.8(eslint@9.33.0(jiti@2.4.2)) eslint-import-resolver-alias: specifier: 1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))) + version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))) eslint-plugin-html: specifier: 8.1.3 version: 8.1.3 eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)) + version: 2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-n: specifier: 17.21.3 - version: 17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + version: 17.21.3(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) eslint-plugin-prettier: - specifier: 5.5.3 - version: 5.5.3(eslint-config-prettier@10.1.8(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(prettier@3.6.2) + specifier: 5.5.4 + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.4.2)))(eslint@9.33.0(jiti@2.4.2))(prettier@3.6.2) eslint-plugin-promise: specifier: 7.2.1 - version: 7.2.1(eslint@9.32.0(jiti@2.4.2)) + version: 7.2.1(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.32.0(jiti@2.4.2)) + version: 7.37.5(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-react-compiler: specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)) + version: 19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: 5.2.0 - version: 5.2.0(eslint@9.32.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.33.0(jiti@2.4.2)) globals: specifier: 16.3.0 version: 16.3.0 @@ -107,11 +107,11 @@ importers: specifier: 5.62.0 version: 5.62.0(@types/node@22.17.1)(typescript@5.9.2) lint-staged: - specifier: 16.1.4 - version: 16.1.4 + specifier: 16.1.5 + version: 16.1.5 neostandard: specifier: 0.12.2 - version: 0.12.2(@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + version: 0.12.2(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) npm-run-all2: specifier: 8.0.4 version: 8.0.4 @@ -132,7 +132,7 @@ importers: version: 3.6.2 prettier-plugin-tailwindcss: specifier: 0.6.14 - version: 0.6.14(@ianvs/prettier-plugin-sort-imports@4.5.1(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2))(@prettier/plugin-oxc@0.0.4)(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.2))(prettier@3.6.2) + version: 0.6.14(@ianvs/prettier-plugin-sort-imports@4.6.2(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2))(@prettier/plugin-oxc@0.0.4)(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.2))(prettier@3.6.2) prettier-plugin-toml: specifier: 2.0.6 version: 2.0.6(prettier@3.6.2) @@ -140,26 +140,26 @@ importers: specifier: 6.1.5 version: 6.1.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) stylelint: - specifier: 16.23.0 - version: 16.23.0(typescript@5.9.2) + specifier: 16.23.1 + version: 16.23.1(typescript@5.9.2) stylelint-config-html: specifier: 1.1.0 - version: 1.1.0(postcss-html@1.8.0)(stylelint@16.23.0(typescript@5.9.2)) + version: 1.1.0(postcss-html@1.8.0)(stylelint@16.23.1(typescript@5.9.2)) stylelint-config-recess-order: - specifier: 7.1.0 - version: 7.1.0(stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.9.2)))(stylelint@16.23.0(typescript@5.9.2)) + specifier: 7.2.0 + version: 7.2.0(stylelint-order@7.0.0(stylelint@16.23.1(typescript@5.9.2)))(stylelint@16.23.1(typescript@5.9.2)) stylelint-config-standard: specifier: 39.0.0 - version: 39.0.0(stylelint@16.23.0(typescript@5.9.2)) + version: 39.0.0(stylelint@16.23.1(typescript@5.9.2)) stylelint-declaration-block-no-ignored-properties: specifier: 2.8.0 - version: 2.8.0(stylelint@16.23.0(typescript@5.9.2)) + version: 2.8.0(stylelint@16.23.1(typescript@5.9.2)) stylelint-order: specifier: 7.0.0 - version: 7.0.0(stylelint@16.23.0(typescript@5.9.2)) + version: 7.0.0(stylelint@16.23.1(typescript@5.9.2)) stylelint-scss: specifier: 6.12.1 - version: 6.12.1(stylelint@16.23.0(typescript@5.9.2)) + version: 6.12.1(stylelint@16.23.1(typescript@5.9.2)) tailwindcss: specifier: 4.1.11 version: 4.1.11 @@ -170,8 +170,8 @@ importers: specifier: 5.9.2 version: 5.9.2 typescript-eslint: - specifier: 8.39.0 - version: 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + specifier: 8.39.1 + version: 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) frontend/interface: dependencies: @@ -359,7 +359,7 @@ importers: version: 1.131.5(@tanstack/react-router@1.131.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.5)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3) '@tanstack/router-plugin': specifier: 1.131.5 - version: 1.131.5(@tanstack/react-router@1.131.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 1.131.5(@tanstack/react-router@1.131.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.3.0 version: 2.3.0 @@ -395,13 +395,13 @@ importers: version: 13.15.2 '@vitejs/plugin-legacy': specifier: 7.2.1 - version: 7.2.1(terser@5.36.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 7.2.1(terser@5.36.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) '@vitejs/plugin-react': specifier: 4.7.0 - version: 4.7.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.7.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) '@vitejs/plugin-react-swc': specifier: 3.11.0 - version: 3.11.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.11.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) change-case: specifier: 5.4.4 version: 5.4.4 @@ -440,19 +440,19 @@ importers: version: 13.15.15 vite: specifier: 7.1.1 - version: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) vite-plugin-html: specifier: 3.2.2 - version: 3.2.2(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 3.2.2(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) vite-plugin-sass-dts: specifier: 1.3.31 - version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.90.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.90.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) vite-plugin-svgr: specifier: 4.3.0 - version: 4.3.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.3.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) zod: specifier: 4.0.17 version: 4.0.17 @@ -488,7 +488,7 @@ importers: version: 19.1.10 '@vitejs/plugin-react': specifier: 4.7.0 - version: 4.7.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.7.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) ahooks: specifier: 3.9.0 version: 3.9.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -518,10 +518,10 @@ importers: version: 4.1.11 vite: specifier: 7.1.1 - version: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + version: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) devDependencies: '@emotion/react': specifier: 11.14.0 @@ -546,7 +546,7 @@ importers: version: 5.2.0(typescript@5.9.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@22.17.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)) + version: 4.5.4(@types/node@22.17.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)) scripts: dependencies: @@ -1665,8 +1665,8 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.3.1': - resolution: {integrity: sha512-k8MHony59I5EPic6EQTCNOuPoVBnoYXkP+20xvwFjN7t0qI3ImyvyBgg+hIVPwC8JaxVjjUZld+cLfBLFDLucg==} + '@eslint/compat@1.3.2': + resolution: {integrity: sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.40 || 9 @@ -1678,28 +1678,28 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.32.0': - resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} + '@eslint/js@9.33.0': + resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.1.1': @@ -1741,17 +1741,23 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} - '@ianvs/prettier-plugin-sort-imports@4.5.1': - resolution: {integrity: sha512-vOQwIyQHnHz0ikvHEQDzwUkNfX74o/7qNEpm9LiPtyBvCg/AU/DOkhwe1o92chPS1QzS6G7HeiO+OwIt8a358A==} + '@ianvs/prettier-plugin-sort-imports@4.6.2': + resolution: {integrity: sha512-kHiL1IghIodo43clNQaJJU2rPqXEioPG+Ink4/T5za46A0ggSNvIx4NM3hGgciQ2VpDaR/X8cTJIZDKRurWjPw==} peerDependencies: '@prettier/plugin-oxc': ^0.0.4 '@vue/compiler-sfc': 2.7.x || 3.x + content-tag: ^4.0.0 prettier: 2 || 3 || ^4.0.0-0 + prettier-plugin-ember-template-tag: ^2.1.0 peerDependenciesMeta: '@prettier/plugin-oxc': optional: true '@vue/compiler-sfc': optional: true + content-tag: + optional: true + prettier-plugin-ember-template-tag: + optional: true '@iconify/json@2.2.371': resolution: {integrity: sha512-dnamUrgw8aDWz4STJOkQqqCz6GB2s7SHGPIY84EVQmlVXzM7T1V7L/csdL7r9bkA3AHF80+OXhx7o4FXn5L8pQ==} @@ -3284,9 +3290,6 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -3390,16 +3393,16 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.39.0': - resolution: {integrity: sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==} + '@typescript-eslint/eslint-plugin@8.39.1': + resolution: {integrity: sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.39.0 + '@typescript-eslint/parser': ^8.39.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.39.0': - resolution: {integrity: sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==} + '@typescript-eslint/parser@8.39.1': + resolution: {integrity: sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3411,8 +3414,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.39.0': - resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} + '@typescript-eslint/project-service@8.39.1': + resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -3421,8 +3424,8 @@ packages: resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.39.0': - resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} + '@typescript-eslint/scope-manager@8.39.1': + resolution: {integrity: sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.38.0': @@ -3437,8 +3440,14 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.39.0': - resolution: {integrity: sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==} + '@typescript-eslint/tsconfig-utils@8.39.1': + resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.39.1': + resolution: {integrity: sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3456,14 +3465,18 @@ packages: resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.39.1': + resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.38.0': resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.39.0': - resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} + '@typescript-eslint/typescript-estree@8.39.1': + resolution: {integrity: sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -3475,8 +3488,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.39.0': - resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} + '@typescript-eslint/utils@8.39.1': + resolution: {integrity: sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3486,8 +3499,8 @@ packages: resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.39.0': - resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} + '@typescript-eslint/visitor-keys@8.39.1': + resolution: {integrity: sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -4027,6 +4040,10 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.5.0: + resolution: {integrity: sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -4908,8 +4925,8 @@ packages: peerDependencies: eslint: '>=8.23.0' - eslint-plugin-prettier@5.5.3: - resolution: {integrity: sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==} + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -4962,8 +4979,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.32.0: - resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} + eslint@9.33.0: + resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6115,8 +6132,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@16.1.4: - resolution: {integrity: sha512-xy7rnzQrhTVGKMpv6+bmIA3C0yET31x8OhKBYfvGo0/byeZ6E0BjGARrir3Kg/RhhYHutpsi01+2J5IpfVoueA==} + lint-staged@16.1.5: + resolution: {integrity: sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==} engines: {node: '>=20.17'} hasBin: true @@ -7791,8 +7808,8 @@ packages: postcss-html: ^1.0.0 stylelint: '>=14.0.0' - stylelint-config-recess-order@7.1.0: - resolution: {integrity: sha512-rFc4Z6SCGgEohr1khsmAZ83X56Tdi2dHY/GB7VT3qJkpKU1V2w+mYlK+b7Za5gpsxEng3jnb4FzWyIl/KTH0AQ==} + stylelint-config-recess-order@7.2.0: + resolution: {integrity: sha512-3Y97dhsWkUHFKRLGNLF6LE5JuNB2EVAZKYJ41wBRK4gplYdk7eHhSIwE24hanu0AoNmv5534Djip70pE+y5qkA==} peerDependencies: stylelint: '>=16.18' stylelint-order: '>=7' @@ -7827,8 +7844,8 @@ packages: peerDependencies: stylelint: ^16.0.2 - stylelint@16.23.0: - resolution: {integrity: sha512-69T5aS2LUY306ekt1Q1oaSPwz/jaG9HjyMix3UMrai1iEbuOafBe2Dh8xlyczrxFAy89qcKyZWWtc42XLx3Bbw==} + stylelint@16.23.1: + resolution: {integrity: sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==} engines: {node: '>=18.12.0'} hasBin: true @@ -8075,8 +8092,8 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript-eslint@8.39.0: - resolution: {integrity: sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==} + typescript-eslint@8.39.1: + resolution: {integrity: sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8545,8 +8562,8 @@ packages: engines: {node: '>= 14'} hasBin: true - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -9856,21 +9873,21 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.32.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.33.0(jiti@2.4.2))': dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.4.2))': dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.3.1(eslint@9.32.0(jiti@2.4.2))': + '@eslint/compat@1.3.2(eslint@9.33.0(jiti@2.4.2))': optionalDependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) '@eslint/config-array@0.21.0': dependencies: @@ -9880,9 +9897,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 @@ -9900,13 +9917,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.32.0': {} + '@eslint/js@9.33.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@fastify/busboy@2.1.1': {} @@ -9940,7 +9957,7 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@ianvs/prettier-plugin-sort-imports@4.5.1(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2)': + '@ianvs/prettier-plugin-sort-imports@4.6.2(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2)': dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 @@ -10670,7 +10687,7 @@ snapshots: '@rollup/pluginutils@5.1.3(rollup@4.46.2)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: @@ -10678,7 +10695,7 @@ snapshots: '@rollup/pluginutils@5.1.4(rollup@4.46.2)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: @@ -10817,10 +10834,10 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@2.11.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@stylistic/eslint-plugin@2.11.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@typescript-eslint/utils': 8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -11115,7 +11132,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.131.5(@tanstack/react-router@1.131.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@tanstack/router-plugin@1.131.5(@tanstack/react-router@1.131.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) @@ -11133,7 +11150,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.131.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -11433,8 +11450,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - '@types/estree@1.0.7': {} - '@types/estree@1.0.8': {} '@types/figlet@1.7.0': {} @@ -11533,15 +11548,15 @@ snapshots: '@types/node': 22.17.1 optional: true - '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.0 - eslint: 9.32.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.39.1 + eslint: 9.33.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -11550,31 +11565,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.39.1 debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color '@typescript-eslint/project-service@8.38.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) - '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) + '@typescript-eslint/types': 8.39.0 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: @@ -11585,10 +11600,10 @@ snapshots: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 - '@typescript-eslint/scope-manager@8.39.0': + '@typescript-eslint/scope-manager@8.39.1': dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/visitor-keys': 8.39.1 '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.9.2)': dependencies: @@ -11598,13 +11613,17 @@ snapshots: dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -11616,6 +11635,8 @@ snapshots: '@typescript-eslint/types@8.39.0': {} + '@typescript-eslint/types@8.39.1': {} + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.9.2)': dependencies: '@typescript-eslint/project-service': 8.38.0(typescript@5.9.2) @@ -11632,12 +11653,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.39.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/visitor-keys': 8.39.1 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -11648,24 +11669,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/utils@8.38.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2)': + '@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -11675,9 +11696,9 @@ snapshots: '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.39.0': + '@typescript-eslint/visitor-keys@8.39.1': dependencies: - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/types': 8.39.1 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.2.0': {} @@ -11741,7 +11762,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.10.1': optional: true - '@vitejs/plugin-legacy@7.2.1(terser@5.36.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-legacy@7.2.1(terser@5.36.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) @@ -11756,19 +11777,19 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.36.0 - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react-swc@3.11.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-react-swc@3.11.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 '@swc/core': 1.13.0 - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.7.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))': + '@vitejs/plugin-react@4.7.0(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -11776,7 +11797,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -12290,6 +12311,8 @@ snapshots: chalk@5.4.1: {} + chalk@5.5.0: {} + change-case@5.4.4: {} character-entities-html4@2.1.0: {} @@ -13244,14 +13267,14 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.32.0(jiti@2.4.2)): + eslint-compat-utils@0.5.1(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) semver: 7.7.2 - eslint-config-prettier@10.1.8(eslint@9.32.0(jiti@2.4.2)): + eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-context@0.1.9(unrs-resolver@1.10.1): dependencies: @@ -13260,9 +13283,9 @@ snapshots: optionalDependencies: unrs-resolver: 1.10.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)) eslint-import-resolver-node@0.3.9: dependencies: @@ -13272,49 +13295,49 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)))(eslint@9.33.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.14 unrs-resolver: 1.10.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-es-x@7.8.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.32.0(jiti@2.4.2) - eslint-compat-utils: 0.5.1(eslint@9.32.0(jiti@2.4.2)) + eslint: 9.33.0(jiti@2.4.2) + eslint-compat-utils: 0.5.1(eslint@9.33.0(jiti@2.4.2)) eslint-plugin-html@8.1.3: dependencies: htmlparser2: 10.0.0 - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)): dependencies: '@typescript-eslint/types': 8.35.1 comment-parser: 1.4.1 debug: 4.4.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-context: 0.1.9(unrs-resolver@1.10.1) is-glob: 4.0.3 minimatch: 9.0.5 @@ -13322,12 +13345,12 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.10.1 optionalDependencies: - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13336,9 +13359,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13350,18 +13373,18 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): + eslint-plugin-n@17.21.3(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) enhanced-resolve: 5.18.1 - eslint: 9.32.0(jiti@2.4.2) - eslint-plugin-es-x: 7.8.0(eslint@9.32.0(jiti@2.4.2)) + eslint: 9.33.0(jiti@2.4.2) + eslint-plugin-es-x: 7.8.0(eslint@9.33.0(jiti@2.4.2)) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 @@ -13371,37 +13394,37 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-prettier@5.5.3(eslint-config-prettier@10.1.8(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(prettier@3.6.2): + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.4.2)))(eslint@9.33.0(jiti@2.4.2))(prettier@3.6.2): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.8 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.32.0(jiti@2.4.2)) + eslint-config-prettier: 10.1.8(eslint@9.33.0(jiti@2.4.2)) - eslint-plugin-promise@7.2.1(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-promise@7.2.1(eslint@9.33.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.32.0(jiti@2.4.2)) - eslint: 9.32.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.33.0(jiti@2.4.2)) + eslint: 9.33.0(jiti@2.4.2) - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.33.0(jiti@2.4.2)): dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.27.0 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) hermes-parser: 0.25.1 zod: 3.24.4 zod-validation-error: 3.3.1(zod@3.24.4) transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.2.0(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.33.0(jiti@2.4.2)): dependencies: - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) - eslint-plugin-react@7.37.5(eslint@9.32.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.33.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -13409,7 +13432,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.32.0(jiti@2.4.2) + eslint: 9.33.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -13434,20 +13457,20 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.32.0(jiti@2.4.2): + eslint@9.33.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.32.0 - '@eslint/plugin-kit': 0.3.4 + '@eslint/js': 9.33.0 + '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 @@ -13513,7 +13536,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -13991,7 +14014,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/unist': 3.0.2 comma-separated-tokens: 2.0.3 @@ -14644,9 +14667,9 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@16.1.4: + lint-staged@16.1.5: dependencies: - chalk: 5.4.1 + chalk: 5.5.0 commander: 14.0.0 debug: 4.4.1 lilconfig: 3.1.3 @@ -14655,7 +14678,7 @@ snapshots: nano-spawn: 1.0.2 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.8.0 + yaml: 2.8.1 transitivePeerDependencies: - supports-color @@ -15149,20 +15172,20 @@ snapshots: sax: 1.3.0 optional: true - neostandard@0.12.2(@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): + neostandard@0.12.2(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: '@humanwhocodes/gitignore-to-minimatch': 1.0.2 - '@stylistic/eslint-plugin': 2.11.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2)))(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-n: 17.21.3(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint-plugin-promise: 7.2.1(eslint@9.32.0(jiti@2.4.2)) - eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.4.2)) + '@stylistic/eslint-plugin': 2.11.0(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2)))(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-n: 17.21.3(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint-plugin-promise: 7.2.1(eslint@9.33.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.5(eslint@9.33.0(jiti@2.4.2)) find-up: 5.0.0 globals: 15.15.0 peowly: 1.3.2 - typescript-eslint: 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) + typescript-eslint: 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node @@ -15616,11 +15639,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-tailwindcss@0.6.14(@ianvs/prettier-plugin-sort-imports@4.5.1(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2))(@prettier/plugin-oxc@0.0.4)(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.2))(prettier@3.6.2): + prettier-plugin-tailwindcss@0.6.14(@ianvs/prettier-plugin-sort-imports@4.6.2(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2))(@prettier/plugin-oxc@0.0.4)(@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.2))(prettier@3.6.2): dependencies: prettier: 3.6.2 optionalDependencies: - '@ianvs/prettier-plugin-sort-imports': 4.5.1(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2) + '@ianvs/prettier-plugin-sort-imports': 4.6.2(@prettier/plugin-oxc@0.0.4)(prettier@3.6.2) '@prettier/plugin-oxc': 0.0.4 '@trivago/prettier-plugin-sort-imports': 4.3.0(prettier@3.6.2) @@ -16497,36 +16520,36 @@ snapshots: dependencies: inline-style-parser: 0.2.3 - stylelint-config-html@1.1.0(postcss-html@1.8.0)(stylelint@16.23.0(typescript@5.9.2)): + stylelint-config-html@1.1.0(postcss-html@1.8.0)(stylelint@16.23.1(typescript@5.9.2)): dependencies: postcss-html: 1.8.0 - stylelint: 16.23.0(typescript@5.9.2) + stylelint: 16.23.1(typescript@5.9.2) - stylelint-config-recess-order@7.1.0(stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.9.2)))(stylelint@16.23.0(typescript@5.9.2)): + stylelint-config-recess-order@7.2.0(stylelint-order@7.0.0(stylelint@16.23.1(typescript@5.9.2)))(stylelint@16.23.1(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.9.2) - stylelint-order: 7.0.0(stylelint@16.23.0(typescript@5.9.2)) + stylelint: 16.23.1(typescript@5.9.2) + stylelint-order: 7.0.0(stylelint@16.23.1(typescript@5.9.2)) - stylelint-config-recommended@17.0.0(stylelint@16.23.0(typescript@5.9.2)): + stylelint-config-recommended@17.0.0(stylelint@16.23.1(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.9.2) + stylelint: 16.23.1(typescript@5.9.2) - stylelint-config-standard@39.0.0(stylelint@16.23.0(typescript@5.9.2)): + stylelint-config-standard@39.0.0(stylelint@16.23.1(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.9.2) - stylelint-config-recommended: 17.0.0(stylelint@16.23.0(typescript@5.9.2)) + stylelint: 16.23.1(typescript@5.9.2) + stylelint-config-recommended: 17.0.0(stylelint@16.23.1(typescript@5.9.2)) - stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@16.23.0(typescript@5.9.2)): + stylelint-declaration-block-no-ignored-properties@2.8.0(stylelint@16.23.1(typescript@5.9.2)): dependencies: - stylelint: 16.23.0(typescript@5.9.2) + stylelint: 16.23.1(typescript@5.9.2) - stylelint-order@7.0.0(stylelint@16.23.0(typescript@5.9.2)): + stylelint-order@7.0.0(stylelint@16.23.1(typescript@5.9.2)): dependencies: postcss: 8.5.6 postcss-sorting: 9.1.0(postcss@8.5.6) - stylelint: 16.23.0(typescript@5.9.2) + stylelint: 16.23.1(typescript@5.9.2) - stylelint-scss@6.12.1(stylelint@16.23.0(typescript@5.9.2)): + stylelint-scss@6.12.1(stylelint@16.23.1(typescript@5.9.2)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 @@ -16536,9 +16559,9 @@ snapshots: postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - stylelint: 16.23.0(typescript@5.9.2) + stylelint: 16.23.1(typescript@5.9.2) - stylelint@16.23.0(typescript@5.9.2): + stylelint@16.23.1(typescript@5.9.2): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -16862,13 +16885,13 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2): + typescript-eslint@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0(jiti@2.4.2))(typescript@5.9.2) - eslint: 9.32.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2))(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.4.2))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.4.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -17145,7 +17168,7 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@22.17.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-dts@4.5.4(@types/node@22.17.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.51.0(@types/node@22.17.1) '@rollup/pluginutils': 5.1.4(rollup@4.46.2) @@ -17158,13 +17181,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-html@3.2.2(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -17178,39 +17201,39 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) - vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.90.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.90.0)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: postcss: 8.5.6 postcss-js: 4.0.1(postcss@8.5.6) prettier: 3.6.2 sass-embedded: 1.90.0 - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) - vite-plugin-svgr@4.3.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-plugin-svgr@4.3.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.46.2) '@svgr/core': 8.1.0(typescript@5.9.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.9.2) optionalDependencies: - vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0) + vite: 7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0): + vite@7.1.1(@types/node@22.17.1)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.1): dependencies: esbuild: 0.25.0 fdir: 6.4.6(picomatch@4.0.3) @@ -17229,7 +17252,7 @@ snapshots: stylus: 0.62.0 terser: 5.36.0 tsx: 4.20.3 - yaml: 2.8.0 + yaml: 2.8.1 void-elements@3.1.0: {} @@ -17407,7 +17430,7 @@ snapshots: yaml@2.7.0: {} - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} diff --git a/lede/package/boot/uboot-rockchip/Makefile b/lede/package/boot/uboot-rockchip/Makefile index 090cd00558..7e8a3a912f 100644 --- a/lede/package/boot/uboot-rockchip/Makefile +++ b/lede/package/boot/uboot-rockchip/Makefile @@ -284,6 +284,7 @@ define U-Boot/generic-rk3568 hinlink_opc-h68k \ hinlink_opc-h69k \ lyt_t68m \ + nlnet_xiguapi-v3 \ seewo_sv21 endef diff --git a/lede/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/lede/target/linux/rockchip/armv8/base-files/etc/board.d/02_network index c7d80f7bc5..5f801ec0ae 100755 --- a/lede/target/linux/rockchip/armv8/base-files/etc/board.d/02_network +++ b/lede/target/linux/rockchip/armv8/base-files/etc/board.d/02_network @@ -42,6 +42,7 @@ rockchip_setup_interfaces() friendlyarm,nanopc-t6|\ hinlink,opc-h28k|\ mmbox,anas3035|\ + nlnet,xiguapi-v3|\ radxa,e20c|\ radxa,e25|\ seewo,sv21|\ @@ -123,6 +124,7 @@ rockchip_setup_macs() hinlink,opc-h68k|\ hinlink,opc-h69k|\ mmbox,anas3035|\ + nlnet,xiguapi-v3|\ rocktech,mpc1903|\ rumu3f,fine-3399|\ seewo,srcm3588-*|\ diff --git a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-xiguapi-v3.dts b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-xiguapi-v3.dts new file mode 100644 index 0000000000..27f9747502 --- /dev/null +++ b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-xiguapi-v3.dts @@ -0,0 +1,800 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/dts-v1/; +#include +#include +#include +#include +#include "rk3568.dtsi" + +/ { + model = "NLnet XiGuaPi V3"; + compatible = "nlnet,xiguapi-v3", "rockchip,rk3568"; + + aliases { + ethernet0 = &gmac0; + ethernet1 = &gmac1; + mmc0 = &sdhci; + mmc1 = &sdmmc0; + + led-boot = &sys_led; + led-failsafe = &sys_led; + led-running = &sys_led; + led-upgrade = &sys_led; + }; + + chosen { + stdout-path = "serial2:1500000n8"; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1750000>; + + button-reset { + label = "reset"; + linux,code = ; + press-threshold-microvolt = <0>; + }; + }; + + hdmi-con { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_con_in: endpoint { + remote-endpoint = <&hdmi_out_con>; + }; + }; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <&sys_led &net_led>; + pinctrl-names = "default"; + + net_led: net-led { + gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>; + label = "blue:net"; + }; + + sys_led: sys-led { + gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>; + label = "blue:sys"; + }; + }; + + led-controller { + compatible = "pwm-leds"; + + backlight: backlight { + label = "lcd:backlight"; + pwms = <&pwm14 0 1000000 0>; + max-brightness = <255>; + linux,default-trigger = "default-on"; + }; + }; + + fan: pwm-fan { + compatible = "pwm-fan"; + #cooling-cells = <2>; + cooling-levels = <30 75 135 195 255>; + pwms = <&pwm7 0 40000 0>; + }; + + rfkill-modem { + compatible = "rfkill-gpio"; + label = "M.2 USB Modem"; + radio-type = "wwan"; + reset-gpios = <&gpio2 RK_PD7 GPIO_ACTIVE_LOW>; + }; + + vcc0v6_ddr: vcc0v6-ddr { + compatible = "regulator-fixed"; + regulator-name = "vcc0v6_ddr"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <600000>; + regulator-max-microvolt = <600000>; + vin-supply = <&vcc_sysin_b>; + }; + + vcc_3v3: vcc-3v3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + /* pi6c pcie clock generator */ + vcc3v3_pi6c: vcc3v3-pi6c { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&pcie_en>; + regulator-name = "vcc3v3_pi6c"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc5v>; + }; + + vcc3v3_sd: vcc3v3-sd { + compatible = "regulator-fixed"; + gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + regulator-name = "vcc3v3_sd"; + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_3v3>; + }; + + /* actually fed by vcc_3v3 */ + vcc_3v3_wifi: vcc-3v3-wifi { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3_wifi"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc3v3_pi6c>; + }; + + /* actually fed by bat+ */ + vcc_4v0_5g: vcc-4v0-5g { + compatible = "regulator-fixed"; + regulator-name = "vcc_4v0_5g"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <4000000>; + regulator-max-microvolt = <4000000>; + vin-supply = <&vcc3v3_pi6c>; + }; + + vcc5v: vcc5v { + compatible = "regulator-fixed"; + regulator-name = "vcc5v"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; + + vcc5v0_usb_otg0: vcc5v0-usb-otg0 { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_usb_otg_en>; + regulator-name = "vcc5v0_usb_otg0"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc5v>; + }; + + /* sourced from vcc5v and bat+ via rk817 sw5 */ + vcc_sysin_b: vcc-sysin-b { + compatible = "regulator-fixed"; + regulator-name = "vcc_sysin_b"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <4000000>; + regulator-max-microvolt = <4000000>; + }; +}; + +&combphy0 { + status = "okay"; +}; + +&combphy1 { + status = "okay"; +}; + +&combphy2 { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu1 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu2 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu3 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu_thermal { + trips { + cpu_low: cpu-low { + temperature = <40000>; + hysteresis = <5000>; + type = "active"; + }; + cpu_warm: cpu-warm { + temperature = <50000>; + hysteresis = <5000>; + type = "active"; + }; + cpu_hot: cpu-hot { + temperature = <60000>; + hysteresis = <3000>; + type = "active"; + }; + cpu_hall: cpu-hall { + temperature = <70000>; + hysteresis = <2000>; + type = "active"; + }; + }; + + cooling-maps { + map0 { + trip = <&cpu_low>; + cooling-device = <&fan 0 1>; + }; + map1 { + trip = <&cpu_warm>; + cooling-device = <&fan 1 2>; + }; + map2 { + trip = <&cpu_hot>; + cooling-device = <&fan 2 3>; + }; + map3 { + trip = <&cpu_hall>; + cooling-device = <&fan 3 4>; + }; + }; +}; + +&gmac0 { + assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>; + assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>; + assigned-clock-rates = <0>, <125000000>; + clock_in_out = "output"; + phy-handle = <&rgmii_phy0>; + phy-mode = "rgmii-id"; + pinctrl-names = "default"; + pinctrl-0 = <&gmac0_miim + &gmac0_tx_bus2 + &gmac0_rx_bus2 + &gmac0_rgmii_clk + &gmac0_rgmii_bus>; + snps,reset-active-low; + snps,reset-delays-us = <0 20000 100000>; + snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>; + status = "okay"; +}; + +&gmac1 { + assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>; + assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>; + assigned-clock-rates = <0>, <125000000>; + clock_in_out = "output"; + phy-handle = <&rgmii_phy1>; + phy-mode = "rgmii-id"; + pinctrl-names = "default"; + pinctrl-0 = <&gmac1m1_miim + &gmac1m1_tx_bus2 + &gmac1m1_rx_bus2 + &gmac1m1_rgmii_clk + &gmac1m1_rgmii_bus>; + snps,reset-active-low; + snps,reset-delays-us = <0 20000 100000>; + snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>; + status = "okay"; +}; + +&gpu { + mali-supply = <&vdd_gpu>; + status = "okay"; +}; + +&hdmi { + avdd-0v9-supply = <&vdda0v9_image>; + avdd-1v8-supply = <&vcca1v8_image>; + status = "okay"; +}; + +&hdmi_in { + hdmi_in_vp0: endpoint { + remote-endpoint = <&vp0_out_hdmi>; + }; +}; + +&hdmi_out { + hdmi_out_con: endpoint { + remote-endpoint = <&hdmi_con_in>; + }; +}; + +&hdmi_sound { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + + vdd_cpu: regulator@1c { + compatible = "tcs,tcs4525"; + reg = <0x1c>; + fcs,suspend-voltage-selector = <1>; + regulator-name = "vdd_cpu"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <800000>; + regulator-max-microvolt = <1150000>; + regulator-ramp-delay = <2300>; + vin-supply = <&vcc_sysin_b>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + rk817: pmic@20 { + compatible = "rockchip,rk817"; + reg = <0x20>; + interrupt-parent = <&gpio0>; + interrupts = ; + pinctrl-names = "default"; + pinctrl-0 = <&pmic_int>; + system-power-controller; + wakeup-source; + #clock-cells = <1>; + + vcc1-supply = <&vcc_sysin_b>; + vcc2-supply = <&vcc_sysin_b>; + vcc3-supply = <&vcc_sysin_b>; + vcc4-supply = <&vcc_sysin_b>; + vcc5-supply = <&vcc_sysin_b>; + vcc6-supply = <&vcc_sysin_b>; + vcc7-supply = <&vcc_sysin_b>; + vcc8-supply = <&vcc_sysin_b>; + vcc9-supply = <&dcdc_boost>; + + regulators { + vdd_logic: DCDC_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-initial-mode = <0x2>; + regulator-min-microvolt = <500000>; + regulator-max-microvolt = <1350000>; + regulator-name = "vdd_logic"; + regulator-ramp-delay = <6001>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_gpu: DCDC_REG2 { + regulator-always-on; + regulator-initial-mode = <0x2>; + regulator-min-microvolt = <500000>; + regulator-max-microvolt = <1350000>; + regulator-name = "vdd_gpu"; + regulator-ramp-delay = <6001>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc_ddr: DCDC_REG3 { + regulator-always-on; + regulator-boot-on; + regulator-initial-mode = <0x2>; + regulator-name = "vcc_ddr"; + + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vcc3v3_sys: DCDC_REG4 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-initial-mode = <0x2>; + regulator-name = "vcc3v3_sys"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcca1v8_pmu: LDO_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcca1v8_pmu"; + + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vdda_0v9: LDO_REG2 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + regulator-name = "vdda_0v9"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdda0v9_pmu: LDO_REG3 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + regulator-name = "vdda0v9_pmu"; + + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vccio_acodec: LDO_REG4 { + regulator-always-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vccio_acodec"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vccio_sd: LDO_REG5 { + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vccio_sd"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc3v3_pmu: LDO_REG6 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc3v3_pmu"; + + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vcca_1v8: LDO_REG7 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcca_1v8"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdda0v9_image: LDO_REG8 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + regulator-name = "vdda0v9_image"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcca1v8_image: LDO_REG9 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcca1v8_image"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + dcdc_boost: BOOST { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <4700000>; + regulator-max-microvolt = <5400000>; + regulator-name = "dcdc_boost"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + otg_switch: OTG_SWITCH { + regulator-name = "otg_switch"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + }; + }; +}; + +&i2c5 { + status = "okay"; +}; + +&mdio0 { + rgmii_phy0: ethernet-phy@1 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0x1>; + }; +}; + +&mdio1 { + rgmii_phy1: ethernet-phy@1 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0x1>; + }; +}; + +&pcie2x1 { + reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc_3v3_wifi>; + status = "okay"; +}; + +&pcie30phy { + phy-supply = <&vcc3v3_pi6c>; + data-lanes = <1 2>; + status = "okay"; +}; + +&pcie3x1 { + num-lanes = <1>; + reset-gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc_3v3_wifi>; + status = "okay"; +}; + +&pcie3x2 { + num-lanes = <1>; + reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc_3v3_wifi>; + status = "okay"; +}; + +&pinctrl { + backlight { + backlight_led_pin: backlight-led-pin { + rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + display { + spi3_display_dc_pin: spi3-display-dc-pin { + rockchip,pins = <4 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + display_reset_pin: display-reset-pin { + rockchip,pins = <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + leds { + net_led_pin: net-led-pin { + rockchip,pins = <3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + sys_led_pin: sys-led-pin { + rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + pcie { + pcie_en: pcie-en { + rockchip,pins = <0 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + pmic { + pmic_int: pmic-int { + rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + spi3 { + spi3_sck: spi3-sck { + rockchip,pins = <4 RK_PC2 2 &pcfg_pull_none>; + }; + spi3_mosi: spi3-mosi { + rockchip,pins = <4 RK_PC3 2 &pcfg_pull_none>; + }; + }; + + usb { + vcc5v0_usb_otg_en: vcc5v0-usb-otg-en { + rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&pmu_io_domains { + pmuio1-supply = <&vcc3v3_pmu>; + pmuio2-supply = <&vcc3v3_pmu>; + vccio1-supply = <&vccio_acodec>; + vccio3-supply = <&vccio_sd>; + vccio4-supply = <&vcca1v8_pmu>; + vccio5-supply = <&vcc3v3_sys>; + vccio6-supply = <&vcca1v8_pmu>; + vccio7-supply = <&vcc3v3_sys>; + status = "okay"; +}; + +&pwm7 { + pinctrl-0 = <&pwm7_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&pwm14 { + pinctrl-0 = <&pwm14m0_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&rng { + status = "okay"; +}; + +&saradc { + vref-supply = <&vcca_1v8>; + status = "okay"; +}; + +&sdhci { + bus-width = <8>; + max-frequency = <200000000>; + mmc-hs200-1_8v; + non-removable; + pinctrl-names = "default"; + pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd &emmc_datastrobe>; + status = "okay"; +}; + +&sdmmc0 { + bus-width = <4>; + cap-sd-highspeed; + cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>; + disable-wp; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; + post-power-on-delay-ms = <800>; + sd-uhs-sdr104; + vmmc-supply = <&vcc3v3_sd>; + vqmmc-supply = <&vccio_sd>; + status = "okay"; +}; + +&spi3 { + pinctrl-names = "default"; + pinctrl-0 = <&spi3m1_cs0 &spi3_sck &spi3_mosi>; + status = "okay"; + + display@0 { + compatible = "galaxycore,gc9307"; + reg = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&spi3_display_dc_pin &display_reset_pin>; + dc-gpios = <&gpio4 RK_PC5 GPIO_ACTIVE_HIGH>; + reset-gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_LOW>; + backlight = <&backlight>; + buswidth = <8>; + rotate = <270>; + }; +}; + +&tsadc { + rockchip,hw-tshut-mode = <1>; + rockchip,hw-tshut-polarity = <0>; + status = "okay"; +}; + +&uart2 { + status = "okay"; +}; + +&usb2phy0 { + status = "okay"; +}; + +&usb2phy0_host { + phy-supply = <&vcc_4v0_5g>; + status = "okay"; +}; + +&usb2phy0_otg { + phy-supply = <&vcc5v0_usb_otg0>; + status = "okay"; +}; + +&usb2phy1 { + status = "okay"; +}; + +&usb2phy1_host { + phy-supply = <&vcc5v0_usb_otg0>; + status = "okay"; +}; + +&usb2phy1_otg { + phy-supply = <&vcc5v0_usb_otg0>; + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usb_host0_xhci { + dr_mode = "host"; + status = "okay"; +}; + +&usb_host1_ehci { + status = "okay"; +}; + +&usb_host1_ohci { + status = "okay"; +}; + +&usb_host1_xhci { + status = "okay"; +}; + +&vop { + assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; + assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; + status = "okay"; +}; + +&vop_mmu { + status = "okay"; +}; + +&vp0 { + vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { + reg = ; + remote-endpoint = <&hdmi_in_vp0>; + }; +}; diff --git a/lede/target/linux/rockchip/image/armv8.mk b/lede/target/linux/rockchip/image/armv8.mk index c302082d62..5faf565ff5 100644 --- a/lede/target/linux/rockchip/image/armv8.mk +++ b/lede/target/linux/rockchip/image/armv8.mk @@ -375,6 +375,16 @@ define Device/mmbox_anas3035 endef TARGET_DEVICES += mmbox_anas3035 +define Device/nlnet_xiguapi-v3 + DEVICE_VENDOR := NLnet + DEVICE_MODEL := XiGuaPi V3 + SOC := rk3568 + UBOOT_DEVICE_NAME := generic-rk3568 + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata + DEVICE_PACKAGES := kmod-hwmon-pwmfan +endef +TARGET_DEVICES += nlnet_xiguapi-v3 + define Device/panther_x2 DEVICE_VENDOR := Panther DEVICE_MODEL := X2 @@ -472,16 +482,6 @@ define Device/radxa_rock-5b endef TARGET_DEVICES += radxa_rock-5b -define Device/rongpin_king3399 - DEVICE_VENDOR := Rongpin - DEVICE_MODEL := King3399 - SOC := rk3399 - UBOOT_DEVICE_NAME := king3399-rk3399 - IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata - DEVICE_PACKAGES := kmod-r8168 kmod-brcmfmac cypress-firmware-4356-sdio wpad-openssl -endef -TARGET_DEVICES += rongpin_king3399 - define Device/rocktech_mpc1903 DEVICE_VENDOR := Rocktech DEVICE_MODEL := MPC1903 @@ -492,6 +492,16 @@ define Device/rocktech_mpc1903 endef TARGET_DEVICES += rocktech_mpc1903 +define Device/rongpin_king3399 + DEVICE_VENDOR := Rongpin + DEVICE_MODEL := King3399 + SOC := rk3399 + UBOOT_DEVICE_NAME := king3399-rk3399 + IMAGE/sysupgrade.img.gz := boot-common | boot-script | pine64-img | gzip | append-metadata + DEVICE_PACKAGES := kmod-r8168 kmod-brcmfmac cypress-firmware-4356-sdio wpad-openssl +endef +TARGET_DEVICES += rongpin_king3399 + define Device/rumu3f_fine-3399 DEVICE_VENDOR := RUMU3F DEVICE_MODEL := FINE 3399 diff --git a/mihomo/.github/workflows/build.yml b/mihomo/.github/workflows/build.yml index 9ddf316014..64cf15bd37 100644 --- a/mihomo/.github/workflows/build.yml +++ b/mihomo/.github/workflows/build.yml @@ -80,6 +80,13 @@ jobs: - { goos: android, goarch: arm, ndk: armv7a-linux-androideabi34, output: armv7 } - { goos: android, goarch: arm64, ndk: aarch64-linux-android34, output: arm64-v8 } + # Go 1.24 with special patch can work on Windows 7 + # https://github.com/MetaCubeX/go/commits/release-branch.go1.24/ + - { goos: windows, goarch: '386', output: '386-go124', goversion: '1.24' } + - { goos: windows, goarch: amd64, goamd64: v1, output: amd64-v1-go124, goversion: '1.24' } + - { goos: windows, goarch: amd64, goamd64: v2, output: amd64-v2-go124, goversion: '1.24' } + - { goos: windows, goarch: amd64, goamd64: v3, output: amd64-v3-go124, goversion: '1.24' } + # Go 1.23 with special patch can work on Windows 7 # https://github.com/MetaCubeX/go/commits/release-branch.go1.23/ - { goos: windows, goarch: '386', output: '386-go123', goversion: '1.23' } @@ -108,6 +115,12 @@ jobs: - { goos: windows, goarch: amd64, goamd64: v2, output: amd64-v2-go120, goversion: '1.20' } - { goos: windows, goarch: amd64, goamd64: v3, output: amd64-v3-go120, goversion: '1.20' } + # Go 1.24 is the last release that will run on macOS 11 Big Sur. Go 1.25 will require macOS 12 Monterey or later. + - { goos: darwin, goarch: arm64, output: arm64-go124, goversion: '1.24' } + - { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-v1-go124, goversion: '1.24' } + - { goos: darwin, goarch: amd64, goamd64: v2, output: amd64-v2-go124, goversion: '1.24' } + - { goos: darwin, goarch: amd64, goamd64: v3, output: amd64-v3-go124, goversion: '1.24' } + # Go 1.22 is the last release that will run on macOS 10.15 Catalina. Go 1.23 will require macOS 11 Big Sur or later. - { goos: darwin, goarch: arm64, output: arm64-go122, goversion: '1.22' } - { goos: darwin, goarch: amd64, goamd64: v1, output: amd64-v1-go122, goversion: '1.22' } @@ -139,7 +152,7 @@ jobs: if: ${{ matrix.jobs.goversion == '' && matrix.jobs.abi != '1' }} uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version: '1.25' - name: Set up Go if: ${{ matrix.jobs.goversion != '' && matrix.jobs.abi != '1' }} @@ -154,6 +167,24 @@ jobs: sudo tar zxf go1.24.0.linux-amd64-abi1.tar.gz -C /usr/local echo "/usr/local/go/bin" >> $GITHUB_PATH + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 + # this patch file only works on golang1.25.x + # that means after golang1.26 release it must be changed + # see: https://github.com/MetaCubeX/go/commits/release-branch.go1.25/ + # revert: + # 693def151adff1af707d82d28f55dba81ceb08e1: "crypto/rand,runtime: switch RtlGenRandom for ProcessPrng" + # 7c1157f9544922e96945196b47b95664b1e39108: "net: remove sysSocket fallback for Windows 7" + # 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround" + # a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries" + - name: Revert Golang1.25 commit for Windows7/8 + if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '' }} + run: | + cd $(go env GOROOT) + curl https://github.com/MetaCubeX/go/commit/8cb5472d94c34b88733a81091bd328e70ee565a4.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/6788c4c6f9fafb56729bad6b660f7ee2272d699f.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/a5b2168bb836ed9d6601c626f95e56c07923f906.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/f56f1e23507e646c85243a71bde7b9629b2f970c.diff | patch --verbose -p 1 + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 # this patch file only works on golang1.24.x # that means after golang1.25 release it must be changed @@ -164,7 +195,7 @@ jobs: # 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround" # a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries" - name: Revert Golang1.24 commit for Windows7/8 - if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '' }} + if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '1.24' }} run: | cd $(go env GOROOT) curl https://github.com/MetaCubeX/go/commit/2a406dc9f1ea7323d6ca9fccb2fe9ddebb6b1cc8.diff | patch --verbose -p 1 diff --git a/mihomo/.github/workflows/test.yml b/mihomo/.github/workflows/test.yml index db7ac0373e..28af5e76d3 100644 --- a/mihomo/.github/workflows/test.yml +++ b/mihomo/.github/workflows/test.yml @@ -24,6 +24,7 @@ jobs: - 'ubuntu-24.04-arm' # arm64 linux - 'macos-13' # amd64 macos go-version: + - '1.25' - '1.24' - '1.23' - '1.22' @@ -47,6 +48,24 @@ jobs: with: go-version: ${{ matrix.go-version }} + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 + # this patch file only works on golang1.25.x + # that means after golang1.26 release it must be changed + # see: https://github.com/MetaCubeX/go/commits/release-branch.go1.25/ + # revert: + # 693def151adff1af707d82d28f55dba81ceb08e1: "crypto/rand,runtime: switch RtlGenRandom for ProcessPrng" + # 7c1157f9544922e96945196b47b95664b1e39108: "net: remove sysSocket fallback for Windows 7" + # 48042aa09c2f878c4faa576948b07fe625c4707a: "syscall: remove Windows 7 console handle workaround" + # a17d959debdb04cd550016a3501dd09d50cd62e7: "runtime: always use LoadLibraryEx to load system libraries" + - name: Revert Golang1.25 commit for Windows7/8 + if: ${{ matrix.jobs.goos == 'windows' && matrix.jobs.goversion == '1.25' }} + run: | + cd $(go env GOROOT) + curl https://github.com/MetaCubeX/go/commit/8cb5472d94c34b88733a81091bd328e70ee565a4.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/6788c4c6f9fafb56729bad6b660f7ee2272d699f.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/a5b2168bb836ed9d6601c626f95e56c07923f906.diff | patch --verbose -p 1 + curl https://github.com/MetaCubeX/go/commit/f56f1e23507e646c85243a71bde7b9629b2f970c.diff | patch --verbose -p 1 + # modify from https://github.com/restic/restic/issues/4636#issuecomment-1896455557 # this patch file only works on golang1.24.x # that means after golang1.25 release it must be changed diff --git a/mihomo/docs/config.yaml b/mihomo/docs/config.yaml index 245b38e8b0..e4c5e7534a 100644 --- a/mihomo/docs/config.yaml +++ b/mihomo/docs/config.yaml @@ -639,7 +639,7 @@ proxies: # socks5 uuid: uuid network: tcp encryption: "8min-vless-mlkem768client-bas64RawURLEncoding" # 复用八分钟后协商新的 sharedKey,需小于服务端的值 - # encryption: "8min-aes128xor-mlkem768client-bas64RawURLEncoding" + # encryption: "8min-xored-mlkem768client-bas64RawURLEncoding" tls: false #可以不开启tls udp: true @@ -1348,7 +1348,7 @@ listeners: # ws-path: "/" # 如果不为空则开启 websocket 传输层 # grpc-service-name: "GunService" # 如果不为空则开启 grpc 传输层 # decryption: "10min-vless-mlkem768seed-bas64RawURLEncoding" # 同时允许 1-RTT 模式与十分钟复用的 0-RTT 模式, 后面base64字符串可由可由 mihomo generate vless-mlkem768 命令生成 - # decryption: "10min-aes128xor-mlkem768seed-bas64RawURLEncoding" + # decryption: "10min-xored-mlkem768seed-bas64RawURLEncoding" # 下面两项如果填写则开启 tls(需要同时填写) # certificate: ./server.crt # private-key: ./server.key diff --git a/mihomo/go.mod b/mihomo/go.mod index 4ba0c3ebbe..c218528072 100644 --- a/mihomo/go.mod +++ b/mihomo/go.mod @@ -25,7 +25,7 @@ require ( github.com/metacubex/quic-go v0.54.1-0.20250730114134-a1ae705fe295 github.com/metacubex/randv2 v0.2.0 github.com/metacubex/sing v0.5.4 - github.com/metacubex/sing-mux v0.3.2 + github.com/metacubex/sing-mux v0.3.3-0.20250813083925-d7c9aeaeeaac github.com/metacubex/sing-quic v0.0.0-20250718154553-1b193bec4cbb github.com/metacubex/sing-shadowsocks v0.2.11 github.com/metacubex/sing-shadowsocks2 v0.2.5 diff --git a/mihomo/go.sum b/mihomo/go.sum index 92d52230d4..4acd1b8706 100644 --- a/mihomo/go.sum +++ b/mihomo/go.sum @@ -119,8 +119,8 @@ github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFq github.com/metacubex/sing v0.5.2/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w= github.com/metacubex/sing v0.5.4 h1:a4kAOZmF+OXosbzPEcrSc5QD35/ex+MNuZsrcuWskHk= github.com/metacubex/sing v0.5.4/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w= -github.com/metacubex/sing-mux v0.3.2 h1:nJv52pyRivHcaZJKk2JgxpaVvj1GAXG81scSa9N7ncw= -github.com/metacubex/sing-mux v0.3.2/go.mod h1:3rt1soewn0O6j89GCLmwAQFsq257u0jf2zQSPhTL3Bw= +github.com/metacubex/sing-mux v0.3.3-0.20250813083925-d7c9aeaeeaac h1:wDH/Jh/yqWbzPktqJP+Y1cUG8hchcrzKzUxJiSpnaQs= +github.com/metacubex/sing-mux v0.3.3-0.20250813083925-d7c9aeaeeaac/go.mod h1:3rt1soewn0O6j89GCLmwAQFsq257u0jf2zQSPhTL3Bw= github.com/metacubex/sing-quic v0.0.0-20250718154553-1b193bec4cbb h1:U/m3h8lp/j7i8zFgfvScLdZa1/Y8dd74oO7iZaQq80s= github.com/metacubex/sing-quic v0.0.0-20250718154553-1b193bec4cbb/go.mod h1:B60FxaPHjR1SeQB0IiLrgwgvKsaoASfOWdiqhLjmMGA= github.com/metacubex/sing-shadowsocks v0.2.11 h1:p2NGNOdF95e6XvdDKipLj1FRRqR8dnbfC/7pw2CCTlw= diff --git a/mihomo/listener/anytls/server.go b/mihomo/listener/anytls/server.go index ae6af171e2..ccbc47a2c0 100644 --- a/mihomo/listener/anytls/server.go +++ b/mihomo/listener/anytls/server.go @@ -7,9 +7,9 @@ import ( "errors" "net" "strings" + "sync/atomic" "github.com/metacubex/mihomo/adapter/inbound" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/buf" "github.com/metacubex/mihomo/component/ca" "github.com/metacubex/mihomo/component/ech" @@ -31,7 +31,7 @@ type Listener struct { listeners []net.Listener tlsConfig *tlsC.Config userMap map[[32]byte]string - padding atomic.TypedValue[*padding.PaddingFactory] + padding atomic.Pointer[padding.PaddingFactory] } func New(config LC.AnyTLSServer, tunnel C.Tunnel, additions ...inbound.Addition) (sl *Listener, err error) { diff --git a/mihomo/listener/inbound/vless_test.go b/mihomo/listener/inbound/vless_test.go index 2ef1212669..e344aa2e88 100644 --- a/mihomo/listener/inbound/vless_test.go +++ b/mihomo/listener/inbound/vless_test.go @@ -103,12 +103,12 @@ func TestInboundVless_Encryption(t *testing.T) { } testInboundVless(t, inboundOptions, outboundOptions) }) - t.Run("-aes128xor-", func(t *testing.T) { + t.Run("-xored-", func(t *testing.T) { inboundOptions := inbound.VlessOption{ - Decryption: "10min-aes128xor-mlkem768seed-" + seedBase64, + Decryption: "10min-xored-mlkem768seed-" + seedBase64, } outboundOptions := outbound.VlessOption{ - Encryption: "8min-aes128xor-mlkem768client-" + clientBase64, + Encryption: "8min-xored-mlkem768client-" + clientBase64, } testInboundVless(t, inboundOptions, outboundOptions) }) diff --git a/mihomo/transport/anytls/client.go b/mihomo/transport/anytls/client.go index 44633ae345..4e74c9272c 100644 --- a/mihomo/transport/anytls/client.go +++ b/mihomo/transport/anytls/client.go @@ -5,9 +5,9 @@ import ( "crypto/sha256" "encoding/binary" "net" + "sync/atomic" "time" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/buf" "github.com/metacubex/mihomo/transport/anytls/padding" "github.com/metacubex/mihomo/transport/anytls/session" @@ -33,7 +33,7 @@ type Client struct { dialer N.Dialer server M.Socksaddr sessionClient *session.Client - padding atomic.TypedValue[*padding.PaddingFactory] + padding atomic.Pointer[padding.PaddingFactory] } func NewClient(ctx context.Context, config ClientConfig) *Client { diff --git a/mihomo/transport/anytls/padding/padding.go b/mihomo/transport/anytls/padding/padding.go index 498feb05c0..76b3c0ef91 100644 --- a/mihomo/transport/anytls/padding/padding.go +++ b/mihomo/transport/anytls/padding/padding.go @@ -7,8 +7,8 @@ import ( "math/big" "strconv" "strings" + "sync/atomic" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/transport/anytls/util" ) @@ -31,7 +31,7 @@ type PaddingFactory struct { Md5 string } -func UpdatePaddingScheme(rawScheme []byte, to *atomic.TypedValue[*PaddingFactory]) bool { +func UpdatePaddingScheme(rawScheme []byte, to *atomic.Pointer[PaddingFactory]) bool { if p := NewPaddingFactory(rawScheme); p != nil { to.Store(p) return true diff --git a/mihomo/transport/anytls/session/client.go b/mihomo/transport/anytls/session/client.go index 50fd7b42ef..0698bd5006 100644 --- a/mihomo/transport/anytls/session/client.go +++ b/mihomo/transport/anytls/session/client.go @@ -7,9 +7,9 @@ import ( "math" "net" "sync" + "sync/atomic" "time" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/transport/anytls/padding" "github.com/metacubex/mihomo/transport/anytls/skiplist" "github.com/metacubex/mihomo/transport/anytls/util" @@ -29,13 +29,13 @@ type Client struct { sessions map[uint64]*Session sessionsLock sync.Mutex - padding *atomic.TypedValue[*padding.PaddingFactory] + padding *atomic.Pointer[padding.PaddingFactory] idleSessionTimeout time.Duration minIdleSession int } -func NewClient(ctx context.Context, dialOut util.DialOutFunc, _padding *atomic.TypedValue[*padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration, minIdleSession int) *Client { +func NewClient(ctx context.Context, dialOut util.DialOutFunc, _padding *atomic.Pointer[padding.PaddingFactory], idleSessionCheckInterval, idleSessionTimeout time.Duration, minIdleSession int) *Client { c := &Client{ sessions: make(map[uint64]*Session), dialOut: dialOut, diff --git a/mihomo/transport/anytls/session/session.go b/mihomo/transport/anytls/session/session.go index c80639ce3b..23c3a087dc 100644 --- a/mihomo/transport/anytls/session/session.go +++ b/mihomo/transport/anytls/session/session.go @@ -9,9 +9,9 @@ import ( "runtime/debug" "strconv" "sync" + "sync/atomic" "time" - "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/buf" "github.com/metacubex/mihomo/common/pool" "github.com/metacubex/mihomo/constant" @@ -38,7 +38,7 @@ type Session struct { // pool seq uint64 idleSince time.Time - padding *atomic.TypedValue[*padding.PaddingFactory] + padding *atomic.Pointer[padding.PaddingFactory] peerVersion byte @@ -53,7 +53,7 @@ type Session struct { onNewStream func(stream *Stream) } -func NewClientSession(conn net.Conn, _padding *atomic.TypedValue[*padding.PaddingFactory]) *Session { +func NewClientSession(conn net.Conn, _padding *atomic.Pointer[padding.PaddingFactory]) *Session { s := &Session{ conn: conn, isClient: true, @@ -65,7 +65,7 @@ func NewClientSession(conn net.Conn, _padding *atomic.TypedValue[*padding.Paddin return s } -func NewServerSession(conn net.Conn, onNewStream func(stream *Stream), _padding *atomic.TypedValue[*padding.PaddingFactory]) *Session { +func NewServerSession(conn net.Conn, onNewStream func(stream *Stream), _padding *atomic.Pointer[padding.PaddingFactory]) *Session { s := &Session{ conn: conn, onNewStream: onNewStream, diff --git a/mihomo/transport/vless/encryption/client.go b/mihomo/transport/vless/encryption/client.go index 726e98d87c..3bef4d94eb 100644 --- a/mihomo/transport/vless/encryption/client.go +++ b/mihomo/transport/vless/encryption/client.go @@ -5,6 +5,7 @@ import ( "crypto/cipher" "crypto/rand" "errors" + "fmt" "io" "net" "runtime" @@ -95,24 +96,36 @@ func (i *ClientInstance) Handshake(conn net.Conn) (net.Conn, error) { nfsKey, encapsulatedNfsKey := i.nfsEKey.Encapsulate() paddingLen := randBetween(100, 1000) - clientHello := make([]byte, 1+1184+1088+5+paddingLen) - clientHello[0] = ClientCipher - copy(clientHello[1:], pfsEKeyBytes) - copy(clientHello[1185:], encapsulatedNfsKey) - EncodeHeader(clientHello[2273:], int(paddingLen)) - rand.Read(clientHello[2278:]) + clientHello := make([]byte, 5+1+1184+1088+5+paddingLen) + EncodeHeader(clientHello, 1, 1+1184+1088) + clientHello[5] = ClientCipher + copy(clientHello[5+1:], pfsEKeyBytes) + copy(clientHello[5+1+1184:], encapsulatedNfsKey) + EncodeHeader(clientHello[5+1+1184+1088:], 23, int(paddingLen)) + rand.Read(clientHello[5+1+1184+1088+5:]) if _, err := c.Conn.Write(clientHello); err != nil { return nil, err } - // we can send more padding if needed + // client can send more padding / NFS AEAD messages if needed - peerServerHello := make([]byte, 1088+21) - if _, err := io.ReadFull(c.Conn, peerServerHello); err != nil { + _, t, l, err := ReadAndDecodeHeader(c.Conn) + if err != nil { return nil, err } - encapsulatedPfsKey := peerServerHello[:1088] - c.ticket = peerServerHello[1088:] + if t != 1 { + return nil, fmt.Errorf("unexpected type %v, expect random hello", t) + } + + peerRandomHello := make([]byte, 1088+21) + if l != len(peerRandomHello) { + return nil, fmt.Errorf("unexpected length %v for random hello", l) + } + if _, err := io.ReadFull(c.Conn, peerRandomHello); err != nil { + return nil, err + } + encapsulatedPfsKey := peerRandomHello[:1088] + c.ticket = peerRandomHello[1088:] pfsKey, err := pfsDKey.Decapsulate(encapsulatedPfsKey) if err != nil { @@ -122,7 +135,7 @@ func (i *ClientInstance) Handshake(conn net.Conn) (net.Conn, error) { nonce := [12]byte{ClientCipher} VLESS, _ := NewAead(ClientCipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Open(nil, nonce[:], c.ticket, pfsEKeyBytes) - if !bytes.Equal(VLESS, []byte("VLESS")) { // TODO: more messages + if !bytes.Equal(VLESS, []byte("VLESS")) { return nil, errors.New("invalid server") } @@ -153,14 +166,15 @@ func (c *ClientConn) Write(b []byte) (int, error) { rand.Read(c.random) c.aead = NewAead(ClientCipher, c.baseKey, c.random, c.ticket) c.nonce = make([]byte, 12) - data = make([]byte, 21+32+5+len(b)+16) - copy(data, c.ticket) - copy(data[21:], c.random) - EncodeHeader(data[53:], len(b)+16) - c.aead.Seal(data[:58], c.nonce, b, data[53:58]) + data = make([]byte, 5+21+32+5+len(b)+16) + EncodeHeader(data, 0, 21+32) + copy(data[5:], c.ticket) + copy(data[5+21:], c.random) + EncodeHeader(data[5+21+32:], 23, len(b)+16) + c.aead.Seal(data[:5+21+32+5], c.nonce, b, data[5+21+32:5+21+32+5]) } else { data = make([]byte, 5+len(b)+16) - EncodeHeader(data, len(b)+16) + EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { c.aead = NewAead(ClientCipher, c.baseKey, data[5:], data[:5]) @@ -178,29 +192,44 @@ func (c *ClientConn) Read(b []byte) (int, error) { if len(b) == 0 { return 0, nil } - peerHeader := make([]byte, 5) if c.peerAead == nil { - if c.instance == nil { + var t byte + var l int + var err error + if c.instance == nil { // from 1-RTT for { - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { + if _, t, l, err = ReadAndDecodeHeader(c.Conn); err != nil { return 0, err } - peerPaddingLen, _ := DecodeHeader(peerHeader) - if peerPaddingLen == 0 { + if t != 23 { break } - if _, err := io.ReadFull(c.Conn, make([]byte, peerPaddingLen)); err != nil { + if _, err := io.ReadFull(c.Conn, make([]byte, l)); err != nil { return 0, err } } } else { - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { + h := make([]byte, 5) + if _, err := io.ReadFull(c.Conn, h); err != nil { return 0, err } + if t, l, err = DecodeHeader(h); err != nil { + c.instance.Lock() + if bytes.Equal(c.ticket, c.instance.ticket) { + c.instance.expire = time.Now() // expired + } + c.instance.Unlock() + return 0, errors.New("new handshake needed") + } + } + if t != 0 { + return 0, fmt.Errorf("unexpected type %v, expect server random", t) } peerRandom := make([]byte, 32) - copy(peerRandom, peerHeader) - if _, err := io.ReadFull(c.Conn, peerRandom[5:]); err != nil { + if l != len(peerRandom) { + return 0, fmt.Errorf("unexpected length %v for server random", l) + } + if _, err := io.ReadFull(c.Conn, peerRandom); err != nil { return 0, err } if c.random == nil { @@ -214,33 +243,26 @@ func (c *ClientConn) Read(b []byte) (int, error) { c.peerCache = c.peerCache[n:] return n, nil } - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { - return 0, err - } - peerLength, err := DecodeHeader(peerHeader) // 17~17000 + h, t, l, err := ReadAndDecodeHeader(c.Conn) // l: 17~17000 if err != nil { - if c.instance != nil { - c.instance.Lock() - if bytes.Equal(c.ticket, c.instance.ticket) { - c.instance.expire = time.Now() // expired - } - c.instance.Unlock() - } return 0, err } - peerData := make([]byte, peerLength) + if t != 23 { + return 0, fmt.Errorf("unexpected type %v, expect encrypted data", t) + } + peerData := make([]byte, l) if _, err := io.ReadFull(c.Conn, peerData); err != nil { return 0, err } - dst := peerData[:peerLength-16] + dst := peerData[:l-16] if len(dst) <= len(b) { dst = b[:len(dst)] // avoids another copy() } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(ClientCipher, c.baseKey, peerData, peerHeader) + peerAead = NewAead(ClientCipher, c.baseKey, peerData, h) } - _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, peerHeader) + _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { c.peerAead = peerAead } diff --git a/mihomo/transport/vless/encryption/common.go b/mihomo/transport/vless/encryption/common.go index 32222f1851..cd4a93c5de 100644 --- a/mihomo/transport/vless/encryption/common.go +++ b/mihomo/transport/vless/encryption/common.go @@ -6,9 +6,10 @@ import ( "crypto/cipher" "crypto/rand" "crypto/sha256" - "errors" + "fmt" + "io" "math/big" - "strconv" + "net" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" @@ -16,23 +17,49 @@ import ( var MaxNonce = bytes.Repeat([]byte{255}, 12) -func EncodeHeader(b []byte, l int) { - b[0] = 23 - b[1] = 3 - b[2] = 3 - b[3] = byte(l >> 8) - b[4] = byte(l) +func EncodeHeader(h []byte, t byte, l int) { + switch t { + case 1: + h[0] = 1 + h[1] = 1 + h[2] = 1 + case 0: + h[0] = 0 + h[1] = 0 + h[2] = 0 + case 23: + h[0] = 23 + h[1] = 3 + h[2] = 3 + } + h[3] = byte(l >> 8) + h[4] = byte(l) } -func DecodeHeader(b []byte) (int, error) { - if b[0] == 23 && b[1] == 3 && b[2] == 3 { - l := int(b[3])<<8 | int(b[4]) - if l < 17 || l > 17000 { // TODO: TLSv1.3 max length - return 0, errors.New("invalid length in record's header: " + strconv.Itoa(l)) - } - return l, nil +func DecodeHeader(h []byte) (t byte, l int, err error) { + l = int(h[3])<<8 | int(h[4]) + if h[0] == 23 && h[1] == 3 && h[2] == 3 { + t = 23 + } else if h[0] == 0 && h[1] == 0 && h[2] == 0 { + t = 0 + } else if h[0] == 1 && h[1] == 1 && h[2] == 1 { + t = 1 + } else { + h = nil } - return 0, errors.New("invalid record's header") + if h == nil || l < 17 || l > 17000 { // TODO: TLSv1.3 max length + err = fmt.Errorf("invalid header: %v", h[:5]) + } + return +} + +func ReadAndDecodeHeader(conn net.Conn) (h []byte, t byte, l int, err error) { + h = make([]byte, 5) + if _, err = io.ReadFull(conn, h); err != nil { + return + } + t, l, err = DecodeHeader(h) + return } func NewAead(c byte, secret, salt, info []byte) (aead cipher.AEAD) { diff --git a/mihomo/transport/vless/encryption/doc.go b/mihomo/transport/vless/encryption/doc.go index d6aeb93efd..96976ed920 100644 --- a/mihomo/transport/vless/encryption/doc.go +++ b/mihomo/transport/vless/encryption/doc.go @@ -5,4 +5,8 @@ // https://github.com/XTLS/Xray-core/commit/ec1cc35188c1a5f38a2ff75e88b5d043ffdc59da // https://github.com/XTLS/Xray-core/commit/5c611420487a92f931faefc01d4bf03869f477f6 // https://github.com/XTLS/Xray-core/commit/23d7aad461d232bc5bed52dd6aaa731ecd88ad35 +// https://github.com/XTLS/Xray-core/commit/3c20bddfcfd8999be5f9a2ac180dc959950e4c61 +// https://github.com/XTLS/Xray-core/commit/1720be168fa069332c418503d30341fc6e01df7f +// https://github.com/XTLS/Xray-core/commit/0fd7691d6b28e05922d7a5a9313d97745a51ea63 +// https://github.com/XTLS/Xray-core/commit/09cc92c61d9067e0d65c1cae9124664ecfc78f43 package encryption diff --git a/mihomo/transport/vless/encryption/factory.go b/mihomo/transport/vless/encryption/factory.go index 18b88c2e3e..4988dbbfb9 100644 --- a/mihomo/transport/vless/encryption/factory.go +++ b/mihomo/transport/vless/encryption/factory.go @@ -31,7 +31,7 @@ func NewClient(encryption string) (*ClientInstance, error) { var xor uint32 switch s[1] { case "vless": - case "aes128xor": + case "xored": xor = 1 default: return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) @@ -76,7 +76,7 @@ func NewServer(decryption string) (*ServerInstance, error) { var xor uint32 switch s[1] { case "vless": - case "aes128xor": + case "xored": xor = 1 default: return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) diff --git a/mihomo/transport/vless/encryption/server.go b/mihomo/transport/vless/encryption/server.go index b42db3fdc5..2accabe7ca 100644 --- a/mihomo/transport/vless/encryption/server.go +++ b/mihomo/transport/vless/encryption/server.go @@ -5,6 +5,7 @@ import ( "crypto/cipher" "crypto/rand" "errors" + "fmt" "io" "net" "sync" @@ -55,12 +56,12 @@ func (i *ServerInstance) Init(nfsDKeySeed []byte, xor uint32, minutes time.Durat go func() { for { time.Sleep(time.Minute) - now := time.Now() i.Lock() if i.closed { i.Unlock() return } + now := time.Now() for ticket, session := range i.sessions { if now.After(session.expire) { delete(i.sessions, ticket) @@ -89,40 +90,49 @@ func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) { } c := &ServerConn{Conn: conn} - peerTicketHello := make([]byte, 21+32) - if _, err := io.ReadFull(c.Conn, peerTicketHello); err != nil { + _, t, l, err := ReadAndDecodeHeader(c.Conn) + if err != nil { return nil, err } - if i.minutes > 0 { + if t == 23 { + return nil, errors.New("unexpected data") + } + + if t == 0 { + if i.minutes == 0 { + return nil, errors.New("0-RTT is not allowed") + } + peerTicketHello := make([]byte, 21+32) + if l != len(peerTicketHello) { + return nil, fmt.Errorf("unexpected length %v for ticket hello", l) + } + if _, err := io.ReadFull(c.Conn, peerTicketHello); err != nil { + return nil, err + } i.RLock() s := i.sessions[[21]byte(peerTicketHello)] i.RUnlock() - if s != nil { - if _, replay := s.randoms.LoadOrStore([32]byte(peerTicketHello[21:]), true); !replay { - c.cipher = s.cipher - c.baseKey = s.baseKey - c.ticket = peerTicketHello[:21] - c.peerRandom = peerTicketHello[21:] - return c, nil - } + if s == nil { + noise := make([]byte, randBetween(100, 1000)) + rand.Read(noise) + c.Conn.Write(noise) // make client do new handshake + return nil, errors.New("expired ticket") } - } - - peerHeader := make([]byte, 5) - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { - return nil, err - } - if l, _ := DecodeHeader(peerHeader); l != 0 { - noise := make([]byte, randBetween(100, 1000)) - rand.Read(noise) - c.Conn.Write(noise) // make client do new handshake - return nil, errors.New("invalid ticket") + if _, replay := s.randoms.LoadOrStore([32]byte(peerTicketHello[21:]), true); replay { + return nil, errors.New("replay detected") + } + c.cipher = s.cipher + c.baseKey = s.baseKey + c.ticket = peerTicketHello[:21] + c.peerRandom = peerTicketHello[21:] + return c, nil } peerClientHello := make([]byte, 1+1184+1088) - copy(peerClientHello, peerTicketHello) - copy(peerClientHello[53:], peerHeader) - if _, err := io.ReadFull(c.Conn, peerClientHello[58:]); err != nil { + if l != len(peerClientHello) { + return nil, fmt.Errorf("unexpected length %v for client hello", l) + } + if _, err := io.ReadFull(c.Conn, peerClientHello); err != nil { return nil, err } c.cipher = peerClientHello[0] @@ -145,16 +155,17 @@ func (i *ServerInstance) Handshake(conn net.Conn) (net.Conn, error) { paddingLen := randBetween(100, 1000) - serverHello := make([]byte, 1088+21+5+paddingLen) - copy(serverHello, encapsulatedPfsKey) - copy(serverHello[1088:], c.ticket) - EncodeHeader(serverHello[1109:], int(paddingLen)) - rand.Read(serverHello[1114:]) + serverHello := make([]byte, 5+1088+21+5+paddingLen) + EncodeHeader(serverHello, 1, 1088+21) + copy(serverHello[5:], encapsulatedPfsKey) + copy(serverHello[5+1088:], c.ticket) + EncodeHeader(serverHello[5+1088+21:], 23, int(paddingLen)) + rand.Read(serverHello[5+1088+21+5:]) if _, err := c.Conn.Write(serverHello); err != nil { return nil, err } - // we can send more padding if needed + // server can send more padding / PFS AEAD messages if needed if i.minutes > 0 { i.Lock() @@ -173,33 +184,36 @@ func (c *ServerConn) Read(b []byte) (int, error) { if len(b) == 0 { return 0, nil } - peerHeader := make([]byte, 5) if c.peerAead == nil { - if c.peerRandom == nil { + if c.peerRandom == nil { // from 1-RTT + var t byte + var l int + var err error for { - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { + if _, t, l, err = ReadAndDecodeHeader(c.Conn); err != nil { return 0, err } - peerPaddingLen, _ := DecodeHeader(peerHeader) - if peerPaddingLen == 0 { + if t != 23 { break } - if _, err := io.ReadFull(c.Conn, make([]byte, peerPaddingLen)); err != nil { + if _, err := io.ReadFull(c.Conn, make([]byte, l)); err != nil { return 0, err } } - peerTicket := make([]byte, 21) - copy(peerTicket, peerHeader) - if _, err := io.ReadFull(c.Conn, peerTicket[5:]); err != nil { + if t != 0 { + return 0, fmt.Errorf("unexpected type %v, expect ticket hello", t) + } + peerTicketHello := make([]byte, 21+32) + if l != len(peerTicketHello) { + return 0, fmt.Errorf("unexpected length %v for ticket hello", l) + } + if _, err := io.ReadFull(c.Conn, peerTicketHello); err != nil { return 0, err } - if !bytes.Equal(peerTicket, c.ticket) { + if !bytes.Equal(peerTicketHello[:21], c.ticket) { return 0, errors.New("naughty boy") } - c.peerRandom = make([]byte, 32) - if _, err := io.ReadFull(c.Conn, c.peerRandom); err != nil { - return 0, err - } + c.peerRandom = peerTicketHello[21:] } c.peerAead = NewAead(c.cipher, c.baseKey, c.peerRandom, c.ticket) c.peerNonce = make([]byte, 12) @@ -209,32 +223,32 @@ func (c *ServerConn) Read(b []byte) (int, error) { c.peerCache = c.peerCache[n:] return n, nil } - if _, err := io.ReadFull(c.Conn, peerHeader); err != nil { - return 0, err - } - peerLength, err := DecodeHeader(peerHeader) // 17~17000 + h, t, l, err := ReadAndDecodeHeader(c.Conn) // l: 17~17000 if err != nil { return 0, err } - peerData := make([]byte, peerLength) + if t != 23 { + return 0, fmt.Errorf("unexpected type %v, expect encrypted data", t) + } + peerData := make([]byte, l) if _, err := io.ReadFull(c.Conn, peerData); err != nil { return 0, err } - dst := peerData[:peerLength-16] + dst := peerData[:l-16] if len(dst) <= len(b) { dst = b[:len(dst)] // avoids another copy() } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(c.cipher, c.baseKey, peerData, peerHeader) + peerAead = NewAead(c.cipher, c.baseKey, peerData, h) } - _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, peerHeader) + _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { c.peerAead = peerAead } IncreaseNonce(c.peerNonce) if err != nil { - return 0, errors.New("error") + return 0, err } if len(dst) > len(b) { c.peerCache = dst[copy(b, dst):] @@ -258,15 +272,16 @@ func (c *ServerConn) Write(b []byte) (int, error) { if c.peerRandom == nil { return 0, errors.New("empty c.peerRandom") } - data = make([]byte, 32+5+len(b)+16) - rand.Read(data[:32]) - c.aead = NewAead(c.cipher, c.baseKey, data[:32], c.peerRandom) + data = make([]byte, 5+32+5+len(b)+16) + EncodeHeader(data, 0, 32) + rand.Read(data[5 : 5+32]) + c.aead = NewAead(c.cipher, c.baseKey, data[5:5+32], c.peerRandom) c.nonce = make([]byte, 12) - EncodeHeader(data[32:], len(b)+16) - c.aead.Seal(data[:37], c.nonce, b, data[32:37]) + EncodeHeader(data[5+32:], 23, len(b)+16) + c.aead.Seal(data[:5+32+5], c.nonce, b, data[5+32:5+32+5]) } else { data = make([]byte, 5+len(b)+16) - EncodeHeader(data, len(b)+16) + EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { c.aead = NewAead(c.cipher, c.baseKey, data[5:], data[:5]) diff --git a/mihomo/transport/vless/encryption/xor.go b/mihomo/transport/vless/encryption/xor.go index 296fdd637a..696702bc69 100644 --- a/mihomo/transport/vless/encryption/xor.go +++ b/mihomo/transport/vless/encryption/xor.go @@ -10,16 +10,19 @@ import ( type XorConn struct { net.Conn - key []byte - ctr cipher.Stream - peerCtr cipher.Stream + key []byte + ctr cipher.Stream + peerCtr cipher.Stream + isHeader bool + skipNext bool } func NewXorConn(conn net.Conn, key []byte) *XorConn { return &XorConn{Conn: conn, key: key[:16]} + //chacha20.NewUnauthenticatedCipher() } -func (c *XorConn) Write(b []byte) (int, error) { +func (c *XorConn) Write(b []byte) (int, error) { // two records at most if len(b) == 0 { return 0, nil } @@ -30,7 +33,13 @@ func (c *XorConn) Write(b []byte) (int, error) { rand.Read(iv) c.ctr = cipher.NewCTR(block, iv) } - c.ctr.XORKeyStream(b, b) // caller MUST discard b + t, l, _ := DecodeHeader(b) + if t != 23 { + l += 10 // 5+l+5 + } else { + l = 5 + } + c.ctr.XORKeyStream(b[:l], b[:l]) // caller MUST discard b if iv != nil { b = append(iv, b...) } @@ -43,7 +52,7 @@ func (c *XorConn) Write(b []byte) (int, error) { return len(b), nil } -func (c *XorConn) Read(b []byte) (int, error) { +func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... if len(b) == 0 { return 0, nil } @@ -54,10 +63,24 @@ func (c *XorConn) Read(b []byte) (int, error) { } block, _ := aes.NewCipher(c.key) c.peerCtr = cipher.NewCTR(block, peerIv) + c.isHeader = true } - n, err := c.Conn.Read(b) - if n > 0 { - c.peerCtr.XORKeyStream(b[:n], b[:n]) + if _, err := io.ReadFull(c.Conn, b); err != nil { + return 0, err } - return n, err + if c.skipNext { + c.skipNext = false + return len(b), nil + } + c.peerCtr.XORKeyStream(b, b) + if c.isHeader { + if t, _, _ := DecodeHeader(b); t == 23 { // always 5-bytes + c.skipNext = true + } else { + c.isHeader = false + } + } else { + c.isHeader = true + } + return len(b), nil } diff --git a/sing-box/common/tls/client.go b/sing-box/common/tls/client.go index ce9cfe3d9b..868e039d35 100644 --- a/sing-box/common/tls/client.go +++ b/sing-box/common/tls/client.go @@ -47,7 +47,6 @@ func ClientHandshake(ctx context.Context, conn net.Conn, config Config) (Conn, e if errors.As(err, &echErr) && len(echErr.RetryConfigList) > 0 { if echConfig, isECH := config.(ECHCapableConfig); isECH { echConfig.SetECHConfigList(echErr.RetryConfigList) - tlsConn, err = aTLS.ClientHandshake(ctx, conn, config) } } if err != nil { diff --git a/sing-box/experimental/libbox/config.go b/sing-box/experimental/libbox/config.go index 7dc84b83f8..89c512229f 100644 --- a/sing-box/experimental/libbox/config.go +++ b/sing-box/experimental/libbox/config.go @@ -22,6 +22,7 @@ import ( "github.com/sagernet/sing/common/logger" "github.com/sagernet/sing/common/x/list" "github.com/sagernet/sing/service" + "github.com/sagernet/sing/service/filemanager" ) func BaseContext(platformInterface PlatformInterface) context.Context { @@ -33,7 +34,9 @@ func BaseContext(platformInterface PlatformInterface) context.Context { }) } } - return box.Context(context.Background(), include.InboundRegistry(), include.OutboundRegistry(), include.EndpointRegistry(), dnsRegistry, include.ServiceRegistry()) + ctx := context.Background() + ctx = filemanager.WithDefault(ctx, sWorkingPath, sTempPath, sUserID, sGroupID) + return box.Context(ctx, include.InboundRegistry(), include.OutboundRegistry(), include.EndpointRegistry(), dnsRegistry, include.ServiceRegistry()) } func parseConfig(ctx context.Context, configContent string) (option.Options, error) { diff --git a/sing-box/experimental/libbox/service.go b/sing-box/experimental/libbox/service.go index 7f80e6fef6..8c94b389da 100644 --- a/sing-box/experimental/libbox/service.go +++ b/sing-box/experimental/libbox/service.go @@ -27,7 +27,6 @@ import ( "github.com/sagernet/sing/common/logger" N "github.com/sagernet/sing/common/network" "github.com/sagernet/sing/service" - "github.com/sagernet/sing/service/filemanager" "github.com/sagernet/sing/service/pause" ) @@ -44,7 +43,6 @@ type BoxService struct { func NewService(configContent string, platformInterface PlatformInterface) (*BoxService, error) { ctx := BaseContext(platformInterface) - ctx = filemanager.WithDefault(ctx, sWorkingPath, sTempPath, sUserID, sGroupID) service.MustRegister[deprecated.Manager](ctx, new(deprecatedManager)) options, err := parseConfig(ctx, configContent) if err != nil { diff --git a/sing-box/protocol/tun/inbound.go b/sing-box/protocol/tun/inbound.go index e018b642e6..fc69309c02 100644 --- a/sing-box/protocol/tun/inbound.go +++ b/sing-box/protocol/tun/inbound.go @@ -137,6 +137,9 @@ func NewInbound(ctx context.Context, router adapter.Router, logger log.ContextLo if platformInterface != nil && platformInterface.UnderNetworkExtension() { // In Network Extension, when MTU exceeds 4064 (4096-UTUN_IF_HEADROOM_SIZE), the performance of tun will drop significantly, which may be a system bug. tunMTU = 4064 + } else if C.IsAndroid { + // Some Android devices report ENOBUFS when using MTU 65535 + tunMTU = 9000 } else { tunMTU = 65535 } diff --git a/sing-box/service/ssmapi/api.go b/sing-box/service/ssmapi/api.go index b9b753a4a9..14c3ac32e1 100644 --- a/sing-box/service/ssmapi/api.go +++ b/sing-box/service/ssmapi/api.go @@ -2,6 +2,7 @@ package ssmapi import ( "net/http" + "strconv" C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing/common/logger" @@ -156,7 +157,7 @@ func (s *APIServer) deleteUser(writer http.ResponseWriter, request *http.Request } func (s *APIServer) getStats(writer http.ResponseWriter, request *http.Request) { - requireClear := chi.URLParam(request, "clear") == "true" + requireClear, _ := strconv.ParseBool(chi.URLParam(request, "clear")) users := s.user.List() s.traffic.ReadUsers(users) diff --git a/v2rayn/.github/workflows/build-linux.yml b/v2rayn/.github/workflows/build-linux.yml index a9fe23e2fc..f793a1cbe8 100644 --- a/v2rayn/.github/workflows/build-linux.yml +++ b/v2rayn/.github/workflows/build-linux.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.2.2 + uses: actions/checkout@v5.0.0 with: submodules: 'recursive' fetch-depth: '0' diff --git a/v2rayn/.github/workflows/build-osx.yml b/v2rayn/.github/workflows/build-osx.yml index 78c18dc5d8..fa1d3ef47b 100644 --- a/v2rayn/.github/workflows/build-osx.yml +++ b/v2rayn/.github/workflows/build-osx.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.2.2 + uses: actions/checkout@v5.0.0 with: submodules: 'recursive' fetch-depth: '0' diff --git a/v2rayn/.github/workflows/build-windows-desktop.yml b/v2rayn/.github/workflows/build-windows-desktop.yml index 9afc504ddd..4cd3370449 100644 --- a/v2rayn/.github/workflows/build-windows-desktop.yml +++ b/v2rayn/.github/workflows/build-windows-desktop.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.2.2 + uses: actions/checkout@v5.0.0 with: submodules: 'recursive' fetch-depth: '0' diff --git a/v2rayn/.github/workflows/build-windows.yml b/v2rayn/.github/workflows/build-windows.yml index 1d33f85a59..c39ed72337 100644 --- a/v2rayn/.github/workflows/build-windows.yml +++ b/v2rayn/.github/workflows/build-windows.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4.2.2 + uses: actions/checkout@v5.0.0 - name: Setup uses: actions/setup-dotnet@v4.3.1 diff --git a/v2rayn/v2rayN/Directory.Packages.props b/v2rayn/v2rayN/Directory.Packages.props index 48fba7da1a..e923397d1c 100644 --- a/v2rayn/v2rayN/Directory.Packages.props +++ b/v2rayn/v2rayN/Directory.Packages.props @@ -10,7 +10,7 @@ - + diff --git a/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs b/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs index 3fb3252478..fa9957865e 100644 --- a/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs +++ b/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs @@ -1862,7 +1862,13 @@ public class CoreConfigSingboxService } } } - else if (item.OutboundTag == Global.ProxyTag) + else if (item.OutboundTag == Global.BlockTag) + { + rule.action = "predefined"; + rule.rcode = "NOERROR"; + rule.answer = new List { "A" }; + } + else { if (simpleDNSItem.FakeIP == true) { @@ -1873,12 +1879,6 @@ public class CoreConfigSingboxService rule.server = Global.SingboxRemoteDNSTag; rule.strategy = string.IsNullOrEmpty(simpleDNSItem.SingboxStrategy4Proxy) ? null : simpleDNSItem.SingboxStrategy4Proxy; } - else if (item.OutboundTag == Global.BlockTag) - { - rule.action = "predefined"; - rule.rcode = "NOERROR"; - rule.answer = new List { "A" }; - } singboxConfig.dns.rules.Add(rule); } diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs index e6e985cab2..a679b8c170 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs @@ -150,7 +150,7 @@ public class DNSSettingViewModel : MyReactiveObject await ConfigHandler.SaveDNSItems(_config, item1); var item2 = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); - item2.Enabled = RayCustomDNSEnableCompatible; + item2.Enabled = SBCustomDNSEnableCompatible; item2.DomainStrategy4Freedom = DomainStrategy4Freedom2Compatible; item2.DomainDNSAddress = DomainDNSAddress2Compatible; item2.NormalDNS = JsonUtils.Serialize(JsonUtils.ParseJson(NormalDNS2Compatible)); diff --git a/v2rayng/.github/workflows/build.yml b/v2rayng/.github/workflows/build.yml index d0b1d0b1ca..413a06a208 100644 --- a/v2rayng/.github/workflows/build.yml +++ b/v2rayng/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4.2.2 + uses: actions/checkout@v5 with: submodules: 'recursive' fetch-depth: '0' diff --git a/v2rayng/V2rayNG/app/build.gradle.kts b/v2rayng/V2rayNG/app/build.gradle.kts index be37cade9d..e101f48aa6 100644 --- a/v2rayng/V2rayNG/app/build.gradle.kts +++ b/v2rayng/V2rayNG/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "com.v2ray.ang" minSdk = 21 targetSdk = 35 - versionCode = 667 - versionName = "1.10.17" + versionCode = 668 + versionName = "1.10.18" multiDexEnabled = true val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';') diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index 8f54e3dbce..b09954ee33 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -91,6 +91,8 @@ object AppConfig { const val TAG_DIRECT = "direct" const val TAG_BLOCKED = "block" const val TAG_FRAGMENT = "fragment" + const val TAG_DNS = "dns-module" + const val TAG_DOMESTIC_DNS = "domestic-dns" /** Network-related constants. */ const val UPLINK = "uplink" diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt index 9aa161ec2c..80db57f7e0 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt @@ -490,6 +490,7 @@ data class V2rayConfig( var expectIPs: List? = null, val clientIp: String? = null, val skipFallback: Boolean? = null, + val tag: String? = null, ) } diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt index ed2db36a66..27b81e4dfb 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt @@ -574,18 +574,8 @@ object V2rayConfigManager { address = domesticDns.first(), domains = directDomain, expectIPs = if (isCnRoutingMode) geoipCn else null, - skipFallback = true - ) - ) - } - - if (Utils.isPureIpAddress(domesticDns.first())) { - v2rayConfig.routing.rules.add( - 0, RulesBean( - outboundTag = AppConfig.TAG_DIRECT, - port = "53", - ip = arrayListOf(domesticDns.first()), - domain = null + skipFallback = true, + tag = AppConfig.TAG_DOMESTIC_DNS ) ) } @@ -626,20 +616,26 @@ object V2rayConfigManager { // DNS dns v2rayConfig.dns = V2rayConfig.DnsBean( servers = servers, - hosts = hosts + hosts = hosts, + tag = AppConfig.TAG_DNS ) // DNS routing - if (Utils.isPureIpAddress(remoteDns.first())) { - v2rayConfig.routing.rules.add( - 0, RulesBean( - outboundTag = AppConfig.TAG_PROXY, - port = "53", - ip = arrayListOf(remoteDns.first()), - domain = null - ) + v2rayConfig.routing.rules.add( + 0, RulesBean( + outboundTag = AppConfig.TAG_PROXY, + inboundTag = arrayListOf(AppConfig.TAG_DNS), + domain = null ) - } + ) + + v2rayConfig.routing.rules.add( + 0, RulesBean( + outboundTag = AppConfig.TAG_DIRECT, + inboundTag = arrayListOf(AppConfig.TAG_DOMESTIC_DNS), + domain = null + ) + ) } catch (e: Exception) { Log.e(AppConfig.TAG, "Failed to configure DNS", e) return false diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt index 7690b97c1e..bc619cf49c 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt @@ -386,6 +386,9 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } R.id.intelligent_selection_all -> { + if (MmkvManager.decodeSettingsString(AppConfig.PREF_OUTBOUND_DOMAIN_RESOLVE_METHOD, "1") != "0") { + toast(getString(R.string.pre_resolving_domain)) + } mainViewModel.createIntelligentSelectionAll() true } diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt index fee9a80f20..aec6c6c54a 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt @@ -42,6 +42,7 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application AppConfig.PREF_VPN_DNS, AppConfig.PREF_VPN_BYPASS_LAN, AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX, + AppConfig.PREF_VPN_MTU, AppConfig.PREF_REMOTE_DNS, AppConfig.PREF_DOMESTIC_DNS, AppConfig.PREF_DNS_HOSTS, diff --git a/v2rayng/V2rayNG/app/src/main/res/values-ar/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-ar/strings.xml index bb50c08acb..568324eed2 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -377,5 +377,6 @@ Least Ping Least Load + Pre-resolving domain… diff --git a/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml index 53593a3220..5ef3e7f8c4 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -382,5 +382,6 @@ Least Ping Least Load + Pre-resolving domain… \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml index 7a2dd4d6ba..7fce5e4490 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -392,5 +392,6 @@ کم ترین پینگ کم ترین بار(لود) + Pre-resolving domain… diff --git a/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml index 0d19dbcd9a..7d58e1aee5 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -391,5 +391,6 @@ کمترین پینگ کمترین بار(لود) + Pre-resolving domain… diff --git a/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml index 9fd4478fd3..e700406913 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -183,7 +183,7 @@ VPN обходит LAN Адрес интерфейса VPN - VPN MTU (default 1500) + VPN MTU (по умолчанию 1500) Внутренняя DNS (необязательно) DNS @@ -198,7 +198,7 @@ Другие устройства могут подключаться, используя ваш IP-адрес, чтобы использовать локальный прокси. Используйте только в доверенной сети, чтобы избежать несанкционированного подключения. Доступ из LAN разрешён, убедитесь, что вы находитесь в доверенной сети - Разрешать небезопасные + Разрешать небезопасные соединения Для TLS по умолчанию разрешены небезопасные соединения Порт локального прокси @@ -391,5 +391,6 @@ Наименьшая задержка Наименьшая нагрузка + Pre-resolving domain… diff --git a/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml index 133ae493b9..43fac0f55e 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -379,5 +379,6 @@ Least Ping Least Load + Pre-resolving domain… diff --git a/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml index 04cc6d160a..974edcd01a 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -383,5 +383,6 @@ 最低延迟 最稳定 + 预解析域名中… diff --git a/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml index 025d91e707..d254c7c735 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -383,5 +383,6 @@ Least Ping Least Load + Pre-resolving domain… diff --git a/v2rayng/V2rayNG/app/src/main/res/values/strings.xml b/v2rayng/V2rayNG/app/src/main/res/values/strings.xml index f72c0d6973..13683b0df1 100644 --- a/v2rayng/V2rayNG/app/src/main/res/values/strings.xml +++ b/v2rayng/V2rayNG/app/src/main/res/values/strings.xml @@ -185,8 +185,10 @@ Does VPN bypass LAN VPN Interface Address + VPN MTU (default 1500) + Domestic DNS (Optional) DNS @@ -393,5 +395,6 @@ Least Ping Least Load + Pre-resolving domain… diff --git a/yt-dlp/.github/workflows/build.yml b/yt-dlp/.github/workflows/build.yml index 810490f735..6679eb0221 100644 --- a/yt-dlp/.github/workflows/build.yml +++ b/yt-dlp/.github/workflows/build.yml @@ -410,7 +410,7 @@ jobs: run: | # Custom pyinstaller built with https://github.com/yt-dlp/pyinstaller-builds python devscripts/install_deps.py -o --include build python devscripts/install_deps.py --include curl-cffi - python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-6.13.0-py3-none-any.whl" + python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x64/pyinstaller-6.15.0-py3-none-any.whl" - name: Prepare run: | @@ -459,7 +459,7 @@ jobs: run: | python devscripts/install_deps.py -o --include build python devscripts/install_deps.py - python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-6.13.0-py3-none-any.whl" + python -m pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86/pyinstaller-6.15.0-py3-none-any.whl" - name: Prepare run: | diff --git a/yt-dlp/test/test_youtube_signature.py b/yt-dlp/test/test_youtube_signature.py index 4562467534..684a6175db 100644 --- a/yt-dlp/test/test_youtube_signature.py +++ b/yt-dlp/test/test_youtube_signature.py @@ -138,6 +138,16 @@ _SIG_TESTS = [ 'gN7a-hudCuAuPH6fByOk1_GNXN0yNMHShjZXS2VOgsEItAJz0tipeavEOmNdYN-wUtcEqD3bCXjc0iyKfAyZxCBGgIARwsSdQfJ2CJtt', 'JC2JfQdSswRAIgGBCxZyAfKyi0cjXCb3DqEctUw-NYdNmOEvaepit0zJAtIEsgOV2SXZjhSHMNy0NXNG_1kOyBf6HPuAuCduh-a', ), + ( + 'https://www.youtube.com/s/player/010fbc8d/player_es5.vflset/en_US/base.js', + 'gN7a-hudCuAuPH6fByOk1_GNXN0yNMHShjZXS2VOgsEItAJz0tipeavEOmNdYN-wUtcEqD3bCXjc0iyKfAyZxCBGgIARwsSdQfJ2CJtt', + 'ttJC2JfQdSswRAIgGBCxZyAfKyi0cjXCb3DqEctUw-NYdNmOEvaepit2zJAsIEggOVaSXZjhSHMNy0NXNG_1kOyBf6HPuAuCduh-', + ), + ( + 'https://www.youtube.com/s/player/010fbc8d/player_es6.vflset/en_US/base.js', + 'gN7a-hudCuAuPH6fByOk1_GNXN0yNMHShjZXS2VOgsEItAJz0tipeavEOmNdYN-wUtcEqD3bCXjc0iyKfAyZxCBGgIARwsSdQfJ2CJtt', + 'ttJC2JfQdSswRAIgGBCxZyAfKyi0cjXCb3DqEctUw-NYdNmOEvaepit2zJAsIEggOVaSXZjhSHMNy0NXNG_1kOyBf6HPuAuCduh-', + ), ] _NSIG_TESTS = [ @@ -377,6 +387,14 @@ _NSIG_TESTS = [ 'https://www.youtube.com/s/player/ef259203/player_ias_tce.vflset/en_US/base.js', 'rPqBC01nJpqhhi2iA2U', 'hY7dbiKFT51UIA', ), + ( + 'https://www.youtube.com/s/player/010fbc8d/player_es5.vflset/en_US/base.js', + '0hlOAlqjFszVvF4Z', 'R-H23bZGAsRFTg', + ), + ( + 'https://www.youtube.com/s/player/010fbc8d/player_es6.vflset/en_US/base.js', + '0hlOAlqjFszVvF4Z', 'R-H23bZGAsRFTg', + ), ] diff --git a/yt-dlp/yt_dlp/extractor/youtube/_video.py b/yt-dlp/yt_dlp/extractor/youtube/_video.py index 9ff727657c..14582c5f98 100644 --- a/yt-dlp/yt_dlp/extractor/youtube/_video.py +++ b/yt-dlp/yt_dlp/extractor/youtube/_video.py @@ -1817,6 +1817,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor): _PLAYER_JS_VARIANT_MAP = { 'main': 'player_ias.vflset/en_US/base.js', 'tce': 'player_ias_tce.vflset/en_US/base.js', + 'es5': 'player_es5.vflset/en_US/base.js', + 'es6': 'player_es6.vflset/en_US/base.js', 'tv': 'tv-player-ias.vflset/tv-player-ias.js', 'tv_es6': 'tv-player-es6.vflset/tv-player-es6.js', 'phone': 'player-plasma-ias-phone-en_US.vflset/base.js',