diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e4f2d91e34..0b999b8a49 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -42,7 +42,7 @@ variables:
   CARGO_PROFILE_DEV_LTO: 'off'
   CARGO_PROFILE_DEV_DEBUG: 'none'
   CARGO_TERM_COLOR: 'always'
-  GIT_CLEAN_FLAGS: -ffdx -e node_modules/ -e built/ -e target/ -e packages/backend-rs/built/
+  GIT_CLEAN_FLAGS: -ffdx -e node_modules/ -e built/ -e target/ -e packages/backend-rs/built/ -e ci/target-msrv/
 
 default:
   before_script:
@@ -246,6 +246,7 @@ cargo:check:msrv:
     - apt-get update && apt-get -y upgrade
     - apt-get install -y --no-install-recommends build-essential clang mold python3 perl nodejs postgresql-client
     - cp ci/cargo/config.toml /usr/local/cargo/config.toml
+    - export CARGO_TARGET_DIR='ci/target-msrv'
   script:
     - cargo fetch --locked --manifest-path Cargo.toml
     - cargo check --locked --frozen --all-features
@@ -320,6 +321,20 @@ cargo:doc:
     - cd target/doc
     - npx --yes netlify-cli deploy --prod --site="${CARGO_DOC_SITE_ID}" --dir=.
 
+cargo:test:miri:
+  stage: test
+  rules:
+    - if: $MIRI
+  script:
+    - export RUST_BACKTRACE=1
+    - export CARGO_TARGET_DIR='ci/target-miri'
+    - export MIRI_NIGHTLY=nightly-$(curl -s https://rust-lang.github.io/rustup-components-history/x86_64-unknown-linux-gnu/miri)
+    - curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C /usr/local/cargo/bin
+    - rustup set profile minimal
+    - rustup override set "${MIRI_NIGHTLY}"
+    - rustup component add miri
+    - MIRIFLAGS='-Zmiri-disable-isolation' cargo miri nextest run -j$(nproc --all)
+
 renovate:
   stage: dependency
   image:
diff --git a/Cargo.lock b/Cargo.lock
index c73b469059..d10b3222dd 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -92,7 +92,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -143,18 +143,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
 name = "async-trait"
-version = "0.1.80"
+version = "0.1.81"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca"
+checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -368,9 +368,9 @@ dependencies = [
 
 [[package]]
 name = "built"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6a6c0b39c38fd754ac338b00a88066436389c0f029da5d37d1e01091d9b7c17"
+checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4"
 
 [[package]]
 name = "bumpalo"
@@ -410,9 +410,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6"
 
 [[package]]
 name = "cc"
-version = "1.0.104"
+version = "1.0.105"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490"
+checksum = "5208975e568d83b6b05cc0a063c8e7e9acc2b43bee6da15616a5b73e109d7437"
 dependencies = [
  "jobserver",
  "libc",
@@ -447,7 +447,7 @@ dependencies = [
  "num-traits",
  "serde",
  "wasm-bindgen",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -629,7 +629,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
 dependencies = [
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -772,7 +772,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -1388,7 +1388,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -1467,7 +1467,7 @@ checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -1496,7 +1496,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -1647,7 +1647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d"
 dependencies = [
  "cfg-if",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -1744,7 +1744,7 @@ dependencies = [
  "convert_case",
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -1808,9 +1808,9 @@ dependencies = [
 
 [[package]]
 name = "napi"
-version = "3.0.0-alpha.3"
+version = "3.0.0-alpha.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53112614847625adf534655b35b7adcc66c4f6ca407284cca73fd5bb0cf8cde5"
+checksum = "2e5a69ce63aa1e68c939c5afa3f7be80d0c37eb3755022b064792dc019f08d8e"
 dependencies = [
  "bitflags 2.6.0",
  "chrono",
@@ -1831,23 +1831,23 @@ checksum = "e1c0f5d67ee408a4685b61f5ab7e58605c8ae3f2b4189f0127d804ff13d5560a"
 
 [[package]]
 name = "napi-derive"
-version = "3.0.0-alpha.3"
+version = "3.0.0-alpha.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "823fb2987af2446a2b4055604a920f2c1f1a028743c72adc8872d92da7e30d2b"
+checksum = "5e82f3209766c72466e28f05d8e55931cfda1652877b2cadf4011034890a2770"
 dependencies = [
  "cfg-if",
  "convert_case",
  "napi-derive-backend",
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
 name = "napi-derive-backend"
-version = "2.0.0-alpha.3"
+version = "2.0.0-alpha.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "abd42151b3c26b5cdde9cf9a8fc5f7240de0919f234e14c6f54e3571d56e4dab"
+checksum = "5b17d6c84ea7366a126d850e2010f2d8354be1d3f2c62bc20751b08ba5b0a774"
 dependencies = [
  "convert_case",
  "once_cell",
@@ -1855,7 +1855,7 @@ dependencies = [
  "quote",
  "regex",
  "semver",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -1984,7 +1984,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -2076,7 +2076,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -2137,7 +2137,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -2196,7 +2196,7 @@ dependencies = [
  "libc",
  "redox_syscall 0.5.2",
  "smallvec",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -2295,7 +2295,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -2468,7 +2468,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd"
 dependencies = [
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -2664,9 +2664,9 @@ dependencies = [
 
 [[package]]
 name = "rgb"
-version = "0.8.40"
+version = "0.8.42"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7439be6844e40133eda024efd85bf07f59d0dd2f59b10c00dd6cfb92cc5c741"
+checksum = "3eeba50c58624afb3be6d04abad8cb7a259d52017068c9f828975aa870a5daf5"
 dependencies = [
  "bytemuck",
 ]
@@ -2839,7 +2839,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -2878,7 +2878,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "sea-bae",
- "syn 2.0.68",
+ "syn 2.0.69",
  "unicode-ident",
 ]
 
@@ -2940,22 +2940,22 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 
 [[package]]
 name = "serde"
-version = "1.0.203"
+version = "1.0.204"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
+checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.203"
+version = "1.0.204"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
+checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -3406,9 +3406,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.68"
+version = "2.0.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9"
+checksum = "201fcda3845c23e8212cd466bfebf0bd20694490fc0356ae8e428e0824a915a6"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -3435,7 +3435,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -3500,7 +3500,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -3566,9 +3566,9 @@ dependencies = [
 
 [[package]]
 name = "tinyvec"
-version = "1.6.1"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82"
+checksum = "ce6b6a2fb3a985e99cebfaefa9faa3024743da73304ca1c683a36429613d3d22"
 dependencies = [
  "tinyvec_macros",
 ]
@@ -3605,7 +3605,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -3699,7 +3699,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -3911,7 +3911,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
  "wasm-bindgen-shared",
 ]
 
@@ -3933,7 +3933,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -4016,7 +4016,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
 dependencies = [
  "windows-core",
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -4025,7 +4025,7 @@ version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
 dependencies = [
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -4043,7 +4043,7 @@ version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
 dependencies = [
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -4063,18 +4063,18 @@ dependencies = [
 
 [[package]]
 name = "windows-targets"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
 dependencies = [
- "windows_aarch64_gnullvm 0.52.5",
- "windows_aarch64_msvc 0.52.5",
- "windows_i686_gnu 0.52.5",
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
  "windows_i686_gnullvm",
- "windows_i686_msvc 0.52.5",
- "windows_x86_64_gnu 0.52.5",
- "windows_x86_64_gnullvm 0.52.5",
- "windows_x86_64_msvc 0.52.5",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
 ]
 
 [[package]]
@@ -4085,9 +4085,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
 [[package]]
 name = "windows_aarch64_msvc"
@@ -4097,9 +4097,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -4109,15 +4109,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
 
 [[package]]
 name = "windows_i686_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -4127,9 +4127,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -4139,9 +4139,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
@@ -4151,9 +4151,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -4163,9 +4163,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
 [[package]]
 name = "winnow"
@@ -4214,7 +4214,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
  "synstructure 0.13.1",
 ]
 
@@ -4235,7 +4235,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
@@ -4255,7 +4255,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
  "synstructure 0.13.1",
 ]
 
@@ -4284,7 +4284,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.68",
+ "syn 2.0.69",
 ]
 
 [[package]]
diff --git a/Cargo.toml b/Cargo.toml
index d36b5e09d5..3eef52c700 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,12 +6,12 @@ resolver = "2"
 macros = { path = "packages/macro-rs/macros" }
 macros-impl = { path = "packages/macro-rs/macros-impl" }
 
-napi = "3.0.0-alpha.3"
-napi-derive = "3.0.0-alpha.3"
+napi = "3.0.0-alpha.6"
+napi-derive = "3.0.0-alpha.5"
 napi-build = "2.1.3"
 
 argon2 = { version = "0.5.3", default-features = false }
-async-trait = { version = "0.1.80", default-features = false }
+async-trait = { version = "0.1.81", default-features = false }
 basen = { version = "0.1.0", default-features = false }
 bb8 = { version = "0.8.5", default-features = false }
 bcrypt = { version = "0.15.1", default-features = false }
@@ -32,10 +32,10 @@ redis = { version = "0.25.4", default-features = false }
 regex = { version = "1.10.5", default-features = false }
 rmp-serde = { version = "1.3.0", default-features = false }
 sea-orm = { version = "0.12.15", default-features = false }
-serde = { version = "1.0.203", default-features = false }
+serde = { version = "1.0.204", default-features = false }
 serde_json = { version = "1.0.120", default-features = false }
 serde_yaml = { version = "0.9.34", default-features = false }
-syn = { version = "2.0.68", default-features = false }
+syn = { version = "2.0.69", default-features = false }
 sysinfo = { version = "0.30.12", default-features = false }
 thiserror = { version = "1.0.61", default-features = false }
 tokio = { version = "1.38.0", default-features = false }
diff --git a/ci/.gitignore b/ci/.gitignore
new file mode 100644
index 0000000000..1e50174ff5
--- /dev/null
+++ b/ci/.gitignore
@@ -0,0 +1,2 @@
+target-msrv/
+target-miri/
diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml
index 4e4f96cbb2..7a490b06bd 100644
--- a/locales/ca-ES.yml
+++ b/locales/ca-ES.yml
@@ -2168,7 +2168,6 @@ addRe: Afegeix "re:" al començament del comentari quant responguis a un missatg
 confirm: Confirmar
 importZip: Importar ZIP
 exportZip: Exportar ZIP
-emojiPackCreator: Creador de paquets Emoji
 detectPostLanguage: Detecta l'idioma automàticament i mostra un botó per els articles
   en altres idiomes
 indexableDescription: Permet al cercador intern mostrar els missatges públics
@@ -2324,3 +2323,4 @@ cancelScheduledPost: Elimina la planificació
 addAlt4MeTag: "Afegeix automàticament l'etiqueta #Alt4Me a les teves publicacions
   que tinguin un fitxer adjunt sense descripció"
 strongPassword: Bona contrasenya
+turnOffCatLanguage: Desactiva la conversió al llenguatge de gat
diff --git a/locales/de-DE.yml b/locales/de-DE.yml
index f6093b823d..2b372c3b1e 100644
--- a/locales/de-DE.yml
+++ b/locales/de-DE.yml
@@ -2186,7 +2186,6 @@ addRe: Ein "re:" am Anfang des Kommentars hinzufügen, um einem Beitrag mit eine
   zu antworten
 confirm: Bestätigen
 importZip: ZIP Importieren
-emojiPackCreator: Emoji-Pack Ersteller
 exportZip: ZIP exportieren
 detectPostLanguage: Sprache automatisch erkennen und eine Schaltfläche zum Übersetzen
   von Beiträgen in Fremdsprachen anzeigen
diff --git a/locales/en-US.yml b/locales/en-US.yml
index 47b69499fa..3bafec3eb8 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -1167,7 +1167,6 @@ exportZip: "Export ZIP"
 getQrCode: "Show QR code"
 remoteFollow: "Remote follow"
 copyRemoteFollowUrl: "Copy remote follow URL"
-emojiPackCreator: "Emoji pack creator"
 indexable: "Indexable"
 indexableDescription: "Allow built-in search to show your public posts"
 languageForTranslation: "Post translation language"
diff --git a/locales/eo.yml b/locales/eo.yml
index abff1cccad..6e9bb18d88 100644
--- a/locales/eo.yml
+++ b/locales/eo.yml
@@ -1 +1,11 @@
 _lang_: "Esperanto"
+introFirefish: Bonvenon Firefish estas malfermkoda, ne centra socia platformo kiu
+  estos senpage ĉiam! 🚀
+headlineFirefish: Malfermkoda, ne centra socia platformo kiu estos senpage ĉiam 🚀
+monthAndDay: '{monato}/{tago}'
+search: Serĉi
+searchPlaceholder: Serĉi Firefish
+notifications: Sciigoj
+username: Uzantnomo
+password: Pasvorto
+forgotPassword: Forgesa pasvorto
diff --git a/locales/es-ES.yml b/locales/es-ES.yml
index 2b45b41ff7..b59dcdbab6 100644
--- a/locales/es-ES.yml
+++ b/locales/es-ES.yml
@@ -1937,7 +1937,7 @@ manageGroups: Administrar grupos
 replayTutorial: Repetir Tutorial
 privateMode: Modo privado
 addInstance: Añadir un servidor
-renoteMute: Silenciar impulsos
+renoteMute: Silenciar impulsos en la línea de tiempo
 renoteUnmute: Dejar de silenciar impulsos
 flagSpeakAsCat: Habla como un gato
 selectInstance: Selecciona un servidor
@@ -2152,7 +2152,6 @@ detectPostLanguage: Detectar automáticamente el idioma y mostrar el botón de t
 indexableDescription: Permitir que el buscador integrado muestre tus publicaciones
 reactions: Reacciones
 exportZip: Exportar ZIP
-emojiPackCreator: Creador de pack de Emoji
 importZip: Importar ZIP
 vibrate: Reproducir vibraciones
 openServerInfo: Mostrar información del servidor al presionar el simbolo del servidor
@@ -2176,3 +2175,10 @@ moreUrlsDescription: 'Ingrese los enlaces de las páginas que desea Fijar en el
   de ayuda, ubicado en la esquina inferior izquierda, usando este formato de notación:
   ["Nombre para mostrar": https://su-enlace.com/]'
 quotes: Citaciónes
+markLocalFilesNsfwByDefault: Marcar todo nuevo archivo local como sensible por defecto
+toReply: Respuesta
+toPost: Publicar
+sentFollowRequests: Enviar solicitudes de seguimiento
+toQuote: Cita
+replyMute: Silenciar respuestas en la linea de tiempo
+replyUnmute: Anular respuestas en las lineas de tiempo
diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml
index 44cec380ca..209b103896 100644
--- a/locales/fr-FR.yml
+++ b/locales/fr-FR.yml
@@ -2193,7 +2193,6 @@ addRe: Ajouter « re: » au début d'un avertissement de contenu (CW) en répo
 confirm: Confirmer
 importZip: Importer ZIP
 exportZip: Exporter ZIP
-emojiPackCreator: Créateur de pack d'émoji
 detectPostLanguage: Détecter automatiquement la langue et afficher un bouton de traduction
   pour les publications en langues étrangères
 indexableDescription: Permettre à la recherche interne d'afficher vos publications
diff --git a/locales/id-ID.yml b/locales/id-ID.yml
index 325941779d..28ea9c5a0e 100644
--- a/locales/id-ID.yml
+++ b/locales/id-ID.yml
@@ -2147,7 +2147,6 @@ addRe: Tambahkan "re:" pada awal komentar balasan postingan dengan peringatan ko
 confirm: Konfirmasi
 importZip: Impor ZIP
 exportZip: Ekspor ZIP
-emojiPackCreator: Pembuat paket emoji
 detectPostLanguage: Deteksi bahasa secara otomatis dan tampilkan tombol terjemahkan
   untuk kiriman dalam bahasa asing
 indexableDescription: Perbolehkan pencarian di sini untuk menampilkan kiriman publikmu
diff --git a/locales/it-IT.yml b/locales/it-IT.yml
index 8ecfd09bdc..4039e2b385 100644
--- a/locales/it-IT.yml
+++ b/locales/it-IT.yml
@@ -2132,7 +2132,6 @@ _messaging:
 confirm: Conferma
 importZip: Importa ZIP
 exportZip: Esporta ZIP
-emojiPackCreator: Creazione di un pacchetto Emoji
 addRe: Aggiungi "re:" all'inizio di un commento in risposta a un post che ha un content
   warning
 detectPostLanguage: Riconosci la lingua automaticamente e mostra il bottone per tradurre
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 437fae7733..354e47b9b4 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -2011,7 +2011,6 @@ delete2faConfirm: これで、このアカウントの2要素認証は完全に
 inputNotMatch: 入力が一致しません
 deletePasskeysConfirm: これで、このアカウントのパスキーは完全に削除されます。続行しますか?
 importZip: ZIPをインポート
-emojiPackCreator: 絵文字パックの作者
 confirm: 確認
 exportZip: ZIPをエクスポート
 openServerInfo: "投稿内のサーバー名をクリックでサーバー情報を開く"
@@ -2090,3 +2089,4 @@ cancelScheduledPost: 予約を解除する
 scheduledPostAt: '{time}に投稿されます'
 strongPassword: 強いパスワード
 addAlt4MeTag: '説明の無いファイルを投稿する際に自動で #Alt4Me のハッシュタグをつける'
+turnOffCatLanguage: 猫語への変換を無効化する
diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml
index bad1f8ee80..2f2c54c7e6 100644
--- a/locales/ko-KR.yml
+++ b/locales/ko-KR.yml
@@ -1980,7 +1980,6 @@ _feeds:
 _dialog:
   charactersExceeded: 글자 수 제한을 초과했습니다! 현재 {current}자 / 최대 {max}자
   charactersBelow: 최소 글자 수 보다 작습니다! 현재 {current}자 / 최소 {max}자
-emojiPackCreator: 이모지 팩 만든이
 objectStorageS3ForcePathStyleDesc: Endpoint URL을 '<bucket>.s3.amazonaws.com'가 아닌 's3.amazonaws.com/<bucket>/'와
   같은 형식으로 사용할 경우에 활성화해 주세요.
 confirm: 확인
diff --git a/locales/no-NO.yml b/locales/no-NO.yml
index adafb8face..9bde2c9ae3 100644
--- a/locales/no-NO.yml
+++ b/locales/no-NO.yml
@@ -1859,7 +1859,6 @@ enterSendsMessage: Trykk enter for å sende meldinger. (Hvis avslått må du try
 confirmToUnclipAlreadyClippedNote: Denne posten er allerede en del av utklippet "{name}".
   Vil du fjerne den fra dette utklippet i stedet?
 showWithSparkles: Vis med gnister
-emojiPackCreator: Emoji-pakke-bygger
 importZip: Importer zip-fil
 pushNotificationAlreadySubscribed: Push-varsler er allerede påslått
 ratio: Forhold
diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml
index e360b5ae27..c2d59df339 100644
--- a/locales/ru-RU.yml
+++ b/locales/ru-RU.yml
@@ -2113,7 +2113,6 @@ removeMember: Удалить участника
 confirm: Подтвердить
 importZip: Импортировать ZIP
 exportZip: Экспортировать ZIP
-emojiPackCreator: Генератор паков эмодзи
 objectStorageS3ForcePathStyle: Использовать путь вместо домена в URL
 objectStorageS3ForcePathStyleDesc: Включите, если хотите, чтобы URL был в формате
   's3.amazonaws.com/<bucket>/' вместо '<bucket>.s3.amazonaws.com'.
diff --git a/locales/tr-TR.yml b/locales/tr-TR.yml
index 66bfe28133..b22dfac06d 100644
--- a/locales/tr-TR.yml
+++ b/locales/tr-TR.yml
@@ -2123,7 +2123,6 @@ indexableDescription: Yerleşik aramanın herkese açık gönderilerinizi göste
 addRe: İçerik uyarısına sahip bir gönderiye yanıt olarak paylaşılan gönderinin başına
   "re:" ekle
 exportZip: ZIP dışa aktar
-emojiPackCreator: Emoji paketi oluşturucu
 importZip: ZIP içe aktar
 indexable: Endekslenebilir
 languageForTranslation: Çeviri sonrası dili
diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml
index 206a52ce95..c170d7fbed 100644
--- a/locales/uk-UA.yml
+++ b/locales/uk-UA.yml
@@ -2126,4 +2126,3 @@ addRe: Додати "re:" на початку коментаря у відпов
 confirm: Підтвердити
 importZip: Імпортувати ZIP
 exportZip: Експортувати ZIP
-emojiPackCreator: Генератор паків емодзі
diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml
index 8e7923670d..3d80c0fcfd 100644
--- a/locales/zh-CN.yml
+++ b/locales/zh-CN.yml
@@ -1993,7 +1993,6 @@ exportZip: 导出 ZIP
 getQrCode: "获取二维码"
 remoteFollow: "远程关注"
 copyRemoteFollowUrl: "复制远程关注 URL"
-emojiPackCreator: 表情包创建工具
 objectStorageS3ForcePathStyleDesc: 打开此选项可构建格式为 "s3.amazonaws.com/<bucket>/" 而非 "<bucket>.s3.amazonaws.com"
   的端点 URL。
 objectStorageS3ForcePathStyle: 使用基于路径的端点 URL
diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml
index d9916dca19..6c8f1c4727 100644
--- a/locales/zh-TW.yml
+++ b/locales/zh-TW.yml
@@ -1972,7 +1972,6 @@ _feeds:
   rss: RSS
   copyFeed: 複製訂閱URL
   jsonFeed: JSON Feed
-emojiPackCreator: 表情包的作者
 importZip: 匯入ZIP
 delete2fa: 停用二階段認證(2FA)
 confirm: 確認
diff --git a/package.json b/package.json
index 1f6e3c65d3..701c8cc29b 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 		"type": "git",
 		"url": "https://firefish.dev/firefish/firefish.git"
 	},
-	"packageManager": "pnpm@9.4.0",
+	"packageManager": "pnpm@9.5.0",
 	"private": true,
 	"scripts": {
 		"rebuild": "pnpm run clean && pnpm run build",
@@ -47,8 +47,8 @@
 		"@biomejs/cli-darwin-x64": "1.8.3",
 		"@biomejs/cli-linux-arm64": "1.8.3",
 		"@biomejs/cli-linux-x64": "1.8.3",
-		"@types/node": "20.14.9",
+		"@types/node": "20.14.10",
 		"execa": "9.3.0",
-		"pnpm": "9.4.0"
+		"pnpm": "9.5.0"
 	}
 }
diff --git a/packages/backend-rs/README.md b/packages/backend-rs/README.md
new file mode 100644
index 0000000000..b1c2a45037
--- /dev/null
+++ b/packages/backend-rs/README.md
@@ -0,0 +1,114 @@
+A work-in-progress Firefish backend written in Rust
+
+Minimum supported Rust version (MSRV): 1.74
+
+Auto-generated documentation is at <https://docs.firefish.dev/backend_rs>
+
+# How to write the code
+
+Currently, there is no entrypoint in this project, and all functions are executed via Node-API.
+
+You need to apply the [`macros::export`] proc macro to export a function to the Node.js backend:
+
+```rust,ignore
+#[macros::export]
+pub fn to_be_exported(value: &str) -> i32 {
+    // You can also call other functions that are not exported
+    do_something();
+    42
+}
+
+fn do_something() {
+    do_other_thing();
+}
+```
+
+this code will be translated into this TypeScript code:
+
+```typescript
+export declare function toBeExported(value: string): number {
+    /* executes the compiled Rust function */
+}
+```
+
+You can also export `async` functions:
+
+```rust,ignore
+#[macros::export]
+pub async fn async_function() -> i32 {
+    some_async_task().await
+}
+```
+
+```typescript
+export declare function asyncFunction(): Promise<number> {
+    /* executes the compiled Rust function */
+}
+```
+
+You need to specify `object` attribute to export `struct`s:
+
+```rust,ignore
+#[macros::export(object)]
+pub struct Thing {
+    pub field_one: String,
+    pub field_two: Option<String>,
+}
+```
+
+```typescript
+export interface Thing {
+    fieldOne: string
+    fieldTwo: string | null
+}
+```
+
+# Update auto-generated files
+
+These files are auto-generated and are not intended for manual editing:
+- `packages/backend-rs/index.js`
+- `packages/backend-rs/index.d.ts`
+- [`packages/backend-rs/src/model/entity/*`](crate::model::entity)
+
+## Prerequisites
+
+1. `dev/config.env` (see `dev/config.example.env` for reference)
+2. PostgreSQL database listening on port `25432`
+3. Dev dependencies
+    - [GNU Make](<https://www.gnu.org/software/make/>)
+    - [sea-orm-cli](<https://www.sea-ql.org/SeaORM/docs/generate-entity/sea-orm-cli/>)
+
+## Update database entity
+
+Run the following command in the repository root directory
+
+```sh
+make entities
+```
+
+## Update `index.js` and `index.d.ts`
+
+Run the following command in the repository root directory
+
+```sh
+make napi
+```
+
+# Unit tests
+
+It is highly encouraged that you write unit tests and test the code yourself (there is no integration test at this point).
+
+## Prerequisites
+
+1. `dev/config.env` (see `dev/config.example.env` for reference)
+2. Firefish config file (`.config/default.yml`)
+3. Dev dependency
+    - [cargo-nextest](<https://nexte.st/>)
+
+## Run unit tests
+
+Run the following command in the repository root directory
+
+```sh
+pnpm run test:rs
+```
diff --git a/packages/backend-rs/index.d.ts b/packages/backend-rs/index.d.ts
index c7348d8636..3b6d5a7a72 100644
--- a/packages/backend-rs/index.d.ts
+++ b/packages/backend-rs/index.d.ts
@@ -1147,18 +1147,16 @@ export type PushNotificationKind =  'generic'|
 'readAllNotifications'|
 'mastodon';
 
-export enum PushSubscriptionType {
-  AdminReport = 'adminReport',
-  AdminSignUp = 'adminSignUp',
-  Favourite = 'favourite',
-  Follow = 'follow',
-  FollowRequest = 'followRequest',
-  Mention = 'mention',
-  Poll = 'poll',
-  Reblog = 'reblog',
-  Status = 'status',
-  Update = 'update'
-}
+export type PushSubscriptionType =  'adminReport'|
+'adminSignUp'|
+'favourite'|
+'follow'|
+'followRequest'|
+'mention'|
+'poll'|
+'reblog'|
+'status'|
+'update';
 
 export interface RedisConfig {
   host: string
diff --git a/packages/backend-rs/src/lib.rs b/packages/backend-rs/src/lib.rs
index 1b9933fb8a..ff7a49a471 100644
--- a/packages/backend-rs/src/lib.rs
+++ b/packages/backend-rs/src/lib.rs
@@ -1,3 +1,5 @@
+#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/README.md"))]
+
 pub mod config;
 pub mod database;
 pub mod federation;
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 8cda70743b..298b3b0f72 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -35,7 +35,7 @@
 		"archiver": "7.0.1",
 		"async-lock": "1.4.0",
 		"async-mutex": "0.5.0",
-		"aws-sdk": "2.1654.0",
+		"aws-sdk": "2.1655.0",
 		"axios": "1.7.2",
 		"backend-rs": "workspace:*",
 		"blurhash": "2.0.5",
@@ -140,7 +140,7 @@
 		"@types/koa__multer": "2.0.7",
 		"@types/koa__router": "12.0.4",
 		"@types/mocha": "10.0.7",
-		"@types/node": "20.14.9",
+		"@types/node": "20.14.10",
 		"@types/node-fetch": "2.6.11",
 		"@types/nodemailer": "6.4.15",
 		"@types/oauth": "0.9.5",
diff --git a/packages/client/package.json b/packages/client/package.json
index 5def464b86..ad2db35cda 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -45,7 +45,7 @@
 		"check-password-strength": "2.0.10",
 		"city-timezones": "1.2.1",
 		"compare-versions": "6.1.0",
-		"cropperjs": "2.0.0-rc.0",
+		"cropperjs": "2.0.0-rc.1",
 		"date-fns": "3.6.0",
 		"emojilib": "3.0.12",
 		"eventemitter3": "5.0.1",
diff --git a/packages/client/src/components/note/MkNoteHeader.vue b/packages/client/src/components/note/MkNoteHeader.vue
index c5abfef6b2..1188f14575 100644
--- a/packages/client/src/components/note/MkNoteHeader.vue
+++ b/packages/client/src/components/note/MkNoteHeader.vue
@@ -58,6 +58,7 @@ import { userPage } from "@/filters/user";
 import { i18n } from "@/i18n";
 import { pageWindow } from "@/os";
 import icon from "@/scripts/icon";
+import { me, isSignedIn } from "@/me";
 
 const props = defineProps<{
 	note: entities.Note;
@@ -71,6 +72,8 @@ const showTicker =
 
 function openServerInfo() {
 	if (!props.canOpenServerInfo || !defaultStore.state.openServerInfo) return;
+	if (props.note.user.host != null && !isSignedIn(me)) return;
+
 	const instanceInfoUrl =
 		props.note.user.host == null
 			? "/about"
diff --git a/packages/client/src/pages/admin/emojis.vue b/packages/client/src/pages/admin/emojis.vue
index 869979063c..4f64c69085 100644
--- a/packages/client/src/pages/admin/emojis.vue
+++ b/packages/client/src/pages/admin/emojis.vue
@@ -322,13 +322,6 @@ const menu = (ev: MouseEvent) => {
 						});
 				},
 			},
-			{
-				icon: `${icon("ph-info")}`,
-				text: i18n.ts.emojiPackCreator,
-				action: () => {
-					window.open("https://firefish.dev/firefish/emoji-gen", "_blank");
-				},
-			},
 		],
 		ev.currentTarget ?? ev.target,
 	);
diff --git a/packages/client/src/pages/settings/accessibility.vue b/packages/client/src/pages/settings/accessibility.vue
new file mode 100644
index 0000000000..18ed74ad42
--- /dev/null
+++ b/packages/client/src/pages/settings/accessibility.vue
@@ -0,0 +1,195 @@
+<template>
+	<div class="_formRoot">
+		<FormSection>
+			<FormSwitch v-model="showNoAltTextWarning" class="_formBlock">{{
+				i18n.ts.showNoAltTextWarning
+			}}</FormSwitch>
+			<FormSwitch v-if="showNoAltTextWarning" v-model="showAddFileDescriptionAtFirstPost" class="_formBlock">{{
+				i18n.ts.showAddFileDescriptionAtFirstPost
+			}}</FormSwitch>
+			<FormSwitch v-model="addAlt4MeTag" class="_formBlock">{{
+				i18n.ts.addAlt4MeTag
+			}}</FormSwitch>
+			<FormSwitch v-model="expandOnNoteClick" class="_formBlock"
+				>{{ i18n.ts.expandOnNoteClick
+				}}<template #caption>{{
+					i18n.ts.expandOnNoteClickDesc
+				}}</template>
+			</FormSwitch>
+			<FormSwitch v-model="turnOffCatLanguage" @update:modelValue="save()" class="_formBlock"
+				>{{ i18n.ts.turnOffCatLanguage }}<template #caption>{{
+					i18n.ts.reflectMayTakeTime
+				}}</template>
+			</FormSwitch>
+			<FormSwitch v-model="advancedMfm" class="_formBlock">
+				{{ i18n.ts._mfm.advanced
+				}}<template #caption>{{
+					i18n.ts._mfm.advancedDescription
+				}}</template>
+			</FormSwitch>
+			<FormSwitch v-model="autoplayMfm" class="_formBlock">
+				{{ i18n.ts._mfm.alwaysPlay }}
+				<template #caption>
+					<i
+						:class="icon('ph-warning')"
+						style="color: var(--warn)"
+					></i>
+					{{ i18n.ts._mfm.warn }}
+				</template>
+			</FormSwitch>
+			<FormSwitch v-model="reduceAnimation" class="_formBlock">{{
+				i18n.ts.reduceUiAnimation
+			}}</FormSwitch>
+			<FormSwitch
+				v-model="disableShowingAnimatedImages"
+				class="_formBlock"
+				>{{ i18n.ts.disableShowingAnimatedImages }}</FormSwitch
+			>
+			<FormSwitch v-model="useSystemFont" class="_formBlock">{{
+				i18n.ts.useSystemFont
+			}}</FormSwitch>
+			<FormSwitch v-model="useOsNativeEmojis" class="_formBlock">
+				{{ i18n.ts.useOsNativeEmojis }}
+				<div>
+					<Mfm :key="useOsNativeEmojis" text="🍮🍦🍭🍩🍰🍫🍬🥞🍪" />
+				</div>
+			</FormSwitch>
+			<FormSwitch
+				v-model="vibrate"
+				class="_formBlock"
+				@click="demoVibrate"
+				>{{ i18n.ts.vibrate }}
+			</FormSwitch>
+			<FormRadios v-model="fontSize" class="_formBlock">
+				<template #label>{{ i18n.ts.fontSize }}</template>
+				<option :value="null">
+					<span style="font-size: 14px">14</span>
+				</option>
+				<option value="15">
+					<span style="font-size: 15px">15</span>
+				</option>
+				<option value="16">
+					<span style="font-size: 16px">16</span>
+				</option>
+				<option value="17">
+					<span style="font-size: 17px">17</span>
+				</option>
+				<option value="18">
+					<span style="font-size: 18px">18</span>
+				</option>
+			</FormRadios>
+
+			<!-- <FormRange
+				v-model="fontSize"
+				:min="12"
+				:max="18"
+				:step="1"
+				:value="fontSize ? fontSize : 14"
+				easing
+				:showTicks="true"
+				class="_formBlock"
+			>
+				<template #label>{{ i18n.ts.fontSize }}</template>
+			</FormRange> -->
+		</FormSection>
+	</div>
+</template>
+
+<script lang="ts" setup>
+import { computed, ref, watch } from "vue";
+import { me } from "@/me";
+import FormSwitch from "@/components/form/switch.vue";
+import FormRadios from "@/components/form/radios.vue";
+import FormSection from "@/components/form/section.vue";
+import { ColdDeviceStorage, defaultStore } from "@/store";
+import * as os from "@/os";
+import { unisonReload } from "@/scripts/unison-reload";
+import { i18n } from "@/i18n";
+import { definePageMetadata } from "@/scripts/page-metadata";
+import icon from "@/scripts/icon";
+
+const fontSize = ref(localStorage.getItem("fontSize"));
+const useSystemFont = ref(localStorage.getItem("useSystemFont") !== "f");
+const turnOffCatLanguage = ref(!me?.readCatLanguage);
+
+function save() {
+	os.api("i/update", {
+		readCatLanguage: !turnOffCatLanguage.value,
+	});
+}
+
+async function reloadAsk() {
+	const { canceled } = await os.confirm({
+		type: "info",
+		text: i18n.ts.reloadToApplySetting,
+	});
+	if (canceled) return;
+
+	unisonReload();
+}
+
+function demoVibrate() {
+	window.navigator.vibrate(100);
+}
+
+const reduceAnimation = computed(
+	defaultStore.makeGetterSetter(
+		"animation",
+		(v) => !v,
+		(v) => !v,
+	),
+);
+const advancedMfm = computed(defaultStore.makeGetterSetter("advancedMfm"));
+const autoplayMfm = computed(
+	defaultStore.makeGetterSetter(
+		"animatedMfm",
+		(v) => !v,
+		(v) => !v,
+	),
+);
+const useOsNativeEmojis = computed(
+	defaultStore.makeGetterSetter("useOsNativeEmojis"),
+);
+const disableShowingAnimatedImages = computed(
+	defaultStore.makeGetterSetter("disableShowingAnimatedImages"),
+);
+const vibrate = computed(ColdDeviceStorage.makeGetterSetter("vibrate"));
+const expandOnNoteClick = computed(
+	defaultStore.makeGetterSetter("expandOnNoteClick"),
+);
+const showNoAltTextWarning = computed(
+	defaultStore.makeGetterSetter("showNoAltTextWarning"),
+);
+const showAddFileDescriptionAtFirstPost = computed(
+	defaultStore.makeGetterSetter("showAddFileDescriptionAtFirstPost"),
+);
+const addAlt4MeTag = computed(defaultStore.makeGetterSetter("addAlt4MeTag"));
+
+watch(fontSize, () => {
+	if (fontSize.value == null) {
+		localStorage.removeItem("fontSize");
+	} else {
+		localStorage.setItem("fontSize", fontSize.value);
+	}
+});
+
+watch(useSystemFont, () => {
+	if (useSystemFont.value) {
+		localStorage.setItem("useSystemFont", "t");
+	} else {
+		localStorage.setItem("useSystemFont", "f");
+	}
+});
+
+watch(
+	[fontSize, useSystemFont, advancedMfm, autoplayMfm, expandOnNoteClick],
+	async () => {
+		await reloadAsk();
+	},
+);
+
+definePageMetadata({
+	title: i18n.ts.accessibility,
+	icon: `${icon("ph-person-arms-spread")}`,
+});
+</script>
diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue
index aa6d2a9ad5..2e27818e2f 100644
--- a/packages/client/src/pages/settings/general.vue
+++ b/packages/client/src/pages/settings/general.vue
@@ -183,91 +183,6 @@
 			</FormSelect>
 		</FormSection>
 
-		<FormSection>
-			<template #label>{{ i18n.ts.accessibility }}</template>
-			<FormSwitch v-model="showNoAltTextWarning" class="_formBlock">{{
-				i18n.ts.showNoAltTextWarning
-			}}</FormSwitch>
-			<FormSwitch v-if="showNoAltTextWarning" v-model="showAddFileDescriptionAtFirstPost" class="_formBlock">{{
-				i18n.ts.showAddFileDescriptionAtFirstPost
-			}}</FormSwitch>
-			<FormSwitch v-model="addAlt4MeTag" class="_formBlock">{{
-				i18n.ts.addAlt4MeTag
-			}}</FormSwitch>
-			<FormSwitch v-model="expandOnNoteClick" class="_formBlock"
-				>{{ i18n.ts.expandOnNoteClick
-				}}<template #caption>{{
-					i18n.ts.expandOnNoteClickDesc
-				}}</template>
-			</FormSwitch>
-			<FormSwitch v-model="turnOffCatLanguage" @update:modelValue="save()" class="_formBlock"
-				>{{ i18n.ts.turnOffCatLanguage }}<template #caption>{{
-					i18n.ts.reflectMayTakeTime
-				}}</template>
-			</FormSwitch>
-			<FormSwitch v-model="advancedMfm" class="_formBlock">
-				{{ i18n.ts._mfm.advanced
-				}}<template #caption>{{
-					i18n.ts._mfm.advancedDescription
-				}}</template>
-			</FormSwitch>
-			<FormSwitch v-model="autoplayMfm" class="_formBlock">
-				{{ i18n.ts._mfm.alwaysPlay }}
-				<template #caption>
-					<i
-						:class="icon('ph-warning')"
-						style="color: var(--warn)"
-					></i>
-					{{ i18n.ts._mfm.warn }}
-				</template>
-			</FormSwitch>
-			<FormSwitch v-model="reduceAnimation" class="_formBlock">{{
-				i18n.ts.reduceUiAnimation
-			}}</FormSwitch>
-			<FormSwitch
-				v-model="disableShowingAnimatedImages"
-				class="_formBlock"
-				>{{ i18n.ts.disableShowingAnimatedImages }}</FormSwitch
-			>
-			<FormSwitch
-				v-model="vibrate"
-				class="_formBlock"
-				@click="demoVibrate"
-				>{{ i18n.ts.vibrate }}
-			</FormSwitch>
-			<FormRadios v-model="fontSize" class="_formBlock">
-				<template #label>{{ i18n.ts.fontSize }}</template>
-				<option :value="null">
-					<span style="font-size: 14px">14</span>
-				</option>
-				<option value="15">
-					<span style="font-size: 15px">15</span>
-				</option>
-				<option value="16">
-					<span style="font-size: 16px">16</span>
-				</option>
-				<option value="17">
-					<span style="font-size: 17px">17</span>
-				</option>
-				<option value="18">
-					<span style="font-size: 18px">18</span>
-				</option>
-			</FormRadios>
-
-			<!-- <FormRange
-				v-model="fontSize"
-				:min="12"
-				:max="18"
-				:step="1"
-				:value="fontSize ? fontSize : 14"
-				easing
-				:showTicks="true"
-				class="_formBlock"
-			>
-				<template #label>{{ i18n.ts.fontSize }}</template>
-			</FormRange> -->
-		</FormSection>
-
 		<FormSection>
 			<template #label>{{ i18n.ts.appearance }}</template>
 			<FormSwitch v-model="showAds" class="_formBlock">{{
@@ -299,15 +214,6 @@
 			<FormSwitch v-model="seperateRenoteQuote" class="_formBlock">{{
 				i18n.ts.seperateRenoteQuote
 			}}</FormSwitch>
-			<FormSwitch v-model="useSystemFont" class="_formBlock">{{
-				i18n.ts.useSystemFont
-			}}</FormSwitch>
-			<FormSwitch v-model="useOsNativeEmojis" class="_formBlock">
-				{{ i18n.ts.useOsNativeEmojis }}
-				<div>
-					<Mfm :key="useOsNativeEmojis" text="🍮🍦🍭🍩🍰🍫🍬🥞🍪" />
-				</div>
-			</FormSwitch>
 			<FormSwitch v-model="disableDrawer" class="_formBlock">{{
 				i18n.ts.disableDrawer
 			}}</FormSwitch>
@@ -415,7 +321,7 @@ import FormSection from "@/components/form/section.vue";
 import FormLink from "@/components/form/link.vue";
 import MkLink from "@/components/MkLink.vue";
 import { langs } from "@/config";
-import { ColdDeviceStorage, defaultStore } from "@/store";
+import { defaultStore } from "@/store";
 import * as os from "@/os";
 import { unisonReload } from "@/scripts/unison-reload";
 import { i18n } from "@/i18n";
@@ -426,15 +332,6 @@ import icon from "@/scripts/icon";
 const lang = ref(localStorage.getItem("lang"));
 const serverLang = ref(me?.lang);
 const translateLang = ref(localStorage.getItem("translateLang"));
-const fontSize = ref(localStorage.getItem("fontSize"));
-const useSystemFont = ref(localStorage.getItem("useSystemFont") !== "f");
-const turnOffCatLanguage = ref(!me?.readCatLanguage);
-
-function save() {
-	os.api("i/update", {
-		readCatLanguage: !turnOffCatLanguage.value,
-	});
-}
 
 async function reloadAsk() {
 	const { canceled } = await os.confirm({
@@ -446,23 +343,12 @@ async function reloadAsk() {
 	unisonReload();
 }
 
-function demoVibrate() {
-	window.navigator.vibrate(100);
-}
-
 const overridedDeviceKind = computed(
 	defaultStore.makeGetterSetter("overridedDeviceKind"),
 );
 const serverDisconnectedBehavior = computed(
 	defaultStore.makeGetterSetter("serverDisconnectedBehavior"),
 );
-const reduceAnimation = computed(
-	defaultStore.makeGetterSetter(
-		"animation",
-		(v) => !v,
-		(v) => !v,
-	),
-);
 const useBlurEffectForModal = computed(
 	defaultStore.makeGetterSetter("useBlurEffectForModal"),
 );
@@ -471,31 +357,13 @@ const showGapBetweenNotesInTimeline = computed(
 	defaultStore.makeGetterSetter("showGapBetweenNotesInTimeline"),
 );
 const showAds = computed(defaultStore.makeGetterSetter("showAds"));
-const advancedMfm = computed(defaultStore.makeGetterSetter("advancedMfm"));
-const autoplayMfm = computed(
-	defaultStore.makeGetterSetter(
-		"animatedMfm",
-		(v) => !v,
-		(v) => !v,
-	),
-);
-const useOsNativeEmojis = computed(
-	defaultStore.makeGetterSetter("useOsNativeEmojis"),
-);
 const disableDrawer = computed(defaultStore.makeGetterSetter("disableDrawer"));
-const disableShowingAnimatedImages = computed(
-	defaultStore.makeGetterSetter("disableShowingAnimatedImages"),
-);
-const vibrate = computed(ColdDeviceStorage.makeGetterSetter("vibrate"));
 const loadRawImages = computed(defaultStore.makeGetterSetter("loadRawImages"));
 const imageNewTab = computed(defaultStore.makeGetterSetter("imageNewTab"));
 const nsfw = computed(defaultStore.makeGetterSetter("nsfw"));
 const disablePagesScript = computed(
 	defaultStore.makeGetterSetter("disablePagesScript"),
 );
-const expandOnNoteClick = computed(
-	defaultStore.makeGetterSetter("expandOnNoteClick"),
-);
 const showFixedPostForm = computed(
 	defaultStore.makeGetterSetter("showFixedPostForm"),
 );
@@ -565,12 +433,6 @@ const enablePullToRefresh = computed(
 const pullToRefreshThreshold = computed(
 	defaultStore.makeGetterSetter("pullToRefreshThreshold"),
 );
-const showNoAltTextWarning = computed(
-	defaultStore.makeGetterSetter("showNoAltTextWarning"),
-);
-const showAddFileDescriptionAtFirstPost = computed(
-	defaultStore.makeGetterSetter("showAddFileDescriptionAtFirstPost"),
-);
 const autocorrectNoteLanguage = computed(
 	defaultStore.makeGetterSetter("autocorrectNoteLanguage"),
 );
@@ -583,7 +445,6 @@ const mergeThreadInTimeline = computed(
 const mergeRenotesInTimeline = computed(
 	defaultStore.makeGetterSetter("mergeRenotesInTimeline"),
 );
-const addAlt4MeTag = computed(defaultStore.makeGetterSetter("addAlt4MeTag"));
 
 // This feature (along with injectPromo) is currently disabled
 // function onChangeInjectFeaturedNote(v) {
@@ -619,28 +480,10 @@ watch(translateLang, () => {
 	localStorage.setItem("translateLang", translateLang.value as string);
 });
 
-watch(fontSize, () => {
-	if (fontSize.value == null) {
-		localStorage.removeItem("fontSize");
-	} else {
-		localStorage.setItem("fontSize", fontSize.value);
-	}
-});
-
-watch(useSystemFont, () => {
-	if (useSystemFont.value) {
-		localStorage.setItem("useSystemFont", "t");
-	} else {
-		localStorage.setItem("useSystemFont", "f");
-	}
-});
-
 watch(
 	[
 		lang,
 		translateLang,
-		fontSize,
-		useSystemFont,
 		enableInfiniteScroll,
 		squareAvatars,
 		showGapBetweenNotesInTimeline,
@@ -652,9 +495,6 @@ watch(
 		swipeOnDesktop,
 		seperateRenoteQuote,
 		showAdminUpdates,
-		advancedMfm,
-		autoplayMfm,
-		expandOnNoteClick,
 		iconSet,
 		useEmojiCdn,
 		enableTimelineStreaming,
diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue
index 96e538898a..a3d9f4fb66 100644
--- a/packages/client/src/pages/settings/index.vue
+++ b/packages/client/src/pages/settings/index.vue
@@ -106,12 +106,6 @@ const menuDef = computed(() => [
 				to: "/settings/drive",
 				active: currentPage.value?.route.name === "drive",
 			},
-			{
-				icon: `${icon("ph-bell")}`,
-				text: i18n.ts.notifications,
-				to: "/settings/notifications",
-				active: currentPage.value?.route.name === "notifications",
-			},
 			{
 				icon: `${icon("ph-envelope-simple-open")}`,
 				text: i18n.ts.email,
@@ -141,6 +135,18 @@ const menuDef = computed(() => [
 				to: "/settings/theme",
 				active: currentPage.value?.route.name === "theme",
 			},
+			{
+				icon: `${icon("ph-person-arms-spread")}`,
+				text: i18n.ts.accessibility,
+				to: "/settings/accessibility",
+				active: currentPage.value?.route.name === "accessibility",
+			},
+			{
+				icon: `${icon("ph-bell")}`,
+				text: i18n.ts.notifications,
+				to: "/settings/notifications",
+				active: currentPage.value?.route.name === "notifications",
+			},
 			{
 				icon: `${icon("ph-list")}`,
 				text: i18n.ts.navbar,
@@ -170,18 +176,6 @@ const menuDef = computed(() => [
 	{
 		title: i18n.ts.otherSettings,
 		items: [
-			{
-				icon: `${icon("ph-airplane-takeoff")}`,
-				text: i18n.ts.migration,
-				to: "/settings/migration",
-				active: currentPage.value?.route.name === "migration",
-			},
-			{
-				icon: `${icon("ph-package")}`,
-				text: i18n.ts.importAndExport,
-				to: "/settings/import-export",
-				active: currentPage.value?.route.name === "import-export",
-			},
 			{
 				icon: `${icon("ph-speaker-none")}`,
 				text: i18n.ts.instanceMute,
@@ -212,6 +206,18 @@ const menuDef = computed(() => [
 				to: "/settings/webhook",
 				active: currentPage.value?.route.name === "webhook",
 			},
+			{
+				icon: `${icon("ph-package")}`,
+				text: i18n.ts.importAndExport,
+				to: "/settings/import-export",
+				active: currentPage.value?.route.name === "import-export",
+			},
+			{
+				icon: `${icon("ph-airplane-takeoff")}`,
+				text: i18n.ts.migration,
+				to: "/settings/migration",
+				active: currentPage.value?.route.name === "migration",
+			},
 			{
 				icon: `${icon("ph-dots-three-outline")}`,
 				text: i18n.ts.other,
diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts
index 2502c07281..9d3c51eede 100644
--- a/packages/client/src/router.ts
+++ b/packages/client/src/router.ts
@@ -91,6 +91,11 @@ export const routes: RouteDef[] = [
 				name: "notifications",
 				component: page(() => import("./pages/settings/notifications.vue")),
 			},
+			{
+				path: "/accessibility",
+				name: "accessibility",
+				component: page(() => import("./pages/settings/accessibility.vue")),
+			},
 			{
 				path: "/email",
 				name: "email",
diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts
index c1b26136cb..ca0fb91c5d 100644
--- a/packages/client/src/store.ts
+++ b/packages/client/src/store.ts
@@ -455,7 +455,7 @@ export const defaultStore = markRaw(
 		},
 		autocorrectNoteLanguage: {
 			where: "account",
-			default: true,
+			default: false,
 		},
 		foldNotification: {
 			where: "deviceAccount",
diff --git a/packages/firefish-js/package.json b/packages/firefish-js/package.json
index f929db6a2b..8e6b903a07 100644
--- a/packages/firefish-js/package.json
+++ b/packages/firefish-js/package.json
@@ -21,7 +21,7 @@
 	},
 	"devDependencies": {
 		"@types/jest": "29.5.12",
-		"@types/node": "20.14.9",
+		"@types/node": "20.14.10",
 		"jest": "29.7.0",
 		"jest-fetch-mock": "3.0.3",
 		"jest-websocket-mock": "2.5.0",
diff --git a/packages/macro-rs/macros/src/lib.rs b/packages/macro-rs/macros/src/lib.rs
index 533f058a96..6bc2c0ddc1 100644
--- a/packages/macro-rs/macros/src/lib.rs
+++ b/packages/macro-rs/macros/src/lib.rs
@@ -51,7 +51,7 @@ define_wrapper_proc_macro_attributes! {
     /// #[cfg_attr(feature = "napi", macros::napi(attr))]
     /// # fn f() {} // to work around doc test compilation error
     /// ```
-    /// where `attr` is given attribute(s). See [macro@napi] for more details.
+    /// where `attr` is given attribute(s). See [macro@napi] and [macros_impl::napi::napi] for more details.
     export(attr, item) {
         #[cfg_attr(feature = "napi", macros::napi(#attr))]
         #item
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d53e9d0f20..60ad394e11 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -28,14 +28,14 @@ importers:
         specifier: 1.8.3
         version: 1.8.3
       '@types/node':
-        specifier: 20.14.9
-        version: 20.14.9
+        specifier: 20.14.10
+        version: 20.14.10
       execa:
         specifier: 9.3.0
         version: 9.3.0
       pnpm:
-        specifier: 9.4.0
-        version: 9.4.0
+        specifier: 9.5.0
+        version: 9.5.0
 
   packages/backend:
     dependencies:
@@ -88,8 +88,8 @@ importers:
         specifier: 0.5.0
         version: 0.5.0
       aws-sdk:
-        specifier: 2.1654.0
-        version: 2.1654.0
+        specifier: 2.1655.0
+        version: 2.1655.0
       axios:
         specifier: 1.7.2
         version: 1.7.2
@@ -317,7 +317,7 @@ importers:
         version: 0.2.3
       typeorm:
         specifier: 0.3.20
-        version: 0.3.20(ioredis@5.4.1)(pg@8.12.0)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+        version: 0.3.20(ioredis@5.4.1)(pg@8.12.0)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       ulid:
         specifier: 2.3.0
         version: 2.3.0
@@ -398,8 +398,8 @@ importers:
         specifier: 10.0.7
         version: 10.0.7
       '@types/node':
-        specifier: 20.14.9
-        version: 20.14.9
+        specifier: 20.14.10
+        version: 20.14.10
       '@types/node-fetch':
         specifier: 2.6.11
         version: 2.6.11
@@ -483,7 +483,7 @@ importers:
         version: 9.5.1(typescript@5.5.3)(webpack@5.92.1)
       ts-node:
         specifier: 10.9.2
-        version: 10.9.2(@types/node@20.14.9)(typescript@5.5.3)
+        version: 10.9.2(@types/node@20.14.10)(typescript@5.5.3)
       tsc-alias:
         specifier: 1.8.10
         version: 1.8.10
@@ -570,7 +570,7 @@ importers:
         version: 10.0.0
       '@vitejs/plugin-vue':
         specifier: 5.0.5
-        version: 5.0.5(vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))(vue@3.4.31(typescript@5.5.3))
+        version: 5.0.5(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))(vue@3.4.31(typescript@5.5.3))
       '@vue/runtime-core':
         specifier: 3.4.31
         version: 3.4.31
@@ -608,8 +608,8 @@ importers:
         specifier: 6.1.0
         version: 6.1.0
       cropperjs:
-        specifier: 2.0.0-rc.0
-        version: 2.0.0-rc.0
+        specifier: 2.0.0-rc.1
+        version: 2.0.0-rc.1
       date-fns:
         specifier: 3.6.0
         version: 3.6.0
@@ -720,10 +720,10 @@ importers:
         version: 10.0.0
       vite:
         specifier: 5.3.3
-        version: 5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
+        version: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
       vite-plugin-compression:
         specifier: 0.5.1
-        version: 0.5.1(vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))
+        version: 0.5.1(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))
       vue:
         specifier: 3.4.31
         version: 3.4.31(typescript@5.5.3)
@@ -753,11 +753,11 @@ importers:
         specifier: 29.5.12
         version: 29.5.12
       '@types/node':
-        specifier: 20.14.9
-        version: 20.14.9
+        specifier: 20.14.10
+        version: 20.14.10
       jest:
         specifier: 29.7.0
-        version: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+        version: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       jest-fetch-mock:
         specifier: 3.0.3
         version: 3.0.3
@@ -769,10 +769,10 @@ importers:
         version: 9.3.1
       ts-jest:
         specifier: 29.1.5
-        version: 29.1.5(@babel/core@7.24.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.6))(jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)))(typescript@5.5.3)
+        version: 29.1.5(@babel/core@7.24.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.6))(jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)))(typescript@5.5.3)
       ts-node:
         specifier: 10.9.2
-        version: 10.9.2(@types/node@20.14.9)(typescript@5.5.3)
+        version: 10.9.2(@types/node@20.14.10)(typescript@5.5.3)
       tsc-alias:
         specifier: 1.8.10
         version: 1.8.10
@@ -793,10 +793,10 @@ importers:
         version: 6.2.1
       vite:
         specifier: 5.3.3
-        version: 5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
+        version: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
       vite-plugin-compression:
         specifier: 0.5.1
-        version: 0.5.1(vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))
+        version: 0.5.1(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))
 
 packages:
 
@@ -1091,38 +1091,38 @@ packages:
   '@chainsafe/is-ip@2.0.2':
     resolution: {integrity: sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==}
 
-  '@cropper/element-canvas@2.0.0-rc.0':
-    resolution: {integrity: sha512-SKrGJS5Wnx8RzTnqcDWxpW6GEW9k0pvNPiu5cFtpGl6dMbs1fBTBqhV8xiv4wiw9lzRvI+kZW+0AlKpYy3sFEQ==}
+  '@cropper/element-canvas@2.0.0-rc.1':
+    resolution: {integrity: sha512-jRt9OM7cls+zch8U2m7pA9wp8dNOz0EtedGKkqH+DInUYw1+UtonEJirrxyl1YHRgOme5M5DTsDmkUSrUiZN6g==}
 
-  '@cropper/element-crosshair@2.0.0-rc.0':
-    resolution: {integrity: sha512-3GcreYQ3wnVV57XZ7tmhkr39fxa3+dqql/odrtgjqPjWQe/wKgQCe3I3Zihs4hEIGpls1D6aF2uX670xR/wt2w==}
+  '@cropper/element-crosshair@2.0.0-rc.1':
+    resolution: {integrity: sha512-xfLelqM8EnRZUf7xEE88RWQQx5erUv7jrzni52bAw3/Ua8HXIz3uAMnkrGKOTBj8K4Rv/mNJY8k1DVAEfHY6Lg==}
 
-  '@cropper/element-grid@2.0.0-rc.0':
-    resolution: {integrity: sha512-tb2DaDH1v23lP/R6CJEEdSlNmz5nC+SGCiTHjNmnDAphnSrfzByOyc4q2+t88B3UbT574AtCe5sYZqraZwkQ3w==}
+  '@cropper/element-grid@2.0.0-rc.1':
+    resolution: {integrity: sha512-U/BYPl76upd9sXT+pZTFoQzUqWyNxdGs4YR2UtaVCfTMHLDTrssPAedmqEEnHgbqVcr325sIEfVmwWVA+v+8Dg==}
 
-  '@cropper/element-handle@2.0.0-rc.0':
-    resolution: {integrity: sha512-RLQKDXDRX7XwG4rxauGidqbzamACr4RCat4msGAg1ULOUL1Ba8r4e5cxaKfeYHcmNW9flBg+AbPF8SERwmU56w==}
+  '@cropper/element-handle@2.0.0-rc.1':
+    resolution: {integrity: sha512-GuOHbjkg5CP1+oFzWQeD7VZffUE86dp4gKv5egLxkBEwnQp1VQxjO7L1Wkgj+KsQymoDczsl+x4bF12KDyDg2g==}
 
-  '@cropper/element-image@2.0.0-rc.0':
-    resolution: {integrity: sha512-anlxSutFmfkaxXJGpdmSRx/h3Tk7ceD6G7FiGtu3hXwr7lFJQ7zFYOrV+1RdQnxahgKJdiUc540ijX+hrWXjBA==}
+  '@cropper/element-image@2.0.0-rc.1':
+    resolution: {integrity: sha512-ttzawKbUkR2A9U3bc2AN/jbNdszBP/yb83PIc5jekjOs+Z7kUBVdOo1SLIewpQ0DjUzhfCRXWUowP1McVQUXZw==}
 
-  '@cropper/element-selection@2.0.0-rc.0':
-    resolution: {integrity: sha512-On158qtmYG0nwIDH/1WqyMj2Fq4sLayWGJ0KgyWX6MRessY6pA+ZEt7jXq7TqTUfFVDs+pyeLHar4Dybs7U69A==}
+  '@cropper/element-selection@2.0.0-rc.1':
+    resolution: {integrity: sha512-AcRHRbsyt9xRfBD1QRyNDTS+vaYg6uAeuqhk/Ra58pqxlhtoimAV3oQ7uc/edwOlK60f/DxtKCc8rSOYFQ85bQ==}
 
-  '@cropper/element-shade@2.0.0-rc.0':
-    resolution: {integrity: sha512-w/zxsZKHNqfArQOsMgYUUms6OuACwJiJX86//ChDaZCooqFWwC0MuEmrRkuP/lcWqq3SdfeAwOpeoflsVOeDNQ==}
+  '@cropper/element-shade@2.0.0-rc.1':
+    resolution: {integrity: sha512-nHv2WujETENoIfxWQn7TYiOnXm5YUnZsoG4r6njK5cxj0gIUfPudUSbjWCQSuB2oxxpeEK8oyTdfOZtP9cxK4g==}
 
-  '@cropper/element-viewer@2.0.0-rc.0':
-    resolution: {integrity: sha512-XZlOrXFSdEyc711YTWPqIW2eyN1JdG3fL8hElXyYfIyZm7p0BVYMTVoX3jQ59K50FFegYclUYHUxRIybolOx7g==}
+  '@cropper/element-viewer@2.0.0-rc.1':
+    resolution: {integrity: sha512-xTj0BObCygbVWXc7t7FYZ9k2eFyWN360it5uGeAkImXcwINRQGTFcLLOjs6i3SwedI7F1a1yNcTBfoT1B/sNAg==}
 
-  '@cropper/element@2.0.0-rc.0':
-    resolution: {integrity: sha512-VrVQpUKZYBEq7GOxkzui5coSMALrRJUzqi0Z3FGJ1+wce7KqMuBMZQ2wkZIevAC+I0AWip4NNREXqeySexRMrQ==}
+  '@cropper/element@2.0.0-rc.1':
+    resolution: {integrity: sha512-OPKgjUgYC2Xmv77vEqtAR6bdfKOW+v9FrSjr4re3u95rcVj6NJ0JidIta41Ipp8KydHTXSmLetq4XDrA+vuIJQ==}
 
-  '@cropper/elements@2.0.0-rc.0':
-    resolution: {integrity: sha512-VAbLz+sBMkraDQNQPvMb6HoGYR8xQDj8d5Yf3V94KCUmcD9sHWkyhaHJ+ThXQc7oyhPqv2puPl9371ucl40j5w==}
+  '@cropper/elements@2.0.0-rc.1':
+    resolution: {integrity: sha512-6qbtCq3iL3dETVav2XA03a8iLkHXWMIqHFxViMjlLr9CSuDjjaS5wp0JDuGtPv5FHxjsjyQ8Yayt8Ak5p09Zxg==}
 
-  '@cropper/utils@2.0.0-rc.0':
-    resolution: {integrity: sha512-28owk7shP5915It+VeXFn1mjdClYfAlkqBU3yIkjkeOmMP7Fd7TX8/969bvamJW+5+8afcxzAshgs+zzKO+qBQ==}
+  '@cropper/utils@2.0.0-rc.1':
+    resolution: {integrity: sha512-kreB3wdrAhmTEscfB8/j7ksGBgYSKN+28t37CAI0Vb5DvX/aUDPDH+3e2kyD7YE+DIZgdnuY2FsMYJAQ9sTThg==}
 
   '@cspotcode/source-map-support@0.8.1':
     resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@@ -2046,11 +2046,11 @@ packages:
   '@octokit/openapi-types@22.2.0':
     resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==}
 
-  '@octokit/plugin-paginate-rest@11.3.1':
-    resolution: {integrity: sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==}
+  '@octokit/plugin-paginate-rest@11.3.3':
+    resolution: {integrity: sha512-o4WRoOJZlKqEEgj+i9CpcmnByvtzoUYC6I8PD2SA95M+BJ2x8h7oLcVOg9qcowWXBOdcTRsMZiwvM3EyLm9AfA==}
     engines: {node: '>= 18'}
     peerDependencies:
-      '@octokit/core': '5'
+      '@octokit/core': '>=6'
 
   '@octokit/plugin-request-log@5.3.0':
     resolution: {integrity: sha512-FiGcyjdtYPlr03ExBk/0ysIlEFIFGJQAVoPPMxL19B24bVSEiZQnVGBunNtaAF1YnvE/EFoDpXmITtRnyCiypQ==}
@@ -2058,11 +2058,11 @@ packages:
     peerDependencies:
       '@octokit/core': '>=6'
 
-  '@octokit/plugin-rest-endpoint-methods@13.2.2':
-    resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==}
+  '@octokit/plugin-rest-endpoint-methods@13.2.4':
+    resolution: {integrity: sha512-gusyAVgTrPiuXOdfqOySMDztQHv6928PQ3E4dqVGEtOvRXAKRbJR4b1zQyniIT9waqaWk/UDaoJ2dyPr7Bk7Iw==}
     engines: {node: '>= 18'}
     peerDependencies:
-      '@octokit/core': ^5
+      '@octokit/core': '>=6'
 
   '@octokit/request-error@6.1.1':
     resolution: {integrity: sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==}
@@ -2459,8 +2459,8 @@ packages:
   '@types/node-fetch@2.6.11':
     resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==}
 
-  '@types/node@20.14.9':
-    resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==}
+  '@types/node@20.14.10':
+    resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==}
 
   '@types/nodemailer@6.4.15':
     resolution: {integrity: sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==}
@@ -2700,8 +2700,8 @@ packages:
     engines: {node: '>=0.4.0'}
     hasBin: true
 
-  acorn@8.12.0:
-    resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==}
+  acorn@8.12.1:
+    resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
     engines: {node: '>=0.4.0'}
     hasBin: true
 
@@ -2801,8 +2801,8 @@ packages:
   asn1@0.2.6:
     resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
 
-  assert-never@1.2.1:
-    resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==}
+  assert-never@1.3.0:
+    resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==}
 
   assert-plus@1.0.0:
     resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
@@ -2839,8 +2839,8 @@ packages:
     resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
     engines: {node: '>= 0.4'}
 
-  aws-sdk@2.1654.0:
-    resolution: {integrity: sha512-b5ryvXipBJod9Uh1GUfQNgi5tIIiluxJbyqr/hZ/mr5U8WxrrfjVq3nGnx5JjevFKYRqXIywhumsVyanfACzFA==}
+  aws-sdk@2.1655.0:
+    resolution: {integrity: sha512-Tec0/ZHK8ES6NvAEJhgEm3znyoPb4QUuyQZ2RdvbNTbpJDbeeDuu4BaCAR5HbEVXREVk1/8OBDMsWW1B5lkcww==}
     engines: {node: '>= 10.0.0'}
 
   axios@0.24.0:
@@ -3038,8 +3038,8 @@ packages:
     resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
     engines: {node: '>=10'}
 
-  caniuse-lite@1.0.30001639:
-    resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==}
+  caniuse-lite@1.0.30001640:
+    resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==}
 
   canonicalize@1.0.8:
     resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==}
@@ -3469,8 +3469,8 @@ packages:
     resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==}
     engines: {node: '>=12.0.0'}
 
-  cropperjs@2.0.0-rc.0:
-    resolution: {integrity: sha512-/1oQT6Ten55trDVsC3OsVqp09ugf0T/QP8NKcvq0wIUTqpfDqpqD/Nk+c5sdbSKeoGyCwnswZYJJkFgLVm0HFA==}
+  cropperjs@2.0.0-rc.1:
+    resolution: {integrity: sha512-Y9ciurIuK6G1vy0ErHC8Gt6wHWvsHWJ5fgE60GL6vsuF2WzHwDpH7F1yof40XAEheeSN4v3rD09D1VZ7kiiSOA==}
 
   cross-env@7.0.3:
     resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
@@ -3751,8 +3751,8 @@ packages:
     engines: {node: '>=0.10.0'}
     hasBin: true
 
-  electron-to-chromium@1.4.815:
-    resolution: {integrity: sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==}
+  electron-to-chromium@1.4.818:
+    resolution: {integrity: sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==}
 
   emittery@0.13.1:
     resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
@@ -4141,9 +4141,9 @@ packages:
   glob-to-regexp@0.4.1:
     resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
 
-  glob@10.4.2:
-    resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==}
-    engines: {node: '>=16 || 14 >=14.18'}
+  glob@10.4.3:
+    resolution: {integrity: sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==}
+    engines: {node: '>=18'}
     hasBin: true
 
   glob@7.2.3:
@@ -4357,8 +4357,8 @@ packages:
   ini@1.3.8:
     resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
 
-  inquirer@9.3.2:
-    resolution: {integrity: sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw==}
+  inquirer@9.3.5:
+    resolution: {integrity: sha512-SVRCRovA7KaT6nqWB2mCNpTvU4cuZ0hOXo5KPyiyOcNNUIZwq/JKtvXuDJNaxfuJKabBYRu1ecHze0YEwDYoRQ==}
     engines: {node: '>=18'}
 
   insert-text-at-cursor@0.3.0:
@@ -4563,9 +4563,9 @@ packages:
     resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
     engines: {node: '>=8'}
 
-  jackspeak@3.1.2:
-    resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==}
-    engines: {node: '>=14'}
+  jackspeak@3.4.1:
+    resolution: {integrity: sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==}
+    engines: {node: '>=18'}
 
   jake@10.9.1:
     resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==}
@@ -5014,9 +5014,9 @@ packages:
     resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
-  lru-cache@10.3.0:
-    resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==}
-    engines: {node: 14 || >=16.14}
+  lru-cache@10.3.1:
+    resolution: {integrity: sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g==}
+    engines: {node: '>=18'}
 
   lru-cache@5.1.1:
     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@@ -5462,8 +5462,8 @@ packages:
     resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
     engines: {node: '>=8'}
 
-  peek-readable@5.1.0:
-    resolution: {integrity: sha512-Tq2I+yoz6Xq3S09E2PyjzOy/oYuNg5v7wyjmrw7OQYSKc7QnDs63q4RXFXraMoI6LZyiEOJ/wDEYzGDPhWwNPA==}
+  peek-readable@5.1.1:
+    resolution: {integrity: sha512-4hEOSH7KeEaZpMDF/xfm1W9fS5rT7Ett3BkXWHqAEzRLLwLaHkwOL+GvvpIEh9UrvX9BDhzfkvteslgraoH69w==}
     engines: {node: '>=14.16'}
 
   peek-stream@1.1.3:
@@ -5577,8 +5577,8 @@ packages:
     resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==}
     engines: {node: '>=14.19.0'}
 
-  pnpm@9.4.0:
-    resolution: {integrity: sha512-9Um4pSydK4U2di+ZwHIiBe/Fr5E+d4NdvMw7CwssqefcgCK3gGLBcpHEjoh0nHDOiOtadPH6jEv14Yu0bIvYOg==}
+  pnpm@9.5.0:
+    resolution: {integrity: sha512-FAA2gwEkYY1iSiGHtQ0EKJ1aCH8ybJ7fwMzXM9dsT1LDoxPU/BSHlKKp2BVTAWAE5nQujPhQZwJopzh/wiDJAw==}
     engines: {node: '>=18.12'}
     hasBin: true
 
@@ -6223,8 +6223,8 @@ packages:
   strnum@1.0.5:
     resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
 
-  strtok3@7.0.0:
-    resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==}
+  strtok3@7.1.0:
+    resolution: {integrity: sha512-19dQEwG6Jd+VabjPRyBhymIF069vZiqWSZa2jJBoKJTsqGKnTxowGoQaLnz+yLARfDI041IUQekyPUMWElOgsQ==}
     engines: {node: '>=14.16'}
 
   stylus@0.57.0:
@@ -6606,8 +6606,8 @@ packages:
     resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
     engines: {node: '>= 0.8'}
 
-  update-browserslist-db@1.0.16:
-    resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==}
+  update-browserslist-db@1.1.0:
+    resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
     hasBin: true
     peerDependencies:
       browserslist: '>= 4.21.0'
@@ -6919,10 +6919,6 @@ packages:
     resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
     engines: {node: '>=6'}
 
-  yargs-parser@20.2.4:
-    resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
-    engines: {node: '>=10'}
-
   yargs-parser@20.2.9:
     resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
     engines: {node: '>=10'}
@@ -6962,12 +6958,12 @@ packages:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
 
-  yoctocolors-cjs@2.1.1:
-    resolution: {integrity: sha512-c6T13b6qYcJZvck7QbEFXrFX/Mu2KOjvAGiKHmYMUg96jxNpfP6i+psGW72BOPxOIDUJrORG+Kyu7quMX9CQBQ==}
+  yoctocolors-cjs@2.1.2:
+    resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
     engines: {node: '>=18'}
 
-  yoctocolors@2.1.0:
-    resolution: {integrity: sha512-FsQpXXeOEe05tcJN4Z2eicuC6+6KiJdBbPOAChanSkwwjZ277XGsh8wh/HaPuGeifTiw/7dgAzabitu2bnDvRg==}
+  yoctocolors@2.1.1:
+    resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
     engines: {node: '>=18'}
 
   zip-stream@6.0.1:
@@ -7336,71 +7332,71 @@ snapshots:
 
   '@chainsafe/is-ip@2.0.2': {}
 
-  '@cropper/element-canvas@2.0.0-rc.0':
+  '@cropper/element-canvas@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element-crosshair@2.0.0-rc.0':
+  '@cropper/element-crosshair@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element-grid@2.0.0-rc.0':
+  '@cropper/element-grid@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element-handle@2.0.0-rc.0':
+  '@cropper/element-handle@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element-image@2.0.0-rc.0':
+  '@cropper/element-image@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/element-canvas': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/element-canvas': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element-selection@2.0.0-rc.0':
+  '@cropper/element-selection@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/element-canvas': 2.0.0-rc.0
-      '@cropper/element-image': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/element-canvas': 2.0.0-rc.1
+      '@cropper/element-image': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element-shade@2.0.0-rc.0':
+  '@cropper/element-shade@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/element-canvas': 2.0.0-rc.0
-      '@cropper/element-selection': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/element-canvas': 2.0.0-rc.1
+      '@cropper/element-selection': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element-viewer@2.0.0-rc.0':
+  '@cropper/element-viewer@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/element-canvas': 2.0.0-rc.0
-      '@cropper/element-image': 2.0.0-rc.0
-      '@cropper/element-selection': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/element-canvas': 2.0.0-rc.1
+      '@cropper/element-image': 2.0.0-rc.1
+      '@cropper/element-selection': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/element@2.0.0-rc.0':
+  '@cropper/element@2.0.0-rc.1':
     dependencies:
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/utils': 2.0.0-rc.1
 
-  '@cropper/elements@2.0.0-rc.0':
+  '@cropper/elements@2.0.0-rc.1':
     dependencies:
-      '@cropper/element': 2.0.0-rc.0
-      '@cropper/element-canvas': 2.0.0-rc.0
-      '@cropper/element-crosshair': 2.0.0-rc.0
-      '@cropper/element-grid': 2.0.0-rc.0
-      '@cropper/element-handle': 2.0.0-rc.0
-      '@cropper/element-image': 2.0.0-rc.0
-      '@cropper/element-selection': 2.0.0-rc.0
-      '@cropper/element-shade': 2.0.0-rc.0
-      '@cropper/element-viewer': 2.0.0-rc.0
+      '@cropper/element': 2.0.0-rc.1
+      '@cropper/element-canvas': 2.0.0-rc.1
+      '@cropper/element-crosshair': 2.0.0-rc.1
+      '@cropper/element-grid': 2.0.0-rc.1
+      '@cropper/element-handle': 2.0.0-rc.1
+      '@cropper/element-image': 2.0.0-rc.1
+      '@cropper/element-selection': 2.0.0-rc.1
+      '@cropper/element-shade': 2.0.0-rc.1
+      '@cropper/element-viewer': 2.0.0-rc.1
 
-  '@cropper/utils@2.0.0-rc.0': {}
+  '@cropper/utils@2.0.0-rc.1': {}
 
   '@cspotcode/source-map-support@0.8.1':
     dependencies:
@@ -7609,27 +7605,27 @@ snapshots:
   '@jest/console@29.7.0':
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       chalk: 4.1.2
       jest-message-util: 29.7.0
       jest-util: 29.7.0
       slash: 3.0.0
 
-  '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))':
+  '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))':
     dependencies:
       '@jest/console': 29.7.0
       '@jest/reporters': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       ci-info: 3.9.0
       exit: 0.1.2
       graceful-fs: 4.2.11
       jest-changed-files: 29.7.0
-      jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      jest-config: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       jest-haste-map: 29.7.0
       jest-message-util: 29.7.0
       jest-regex-util: 29.6.3
@@ -7654,7 +7650,7 @@ snapshots:
     dependencies:
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       jest-mock: 29.7.0
 
   '@jest/expect-utils@29.7.0':
@@ -7672,7 +7668,7 @@ snapshots:
     dependencies:
       '@jest/types': 29.6.3
       '@sinonjs/fake-timers': 10.3.0
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       jest-message-util: 29.7.0
       jest-mock: 29.7.0
       jest-util: 29.7.0
@@ -7694,7 +7690,7 @@ snapshots:
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
       '@jridgewell/trace-mapping': 0.3.25
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       chalk: 4.1.2
       collect-v8-coverage: 1.0.2
       exit: 0.1.2
@@ -7764,7 +7760,7 @@ snapshots:
       '@jest/schemas': 29.6.3
       '@types/istanbul-lib-coverage': 2.0.6
       '@types/istanbul-reports': 3.0.4
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       '@types/yargs': 17.0.32
       chalk: 4.1.2
 
@@ -7915,7 +7911,7 @@ snapshots:
       clipanion: 3.2.1(typanion@3.14.0)
       colorette: 2.0.20
       debug: 4.3.5(supports-color@8.1.1)
-      inquirer: 9.3.2
+      inquirer: 9.3.5
       js-yaml: 4.1.0
       lodash-es: 4.17.21
       semver: 7.6.2
@@ -8166,7 +8162,7 @@ snapshots:
 
   '@octokit/openapi-types@22.2.0': {}
 
-  '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@6.1.2)':
+  '@octokit/plugin-paginate-rest@11.3.3(@octokit/core@6.1.2)':
     dependencies:
       '@octokit/core': 6.1.2
       '@octokit/types': 13.5.0
@@ -8175,7 +8171,7 @@ snapshots:
     dependencies:
       '@octokit/core': 6.1.2
 
-  '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@6.1.2)':
+  '@octokit/plugin-rest-endpoint-methods@13.2.4(@octokit/core@6.1.2)':
     dependencies:
       '@octokit/core': 6.1.2
       '@octokit/types': 13.5.0
@@ -8194,9 +8190,9 @@ snapshots:
   '@octokit/rest@21.0.0':
     dependencies:
       '@octokit/core': 6.1.2
-      '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@6.1.2)
+      '@octokit/plugin-paginate-rest': 11.3.3(@octokit/core@6.1.2)
       '@octokit/plugin-request-log': 5.3.0(@octokit/core@6.1.2)
-      '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@6.1.2)
+      '@octokit/plugin-rest-endpoint-methods': 13.2.4(@octokit/core@6.1.2)
 
   '@octokit/types@13.5.0':
     dependencies:
@@ -8368,11 +8364,11 @@ snapshots:
 
   '@types/accepts@1.3.7':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/adm-zip@0.5.5':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/async-lock@1.4.0': {}
 
@@ -8402,18 +8398,18 @@ snapshots:
   '@types/body-parser@1.19.5':
     dependencies:
       '@types/connect': 3.4.38
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/cacheable-request@6.0.3':
     dependencies:
       '@types/http-cache-semantics': 4.0.4
       '@types/keyv': 3.1.4
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       '@types/responselike': 1.0.3
 
   '@types/co-body@6.1.3':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       '@types/qs': 6.9.15
 
   '@types/color-convert@2.0.3':
@@ -8424,7 +8420,7 @@ snapshots:
 
   '@types/connect@3.4.38':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/content-disposition@0.5.8': {}
 
@@ -8433,7 +8429,7 @@ snapshots:
       '@types/connect': 3.4.38
       '@types/express': 4.17.21
       '@types/keygrip': 1.0.6
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/disposable-email-domains@1.0.6': {}
 
@@ -8458,7 +8454,7 @@ snapshots:
 
   '@types/express-serve-static-core@4.19.5':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       '@types/qs': 6.9.15
       '@types/range-parser': 1.2.7
       '@types/send': 0.17.4
@@ -8472,20 +8468,20 @@ snapshots:
 
   '@types/fluent-ffmpeg@2.1.24':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/formidable@2.0.6':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/glob@8.1.0':
     dependencies:
       '@types/minimatch': 5.1.2
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/graceful-fs@4.1.9':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/http-assert@1.5.5': {}
 
@@ -8512,7 +8508,7 @@ snapshots:
 
   '@types/jsdom@21.1.7':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       '@types/tough-cookie': 4.0.5
       parse5: 7.1.2
 
@@ -8528,7 +8524,7 @@ snapshots:
 
   '@types/keyv@3.1.4':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/koa-bodyparser@4.3.12':
     dependencies:
@@ -8567,7 +8563,7 @@ snapshots:
       '@types/http-errors': 2.0.4
       '@types/keygrip': 1.0.6
       '@types/koa-compose': 3.2.8
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/koa__cors@5.0.0':
     dependencies:
@@ -8593,32 +8589,32 @@ snapshots:
 
   '@types/needle@3.3.0':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/node-fetch@2.6.11':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       form-data: 4.0.0
 
-  '@types/node@20.14.9':
+  '@types/node@20.14.10':
     dependencies:
       undici-types: 5.26.5
 
   '@types/nodemailer@6.4.15':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/normalize-package-data@2.4.4': {}
 
   '@types/oauth@0.9.5':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/opencc-js@1.0.3': {}
 
   '@types/pg@8.11.6':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       pg-protocol: 1.6.1
       pg-types: 4.0.2
 
@@ -8627,7 +8623,7 @@ snapshots:
   '@types/probe-image-size@7.2.4':
     dependencies:
       '@types/needle': 3.3.0
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/pug@2.0.10': {}
 
@@ -8635,7 +8631,7 @@ snapshots:
 
   '@types/qrcode@1.5.5':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/qs@6.9.15': {}
 
@@ -8649,7 +8645,7 @@ snapshots:
 
   '@types/responselike@1.0.3':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/sanitize-html@2.11.0':
     dependencies:
@@ -8662,12 +8658,12 @@ snapshots:
   '@types/send@0.17.4':
     dependencies:
       '@types/mime': 1.3.5
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/serve-static@1.15.7':
     dependencies:
       '@types/http-errors': 2.0.4
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       '@types/send': 0.17.4
 
   '@types/sinonjs__fake-timers@8.1.5': {}
@@ -8692,11 +8688,11 @@ snapshots:
 
   '@types/websocket@1.0.10':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/ws@8.5.10':
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
 
   '@types/yargs-parser@21.0.3': {}
 
@@ -8704,9 +8700,9 @@ snapshots:
     dependencies:
       '@types/yargs-parser': 21.0.3
 
-  '@vitejs/plugin-vue@5.0.5(vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))(vue@3.4.31(typescript@5.5.3))':
+  '@vitejs/plugin-vue@5.0.5(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0))(vue@3.4.31(typescript@5.5.3))':
     dependencies:
-      vite: 5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
+      vite: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
       vue: 3.4.31(typescript@5.5.3)
 
   '@volar/language-core@2.4.0-alpha.15':
@@ -8887,17 +8883,17 @@ snapshots:
       mime-types: 2.1.35
       negotiator: 0.6.3
 
-  acorn-import-attributes@1.9.5(acorn@8.12.0):
+  acorn-import-attributes@1.9.5(acorn@8.12.1):
     dependencies:
-      acorn: 8.12.0
+      acorn: 8.12.1
 
   acorn-walk@8.3.3:
     dependencies:
-      acorn: 8.12.0
+      acorn: 8.12.1
 
   acorn@7.4.1: {}
 
-  acorn@8.12.0: {}
+  acorn@8.12.1: {}
 
   adm-zip@0.5.14: {}
 
@@ -8960,7 +8956,7 @@ snapshots:
 
   archiver-utils@5.0.2:
     dependencies:
-      glob: 10.4.2
+      glob: 10.4.3
       graceful-fs: 4.2.11
       is-stream: 2.0.1
       lazystream: 1.0.1
@@ -8996,7 +8992,7 @@ snapshots:
     dependencies:
       safer-buffer: 2.1.2
 
-  assert-never@1.2.1: {}
+  assert-never@1.3.0: {}
 
   assert-plus@1.0.0: {}
 
@@ -9023,7 +9019,7 @@ snapshots:
     dependencies:
       possible-typed-array-names: 1.0.0
 
-  aws-sdk@2.1654.0:
+  aws-sdk@2.1655.0:
     dependencies:
       buffer: 4.9.2
       events: 1.1.1
@@ -9170,10 +9166,10 @@ snapshots:
 
   browserslist@4.23.1:
     dependencies:
-      caniuse-lite: 1.0.30001639
-      electron-to-chromium: 1.4.815
+      caniuse-lite: 1.0.30001640
+      electron-to-chromium: 1.4.818
       node-releases: 2.0.14
-      update-browserslist-db: 1.0.16(browserslist@4.23.1)
+      update-browserslist-db: 1.1.0(browserslist@4.23.1)
 
   bs-logger@0.2.6:
     dependencies:
@@ -9201,7 +9197,7 @@ snapshots:
   buffer@4.9.2:
     dependencies:
       base64-js: 1.5.1
-      ieee754: 1.2.1
+      ieee754: 1.1.13
       isarray: 1.0.0
 
   buffer@5.7.1:
@@ -9287,7 +9283,7 @@ snapshots:
 
   camelcase@6.3.0: {}
 
-  caniuse-lite@1.0.30001639: {}
+  caniuse-lite@1.0.30001640: {}
 
   canonicalize@1.0.8: {}
 
@@ -9574,13 +9570,13 @@ snapshots:
       crc-32: 1.2.2
       readable-stream: 4.5.2
 
-  create-jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)):
+  create-jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)):
     dependencies:
       '@jest/types': 29.6.3
       chalk: 4.1.2
       exit: 0.1.2
       graceful-fs: 4.2.11
-      jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      jest-config: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       jest-util: 29.7.0
       prompts: 2.4.2
     transitivePeerDependencies:
@@ -9595,10 +9591,10 @@ snapshots:
     dependencies:
       luxon: 3.4.4
 
-  cropperjs@2.0.0-rc.0:
+  cropperjs@2.0.0-rc.1:
     dependencies:
-      '@cropper/elements': 2.0.0-rc.0
-      '@cropper/utils': 2.0.0-rc.0
+      '@cropper/elements': 2.0.0-rc.1
+      '@cropper/utils': 2.0.0-rc.1
 
   cross-env@7.0.3:
     dependencies:
@@ -9751,7 +9747,7 @@ snapshots:
 
   deepl-node@1.13.0:
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       axios: 1.7.2
       form-data: 3.0.1
       loglevel: 1.9.1
@@ -9877,7 +9873,7 @@ snapshots:
     dependencies:
       jake: 10.9.1
 
-  electron-to-chromium@1.4.815: {}
+  electron-to-chromium@1.4.818: {}
 
   emittery@0.13.1: {}
 
@@ -10056,7 +10052,7 @@ snapshots:
       pretty-ms: 9.0.0
       signal-exit: 4.1.0
       strip-final-newline: 4.0.0
-      yoctocolors: 2.1.0
+      yoctocolors: 2.1.1
 
   exit@0.1.2: {}
 
@@ -10132,7 +10128,7 @@ snapshots:
   file-type@19.0.0:
     dependencies:
       readable-web-to-node-stream: 3.0.2
-      strtok3: 7.0.0
+      strtok3: 7.1.0
       token-types: 5.0.1
 
   file-type@3.9.0: {}
@@ -10290,10 +10286,10 @@ snapshots:
 
   glob-to-regexp@0.4.1: {}
 
-  glob@10.4.2:
+  glob@10.4.3:
     dependencies:
       foreground-child: 3.2.1
-      jackspeak: 3.1.2
+      jackspeak: 3.4.1
       minimatch: 9.0.5
       minipass: 7.1.2
       package-json-from-dist: 1.0.0
@@ -10535,7 +10531,7 @@ snapshots:
 
   ini@1.3.8: {}
 
-  inquirer@9.3.2:
+  inquirer@9.3.5:
     dependencies:
       '@inquirer/figures': 1.0.3
       ansi-escapes: 4.3.2
@@ -10548,7 +10544,7 @@ snapshots:
       string-width: 4.2.3
       strip-ansi: 6.0.1
       wrap-ansi: 6.2.0
-      yoctocolors-cjs: 2.1.1
+      yoctocolors-cjs: 2.1.2
 
   insert-text-at-cursor@0.3.0: {}
 
@@ -10727,7 +10723,7 @@ snapshots:
       html-escaper: 2.0.2
       istanbul-lib-report: 3.0.1
 
-  jackspeak@3.1.2:
+  jackspeak@3.4.1:
     dependencies:
       '@isaacs/cliui': 8.0.2
     optionalDependencies:
@@ -10752,7 +10748,7 @@ snapshots:
       '@jest/expect': 29.7.0
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       chalk: 4.1.2
       co: 4.6.0
       dedent: 1.5.3
@@ -10772,16 +10768,16 @@ snapshots:
       - babel-plugin-macros
       - supports-color
 
-  jest-cli@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)):
+  jest-cli@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)):
     dependencies:
-      '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
       chalk: 4.1.2
-      create-jest: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      create-jest: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       exit: 0.1.2
       import-local: 3.1.0
-      jest-config: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      jest-config: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       jest-util: 29.7.0
       jest-validate: 29.7.0
       yargs: 17.7.2
@@ -10791,7 +10787,7 @@ snapshots:
       - supports-color
       - ts-node
 
-  jest-config@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)):
+  jest-config@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)):
     dependencies:
       '@babel/core': 7.24.6
       '@jest/test-sequencer': 29.7.0
@@ -10816,8 +10812,8 @@ snapshots:
       slash: 3.0.0
       strip-json-comments: 3.1.1
     optionalDependencies:
-      '@types/node': 20.14.9
-      ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3)
+      '@types/node': 20.14.10
+      ts-node: 10.9.2(@types/node@20.14.10)(typescript@5.5.3)
     transitivePeerDependencies:
       - babel-plugin-macros
       - supports-color
@@ -10846,7 +10842,7 @@ snapshots:
       '@jest/environment': 29.7.0
       '@jest/fake-timers': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       jest-mock: 29.7.0
       jest-util: 29.7.0
 
@@ -10863,7 +10859,7 @@ snapshots:
     dependencies:
       '@jest/types': 29.6.3
       '@types/graceful-fs': 4.1.9
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       anymatch: 3.1.3
       fb-watchman: 2.0.2
       graceful-fs: 4.2.11
@@ -10902,7 +10898,7 @@ snapshots:
   jest-mock@29.7.0:
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       jest-util: 29.7.0
 
   jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
@@ -10937,7 +10933,7 @@ snapshots:
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       chalk: 4.1.2
       emittery: 0.13.1
       graceful-fs: 4.2.11
@@ -10965,7 +10961,7 @@ snapshots:
       '@jest/test-result': 29.7.0
       '@jest/transform': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       chalk: 4.1.2
       cjs-module-lexer: 1.3.1
       collect-v8-coverage: 1.0.2
@@ -11011,7 +11007,7 @@ snapshots:
   jest-util@29.7.0:
     dependencies:
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       chalk: 4.1.2
       ci-info: 3.9.0
       graceful-fs: 4.2.11
@@ -11030,7 +11026,7 @@ snapshots:
     dependencies:
       '@jest/test-result': 29.7.0
       '@jest/types': 29.6.3
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       emittery: 0.13.1
@@ -11044,23 +11040,23 @@ snapshots:
 
   jest-worker@27.5.1:
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
   jest-worker@29.7.0:
     dependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       jest-util: 29.7.0
       merge-stream: 2.0.0
       supports-color: 8.1.1
 
-  jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)):
+  jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)):
     dependencies:
-      '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       '@jest/types': 29.6.3
       import-local: 3.1.0
-      jest-cli: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      jest-cli: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
     transitivePeerDependencies:
       - '@types/node'
       - babel-plugin-macros
@@ -11075,7 +11071,7 @@ snapshots:
     dependencies:
       config-chain: 1.1.13
       editorconfig: 1.0.4
-      glob: 10.4.2
+      glob: 10.4.3
       js-cookie: 3.0.5
       nopt: 7.2.1
 
@@ -11350,7 +11346,7 @@ snapshots:
       content-disposition: 0.5.4
       content-type: 1.0.5
       cookies: 0.8.0
-      debug: 4.3.5(supports-color@8.1.1)
+      debug: 4.3.3
       delegates: 1.0.0
       depd: 2.0.0
       destroy: 1.2.0
@@ -11478,7 +11474,7 @@ snapshots:
 
   lowercase-keys@3.0.0: {}
 
-  lru-cache@10.3.0: {}
+  lru-cache@10.3.1: {}
 
   lru-cache@5.1.1:
     dependencies:
@@ -11881,14 +11877,14 @@ snapshots:
 
   path-scurry@1.11.1:
     dependencies:
-      lru-cache: 10.3.0
+      lru-cache: 10.3.1
       minipass: 7.1.2
 
   path-to-regexp@6.2.2: {}
 
   path-type@4.0.0: {}
 
-  peek-readable@5.1.0: {}
+  peek-readable@5.1.1: {}
 
   peek-stream@1.1.3:
     dependencies:
@@ -11991,7 +11987,7 @@ snapshots:
 
   pngjs@7.0.0: {}
 
-  pnpm@9.4.0: {}
+  pnpm@9.5.0: {}
 
   possible-typed-array-names@1.0.0: {}
 
@@ -12693,10 +12689,10 @@ snapshots:
 
   strnum@1.0.5: {}
 
-  strtok3@7.0.0:
+  strtok3@7.1.0:
     dependencies:
       '@tokenizer/token': 0.3.0
-      peek-readable: 5.1.0
+      peek-readable: 5.1.1
 
   stylus@0.57.0:
     dependencies:
@@ -12785,7 +12781,7 @@ snapshots:
   terser@5.31.0:
     dependencies:
       '@jridgewell/source-map': 0.3.6
-      acorn: 8.12.0
+      acorn: 8.12.1
       commander: 2.20.3
       source-map-support: 0.5.21
 
@@ -12879,11 +12875,11 @@ snapshots:
 
   trim-newlines@3.0.1: {}
 
-  ts-jest@29.1.5(@babel/core@7.24.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.6))(jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)))(typescript@5.5.3):
+  ts-jest@29.1.5(@babel/core@7.24.6)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.6))(jest@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)))(typescript@5.5.3):
     dependencies:
       bs-logger: 0.2.6
       fast-json-stable-stringify: 2.1.0
-      jest: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3))
+      jest: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))
       jest-util: 29.7.0
       json5: 2.2.3
       lodash.memoize: 4.1.2
@@ -12907,15 +12903,15 @@ snapshots:
       typescript: 5.5.3
       webpack: 5.92.1
 
-  ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3):
+  ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3):
     dependencies:
       '@cspotcode/source-map-support': 0.8.1
       '@tsconfig/node10': 1.0.11
       '@tsconfig/node12': 1.0.11
       '@tsconfig/node14': 1.0.3
       '@tsconfig/node16': 1.0.4
-      '@types/node': 20.14.9
-      acorn: 8.12.0
+      '@types/node': 20.14.10
+      acorn: 8.12.1
       acorn-walk: 8.3.3
       arg: 4.1.3
       create-require: 1.1.1
@@ -12983,7 +12979,7 @@ snapshots:
 
   typedarray@0.0.6: {}
 
-  typeorm@0.3.20(ioredis@5.4.1)(pg@8.12.0)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.3)):
+  typeorm@0.3.20(ioredis@5.4.1)(pg@8.12.0)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)):
     dependencies:
       '@sqltools/formatter': 1.2.5
       app-root-path: 3.1.0
@@ -12993,7 +12989,7 @@ snapshots:
       dayjs: 1.11.11
       debug: 4.3.5(supports-color@8.1.1)
       dotenv: 16.4.5
-      glob: 10.4.2
+      glob: 10.4.3
       mkdirp: 2.1.6
       reflect-metadata: 0.2.2
       sha.js: 2.4.11
@@ -13003,7 +12999,7 @@ snapshots:
     optionalDependencies:
       ioredis: 5.4.1
       pg: 8.12.0
-      ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.3)
+      ts-node: 10.9.2(@types/node@20.14.10)(typescript@5.5.3)
     transitivePeerDependencies:
       - supports-color
 
@@ -13047,7 +13043,7 @@ snapshots:
 
   unpipe@1.0.0: {}
 
-  update-browserslist-db@1.0.16(browserslist@4.23.1):
+  update-browserslist-db@1.1.0(browserslist@4.23.1):
     dependencies:
       browserslist: 4.23.1
       escalade: 3.1.2
@@ -13112,22 +13108,22 @@ snapshots:
       core-util-is: 1.0.2
       extsprintf: 1.3.0
 
-  vite-plugin-compression@0.5.1(vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)):
+  vite-plugin-compression@0.5.1(vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)):
     dependencies:
       chalk: 4.1.2
       debug: 4.3.5(supports-color@8.1.1)
       fs-extra: 10.1.0
-      vite: 5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
+      vite: 5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0)
     transitivePeerDependencies:
       - supports-color
 
-  vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0):
+  vite@5.3.3(@types/node@20.14.10)(sass@1.77.6)(stylus@0.57.0)(terser@5.31.0):
     dependencies:
       esbuild: 0.21.5
       postcss: 8.4.39
       rollup: 4.17.2
     optionalDependencies:
-      '@types/node': 20.14.9
+      '@types/node': 20.14.10
       fsevents: 2.3.3
       sass: 1.77.6
       stylus: 0.57.0
@@ -13213,8 +13209,8 @@ snapshots:
       '@webassemblyjs/ast': 1.12.1
       '@webassemblyjs/wasm-edit': 1.12.1
       '@webassemblyjs/wasm-parser': 1.12.1
-      acorn: 8.12.0
-      acorn-import-attributes: 1.9.5(acorn@8.12.0)
+      acorn: 8.12.1
+      acorn-import-attributes: 1.9.5(acorn@8.12.1)
       browserslist: 4.23.1
       chrome-trace-event: 1.0.4
       enhanced-resolve: 5.17.0
@@ -13284,9 +13280,9 @@ snapshots:
 
   with@7.0.2:
     dependencies:
-      '@babel/parser': 7.24.6
+      '@babel/parser': 7.24.7
       '@babel/types': 7.24.6
-      assert-never: 1.2.1
+      assert-never: 1.3.0
       babel-walk: 3.0.0-canary-5
 
   workerpool@6.5.1: {}
@@ -13336,7 +13332,7 @@ snapshots:
 
   xml2js@0.6.2:
     dependencies:
-      sax: 1.4.1
+      sax: 1.2.1
       xmlbuilder: 11.0.1
 
   xmlbuilder@11.0.1: {}
@@ -13362,8 +13358,6 @@ snapshots:
       camelcase: 5.3.1
       decamelize: 1.2.0
 
-  yargs-parser@20.2.4: {}
-
   yargs-parser@20.2.9: {}
 
   yargs-parser@21.1.1: {}
@@ -13397,7 +13391,7 @@ snapshots:
       require-directory: 2.1.1
       string-width: 4.2.3
       y18n: 5.0.8
-      yargs-parser: 20.2.4
+      yargs-parser: 20.2.9
 
   yargs@17.7.2:
     dependencies:
@@ -13420,9 +13414,9 @@ snapshots:
 
   yocto-queue@0.1.0: {}
 
-  yoctocolors-cjs@2.1.1: {}
+  yoctocolors-cjs@2.1.2: {}
 
-  yoctocolors@2.1.0: {}
+  yoctocolors@2.1.1: {}
 
   zip-stream@6.0.1:
     dependencies: