+2
-1
.env.example
+2
-1
.env.example
···
1
-
DATABASE_URL=postgresql://user:password@localhost/dbname
1
+
# by default, simplelink uses an sqlite db in /data, to use a postgres db, set DATABASE_URl
2
+
# DATABASE_URL=postgresql://user:password@localhost/dbname
2
3
SERVER_HOST=127.0.0.1
3
4
SERVER_PORT=8080
4
5
JWT_SECRET=change-me-in-production
+5
-15
.github/workflows/docker-image.yml
+5
-15
.github/workflows/docker-image.yml
···
29
29
30
30
- name: Install cosign
31
31
if: github.event_name != 'pull_request'
32
-
uses: sigstore/cosign-installer@v3.7.0
32
+
uses: sigstore/cosign-installer@v3.8.1
33
33
with:
34
-
cosign-release: "v2.4.1"
34
+
cosign-release: "v2.4.3"
35
35
36
36
- name: Setup Docker buildx
37
37
uses: docker/setup-buildx-action@v3
···
59
59
${{ env.IMAGE_NAME }}
60
60
${{ env.REGISTRY }}/${{ github.repository }}
61
61
62
-
- name: Build and push Docker image (amd64)
63
-
uses: docker/build-push-action@v6
64
-
with:
65
-
context: .
66
-
file: ./Dockerfile
67
-
platforms: linux/amd64
68
-
push: ${{ github.event_name != 'pull_request' }}
69
-
tags: ${{ steps.meta.outputs.tags }}-amd64
70
-
labels: ${{ steps.meta.outputs.labels }}
71
-
72
-
- name: Build and push Docker image (arm64)
62
+
- name: Build and push Docker image
73
63
uses: docker/build-push-action@v6
74
64
with:
75
65
context: .
76
66
file: ./Dockerfile
77
-
platforms: linux/arm64
67
+
platforms: linux/amd64,linux/arm64
78
68
push: ${{ github.event_name != 'pull_request' }}
79
-
tags: ${{ steps.meta.outputs.tags }}-arm64
69
+
tags: ${{ steps.meta.outputs.tags }}
80
70
labels: ${{ steps.meta.outputs.labels }}
+6
-1
.gitignore
+6
-1
.gitignore
+67
-230
Cargo.lock
+67
-230
Cargo.lock
···
607
607
]
608
608
609
609
[[package]]
610
-
name = "core-foundation"
611
-
version = "0.9.4"
612
-
source = "registry+https://github.com/rust-lang/crates.io-index"
613
-
checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
614
-
dependencies = [
615
-
"core-foundation-sys",
616
-
"libc",
617
-
]
618
-
619
-
[[package]]
620
610
name = "core-foundation-sys"
621
611
version = "0.8.7"
622
612
source = "registry+https://github.com/rust-lang/crates.io-index"
···
838
828
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
839
829
840
830
[[package]]
841
-
name = "foreign-types"
842
-
version = "0.3.2"
843
-
source = "registry+https://github.com/rust-lang/crates.io-index"
844
-
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
845
-
dependencies = [
846
-
"foreign-types-shared",
847
-
]
848
-
849
-
[[package]]
850
-
name = "foreign-types-shared"
851
-
version = "0.1.1"
831
+
name = "foldhash"
832
+
version = "0.1.4"
852
833
source = "registry+https://github.com/rust-lang/crates.io-index"
853
-
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
834
+
checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
854
835
855
836
[[package]]
856
837
name = "form_urlencoded"
···
862
843
]
863
844
864
845
[[package]]
846
+
name = "futures"
847
+
version = "0.3.31"
848
+
source = "registry+https://github.com/rust-lang/crates.io-index"
849
+
checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
850
+
dependencies = [
851
+
"futures-channel",
852
+
"futures-core",
853
+
"futures-executor",
854
+
"futures-io",
855
+
"futures-sink",
856
+
"futures-task",
857
+
"futures-util",
858
+
]
859
+
860
+
[[package]]
865
861
name = "futures-channel"
866
862
version = "0.3.31"
867
863
source = "registry+https://github.com/rust-lang/crates.io-index"
···
906
902
checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
907
903
908
904
[[package]]
905
+
name = "futures-macro"
906
+
version = "0.3.31"
907
+
source = "registry+https://github.com/rust-lang/crates.io-index"
908
+
checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
909
+
dependencies = [
910
+
"proc-macro2",
911
+
"quote",
912
+
"syn",
913
+
]
914
+
915
+
[[package]]
909
916
name = "futures-sink"
910
917
version = "0.3.31"
911
918
source = "registry+https://github.com/rust-lang/crates.io-index"
···
923
930
source = "registry+https://github.com/rust-lang/crates.io-index"
924
931
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
925
932
dependencies = [
933
+
"futures-channel",
926
934
"futures-core",
927
935
"futures-io",
936
+
"futures-macro",
928
937
"futures-sink",
929
938
"futures-task",
930
939
"memchr",
···
983
992
984
993
[[package]]
985
994
name = "hashbrown"
986
-
version = "0.14.5"
995
+
version = "0.15.2"
987
996
source = "registry+https://github.com/rust-lang/crates.io-index"
988
-
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
997
+
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
989
998
dependencies = [
990
-
"ahash",
991
999
"allocator-api2",
1000
+
"equivalent",
1001
+
"foldhash",
992
1002
]
993
1003
994
1004
[[package]]
995
-
name = "hashbrown"
996
-
version = "0.15.2"
997
-
source = "registry+https://github.com/rust-lang/crates.io-index"
998
-
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
999
-
1000
-
[[package]]
1001
1005
name = "hashlink"
1002
-
version = "0.9.1"
1006
+
version = "0.10.0"
1003
1007
source = "registry+https://github.com/rust-lang/crates.io-index"
1004
-
checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af"
1008
+
checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
1005
1009
dependencies = [
1006
-
"hashbrown 0.14.5",
1010
+
"hashbrown",
1007
1011
]
1008
1012
1009
1013
[[package]]
···
1249
1253
checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
1250
1254
dependencies = [
1251
1255
"equivalent",
1252
-
"hashbrown 0.15.2",
1256
+
"hashbrown",
1253
1257
]
1254
1258
1255
1259
[[package]]
···
1414
1418
]
1415
1419
1416
1420
[[package]]
1417
-
name = "minimal-lexical"
1418
-
version = "0.2.1"
1419
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1420
-
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
1421
-
1422
-
[[package]]
1423
1421
name = "miniz_oxide"
1424
1422
version = "0.8.3"
1425
1423
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1441
1439
]
1442
1440
1443
1441
[[package]]
1444
-
name = "native-tls"
1445
-
version = "0.2.12"
1446
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1447
-
checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
1448
-
dependencies = [
1449
-
"libc",
1450
-
"log",
1451
-
"openssl",
1452
-
"openssl-probe",
1453
-
"openssl-sys",
1454
-
"schannel",
1455
-
"security-framework",
1456
-
"security-framework-sys",
1457
-
"tempfile",
1458
-
]
1459
-
1460
-
[[package]]
1461
-
name = "nom"
1462
-
version = "7.1.3"
1463
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1464
-
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
1465
-
dependencies = [
1466
-
"memchr",
1467
-
"minimal-lexical",
1468
-
]
1469
-
1470
-
[[package]]
1471
1442
name = "nu-ansi-term"
1472
-
version = "0.46.0"
1443
+
version = "0.50.1"
1473
1444
source = "registry+https://github.com/rust-lang/crates.io-index"
1474
-
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
1445
+
checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399"
1475
1446
dependencies = [
1476
-
"overload",
1477
-
"winapi",
1447
+
"windows-sys 0.52.0",
1478
1448
]
1479
1449
1480
1450
[[package]]
···
1556
1526
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
1557
1527
1558
1528
[[package]]
1559
-
name = "openssl"
1560
-
version = "0.10.68"
1561
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1562
-
checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
1563
-
dependencies = [
1564
-
"bitflags",
1565
-
"cfg-if",
1566
-
"foreign-types",
1567
-
"libc",
1568
-
"once_cell",
1569
-
"openssl-macros",
1570
-
"openssl-sys",
1571
-
]
1572
-
1573
-
[[package]]
1574
-
name = "openssl-macros"
1575
-
version = "0.1.1"
1576
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1577
-
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
1578
-
dependencies = [
1579
-
"proc-macro2",
1580
-
"quote",
1581
-
"syn",
1582
-
]
1583
-
1584
-
[[package]]
1585
-
name = "openssl-probe"
1586
-
version = "0.1.6"
1587
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1588
-
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
1589
-
1590
-
[[package]]
1591
-
name = "openssl-sys"
1592
-
version = "0.9.104"
1593
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1594
-
checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
1595
-
dependencies = [
1596
-
"cc",
1597
-
"libc",
1598
-
"pkg-config",
1599
-
"vcpkg",
1600
-
]
1601
-
1602
-
[[package]]
1603
-
name = "overload"
1604
-
version = "0.1.1"
1605
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1606
-
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
1607
-
1608
-
[[package]]
1609
1529
name = "parking"
1610
1530
version = "2.2.1"
1611
1531
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1824
1744
1825
1745
[[package]]
1826
1746
name = "ring"
1827
-
version = "0.17.8"
1747
+
version = "0.17.13"
1828
1748
source = "registry+https://github.com/rust-lang/crates.io-index"
1829
-
checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
1749
+
checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee"
1830
1750
dependencies = [
1831
1751
"cc",
1832
1752
"cfg-if",
1833
1753
"getrandom",
1834
1754
"libc",
1835
-
"spin",
1836
1755
"untrusted",
1837
1756
"windows-sys 0.52.0",
1838
1757
]
···
1941
1860
]
1942
1861
1943
1862
[[package]]
1944
-
name = "schannel"
1945
-
version = "0.1.27"
1946
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1947
-
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1948
-
dependencies = [
1949
-
"windows-sys 0.59.0",
1950
-
]
1951
-
1952
-
[[package]]
1953
1863
name = "scopeguard"
1954
1864
version = "1.2.0"
1955
1865
source = "registry+https://github.com/rust-lang/crates.io-index"
1956
1866
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1957
1867
1958
1868
[[package]]
1959
-
name = "security-framework"
1960
-
version = "2.11.1"
1961
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1962
-
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1963
-
dependencies = [
1964
-
"bitflags",
1965
-
"core-foundation",
1966
-
"core-foundation-sys",
1967
-
"libc",
1968
-
"security-framework-sys",
1969
-
]
1970
-
1971
-
[[package]]
1972
-
name = "security-framework-sys"
1973
-
version = "2.14.0"
1974
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1975
-
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1976
-
dependencies = [
1977
-
"core-foundation-sys",
1978
-
"libc",
1979
-
]
1980
-
1981
-
[[package]]
1982
1869
name = "semver"
1983
1870
version = "1.0.25"
1984
1871
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2109
1996
"chrono",
2110
1997
"clap",
2111
1998
"dotenv",
1999
+
"futures",
2112
2000
"jsonwebtoken",
2113
2001
"lazy_static",
2114
2002
"mime_guess",
···
2173
2061
]
2174
2062
2175
2063
[[package]]
2176
-
name = "sqlformat"
2177
-
version = "0.2.6"
2178
-
source = "registry+https://github.com/rust-lang/crates.io-index"
2179
-
checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790"
2180
-
dependencies = [
2181
-
"nom",
2182
-
"unicode_categories",
2183
-
]
2184
-
2185
-
[[package]]
2186
2064
name = "sqlx"
2187
-
version = "0.8.1"
2065
+
version = "0.8.3"
2188
2066
source = "registry+https://github.com/rust-lang/crates.io-index"
2189
-
checksum = "fcfa89bea9500db4a0d038513d7a060566bfc51d46d1c014847049a45cce85e8"
2067
+
checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f"
2190
2068
dependencies = [
2191
2069
"sqlx-core",
2192
2070
"sqlx-macros",
···
2197
2075
2198
2076
[[package]]
2199
2077
name = "sqlx-core"
2200
-
version = "0.8.1"
2078
+
version = "0.8.3"
2201
2079
source = "registry+https://github.com/rust-lang/crates.io-index"
2202
-
checksum = "d06e2f2bd861719b1f3f0c7dbe1d80c30bf59e76cf019f07d9014ed7eefb8e08"
2080
+
checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0"
2203
2081
dependencies = [
2204
-
"atoi",
2205
-
"byteorder",
2206
2082
"bytes",
2207
2083
"chrono",
2208
2084
"crc",
2209
2085
"crossbeam-queue",
2210
2086
"either",
2211
2087
"event-listener",
2212
-
"futures-channel",
2213
2088
"futures-core",
2214
2089
"futures-intrusive",
2215
2090
"futures-io",
2216
2091
"futures-util",
2217
-
"hashbrown 0.14.5",
2092
+
"hashbrown",
2218
2093
"hashlink",
2219
-
"hex",
2220
2094
"indexmap",
2221
2095
"log",
2222
2096
"memchr",
2223
-
"native-tls",
2224
2097
"once_cell",
2225
-
"paste",
2226
2098
"percent-encoding",
2227
2099
"serde",
2228
2100
"serde_json",
2229
2101
"sha2",
2230
2102
"smallvec",
2231
-
"sqlformat",
2232
-
"thiserror 1.0.69",
2103
+
"thiserror 2.0.11",
2233
2104
"tokio",
2234
2105
"tokio-stream",
2235
2106
"tracing",
2236
2107
"url",
2237
-
"uuid",
2238
2108
]
2239
2109
2240
2110
[[package]]
2241
2111
name = "sqlx-macros"
2242
-
version = "0.8.1"
2112
+
version = "0.8.3"
2243
2113
source = "registry+https://github.com/rust-lang/crates.io-index"
2244
-
checksum = "2f998a9defdbd48ed005a89362bd40dd2117502f15294f61c8d47034107dbbdc"
2114
+
checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310"
2245
2115
dependencies = [
2246
2116
"proc-macro2",
2247
2117
"quote",
···
2252
2122
2253
2123
[[package]]
2254
2124
name = "sqlx-macros-core"
2255
-
version = "0.8.1"
2125
+
version = "0.8.3"
2256
2126
source = "registry+https://github.com/rust-lang/crates.io-index"
2257
-
checksum = "3d100558134176a2629d46cec0c8891ba0be8910f7896abfdb75ef4ab6f4e7ce"
2127
+
checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad"
2258
2128
dependencies = [
2259
2129
"dotenvy",
2260
2130
"either",
···
2278
2148
2279
2149
[[package]]
2280
2150
name = "sqlx-mysql"
2281
-
version = "0.8.1"
2151
+
version = "0.8.3"
2282
2152
source = "registry+https://github.com/rust-lang/crates.io-index"
2283
-
checksum = "936cac0ab331b14cb3921c62156d913e4c15b74fb6ec0f3146bd4ef6e4fb3c12"
2153
+
checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233"
2284
2154
dependencies = [
2285
2155
"atoi",
2286
2156
"base64 0.22.1",
···
2314
2184
"smallvec",
2315
2185
"sqlx-core",
2316
2186
"stringprep",
2317
-
"thiserror 1.0.69",
2187
+
"thiserror 2.0.11",
2318
2188
"tracing",
2319
-
"uuid",
2320
2189
"whoami",
2321
2190
]
2322
2191
2323
2192
[[package]]
2324
2193
name = "sqlx-postgres"
2325
-
version = "0.8.1"
2194
+
version = "0.8.3"
2326
2195
source = "registry+https://github.com/rust-lang/crates.io-index"
2327
-
checksum = "9734dbce698c67ecf67c442f768a5e90a49b2a4d61a9f1d59f73874bd4cf0710"
2196
+
checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613"
2328
2197
dependencies = [
2329
2198
"atoi",
2330
2199
"base64 0.22.1",
···
2336
2205
"etcetera",
2337
2206
"futures-channel",
2338
2207
"futures-core",
2339
-
"futures-io",
2340
2208
"futures-util",
2341
2209
"hex",
2342
2210
"hkdf",
···
2354
2222
"smallvec",
2355
2223
"sqlx-core",
2356
2224
"stringprep",
2357
-
"thiserror 1.0.69",
2225
+
"thiserror 2.0.11",
2358
2226
"tracing",
2359
-
"uuid",
2360
2227
"whoami",
2361
2228
]
2362
2229
2363
2230
[[package]]
2364
2231
name = "sqlx-sqlite"
2365
-
version = "0.8.1"
2232
+
version = "0.8.3"
2366
2233
source = "registry+https://github.com/rust-lang/crates.io-index"
2367
-
checksum = "a75b419c3c1b1697833dd927bdc4c6545a620bc1bbafabd44e1efbe9afcd337e"
2234
+
checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540"
2368
2235
dependencies = [
2369
2236
"atoi",
2370
2237
"chrono",
···
2382
2249
"sqlx-core",
2383
2250
"tracing",
2384
2251
"url",
2385
-
"uuid",
2386
2252
]
2387
2253
2388
2254
[[package]]
···
2558
2424
2559
2425
[[package]]
2560
2426
name = "tokio"
2561
-
version = "1.43.0"
2427
+
version = "1.43.1"
2562
2428
source = "registry+https://github.com/rust-lang/crates.io-index"
2563
-
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
2429
+
checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c"
2564
2430
dependencies = [
2565
2431
"backtrace",
2566
2432
"bytes",
···
2655
2521
2656
2522
[[package]]
2657
2523
name = "tracing-subscriber"
2658
-
version = "0.3.19"
2524
+
version = "0.3.20"
2659
2525
source = "registry+https://github.com/rust-lang/crates.io-index"
2660
-
checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
2526
+
checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5"
2661
2527
dependencies = [
2662
2528
"nu-ansi-term",
2663
2529
"sharded-slab",
···
2707
2573
checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
2708
2574
2709
2575
[[package]]
2710
-
name = "unicode_categories"
2711
-
version = "0.1.1"
2712
-
source = "registry+https://github.com/rust-lang/crates.io-index"
2713
-
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
2714
-
2715
-
[[package]]
2716
2576
name = "untrusted"
2717
2577
version = "0.9.0"
2718
2578
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2754
2614
checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b"
2755
2615
dependencies = [
2756
2616
"getrandom",
2757
-
"serde",
2758
2617
]
2759
2618
2760
2619
[[package]]
···
2872
2731
]
2873
2732
2874
2733
[[package]]
2875
-
name = "winapi"
2876
-
version = "0.3.9"
2877
-
source = "registry+https://github.com/rust-lang/crates.io-index"
2878
-
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2879
-
dependencies = [
2880
-
"winapi-i686-pc-windows-gnu",
2881
-
"winapi-x86_64-pc-windows-gnu",
2882
-
]
2883
-
2884
-
[[package]]
2885
-
name = "winapi-i686-pc-windows-gnu"
2886
-
version = "0.4.0"
2887
-
source = "registry+https://github.com/rust-lang/crates.io-index"
2888
-
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2889
-
2890
-
[[package]]
2891
2734
name = "winapi-util"
2892
2735
version = "0.1.9"
2893
2736
source = "registry+https://github.com/rust-lang/crates.io-index"
···
2895
2738
dependencies = [
2896
2739
"windows-sys 0.59.0",
2897
2740
]
2898
-
2899
-
[[package]]
2900
-
name = "winapi-x86_64-pc-windows-gnu"
2901
-
version = "0.4.0"
2902
-
source = "registry+https://github.com/rust-lang/crates.io-index"
2903
-
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2904
2741
2905
2742
[[package]]
2906
2743
name = "windows-core"
+4
-3
Cargo.toml
+4
-3
Cargo.toml
···
13
13
actix-web = "4.4"
14
14
actix-files = "0.6"
15
15
actix-cors = "0.6"
16
-
tokio = { version = "1.36", features = ["full"] }
17
-
sqlx = { version = "0.8", features = ["runtime-tokio-native-tls", "postgres", "uuid", "chrono"] }
16
+
tokio = { version = "1.43", features = ["rt-multi-thread", "macros"] }
17
+
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "sqlite", "chrono"] }
18
18
serde = { version = "1.0", features = ["derive"] }
19
19
serde_json = "1.0"
20
20
anyhow = "1.0"
21
21
thiserror = "1.0"
22
22
tracing = "0.1"
23
23
tracing-subscriber = "0.3"
24
-
uuid = { version = "1.7", features = ["v4", "serde"] }
24
+
uuid = { version = "1.7", features = ["v4"] } # Remove serde if not using UUID serialization
25
25
base62 = "2.0"
26
26
clap = { version = "4.5", features = ["derive"] }
27
27
dotenv = "0.15"
···
31
31
argon2 = "0.5.3"
32
32
rand = { version = "0.8", features = ["std"] }
33
33
mime_guess = "2.0.5"
34
+
futures = "0.3.31"
+2
-2
Dockerfile
+2
-2
Dockerfile
···
4
4
WORKDIR /usr/src/frontend
5
5
6
6
# Copy frontend files
7
-
COPY frontend/package*.json ./
7
+
COPY frontend/package.json ./
8
8
RUN bun install
9
9
10
10
COPY frontend/ ./
···
57
57
# Copy static files
58
58
COPY --from=backend-builder /usr/src/app/static /app/static
59
59
60
-
# Expose the port (this is just documentation)
60
+
# Expose the port
61
61
EXPOSE 8080
62
62
63
63
# Set default network configuration
+53
-11
README.md
+53
-11
README.md
···
1
1
# SimpleLink
2
-
A very performant and light (6mb in memory) link shortener and tracker. Written in Rust and React and uses Postgres.
2
+
3
+
A very performant and light (2MB in memory) link shortener and tracker. Written in Rust and React and uses Postgres or SQLite.
3
4
4
5

5
6
6
7

8
+
9
+
## How to Run
10
+
11
+
### From Docker
12
+
13
+
```bash
14
+
docker run -p 8080:8080 \
15
+
-e JWT_SECRET=change-me-in-production \
16
+
-e SIMPLELINK_USER=admin@example.com \
17
+
-e SIMPLELINK_PASS=your-secure-password \
18
+
-v simplelink_data:/data \
19
+
ghcr.io/waveringana/simplelink:v2.2
20
+
```
21
+
22
+
### Environment Variables
23
+
24
+
- `JWT_SECRET`: Required. Used for JWT token generation
25
+
- `SIMPLELINK_USER`: Optional. If set along with SIMPLELINK_PASS, creates an admin user on first run
26
+
- `SIMPLELINK_PASS`: Optional. Admin user password
27
+
- `DATABASE_URL`: Optional. Postgres connection string. If not set, uses SQLite
28
+
- `INITIAL_LINKS`: Optional. Semicolon-separated list of initial links in format "url,code;url2,code2"
29
+
- `SERVER_HOST`: Optional. Default: "127.0.0.1"
30
+
- `SERVER_PORT`: Optional. Default: "8080"
31
+
32
+
If `SIMPLELINK_USER` and `SIMPLELINK_PASS` are not passed, an admin-setup-token is pasted to the console and as a text file in the project root.
33
+
34
+
### From Docker Compose
35
+
36
+
Edit the docker-compose.yml file. It comes included with a PostgreSQL db configuration.
7
37
8
38
## Build
9
39
10
40
### From Source
11
-
First configure .env.example and save it to .env
12
41
13
-
The project will not run withot DATABASE_URL set. (TODO add sqlite support)
42
+
First configure .env.example and save it to .env
14
43
15
44
```bash
16
-
#set api-domain to where you will be deploying the link shortener, eg: link.example.com, default is localhost:8080
17
45
git clone https://github.com/waveringana/simplelink && cd simplelink
18
-
./build.sh api-domain=localhost:8080
46
+
./build.sh
19
47
cargo run
20
48
```
21
49
22
-
Alternatively if you want a binary form
50
+
Alternatively for a binary build:
51
+
23
52
```bash
24
53
./build.sh --binary
25
54
```
55
+
26
56
then check /target/release for the binary named `SimpleGit`
27
57
28
58
### From Docker
59
+
29
60
```bash
30
-
docker build --build-arg API_URL=http://localhost:8080 -t simplelink .
31
-
docker run simplelink -p 8080:8080 \
32
-
-e JWT_SECRET=change-me-in-production \
33
-
-e DATABASE_URL=postgres://user:password@host:port/database \
61
+
docker build -t simplelink .
62
+
docker run -p 8080:8080 \
63
+
-e JWT_SECRET=change-me-in-production \
64
+
-e SIMPLELINK_USER=admin@example.com \
65
+
-e SIMPLELINK_PASS=your-secure-password \
66
+
-v simplelink_data:/data \
34
67
simplelink
35
68
```
36
69
37
70
### From Docker Compose
38
-
Adjust the included docker-compose.yml to your liking, it includes a postgres config as well.
71
+
72
+
Adjust the included docker-compose.yml to your liking; it includes a postgres config as well.
73
+
74
+
## Features
75
+
76
+
- Support for both PostgreSQL and SQLite databases
77
+
- Initial links can be configured via environment variables
78
+
- Admin user can be created on first run via environment variables
79
+
- Link click tracking and statistics
80
+
- Lightweight and performant
-1
admin-setup-token.txt
-1
admin-setup-token.txt
···
1
-
fqfO6awRz3mkc2Kxunkp1uTQcXaSfGD9
+7
-7
build.sh
+7
-7
build.sh
···
1
1
#!/bin/bash
2
2
3
3
# Default values
4
-
API_URL="http://localhost:8080"
4
+
#API_URL="http://localhost:8080"
5
5
RELEASE_MODE=false
6
6
BINARY_MODE=false
7
7
···
9
9
for arg in "$@"
10
10
do
11
11
case $arg in
12
-
api-domain=*)
13
-
API_URL="${arg#*=}"
14
-
shift
15
-
;;
12
+
#api-domain=*)
13
+
#API_URL="${arg#*=}"
14
+
#shift
15
+
#;;
16
16
--release)
17
17
RELEASE_MODE=true
18
18
shift
···
24
24
esac
25
25
done
26
26
27
-
echo "Building project with API_URL: $API_URL"
27
+
#echo "Building project with API_URL: $API_URL"
28
28
echo "Release mode: $RELEASE_MODE"
29
29
30
30
# Check if cargo is installed
···
42
42
# Build frontend
43
43
echo "Building frontend..."
44
44
# Create .env file for Vite
45
-
echo "VITE_API_URL=$API_URL" > frontend/.env
45
+
#echo "VITE_API_URL=$API_URL" > frontend/.env
46
46
47
47
# Install frontend dependencies and build
48
48
cd frontend
+1
-5
docker-compose.yml
+1
-5
docker-compose.yml
-858
frontend/bun.lock
-858
frontend/bun.lock
···
1
-
{
2
-
"lockfileVersion": 1,
3
-
"workspaces": {
4
-
"": {
5
-
"name": "frontend",
6
-
"dependencies": {
7
-
"@emotion/react": "^11.14.0",
8
-
"@hookform/resolvers": "^3.10.0",
9
-
"@icons-pack/react-simple-icons": "^11.2.0",
10
-
"@mantine/core": "^7.16.1",
11
-
"@mantine/form": "^7.16.1",
12
-
"@mantine/hooks": "^7.16.1",
13
-
"@radix-ui/react-dialog": "^1.1.5",
14
-
"@radix-ui/react-dropdown-menu": "^2.1.5",
15
-
"@radix-ui/react-label": "^2.1.1",
16
-
"@radix-ui/react-slot": "^1.1.1",
17
-
"@radix-ui/react-tabs": "^1.1.2",
18
-
"@radix-ui/react-toast": "^1.2.5",
19
-
"@tailwindcss/vite": "^4.0.0",
20
-
"axios": "^1.7.9",
21
-
"class-variance-authority": "^0.7.1",
22
-
"clsx": "^2.1.1",
23
-
"lucide-react": "^0.474.0",
24
-
"react": "^18.3.1",
25
-
"react-dom": "^18.3.1",
26
-
"react-hook-form": "^7.54.2",
27
-
"recharts": "^2.15.0",
28
-
"tailwind-merge": "^2.6.0",
29
-
"tailwindcss-animate": "^1.0.7",
30
-
"zod": "^3.24.1",
31
-
},
32
-
"devDependencies": {
33
-
"@eslint/js": "^9.17.0",
34
-
"@tailwindcss/postcss": "^4.0.0",
35
-
"@types/node": "^22.10.10",
36
-
"@types/react": "^18.3.18",
37
-
"@types/react-dom": "^18.3.5",
38
-
"@vitejs/plugin-react": "^4.3.4",
39
-
"eslint": "^9.17.0",
40
-
"eslint-plugin-react-hooks": "^5.0.0",
41
-
"eslint-plugin-react-refresh": "^0.4.16",
42
-
"globals": "^15.14.0",
43
-
"postcss": "^8.5.1",
44
-
"tailwindcss": "^4.0.0",
45
-
"typescript": "~5.6.2",
46
-
"typescript-eslint": "^8.18.2",
47
-
"vite": "^6.0.5",
48
-
},
49
-
},
50
-
},
51
-
"packages": {
52
-
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
53
-
54
-
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
55
-
56
-
"@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="],
57
-
58
-
"@babel/compat-data": ["@babel/compat-data@7.26.5", "", {}, "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg=="],
59
-
60
-
"@babel/core": ["@babel/core@7.26.7", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/traverse": "^7.26.7", "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA=="],
61
-
62
-
"@babel/generator": ["@babel/generator@7.26.5", "", { "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw=="],
63
-
64
-
"@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.26.5", "", { "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA=="],
65
-
66
-
"@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="],
67
-
68
-
"@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="],
69
-
70
-
"@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="],
71
-
72
-
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="],
73
-
74
-
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
75
-
76
-
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="],
77
-
78
-
"@babel/helpers": ["@babel/helpers@7.26.7", "", { "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.7" } }, "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A=="],
79
-
80
-
"@babel/parser": ["@babel/parser@7.26.7", "", { "dependencies": { "@babel/types": "^7.26.7" }, "bin": "./bin/babel-parser.js" }, "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w=="],
81
-
82
-
"@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg=="],
83
-
84
-
"@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg=="],
85
-
86
-
"@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="],
87
-
88
-
"@babel/template": ["@babel/template@7.25.9", "", { "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg=="],
89
-
90
-
"@babel/traverse": ["@babel/traverse@7.26.7", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA=="],
91
-
92
-
"@babel/types": ["@babel/types@7.26.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg=="],
93
-
94
-
"@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="],
95
-
96
-
"@emotion/cache": ["@emotion/cache@11.14.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="],
97
-
98
-
"@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="],
99
-
100
-
"@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="],
101
-
102
-
"@emotion/react": ["@emotion/react@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="],
103
-
104
-
"@emotion/serialize": ["@emotion/serialize@1.3.3", "", { "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="],
105
-
106
-
"@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="],
107
-
108
-
"@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="],
109
-
110
-
"@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="],
111
-
112
-
"@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="],
113
-
114
-
"@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="],
115
-
116
-
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="],
117
-
118
-
"@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="],
119
-
120
-
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="],
121
-
122
-
"@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="],
123
-
124
-
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="],
125
-
126
-
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="],
127
-
128
-
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="],
129
-
130
-
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="],
131
-
132
-
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="],
133
-
134
-
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="],
135
-
136
-
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="],
137
-
138
-
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="],
139
-
140
-
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="],
141
-
142
-
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="],
143
-
144
-
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="],
145
-
146
-
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="],
147
-
148
-
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="],
149
-
150
-
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="],
151
-
152
-
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="],
153
-
154
-
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="],
155
-
156
-
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="],
157
-
158
-
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="],
159
-
160
-
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="],
161
-
162
-
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="],
163
-
164
-
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="],
165
-
166
-
"@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="],
167
-
168
-
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
169
-
170
-
"@eslint/config-array": ["@eslint/config-array@0.19.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.5", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA=="],
171
-
172
-
"@eslint/core": ["@eslint/core@0.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw=="],
173
-
174
-
"@eslint/eslintrc": ["@eslint/eslintrc@3.2.0", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w=="],
175
-
176
-
"@eslint/js": ["@eslint/js@9.19.0", "", {}, "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ=="],
177
-
178
-
"@eslint/object-schema": ["@eslint/object-schema@2.1.5", "", {}, "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ=="],
179
-
180
-
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.5", "", { "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" } }, "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A=="],
181
-
182
-
"@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="],
183
-
184
-
"@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="],
185
-
186
-
"@floating-ui/react": ["@floating-ui/react@0.26.28", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.2", "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw=="],
187
-
188
-
"@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="],
189
-
190
-
"@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="],
191
-
192
-
"@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="],
193
-
194
-
"@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
195
-
196
-
"@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
197
-
198
-
"@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
199
-
200
-
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="],
201
-
202
-
"@icons-pack/react-simple-icons": ["@icons-pack/react-simple-icons@11.2.0", "", { "peerDependencies": { "react": "^16.13 || ^17 || ^18 || ^19" } }, "sha512-jCJ+1Fe0yiBQGYSfhx8QGU/9o27t8J4Hw3mxHEI9vohRltLSi5CaPzO2fCQcMNeTrAUAm4j+yaDuAutskiKRjA=="],
203
-
204
-
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
205
-
206
-
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
207
-
208
-
"@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
209
-
210
-
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
211
-
212
-
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
213
-
214
-
"@mantine/core": ["@mantine/core@7.16.1", "", { "dependencies": { "@floating-ui/react": "^0.26.28", "clsx": "^2.1.1", "react-number-format": "^5.4.3", "react-remove-scroll": "^2.6.2", "react-textarea-autosize": "8.5.6", "type-fest": "^4.27.0" }, "peerDependencies": { "@mantine/hooks": "7.16.1", "react": "^18.x || ^19.x", "react-dom": "^18.x || ^19.x" } }, "sha512-HYdjCeMU3dUJbc1CrAAedeAASTG5kVyL/qsiuYh5b7BoG0qsRtK8WJxBpUjW6VqtJpUaE94c5tlBJ8MgAmPHTQ=="],
215
-
216
-
"@mantine/form": ["@mantine/form@7.16.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "klona": "^2.0.6" }, "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-SZfOlmO14oAYdqo3SJKJlPrSNaeWyTPIPV/cur/4sPf114cAyggEZHoHJEjy2yA8UccfwYZx39yWrwxQCb8J8w=="],
217
-
218
-
"@mantine/hooks": ["@mantine/hooks@7.16.1", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-+hER8E4d2ByfQ/DKIXGM3Euxb7IH5ArSjzzzoF21sG095iXIryOCob22ZanrmiXCoAzKKdxqgVj4Di67ikLYSQ=="],
219
-
220
-
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
221
-
222
-
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
223
-
224
-
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
225
-
226
-
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.1", "", {}, "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA=="],
227
-
228
-
"@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w=="],
229
-
230
-
"@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA=="],
231
-
232
-
"@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="],
233
-
234
-
"@radix-ui/react-context": ["@radix-ui/react-context@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q=="],
235
-
236
-
"@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-slot": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw=="],
237
-
238
-
"@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg=="],
239
-
240
-
"@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-escape-keydown": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA=="],
241
-
242
-
"@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-menu": "2.1.5", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-50ZmEFL1kOuLalPKHrLWvPFMons2fGx9TqQCWlPwDVpbAnaUJ1g4XNcKqFNMQymYU0kKWR4MDDi+9vUQBGFgcQ=="],
243
-
244
-
"@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg=="],
245
-
246
-
"@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA=="],
247
-
248
-
"@radix-ui/react-id": ["@radix-ui/react-id@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA=="],
249
-
250
-
"@radix-ui/react-label": ["@radix-ui/react-label@2.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw=="],
251
-
252
-
"@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-focus-guards": "1.1.1", "@radix-ui/react-focus-scope": "1.1.1", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-popper": "1.2.1", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-roving-focus": "1.1.1", "@radix-ui/react-slot": "1.1.1", "@radix-ui/react-use-callback-ref": "1.1.0", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uH+3w5heoMJtqVCgYOtYVMECk1TOrkUn0OG0p5MqXC0W2ppcuVeESbou8PTHoqAjbdTEK19AGXBWcEtR5WpEQg=="],
253
-
254
-
"@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.1", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-use-rect": "1.1.0", "@radix-ui/react-use-size": "1.1.0", "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw=="],
255
-
256
-
"@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw=="],
257
-
258
-
"@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg=="],
259
-
260
-
"@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.0.1", "", { "dependencies": { "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg=="],
261
-
262
-
"@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw=="],
263
-
264
-
"@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g=="],
265
-
266
-
"@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-roving-focus": "1.1.1", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ=="],
267
-
268
-
"@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.1", "@radix-ui/react-collection": "1.1.1", "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.4", "@radix-ui/react-portal": "1.1.3", "@radix-ui/react-presence": "1.1.2", "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-callback-ref": "1.1.0", "@radix-ui/react-use-controllable-state": "1.1.0", "@radix-ui/react-use-layout-effect": "1.1.0", "@radix-ui/react-visually-hidden": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ZzUsAaOx8NdXZZKcFNDhbSlbsCUy8qQWmzTdgrlrhhZAOx2ofLtKrBDW9fkqhFvXgmtv560Uj16pkLkqML7SHA=="],
269
-
270
-
"@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw=="],
271
-
272
-
"@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw=="],
273
-
274
-
"@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.0", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw=="],
275
-
276
-
"@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w=="],
277
-
278
-
"@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.0", "", { "dependencies": { "@radix-ui/rect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ=="],
279
-
280
-
"@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.0", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw=="],
281
-
282
-
"@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.1.1", "", { "dependencies": { "@radix-ui/react-primitive": "2.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg=="],
283
-
284
-
"@radix-ui/rect": ["@radix-ui/rect@1.1.0", "", {}, "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg=="],
285
-
286
-
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.32.0", "", { "os": "android", "cpu": "arm" }, "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg=="],
287
-
288
-
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A=="],
289
-
290
-
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ=="],
291
-
292
-
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ=="],
293
-
294
-
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.32.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA=="],
295
-
296
-
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ=="],
297
-
298
-
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A=="],
299
-
300
-
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ=="],
301
-
302
-
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w=="],
303
-
304
-
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw=="],
305
-
306
-
"@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.32.0", "", { "os": "linux", "cpu": "none" }, "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw=="],
307
-
308
-
"@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.32.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ=="],
309
-
310
-
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.32.0", "", { "os": "linux", "cpu": "none" }, "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw=="],
311
-
312
-
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.32.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw=="],
313
-
314
-
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A=="],
315
-
316
-
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg=="],
317
-
318
-
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg=="],
319
-
320
-
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.32.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw=="],
321
-
322
-
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA=="],
323
-
324
-
"@tailwindcss/node": ["@tailwindcss/node@4.0.0", "", { "dependencies": { "enhanced-resolve": "^5.18.0", "jiti": "^2.4.2", "tailwindcss": "4.0.0" } }, "sha512-tfG2uBvo6j6kDIPmntxwXggCOZAt7SkpAXJ6pTIYirNdk5FBqh/CZZ9BZPpgcl/tNFLs6zc4yghM76sqiELG9g=="],
325
-
326
-
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.0.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.0.0", "@tailwindcss/oxide-darwin-arm64": "4.0.0", "@tailwindcss/oxide-darwin-x64": "4.0.0", "@tailwindcss/oxide-freebsd-x64": "4.0.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.0", "@tailwindcss/oxide-linux-arm64-musl": "4.0.0", "@tailwindcss/oxide-linux-x64-gnu": "4.0.0", "@tailwindcss/oxide-linux-x64-musl": "4.0.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.0", "@tailwindcss/oxide-win32-x64-msvc": "4.0.0" } }, "sha512-W3FjpJgy4VV1JiL7iBYDf2n/WkeDg1Il+0Q7eWnqPyvkPPCo/Mbwc5BiaT7dfBNV6tQKAhVE34rU5xl8pSl50w=="],
327
-
328
-
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.0.0", "", { "os": "android", "cpu": "arm64" }, "sha512-EAhjU0+FIdyGPR+7MbBWubLLPtmOu+p7c2egTTFBRk/n//zYjNvVK0WhcBK5Y7oUB5mo4EjA2mCbY7dcEMWSRw=="],
329
-
330
-
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hdz4xnSWS11cIp+7ye+3dGHqs0X33z+BXXTtgPOguDWVa+TdXUzwxonklSzf5wlJFuot3dv5eWzhlNai0oYYQg=="],
331
-
332
-
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.0.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-+dOUUaXTkPKKhtUI9QtVaYg+MpmLh2CN0dHohiYXaBirEyPMkjaT0zbRgzQlNnQWjCVVXPQluIEb0OMEjSTH+Q=="],
333
-
334
-
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.0.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-CJhGDhxnrmu4SwyC62fA+wP24MhA/TZlIhRHqg1kRuIHoGoVR2uSSm1qxTxU37tSSZj8Up0q6jsBJCAP4k7rgQ=="],
335
-
336
-
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Wy7Av0xzXfY2ujZBcYy4+7GQm25/J1iHvlQU2CfwdDCuPWfIjYzR6kggz+uVdSJyKV2s64znchBxRE8kV4uXSA=="],
337
-
338
-
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-srwBo2l6pvM0swBntc1ucuhGsfFOLkqPRFQ3dWARRTfSkL1U9nAsob2MKc/n47Eva/W9pZZgMOuf7rDw8pK1Ew=="],
339
-
340
-
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-abhusswkduYWuezkBmgo0K0/erGq3M4Se5xP0fhc/0dKs0X/rJUYYCFWntHb3IGh3aVzdQ0SXJs93P76DbUqtw=="],
341
-
342
-
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-hGtRYIUEx377/HlU49+jvVKKwU1MDSKYSMMs0JFO2Wp7LGxk5+0j5+RBk9NFnmp/lbp32yPTgIOO5m1BmDq36A=="],
343
-
344
-
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7xgQgSAThs0I14VAgmxpJnK6XFSZBxHMGoDXkLyYkEnu+8WRQMbCP93dkCUn2PIv+Q+JulRgc00PJ09uORSLXQ=="],
345
-
346
-
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-qEcgTIPcWY5ZE7f6VxQ/JPrSFMcehzVIlZj7sGE3mVd5YWreAT+Fl1vSP8q2pjnWXn0avZG3Iw7a2hJQAm+fTQ=="],
347
-
348
-
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-bqT0AY8RXb8GMDy28JtngvqaOSB2YixbLPLvUo6I6lkvvUwA6Eqh2Tj60e2Lh7O/k083f8tYiB0WEK4wmTI7Jg=="],
349
-
350
-
"@tailwindcss/postcss": ["@tailwindcss/postcss@4.0.0", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "^4.0.0", "@tailwindcss/oxide": "^4.0.0", "lightningcss": "^1.29.1", "postcss": "^8.4.41", "tailwindcss": "4.0.0" } }, "sha512-lI2bPk4TvwavHdehjr5WiC6HnZ59hacM6ySEo4RM/H7tsjWd8JpqiNW9ThH7rO/yKtrn4mGBoXshpvn8clXjPg=="],
351
-
352
-
"@tailwindcss/vite": ["@tailwindcss/vite@4.0.0", "", { "dependencies": { "@tailwindcss/node": "^4.0.0", "@tailwindcss/oxide": "^4.0.0", "lightningcss": "^1.29.1", "tailwindcss": "4.0.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-4uukMiU9gHui8KMPMdWic5SP1O/tmQ1NFSRNrQWmcop5evAVl/LZ6/LuWL3quEiecp2RBcRWwqJrG+mFXlRlew=="],
353
-
354
-
"@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
355
-
356
-
"@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="],
357
-
358
-
"@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
359
-
360
-
"@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="],
361
-
362
-
"@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="],
363
-
364
-
"@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="],
365
-
366
-
"@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="],
367
-
368
-
"@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="],
369
-
370
-
"@types/d3-path": ["@types/d3-path@3.1.0", "", {}, "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ=="],
371
-
372
-
"@types/d3-scale": ["@types/d3-scale@4.0.8", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ=="],
373
-
374
-
"@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="],
375
-
376
-
"@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
377
-
378
-
"@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="],
379
-
380
-
"@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
381
-
382
-
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
383
-
384
-
"@types/node": ["@types/node@22.10.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww=="],
385
-
386
-
"@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="],
387
-
388
-
"@types/prop-types": ["@types/prop-types@15.7.14", "", {}, "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="],
389
-
390
-
"@types/react": ["@types/react@18.3.18", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ=="],
391
-
392
-
"@types/react-dom": ["@types/react-dom@18.3.5", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q=="],
393
-
394
-
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/type-utils": "8.21.0", "@typescript-eslint/utils": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA=="],
395
-
396
-
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/types": "8.21.0", "@typescript-eslint/typescript-estree": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA=="],
397
-
398
-
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0" } }, "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA=="],
399
-
400
-
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.21.0", "@typescript-eslint/utils": "8.21.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ=="],
401
-
402
-
"@typescript-eslint/types": ["@typescript-eslint/types@8.21.0", "", {}, "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A=="],
403
-
404
-
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "@typescript-eslint/visitor-keys": "8.21.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg=="],
405
-
406
-
"@typescript-eslint/utils": ["@typescript-eslint/utils@8.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.21.0", "@typescript-eslint/types": "8.21.0", "@typescript-eslint/typescript-estree": "8.21.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw=="],
407
-
408
-
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.21.0", "", { "dependencies": { "@typescript-eslint/types": "8.21.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w=="],
409
-
410
-
"@vitejs/plugin-react": ["@vitejs/plugin-react@4.3.4", "", { "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug=="],
411
-
412
-
"acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
413
-
414
-
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
415
-
416
-
"ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
417
-
418
-
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
419
-
420
-
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
421
-
422
-
"aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="],
423
-
424
-
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
425
-
426
-
"axios": ["axios@1.7.9", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw=="],
427
-
428
-
"babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="],
429
-
430
-
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
431
-
432
-
"brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
433
-
434
-
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
435
-
436
-
"browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="],
437
-
438
-
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
439
-
440
-
"caniuse-lite": ["caniuse-lite@1.0.30001695", "", {}, "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw=="],
441
-
442
-
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
443
-
444
-
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
445
-
446
-
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
447
-
448
-
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
449
-
450
-
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
451
-
452
-
"combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
453
-
454
-
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
455
-
456
-
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
457
-
458
-
"cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="],
459
-
460
-
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
461
-
462
-
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
463
-
464
-
"d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
465
-
466
-
"d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
467
-
468
-
"d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="],
469
-
470
-
"d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="],
471
-
472
-
"d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
473
-
474
-
"d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
475
-
476
-
"d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
477
-
478
-
"d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
479
-
480
-
"d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
481
-
482
-
"d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
483
-
484
-
"d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="],
485
-
486
-
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
487
-
488
-
"decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="],
489
-
490
-
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
491
-
492
-
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
493
-
494
-
"detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="],
495
-
496
-
"detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
497
-
498
-
"dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="],
499
-
500
-
"electron-to-chromium": ["electron-to-chromium@1.5.88", "", {}, "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw=="],
501
-
502
-
"enhanced-resolve": ["enhanced-resolve@5.18.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ=="],
503
-
504
-
"error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="],
505
-
506
-
"esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="],
507
-
508
-
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
509
-
510
-
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
511
-
512
-
"eslint": ["eslint@9.19.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA=="],
513
-
514
-
"eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.1.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw=="],
515
-
516
-
"eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.18", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-IRGEoFn3OKalm3hjfolEWGqoF/jPqeEYFp+C8B0WMzwGwBMvlRDQd06kghDhF0C61uJ6WfSDhEZE/sAQjduKgw=="],
517
-
518
-
"eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="],
519
-
520
-
"eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
521
-
522
-
"espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="],
523
-
524
-
"esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
525
-
526
-
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
527
-
528
-
"estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
529
-
530
-
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
531
-
532
-
"eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],
533
-
534
-
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
535
-
536
-
"fast-equals": ["fast-equals@5.2.2", "", {}, "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw=="],
537
-
538
-
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
539
-
540
-
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
541
-
542
-
"fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
543
-
544
-
"fastq": ["fastq@1.18.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw=="],
545
-
546
-
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
547
-
548
-
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
549
-
550
-
"find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="],
551
-
552
-
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
553
-
554
-
"flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
555
-
556
-
"flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="],
557
-
558
-
"follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
559
-
560
-
"form-data": ["form-data@4.0.1", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw=="],
561
-
562
-
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
563
-
564
-
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
565
-
566
-
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
567
-
568
-
"get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
569
-
570
-
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
571
-
572
-
"globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="],
573
-
574
-
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
575
-
576
-
"graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
577
-
578
-
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
579
-
580
-
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
581
-
582
-
"hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="],
583
-
584
-
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
585
-
586
-
"import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="],
587
-
588
-
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
589
-
590
-
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
591
-
592
-
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
593
-
594
-
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
595
-
596
-
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
597
-
598
-
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
599
-
600
-
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
601
-
602
-
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
603
-
604
-
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
605
-
606
-
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
607
-
608
-
"js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
609
-
610
-
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
611
-
612
-
"json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
613
-
614
-
"json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
615
-
616
-
"json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
617
-
618
-
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
619
-
620
-
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
621
-
622
-
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
623
-
624
-
"klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="],
625
-
626
-
"levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
627
-
628
-
"lightningcss": ["lightningcss@1.29.1", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.1", "lightningcss-darwin-x64": "1.29.1", "lightningcss-freebsd-x64": "1.29.1", "lightningcss-linux-arm-gnueabihf": "1.29.1", "lightningcss-linux-arm64-gnu": "1.29.1", "lightningcss-linux-arm64-musl": "1.29.1", "lightningcss-linux-x64-gnu": "1.29.1", "lightningcss-linux-x64-musl": "1.29.1", "lightningcss-win32-arm64-msvc": "1.29.1", "lightningcss-win32-x64-msvc": "1.29.1" } }, "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q=="],
629
-
630
-
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw=="],
631
-
632
-
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA=="],
633
-
634
-
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ=="],
635
-
636
-
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.1", "", { "os": "linux", "cpu": "arm" }, "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg=="],
637
-
638
-
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ=="],
639
-
640
-
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw=="],
641
-
642
-
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw=="],
643
-
644
-
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw=="],
645
-
646
-
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog=="],
647
-
648
-
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.1", "", { "os": "win32", "cpu": "x64" }, "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q=="],
649
-
650
-
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
651
-
652
-
"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
653
-
654
-
"lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
655
-
656
-
"lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
657
-
658
-
"loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
659
-
660
-
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
661
-
662
-
"lucide-react": ["lucide-react@0.474.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-CmghgHkh0OJNmxGKWc0qfPJCYHASPMVSyGY8fj3xgk4v84ItqDg64JNKFZn5hC6E0vHi6gxnbCgwhyVB09wQtA=="],
663
-
664
-
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
665
-
666
-
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
667
-
668
-
"mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
669
-
670
-
"mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
671
-
672
-
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
673
-
674
-
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
675
-
676
-
"nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
677
-
678
-
"natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
679
-
680
-
"node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
681
-
682
-
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
683
-
684
-
"optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
685
-
686
-
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
687
-
688
-
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
689
-
690
-
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
691
-
692
-
"parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
693
-
694
-
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
695
-
696
-
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
697
-
698
-
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
699
-
700
-
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
701
-
702
-
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
703
-
704
-
"picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
705
-
706
-
"postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="],
707
-
708
-
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
709
-
710
-
"prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
711
-
712
-
"proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
713
-
714
-
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
715
-
716
-
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
717
-
718
-
"react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
719
-
720
-
"react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="],
721
-
722
-
"react-hook-form": ["react-hook-form@7.54.2", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg=="],
723
-
724
-
"react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
725
-
726
-
"react-number-format": ["react-number-format@5.4.3", "", { "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-VCY5hFg/soBighAoGcdE+GagkJq0230qN6jcS5sp8wQX1qy1fYN/RX7/BXkrs0oyzzwqR8/+eSUrqXbGeywdUQ=="],
727
-
728
-
"react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="],
729
-
730
-
"react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="],
731
-
732
-
"react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
733
-
734
-
"react-smooth": ["react-smooth@4.0.4", "", { "dependencies": { "fast-equals": "^5.0.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q=="],
735
-
736
-
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
737
-
738
-
"react-textarea-autosize": ["react-textarea-autosize@8.5.6", "", { "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aT3ioKXMa8f6zHYGebhbdMD2L00tKeRX1zuVuDx9YQK/JLLRSaSxq3ugECEmUB9z2kvk6bFSIoRHLkkUv0RJiw=="],
739
-
740
-
"react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="],
741
-
742
-
"recharts": ["recharts@2.15.0", "", { "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.21", "react-is": "^18.3.1", "react-smooth": "^4.0.0", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw=="],
743
-
744
-
"recharts-scale": ["recharts-scale@0.4.5", "", { "dependencies": { "decimal.js-light": "^2.4.1" } }, "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w=="],
745
-
746
-
"regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="],
747
-
748
-
"resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
749
-
750
-
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
751
-
752
-
"reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="],
753
-
754
-
"rollup": ["rollup@4.32.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.32.0", "@rollup/rollup-android-arm64": "4.32.0", "@rollup/rollup-darwin-arm64": "4.32.0", "@rollup/rollup-darwin-x64": "4.32.0", "@rollup/rollup-freebsd-arm64": "4.32.0", "@rollup/rollup-freebsd-x64": "4.32.0", "@rollup/rollup-linux-arm-gnueabihf": "4.32.0", "@rollup/rollup-linux-arm-musleabihf": "4.32.0", "@rollup/rollup-linux-arm64-gnu": "4.32.0", "@rollup/rollup-linux-arm64-musl": "4.32.0", "@rollup/rollup-linux-loongarch64-gnu": "4.32.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.32.0", "@rollup/rollup-linux-riscv64-gnu": "4.32.0", "@rollup/rollup-linux-s390x-gnu": "4.32.0", "@rollup/rollup-linux-x64-gnu": "4.32.0", "@rollup/rollup-linux-x64-musl": "4.32.0", "@rollup/rollup-win32-arm64-msvc": "4.32.0", "@rollup/rollup-win32-ia32-msvc": "4.32.0", "@rollup/rollup-win32-x64-msvc": "4.32.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg=="],
755
-
756
-
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
757
-
758
-
"scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="],
759
-
760
-
"semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
761
-
762
-
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
763
-
764
-
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
765
-
766
-
"source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
767
-
768
-
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
769
-
770
-
"strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
771
-
772
-
"stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="],
773
-
774
-
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
775
-
776
-
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
777
-
778
-
"tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
779
-
780
-
"tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="],
781
-
782
-
"tailwindcss": ["tailwindcss@4.0.0", "", {}, "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ=="],
783
-
784
-
"tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="],
785
-
786
-
"tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="],
787
-
788
-
"tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
789
-
790
-
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
791
-
792
-
"ts-api-utils": ["ts-api-utils@2.0.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ=="],
793
-
794
-
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
795
-
796
-
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
797
-
798
-
"type-fest": ["type-fest@4.33.0", "", {}, "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g=="],
799
-
800
-
"typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
801
-
802
-
"typescript-eslint": ["typescript-eslint@8.21.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.21.0", "@typescript-eslint/parser": "8.21.0", "@typescript-eslint/utils": "8.21.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw=="],
803
-
804
-
"undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
805
-
806
-
"update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="],
807
-
808
-
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
809
-
810
-
"use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
811
-
812
-
"use-composed-ref": ["use-composed-ref@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w=="],
813
-
814
-
"use-isomorphic-layout-effect": ["use-isomorphic-layout-effect@1.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w=="],
815
-
816
-
"use-latest": ["use-latest@1.3.0", "", { "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ=="],
817
-
818
-
"use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
819
-
820
-
"victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="],
821
-
822
-
"vite": ["vite@6.0.11", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg=="],
823
-
824
-
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
825
-
826
-
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
827
-
828
-
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
829
-
830
-
"yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
831
-
832
-
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
833
-
834
-
"zod": ["zod@3.24.1", "", {}, "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A=="],
835
-
836
-
"@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
837
-
838
-
"@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="],
839
-
840
-
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
841
-
842
-
"@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
843
-
844
-
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
845
-
846
-
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
847
-
848
-
"@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="],
849
-
850
-
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
851
-
852
-
"hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
853
-
854
-
"prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
855
-
856
-
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
857
-
}
858
-
}
+14
-11
frontend/index.html
+14
-11
frontend/index.html
···
1
1
<!doctype html>
2
2
<html lang="en">
3
-
<head>
4
-
<meta charset="UTF-8" />
5
-
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
-
<title>Vite + React + TS</title>
8
-
</head>
9
-
<body>
10
-
<div id="root"></div>
11
-
<script type="module" src="/src/main.tsx"></script>
12
-
</body>
13
-
</html>
3
+
4
+
<head>
5
+
<meta charset="UTF-8" />
6
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
7
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+
<title>SimpleLink</title>
9
+
</head>
10
+
11
+
<body>
12
+
<div id="root"></div>
13
+
<script type="module" src="/src/main.tsx"></script>
14
+
</body>
15
+
16
+
</html>
-3996
frontend/package-lock.json
-3996
frontend/package-lock.json
···
1
-
{
2
-
"name": "frontend",
3
-
"version": "0.0.0",
4
-
"lockfileVersion": 3,
5
-
"requires": true,
6
-
"packages": {
7
-
"": {
8
-
"name": "frontend",
9
-
"version": "0.0.0",
10
-
"dependencies": {
11
-
"@emotion/react": "^11.14.0",
12
-
"@hookform/resolvers": "^3.10.0",
13
-
"@icons-pack/react-simple-icons": "^11.2.0",
14
-
"@mantine/core": "^7.16.1",
15
-
"@mantine/form": "^7.16.1",
16
-
"@mantine/hooks": "^7.16.1",
17
-
"@radix-ui/react-dialog": "^1.1.5",
18
-
"@radix-ui/react-dropdown-menu": "^2.1.5",
19
-
"@radix-ui/react-label": "^2.1.1",
20
-
"@radix-ui/react-slot": "^1.1.1",
21
-
"@radix-ui/react-tabs": "^1.1.2",
22
-
"@radix-ui/react-toast": "^1.2.5",
23
-
"@tailwindcss/vite": "^4.0.0",
24
-
"axios": "^1.7.9",
25
-
"class-variance-authority": "^0.7.1",
26
-
"clsx": "^2.1.1",
27
-
"lucide-react": "^0.474.0",
28
-
"react": "^18.3.1",
29
-
"react-dom": "^18.3.1",
30
-
"react-hook-form": "^7.54.2",
31
-
"recharts": "^2.15.0",
32
-
"tailwind-merge": "^2.6.0",
33
-
"tailwindcss-animate": "^1.0.7",
34
-
"zod": "^3.24.1"
35
-
},
36
-
"devDependencies": {
37
-
"@eslint/js": "^9.17.0",
38
-
"@tailwindcss/postcss": "^4.0.0",
39
-
"@types/node": "^22.10.10",
40
-
"@types/react": "^18.3.18",
41
-
"@types/react-dom": "^18.3.5",
42
-
"@vitejs/plugin-react": "^4.3.4",
43
-
"eslint": "^9.17.0",
44
-
"eslint-plugin-react-hooks": "^5.0.0",
45
-
"eslint-plugin-react-refresh": "^0.4.16",
46
-
"globals": "^15.14.0",
47
-
"postcss": "^8.5.1",
48
-
"tailwindcss": "^4.0.0",
49
-
"typescript": "~5.6.2",
50
-
"typescript-eslint": "^8.18.2",
51
-
"vite": "^6.0.5"
52
-
}
53
-
},
54
-
"node_modules/@alloc/quick-lru": {
55
-
"version": "5.2.0",
56
-
"dev": true,
57
-
"license": "MIT",
58
-
"engines": {
59
-
"node": ">=10"
60
-
},
61
-
"funding": {
62
-
"url": "https://github.com/sponsors/sindresorhus"
63
-
}
64
-
},
65
-
"node_modules/@ampproject/remapping": {
66
-
"version": "2.3.0",
67
-
"dev": true,
68
-
"license": "Apache-2.0",
69
-
"dependencies": {
70
-
"@jridgewell/gen-mapping": "^0.3.5",
71
-
"@jridgewell/trace-mapping": "^0.3.24"
72
-
},
73
-
"engines": {
74
-
"node": ">=6.0.0"
75
-
}
76
-
},
77
-
"node_modules/@babel/code-frame": {
78
-
"version": "7.26.2",
79
-
"license": "MIT",
80
-
"dependencies": {
81
-
"@babel/helper-validator-identifier": "^7.25.9",
82
-
"js-tokens": "^4.0.0",
83
-
"picocolors": "^1.0.0"
84
-
},
85
-
"engines": {
86
-
"node": ">=6.9.0"
87
-
}
88
-
},
89
-
"node_modules/@babel/compat-data": {
90
-
"version": "7.26.5",
91
-
"dev": true,
92
-
"license": "MIT",
93
-
"engines": {
94
-
"node": ">=6.9.0"
95
-
}
96
-
},
97
-
"node_modules/@babel/core": {
98
-
"version": "7.26.7",
99
-
"dev": true,
100
-
"license": "MIT",
101
-
"dependencies": {
102
-
"@ampproject/remapping": "^2.2.0",
103
-
"@babel/code-frame": "^7.26.2",
104
-
"@babel/generator": "^7.26.5",
105
-
"@babel/helper-compilation-targets": "^7.26.5",
106
-
"@babel/helper-module-transforms": "^7.26.0",
107
-
"@babel/helpers": "^7.26.7",
108
-
"@babel/parser": "^7.26.7",
109
-
"@babel/template": "^7.25.9",
110
-
"@babel/traverse": "^7.26.7",
111
-
"@babel/types": "^7.26.7",
112
-
"convert-source-map": "^2.0.0",
113
-
"debug": "^4.1.0",
114
-
"gensync": "^1.0.0-beta.2",
115
-
"json5": "^2.2.3",
116
-
"semver": "^6.3.1"
117
-
},
118
-
"engines": {
119
-
"node": ">=6.9.0"
120
-
},
121
-
"funding": {
122
-
"type": "opencollective",
123
-
"url": "https://opencollective.com/babel"
124
-
}
125
-
},
126
-
"node_modules/@babel/generator": {
127
-
"version": "7.26.5",
128
-
"license": "MIT",
129
-
"dependencies": {
130
-
"@babel/parser": "^7.26.5",
131
-
"@babel/types": "^7.26.5",
132
-
"@jridgewell/gen-mapping": "^0.3.5",
133
-
"@jridgewell/trace-mapping": "^0.3.25",
134
-
"jsesc": "^3.0.2"
135
-
},
136
-
"engines": {
137
-
"node": ">=6.9.0"
138
-
}
139
-
},
140
-
"node_modules/@babel/helper-compilation-targets": {
141
-
"version": "7.26.5",
142
-
"dev": true,
143
-
"license": "MIT",
144
-
"dependencies": {
145
-
"@babel/compat-data": "^7.26.5",
146
-
"@babel/helper-validator-option": "^7.25.9",
147
-
"browserslist": "^4.24.0",
148
-
"lru-cache": "^5.1.1",
149
-
"semver": "^6.3.1"
150
-
},
151
-
"engines": {
152
-
"node": ">=6.9.0"
153
-
}
154
-
},
155
-
"node_modules/@babel/helper-module-imports": {
156
-
"version": "7.25.9",
157
-
"license": "MIT",
158
-
"dependencies": {
159
-
"@babel/traverse": "^7.25.9",
160
-
"@babel/types": "^7.25.9"
161
-
},
162
-
"engines": {
163
-
"node": ">=6.9.0"
164
-
}
165
-
},
166
-
"node_modules/@babel/helper-module-transforms": {
167
-
"version": "7.26.0",
168
-
"dev": true,
169
-
"license": "MIT",
170
-
"dependencies": {
171
-
"@babel/helper-module-imports": "^7.25.9",
172
-
"@babel/helper-validator-identifier": "^7.25.9",
173
-
"@babel/traverse": "^7.25.9"
174
-
},
175
-
"engines": {
176
-
"node": ">=6.9.0"
177
-
},
178
-
"peerDependencies": {
179
-
"@babel/core": "^7.0.0"
180
-
}
181
-
},
182
-
"node_modules/@babel/helper-plugin-utils": {
183
-
"version": "7.26.5",
184
-
"dev": true,
185
-
"license": "MIT",
186
-
"engines": {
187
-
"node": ">=6.9.0"
188
-
}
189
-
},
190
-
"node_modules/@babel/helper-string-parser": {
191
-
"version": "7.25.9",
192
-
"license": "MIT",
193
-
"engines": {
194
-
"node": ">=6.9.0"
195
-
}
196
-
},
197
-
"node_modules/@babel/helper-validator-identifier": {
198
-
"version": "7.25.9",
199
-
"license": "MIT",
200
-
"engines": {
201
-
"node": ">=6.9.0"
202
-
}
203
-
},
204
-
"node_modules/@babel/helper-validator-option": {
205
-
"version": "7.25.9",
206
-
"dev": true,
207
-
"license": "MIT",
208
-
"engines": {
209
-
"node": ">=6.9.0"
210
-
}
211
-
},
212
-
"node_modules/@babel/helpers": {
213
-
"version": "7.26.7",
214
-
"dev": true,
215
-
"license": "MIT",
216
-
"dependencies": {
217
-
"@babel/template": "^7.25.9",
218
-
"@babel/types": "^7.26.7"
219
-
},
220
-
"engines": {
221
-
"node": ">=6.9.0"
222
-
}
223
-
},
224
-
"node_modules/@babel/parser": {
225
-
"version": "7.26.7",
226
-
"license": "MIT",
227
-
"dependencies": {
228
-
"@babel/types": "^7.26.7"
229
-
},
230
-
"bin": {
231
-
"parser": "bin/babel-parser.js"
232
-
},
233
-
"engines": {
234
-
"node": ">=6.0.0"
235
-
}
236
-
},
237
-
"node_modules/@babel/plugin-transform-react-jsx-self": {
238
-
"version": "7.25.9",
239
-
"dev": true,
240
-
"license": "MIT",
241
-
"dependencies": {
242
-
"@babel/helper-plugin-utils": "^7.25.9"
243
-
},
244
-
"engines": {
245
-
"node": ">=6.9.0"
246
-
},
247
-
"peerDependencies": {
248
-
"@babel/core": "^7.0.0-0"
249
-
}
250
-
},
251
-
"node_modules/@babel/plugin-transform-react-jsx-source": {
252
-
"version": "7.25.9",
253
-
"dev": true,
254
-
"license": "MIT",
255
-
"dependencies": {
256
-
"@babel/helper-plugin-utils": "^7.25.9"
257
-
},
258
-
"engines": {
259
-
"node": ">=6.9.0"
260
-
},
261
-
"peerDependencies": {
262
-
"@babel/core": "^7.0.0-0"
263
-
}
264
-
},
265
-
"node_modules/@babel/runtime": {
266
-
"version": "7.26.7",
267
-
"license": "MIT",
268
-
"dependencies": {
269
-
"regenerator-runtime": "^0.14.0"
270
-
},
271
-
"engines": {
272
-
"node": ">=6.9.0"
273
-
}
274
-
},
275
-
"node_modules/@babel/template": {
276
-
"version": "7.25.9",
277
-
"license": "MIT",
278
-
"dependencies": {
279
-
"@babel/code-frame": "^7.25.9",
280
-
"@babel/parser": "^7.25.9",
281
-
"@babel/types": "^7.25.9"
282
-
},
283
-
"engines": {
284
-
"node": ">=6.9.0"
285
-
}
286
-
},
287
-
"node_modules/@babel/traverse": {
288
-
"version": "7.26.7",
289
-
"license": "MIT",
290
-
"dependencies": {
291
-
"@babel/code-frame": "^7.26.2",
292
-
"@babel/generator": "^7.26.5",
293
-
"@babel/parser": "^7.26.7",
294
-
"@babel/template": "^7.25.9",
295
-
"@babel/types": "^7.26.7",
296
-
"debug": "^4.3.1",
297
-
"globals": "^11.1.0"
298
-
},
299
-
"engines": {
300
-
"node": ">=6.9.0"
301
-
}
302
-
},
303
-
"node_modules/@babel/traverse/node_modules/globals": {
304
-
"version": "11.12.0",
305
-
"license": "MIT",
306
-
"engines": {
307
-
"node": ">=4"
308
-
}
309
-
},
310
-
"node_modules/@babel/types": {
311
-
"version": "7.26.7",
312
-
"license": "MIT",
313
-
"dependencies": {
314
-
"@babel/helper-string-parser": "^7.25.9",
315
-
"@babel/helper-validator-identifier": "^7.25.9"
316
-
},
317
-
"engines": {
318
-
"node": ">=6.9.0"
319
-
}
320
-
},
321
-
"node_modules/@emotion/babel-plugin": {
322
-
"version": "11.13.5",
323
-
"license": "MIT",
324
-
"dependencies": {
325
-
"@babel/helper-module-imports": "^7.16.7",
326
-
"@babel/runtime": "^7.18.3",
327
-
"@emotion/hash": "^0.9.2",
328
-
"@emotion/memoize": "^0.9.0",
329
-
"@emotion/serialize": "^1.3.3",
330
-
"babel-plugin-macros": "^3.1.0",
331
-
"convert-source-map": "^1.5.0",
332
-
"escape-string-regexp": "^4.0.0",
333
-
"find-root": "^1.1.0",
334
-
"source-map": "^0.5.7",
335
-
"stylis": "4.2.0"
336
-
}
337
-
},
338
-
"node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
339
-
"version": "1.9.0",
340
-
"license": "MIT"
341
-
},
342
-
"node_modules/@emotion/cache": {
343
-
"version": "11.14.0",
344
-
"license": "MIT",
345
-
"dependencies": {
346
-
"@emotion/memoize": "^0.9.0",
347
-
"@emotion/sheet": "^1.4.0",
348
-
"@emotion/utils": "^1.4.2",
349
-
"@emotion/weak-memoize": "^0.4.0",
350
-
"stylis": "4.2.0"
351
-
}
352
-
},
353
-
"node_modules/@emotion/hash": {
354
-
"version": "0.9.2",
355
-
"license": "MIT"
356
-
},
357
-
"node_modules/@emotion/memoize": {
358
-
"version": "0.9.0",
359
-
"license": "MIT"
360
-
},
361
-
"node_modules/@emotion/react": {
362
-
"version": "11.14.0",
363
-
"license": "MIT",
364
-
"dependencies": {
365
-
"@babel/runtime": "^7.18.3",
366
-
"@emotion/babel-plugin": "^11.13.5",
367
-
"@emotion/cache": "^11.14.0",
368
-
"@emotion/serialize": "^1.3.3",
369
-
"@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
370
-
"@emotion/utils": "^1.4.2",
371
-
"@emotion/weak-memoize": "^0.4.0",
372
-
"hoist-non-react-statics": "^3.3.1"
373
-
},
374
-
"peerDependencies": {
375
-
"react": ">=16.8.0"
376
-
},
377
-
"peerDependenciesMeta": {
378
-
"@types/react": {
379
-
"optional": true
380
-
}
381
-
}
382
-
},
383
-
"node_modules/@emotion/serialize": {
384
-
"version": "1.3.3",
385
-
"license": "MIT",
386
-
"dependencies": {
387
-
"@emotion/hash": "^0.9.2",
388
-
"@emotion/memoize": "^0.9.0",
389
-
"@emotion/unitless": "^0.10.0",
390
-
"@emotion/utils": "^1.4.2",
391
-
"csstype": "^3.0.2"
392
-
}
393
-
},
394
-
"node_modules/@emotion/sheet": {
395
-
"version": "1.4.0",
396
-
"license": "MIT"
397
-
},
398
-
"node_modules/@emotion/unitless": {
399
-
"version": "0.10.0",
400
-
"license": "MIT"
401
-
},
402
-
"node_modules/@emotion/use-insertion-effect-with-fallbacks": {
403
-
"version": "1.2.0",
404
-
"license": "MIT",
405
-
"peerDependencies": {
406
-
"react": ">=16.8.0"
407
-
}
408
-
},
409
-
"node_modules/@emotion/utils": {
410
-
"version": "1.4.2",
411
-
"license": "MIT"
412
-
},
413
-
"node_modules/@emotion/weak-memoize": {
414
-
"version": "0.4.0",
415
-
"license": "MIT"
416
-
},
417
-
"node_modules/@esbuild/darwin-arm64": {
418
-
"version": "0.24.2",
419
-
"cpu": [
420
-
"arm64"
421
-
],
422
-
"license": "MIT",
423
-
"optional": true,
424
-
"os": [
425
-
"darwin"
426
-
],
427
-
"engines": {
428
-
"node": ">=18"
429
-
}
430
-
},
431
-
"node_modules/@eslint-community/eslint-utils": {
432
-
"version": "4.4.1",
433
-
"dev": true,
434
-
"license": "MIT",
435
-
"dependencies": {
436
-
"eslint-visitor-keys": "^3.4.3"
437
-
},
438
-
"engines": {
439
-
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
440
-
},
441
-
"funding": {
442
-
"url": "https://opencollective.com/eslint"
443
-
},
444
-
"peerDependencies": {
445
-
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
446
-
}
447
-
},
448
-
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
449
-
"version": "3.4.3",
450
-
"dev": true,
451
-
"license": "Apache-2.0",
452
-
"engines": {
453
-
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
454
-
},
455
-
"funding": {
456
-
"url": "https://opencollective.com/eslint"
457
-
}
458
-
},
459
-
"node_modules/@eslint-community/regexpp": {
460
-
"version": "4.12.1",
461
-
"dev": true,
462
-
"license": "MIT",
463
-
"engines": {
464
-
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
465
-
}
466
-
},
467
-
"node_modules/@eslint/config-array": {
468
-
"version": "0.19.1",
469
-
"dev": true,
470
-
"license": "Apache-2.0",
471
-
"dependencies": {
472
-
"@eslint/object-schema": "^2.1.5",
473
-
"debug": "^4.3.1",
474
-
"minimatch": "^3.1.2"
475
-
},
476
-
"engines": {
477
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
478
-
}
479
-
},
480
-
"node_modules/@eslint/core": {
481
-
"version": "0.10.0",
482
-
"dev": true,
483
-
"license": "Apache-2.0",
484
-
"dependencies": {
485
-
"@types/json-schema": "^7.0.15"
486
-
},
487
-
"engines": {
488
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
489
-
}
490
-
},
491
-
"node_modules/@eslint/eslintrc": {
492
-
"version": "3.2.0",
493
-
"dev": true,
494
-
"license": "MIT",
495
-
"dependencies": {
496
-
"ajv": "^6.12.4",
497
-
"debug": "^4.3.2",
498
-
"espree": "^10.0.1",
499
-
"globals": "^14.0.0",
500
-
"ignore": "^5.2.0",
501
-
"import-fresh": "^3.2.1",
502
-
"js-yaml": "^4.1.0",
503
-
"minimatch": "^3.1.2",
504
-
"strip-json-comments": "^3.1.1"
505
-
},
506
-
"engines": {
507
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
508
-
},
509
-
"funding": {
510
-
"url": "https://opencollective.com/eslint"
511
-
}
512
-
},
513
-
"node_modules/@eslint/eslintrc/node_modules/globals": {
514
-
"version": "14.0.0",
515
-
"dev": true,
516
-
"license": "MIT",
517
-
"engines": {
518
-
"node": ">=18"
519
-
},
520
-
"funding": {
521
-
"url": "https://github.com/sponsors/sindresorhus"
522
-
}
523
-
},
524
-
"node_modules/@eslint/js": {
525
-
"version": "9.19.0",
526
-
"dev": true,
527
-
"license": "MIT",
528
-
"engines": {
529
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
530
-
}
531
-
},
532
-
"node_modules/@eslint/object-schema": {
533
-
"version": "2.1.5",
534
-
"dev": true,
535
-
"license": "Apache-2.0",
536
-
"engines": {
537
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
538
-
}
539
-
},
540
-
"node_modules/@eslint/plugin-kit": {
541
-
"version": "0.2.5",
542
-
"dev": true,
543
-
"license": "Apache-2.0",
544
-
"dependencies": {
545
-
"@eslint/core": "^0.10.0",
546
-
"levn": "^0.4.1"
547
-
},
548
-
"engines": {
549
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
550
-
}
551
-
},
552
-
"node_modules/@floating-ui/core": {
553
-
"version": "1.6.9",
554
-
"license": "MIT",
555
-
"dependencies": {
556
-
"@floating-ui/utils": "^0.2.9"
557
-
}
558
-
},
559
-
"node_modules/@floating-ui/dom": {
560
-
"version": "1.6.13",
561
-
"license": "MIT",
562
-
"dependencies": {
563
-
"@floating-ui/core": "^1.6.0",
564
-
"@floating-ui/utils": "^0.2.9"
565
-
}
566
-
},
567
-
"node_modules/@floating-ui/react": {
568
-
"version": "0.26.28",
569
-
"license": "MIT",
570
-
"dependencies": {
571
-
"@floating-ui/react-dom": "^2.1.2",
572
-
"@floating-ui/utils": "^0.2.8",
573
-
"tabbable": "^6.0.0"
574
-
},
575
-
"peerDependencies": {
576
-
"react": ">=16.8.0",
577
-
"react-dom": ">=16.8.0"
578
-
}
579
-
},
580
-
"node_modules/@floating-ui/react-dom": {
581
-
"version": "2.1.2",
582
-
"license": "MIT",
583
-
"dependencies": {
584
-
"@floating-ui/dom": "^1.0.0"
585
-
},
586
-
"peerDependencies": {
587
-
"react": ">=16.8.0",
588
-
"react-dom": ">=16.8.0"
589
-
}
590
-
},
591
-
"node_modules/@floating-ui/utils": {
592
-
"version": "0.2.9",
593
-
"license": "MIT"
594
-
},
595
-
"node_modules/@hookform/resolvers": {
596
-
"version": "3.10.0",
597
-
"license": "MIT",
598
-
"peerDependencies": {
599
-
"react-hook-form": "^7.0.0"
600
-
}
601
-
},
602
-
"node_modules/@humanfs/core": {
603
-
"version": "0.19.1",
604
-
"dev": true,
605
-
"license": "Apache-2.0",
606
-
"engines": {
607
-
"node": ">=18.18.0"
608
-
}
609
-
},
610
-
"node_modules/@humanfs/node": {
611
-
"version": "0.16.6",
612
-
"dev": true,
613
-
"license": "Apache-2.0",
614
-
"dependencies": {
615
-
"@humanfs/core": "^0.19.1",
616
-
"@humanwhocodes/retry": "^0.3.0"
617
-
},
618
-
"engines": {
619
-
"node": ">=18.18.0"
620
-
}
621
-
},
622
-
"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
623
-
"version": "0.3.1",
624
-
"dev": true,
625
-
"license": "Apache-2.0",
626
-
"engines": {
627
-
"node": ">=18.18"
628
-
},
629
-
"funding": {
630
-
"type": "github",
631
-
"url": "https://github.com/sponsors/nzakas"
632
-
}
633
-
},
634
-
"node_modules/@humanwhocodes/module-importer": {
635
-
"version": "1.0.1",
636
-
"dev": true,
637
-
"license": "Apache-2.0",
638
-
"engines": {
639
-
"node": ">=12.22"
640
-
},
641
-
"funding": {
642
-
"type": "github",
643
-
"url": "https://github.com/sponsors/nzakas"
644
-
}
645
-
},
646
-
"node_modules/@humanwhocodes/retry": {
647
-
"version": "0.4.1",
648
-
"dev": true,
649
-
"license": "Apache-2.0",
650
-
"engines": {
651
-
"node": ">=18.18"
652
-
},
653
-
"funding": {
654
-
"type": "github",
655
-
"url": "https://github.com/sponsors/nzakas"
656
-
}
657
-
},
658
-
"node_modules/@icons-pack/react-simple-icons": {
659
-
"version": "11.2.0",
660
-
"license": "MIT",
661
-
"peerDependencies": {
662
-
"react": "^16.13 || ^17 || ^18 || ^19"
663
-
}
664
-
},
665
-
"node_modules/@jridgewell/gen-mapping": {
666
-
"version": "0.3.8",
667
-
"license": "MIT",
668
-
"dependencies": {
669
-
"@jridgewell/set-array": "^1.2.1",
670
-
"@jridgewell/sourcemap-codec": "^1.4.10",
671
-
"@jridgewell/trace-mapping": "^0.3.24"
672
-
},
673
-
"engines": {
674
-
"node": ">=6.0.0"
675
-
}
676
-
},
677
-
"node_modules/@jridgewell/resolve-uri": {
678
-
"version": "3.1.2",
679
-
"license": "MIT",
680
-
"engines": {
681
-
"node": ">=6.0.0"
682
-
}
683
-
},
684
-
"node_modules/@jridgewell/set-array": {
685
-
"version": "1.2.1",
686
-
"license": "MIT",
687
-
"engines": {
688
-
"node": ">=6.0.0"
689
-
}
690
-
},
691
-
"node_modules/@jridgewell/sourcemap-codec": {
692
-
"version": "1.5.0",
693
-
"license": "MIT"
694
-
},
695
-
"node_modules/@jridgewell/trace-mapping": {
696
-
"version": "0.3.25",
697
-
"license": "MIT",
698
-
"dependencies": {
699
-
"@jridgewell/resolve-uri": "^3.1.0",
700
-
"@jridgewell/sourcemap-codec": "^1.4.14"
701
-
}
702
-
},
703
-
"node_modules/@mantine/core": {
704
-
"version": "7.16.1",
705
-
"license": "MIT",
706
-
"dependencies": {
707
-
"@floating-ui/react": "^0.26.28",
708
-
"clsx": "^2.1.1",
709
-
"react-number-format": "^5.4.3",
710
-
"react-remove-scroll": "^2.6.2",
711
-
"react-textarea-autosize": "8.5.6",
712
-
"type-fest": "^4.27.0"
713
-
},
714
-
"peerDependencies": {
715
-
"@mantine/hooks": "7.16.1",
716
-
"react": "^18.x || ^19.x",
717
-
"react-dom": "^18.x || ^19.x"
718
-
}
719
-
},
720
-
"node_modules/@mantine/form": {
721
-
"version": "7.16.1",
722
-
"license": "MIT",
723
-
"dependencies": {
724
-
"fast-deep-equal": "^3.1.3",
725
-
"klona": "^2.0.6"
726
-
},
727
-
"peerDependencies": {
728
-
"react": "^18.x || ^19.x"
729
-
}
730
-
},
731
-
"node_modules/@mantine/hooks": {
732
-
"version": "7.16.1",
733
-
"license": "MIT",
734
-
"peerDependencies": {
735
-
"react": "^18.x || ^19.x"
736
-
}
737
-
},
738
-
"node_modules/@nodelib/fs.scandir": {
739
-
"version": "2.1.5",
740
-
"dev": true,
741
-
"license": "MIT",
742
-
"dependencies": {
743
-
"@nodelib/fs.stat": "2.0.5",
744
-
"run-parallel": "^1.1.9"
745
-
},
746
-
"engines": {
747
-
"node": ">= 8"
748
-
}
749
-
},
750
-
"node_modules/@nodelib/fs.stat": {
751
-
"version": "2.0.5",
752
-
"dev": true,
753
-
"license": "MIT",
754
-
"engines": {
755
-
"node": ">= 8"
756
-
}
757
-
},
758
-
"node_modules/@nodelib/fs.walk": {
759
-
"version": "1.2.8",
760
-
"dev": true,
761
-
"license": "MIT",
762
-
"dependencies": {
763
-
"@nodelib/fs.scandir": "2.1.5",
764
-
"fastq": "^1.6.0"
765
-
},
766
-
"engines": {
767
-
"node": ">= 8"
768
-
}
769
-
},
770
-
"node_modules/@radix-ui/primitive": {
771
-
"version": "1.1.1",
772
-
"license": "MIT"
773
-
},
774
-
"node_modules/@radix-ui/react-arrow": {
775
-
"version": "1.1.1",
776
-
"license": "MIT",
777
-
"dependencies": {
778
-
"@radix-ui/react-primitive": "2.0.1"
779
-
},
780
-
"peerDependencies": {
781
-
"@types/react": "*",
782
-
"@types/react-dom": "*",
783
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
784
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
785
-
},
786
-
"peerDependenciesMeta": {
787
-
"@types/react": {
788
-
"optional": true
789
-
},
790
-
"@types/react-dom": {
791
-
"optional": true
792
-
}
793
-
}
794
-
},
795
-
"node_modules/@radix-ui/react-collection": {
796
-
"version": "1.1.1",
797
-
"license": "MIT",
798
-
"dependencies": {
799
-
"@radix-ui/react-compose-refs": "1.1.1",
800
-
"@radix-ui/react-context": "1.1.1",
801
-
"@radix-ui/react-primitive": "2.0.1",
802
-
"@radix-ui/react-slot": "1.1.1"
803
-
},
804
-
"peerDependencies": {
805
-
"@types/react": "*",
806
-
"@types/react-dom": "*",
807
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
808
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
809
-
},
810
-
"peerDependenciesMeta": {
811
-
"@types/react": {
812
-
"optional": true
813
-
},
814
-
"@types/react-dom": {
815
-
"optional": true
816
-
}
817
-
}
818
-
},
819
-
"node_modules/@radix-ui/react-compose-refs": {
820
-
"version": "1.1.1",
821
-
"license": "MIT",
822
-
"peerDependencies": {
823
-
"@types/react": "*",
824
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
825
-
},
826
-
"peerDependenciesMeta": {
827
-
"@types/react": {
828
-
"optional": true
829
-
}
830
-
}
831
-
},
832
-
"node_modules/@radix-ui/react-context": {
833
-
"version": "1.1.1",
834
-
"license": "MIT",
835
-
"peerDependencies": {
836
-
"@types/react": "*",
837
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
838
-
},
839
-
"peerDependenciesMeta": {
840
-
"@types/react": {
841
-
"optional": true
842
-
}
843
-
}
844
-
},
845
-
"node_modules/@radix-ui/react-dialog": {
846
-
"version": "1.1.5",
847
-
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.5.tgz",
848
-
"integrity": "sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==",
849
-
"license": "MIT",
850
-
"dependencies": {
851
-
"@radix-ui/primitive": "1.1.1",
852
-
"@radix-ui/react-compose-refs": "1.1.1",
853
-
"@radix-ui/react-context": "1.1.1",
854
-
"@radix-ui/react-dismissable-layer": "1.1.4",
855
-
"@radix-ui/react-focus-guards": "1.1.1",
856
-
"@radix-ui/react-focus-scope": "1.1.1",
857
-
"@radix-ui/react-id": "1.1.0",
858
-
"@radix-ui/react-portal": "1.1.3",
859
-
"@radix-ui/react-presence": "1.1.2",
860
-
"@radix-ui/react-primitive": "2.0.1",
861
-
"@radix-ui/react-slot": "1.1.1",
862
-
"@radix-ui/react-use-controllable-state": "1.1.0",
863
-
"aria-hidden": "^1.2.4",
864
-
"react-remove-scroll": "^2.6.2"
865
-
},
866
-
"peerDependencies": {
867
-
"@types/react": "*",
868
-
"@types/react-dom": "*",
869
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
870
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
871
-
},
872
-
"peerDependenciesMeta": {
873
-
"@types/react": {
874
-
"optional": true
875
-
},
876
-
"@types/react-dom": {
877
-
"optional": true
878
-
}
879
-
}
880
-
},
881
-
"node_modules/@radix-ui/react-direction": {
882
-
"version": "1.1.0",
883
-
"license": "MIT",
884
-
"peerDependencies": {
885
-
"@types/react": "*",
886
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
887
-
},
888
-
"peerDependenciesMeta": {
889
-
"@types/react": {
890
-
"optional": true
891
-
}
892
-
}
893
-
},
894
-
"node_modules/@radix-ui/react-dismissable-layer": {
895
-
"version": "1.1.4",
896
-
"license": "MIT",
897
-
"dependencies": {
898
-
"@radix-ui/primitive": "1.1.1",
899
-
"@radix-ui/react-compose-refs": "1.1.1",
900
-
"@radix-ui/react-primitive": "2.0.1",
901
-
"@radix-ui/react-use-callback-ref": "1.1.0",
902
-
"@radix-ui/react-use-escape-keydown": "1.1.0"
903
-
},
904
-
"peerDependencies": {
905
-
"@types/react": "*",
906
-
"@types/react-dom": "*",
907
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
908
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
909
-
},
910
-
"peerDependenciesMeta": {
911
-
"@types/react": {
912
-
"optional": true
913
-
},
914
-
"@types/react-dom": {
915
-
"optional": true
916
-
}
917
-
}
918
-
},
919
-
"node_modules/@radix-ui/react-dropdown-menu": {
920
-
"version": "2.1.5",
921
-
"license": "MIT",
922
-
"dependencies": {
923
-
"@radix-ui/primitive": "1.1.1",
924
-
"@radix-ui/react-compose-refs": "1.1.1",
925
-
"@radix-ui/react-context": "1.1.1",
926
-
"@radix-ui/react-id": "1.1.0",
927
-
"@radix-ui/react-menu": "2.1.5",
928
-
"@radix-ui/react-primitive": "2.0.1",
929
-
"@radix-ui/react-use-controllable-state": "1.1.0"
930
-
},
931
-
"peerDependencies": {
932
-
"@types/react": "*",
933
-
"@types/react-dom": "*",
934
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
935
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
936
-
},
937
-
"peerDependenciesMeta": {
938
-
"@types/react": {
939
-
"optional": true
940
-
},
941
-
"@types/react-dom": {
942
-
"optional": true
943
-
}
944
-
}
945
-
},
946
-
"node_modules/@radix-ui/react-focus-guards": {
947
-
"version": "1.1.1",
948
-
"license": "MIT",
949
-
"peerDependencies": {
950
-
"@types/react": "*",
951
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
952
-
},
953
-
"peerDependenciesMeta": {
954
-
"@types/react": {
955
-
"optional": true
956
-
}
957
-
}
958
-
},
959
-
"node_modules/@radix-ui/react-focus-scope": {
960
-
"version": "1.1.1",
961
-
"license": "MIT",
962
-
"dependencies": {
963
-
"@radix-ui/react-compose-refs": "1.1.1",
964
-
"@radix-ui/react-primitive": "2.0.1",
965
-
"@radix-ui/react-use-callback-ref": "1.1.0"
966
-
},
967
-
"peerDependencies": {
968
-
"@types/react": "*",
969
-
"@types/react-dom": "*",
970
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
971
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
972
-
},
973
-
"peerDependenciesMeta": {
974
-
"@types/react": {
975
-
"optional": true
976
-
},
977
-
"@types/react-dom": {
978
-
"optional": true
979
-
}
980
-
}
981
-
},
982
-
"node_modules/@radix-ui/react-id": {
983
-
"version": "1.1.0",
984
-
"license": "MIT",
985
-
"dependencies": {
986
-
"@radix-ui/react-use-layout-effect": "1.1.0"
987
-
},
988
-
"peerDependencies": {
989
-
"@types/react": "*",
990
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
991
-
},
992
-
"peerDependenciesMeta": {
993
-
"@types/react": {
994
-
"optional": true
995
-
}
996
-
}
997
-
},
998
-
"node_modules/@radix-ui/react-label": {
999
-
"version": "2.1.1",
1000
-
"license": "MIT",
1001
-
"dependencies": {
1002
-
"@radix-ui/react-primitive": "2.0.1"
1003
-
},
1004
-
"peerDependencies": {
1005
-
"@types/react": "*",
1006
-
"@types/react-dom": "*",
1007
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1008
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1009
-
},
1010
-
"peerDependenciesMeta": {
1011
-
"@types/react": {
1012
-
"optional": true
1013
-
},
1014
-
"@types/react-dom": {
1015
-
"optional": true
1016
-
}
1017
-
}
1018
-
},
1019
-
"node_modules/@radix-ui/react-menu": {
1020
-
"version": "2.1.5",
1021
-
"license": "MIT",
1022
-
"dependencies": {
1023
-
"@radix-ui/primitive": "1.1.1",
1024
-
"@radix-ui/react-collection": "1.1.1",
1025
-
"@radix-ui/react-compose-refs": "1.1.1",
1026
-
"@radix-ui/react-context": "1.1.1",
1027
-
"@radix-ui/react-direction": "1.1.0",
1028
-
"@radix-ui/react-dismissable-layer": "1.1.4",
1029
-
"@radix-ui/react-focus-guards": "1.1.1",
1030
-
"@radix-ui/react-focus-scope": "1.1.1",
1031
-
"@radix-ui/react-id": "1.1.0",
1032
-
"@radix-ui/react-popper": "1.2.1",
1033
-
"@radix-ui/react-portal": "1.1.3",
1034
-
"@radix-ui/react-presence": "1.1.2",
1035
-
"@radix-ui/react-primitive": "2.0.1",
1036
-
"@radix-ui/react-roving-focus": "1.1.1",
1037
-
"@radix-ui/react-slot": "1.1.1",
1038
-
"@radix-ui/react-use-callback-ref": "1.1.0",
1039
-
"aria-hidden": "^1.2.4",
1040
-
"react-remove-scroll": "^2.6.2"
1041
-
},
1042
-
"peerDependencies": {
1043
-
"@types/react": "*",
1044
-
"@types/react-dom": "*",
1045
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1046
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1047
-
},
1048
-
"peerDependenciesMeta": {
1049
-
"@types/react": {
1050
-
"optional": true
1051
-
},
1052
-
"@types/react-dom": {
1053
-
"optional": true
1054
-
}
1055
-
}
1056
-
},
1057
-
"node_modules/@radix-ui/react-popper": {
1058
-
"version": "1.2.1",
1059
-
"license": "MIT",
1060
-
"dependencies": {
1061
-
"@floating-ui/react-dom": "^2.0.0",
1062
-
"@radix-ui/react-arrow": "1.1.1",
1063
-
"@radix-ui/react-compose-refs": "1.1.1",
1064
-
"@radix-ui/react-context": "1.1.1",
1065
-
"@radix-ui/react-primitive": "2.0.1",
1066
-
"@radix-ui/react-use-callback-ref": "1.1.0",
1067
-
"@radix-ui/react-use-layout-effect": "1.1.0",
1068
-
"@radix-ui/react-use-rect": "1.1.0",
1069
-
"@radix-ui/react-use-size": "1.1.0",
1070
-
"@radix-ui/rect": "1.1.0"
1071
-
},
1072
-
"peerDependencies": {
1073
-
"@types/react": "*",
1074
-
"@types/react-dom": "*",
1075
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1076
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1077
-
},
1078
-
"peerDependenciesMeta": {
1079
-
"@types/react": {
1080
-
"optional": true
1081
-
},
1082
-
"@types/react-dom": {
1083
-
"optional": true
1084
-
}
1085
-
}
1086
-
},
1087
-
"node_modules/@radix-ui/react-portal": {
1088
-
"version": "1.1.3",
1089
-
"license": "MIT",
1090
-
"dependencies": {
1091
-
"@radix-ui/react-primitive": "2.0.1",
1092
-
"@radix-ui/react-use-layout-effect": "1.1.0"
1093
-
},
1094
-
"peerDependencies": {
1095
-
"@types/react": "*",
1096
-
"@types/react-dom": "*",
1097
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1098
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1099
-
},
1100
-
"peerDependenciesMeta": {
1101
-
"@types/react": {
1102
-
"optional": true
1103
-
},
1104
-
"@types/react-dom": {
1105
-
"optional": true
1106
-
}
1107
-
}
1108
-
},
1109
-
"node_modules/@radix-ui/react-presence": {
1110
-
"version": "1.1.2",
1111
-
"license": "MIT",
1112
-
"dependencies": {
1113
-
"@radix-ui/react-compose-refs": "1.1.1",
1114
-
"@radix-ui/react-use-layout-effect": "1.1.0"
1115
-
},
1116
-
"peerDependencies": {
1117
-
"@types/react": "*",
1118
-
"@types/react-dom": "*",
1119
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1120
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1121
-
},
1122
-
"peerDependenciesMeta": {
1123
-
"@types/react": {
1124
-
"optional": true
1125
-
},
1126
-
"@types/react-dom": {
1127
-
"optional": true
1128
-
}
1129
-
}
1130
-
},
1131
-
"node_modules/@radix-ui/react-primitive": {
1132
-
"version": "2.0.1",
1133
-
"license": "MIT",
1134
-
"dependencies": {
1135
-
"@radix-ui/react-slot": "1.1.1"
1136
-
},
1137
-
"peerDependencies": {
1138
-
"@types/react": "*",
1139
-
"@types/react-dom": "*",
1140
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1141
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1142
-
},
1143
-
"peerDependenciesMeta": {
1144
-
"@types/react": {
1145
-
"optional": true
1146
-
},
1147
-
"@types/react-dom": {
1148
-
"optional": true
1149
-
}
1150
-
}
1151
-
},
1152
-
"node_modules/@radix-ui/react-roving-focus": {
1153
-
"version": "1.1.1",
1154
-
"license": "MIT",
1155
-
"dependencies": {
1156
-
"@radix-ui/primitive": "1.1.1",
1157
-
"@radix-ui/react-collection": "1.1.1",
1158
-
"@radix-ui/react-compose-refs": "1.1.1",
1159
-
"@radix-ui/react-context": "1.1.1",
1160
-
"@radix-ui/react-direction": "1.1.0",
1161
-
"@radix-ui/react-id": "1.1.0",
1162
-
"@radix-ui/react-primitive": "2.0.1",
1163
-
"@radix-ui/react-use-callback-ref": "1.1.0",
1164
-
"@radix-ui/react-use-controllable-state": "1.1.0"
1165
-
},
1166
-
"peerDependencies": {
1167
-
"@types/react": "*",
1168
-
"@types/react-dom": "*",
1169
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1170
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1171
-
},
1172
-
"peerDependenciesMeta": {
1173
-
"@types/react": {
1174
-
"optional": true
1175
-
},
1176
-
"@types/react-dom": {
1177
-
"optional": true
1178
-
}
1179
-
}
1180
-
},
1181
-
"node_modules/@radix-ui/react-slot": {
1182
-
"version": "1.1.1",
1183
-
"license": "MIT",
1184
-
"dependencies": {
1185
-
"@radix-ui/react-compose-refs": "1.1.1"
1186
-
},
1187
-
"peerDependencies": {
1188
-
"@types/react": "*",
1189
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1190
-
},
1191
-
"peerDependenciesMeta": {
1192
-
"@types/react": {
1193
-
"optional": true
1194
-
}
1195
-
}
1196
-
},
1197
-
"node_modules/@radix-ui/react-tabs": {
1198
-
"version": "1.1.2",
1199
-
"license": "MIT",
1200
-
"dependencies": {
1201
-
"@radix-ui/primitive": "1.1.1",
1202
-
"@radix-ui/react-context": "1.1.1",
1203
-
"@radix-ui/react-direction": "1.1.0",
1204
-
"@radix-ui/react-id": "1.1.0",
1205
-
"@radix-ui/react-presence": "1.1.2",
1206
-
"@radix-ui/react-primitive": "2.0.1",
1207
-
"@radix-ui/react-roving-focus": "1.1.1",
1208
-
"@radix-ui/react-use-controllable-state": "1.1.0"
1209
-
},
1210
-
"peerDependencies": {
1211
-
"@types/react": "*",
1212
-
"@types/react-dom": "*",
1213
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1214
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1215
-
},
1216
-
"peerDependenciesMeta": {
1217
-
"@types/react": {
1218
-
"optional": true
1219
-
},
1220
-
"@types/react-dom": {
1221
-
"optional": true
1222
-
}
1223
-
}
1224
-
},
1225
-
"node_modules/@radix-ui/react-toast": {
1226
-
"version": "1.2.5",
1227
-
"license": "MIT",
1228
-
"dependencies": {
1229
-
"@radix-ui/primitive": "1.1.1",
1230
-
"@radix-ui/react-collection": "1.1.1",
1231
-
"@radix-ui/react-compose-refs": "1.1.1",
1232
-
"@radix-ui/react-context": "1.1.1",
1233
-
"@radix-ui/react-dismissable-layer": "1.1.4",
1234
-
"@radix-ui/react-portal": "1.1.3",
1235
-
"@radix-ui/react-presence": "1.1.2",
1236
-
"@radix-ui/react-primitive": "2.0.1",
1237
-
"@radix-ui/react-use-callback-ref": "1.1.0",
1238
-
"@radix-ui/react-use-controllable-state": "1.1.0",
1239
-
"@radix-ui/react-use-layout-effect": "1.1.0",
1240
-
"@radix-ui/react-visually-hidden": "1.1.1"
1241
-
},
1242
-
"peerDependencies": {
1243
-
"@types/react": "*",
1244
-
"@types/react-dom": "*",
1245
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1246
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1247
-
},
1248
-
"peerDependenciesMeta": {
1249
-
"@types/react": {
1250
-
"optional": true
1251
-
},
1252
-
"@types/react-dom": {
1253
-
"optional": true
1254
-
}
1255
-
}
1256
-
},
1257
-
"node_modules/@radix-ui/react-use-callback-ref": {
1258
-
"version": "1.1.0",
1259
-
"license": "MIT",
1260
-
"peerDependencies": {
1261
-
"@types/react": "*",
1262
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1263
-
},
1264
-
"peerDependenciesMeta": {
1265
-
"@types/react": {
1266
-
"optional": true
1267
-
}
1268
-
}
1269
-
},
1270
-
"node_modules/@radix-ui/react-use-controllable-state": {
1271
-
"version": "1.1.0",
1272
-
"license": "MIT",
1273
-
"dependencies": {
1274
-
"@radix-ui/react-use-callback-ref": "1.1.0"
1275
-
},
1276
-
"peerDependencies": {
1277
-
"@types/react": "*",
1278
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1279
-
},
1280
-
"peerDependenciesMeta": {
1281
-
"@types/react": {
1282
-
"optional": true
1283
-
}
1284
-
}
1285
-
},
1286
-
"node_modules/@radix-ui/react-use-escape-keydown": {
1287
-
"version": "1.1.0",
1288
-
"license": "MIT",
1289
-
"dependencies": {
1290
-
"@radix-ui/react-use-callback-ref": "1.1.0"
1291
-
},
1292
-
"peerDependencies": {
1293
-
"@types/react": "*",
1294
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1295
-
},
1296
-
"peerDependenciesMeta": {
1297
-
"@types/react": {
1298
-
"optional": true
1299
-
}
1300
-
}
1301
-
},
1302
-
"node_modules/@radix-ui/react-use-layout-effect": {
1303
-
"version": "1.1.0",
1304
-
"license": "MIT",
1305
-
"peerDependencies": {
1306
-
"@types/react": "*",
1307
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1308
-
},
1309
-
"peerDependenciesMeta": {
1310
-
"@types/react": {
1311
-
"optional": true
1312
-
}
1313
-
}
1314
-
},
1315
-
"node_modules/@radix-ui/react-use-rect": {
1316
-
"version": "1.1.0",
1317
-
"license": "MIT",
1318
-
"dependencies": {
1319
-
"@radix-ui/rect": "1.1.0"
1320
-
},
1321
-
"peerDependencies": {
1322
-
"@types/react": "*",
1323
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1324
-
},
1325
-
"peerDependenciesMeta": {
1326
-
"@types/react": {
1327
-
"optional": true
1328
-
}
1329
-
}
1330
-
},
1331
-
"node_modules/@radix-ui/react-use-size": {
1332
-
"version": "1.1.0",
1333
-
"license": "MIT",
1334
-
"dependencies": {
1335
-
"@radix-ui/react-use-layout-effect": "1.1.0"
1336
-
},
1337
-
"peerDependencies": {
1338
-
"@types/react": "*",
1339
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1340
-
},
1341
-
"peerDependenciesMeta": {
1342
-
"@types/react": {
1343
-
"optional": true
1344
-
}
1345
-
}
1346
-
},
1347
-
"node_modules/@radix-ui/react-visually-hidden": {
1348
-
"version": "1.1.1",
1349
-
"license": "MIT",
1350
-
"dependencies": {
1351
-
"@radix-ui/react-primitive": "2.0.1"
1352
-
},
1353
-
"peerDependencies": {
1354
-
"@types/react": "*",
1355
-
"@types/react-dom": "*",
1356
-
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
1357
-
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
1358
-
},
1359
-
"peerDependenciesMeta": {
1360
-
"@types/react": {
1361
-
"optional": true
1362
-
},
1363
-
"@types/react-dom": {
1364
-
"optional": true
1365
-
}
1366
-
}
1367
-
},
1368
-
"node_modules/@radix-ui/rect": {
1369
-
"version": "1.1.0",
1370
-
"license": "MIT"
1371
-
},
1372
-
"node_modules/@rollup/rollup-darwin-arm64": {
1373
-
"version": "4.32.0",
1374
-
"cpu": [
1375
-
"arm64"
1376
-
],
1377
-
"license": "MIT",
1378
-
"optional": true,
1379
-
"os": [
1380
-
"darwin"
1381
-
]
1382
-
},
1383
-
"node_modules/@tailwindcss/node": {
1384
-
"version": "4.0.0",
1385
-
"license": "MIT",
1386
-
"dependencies": {
1387
-
"enhanced-resolve": "^5.18.0",
1388
-
"jiti": "^2.4.2",
1389
-
"tailwindcss": "4.0.0"
1390
-
}
1391
-
},
1392
-
"node_modules/@tailwindcss/oxide": {
1393
-
"version": "4.0.0",
1394
-
"license": "MIT",
1395
-
"engines": {
1396
-
"node": ">= 10"
1397
-
},
1398
-
"optionalDependencies": {
1399
-
"@tailwindcss/oxide-android-arm64": "4.0.0",
1400
-
"@tailwindcss/oxide-darwin-arm64": "4.0.0",
1401
-
"@tailwindcss/oxide-darwin-x64": "4.0.0",
1402
-
"@tailwindcss/oxide-freebsd-x64": "4.0.0",
1403
-
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.0",
1404
-
"@tailwindcss/oxide-linux-arm64-gnu": "4.0.0",
1405
-
"@tailwindcss/oxide-linux-arm64-musl": "4.0.0",
1406
-
"@tailwindcss/oxide-linux-x64-gnu": "4.0.0",
1407
-
"@tailwindcss/oxide-linux-x64-musl": "4.0.0",
1408
-
"@tailwindcss/oxide-win32-arm64-msvc": "4.0.0",
1409
-
"@tailwindcss/oxide-win32-x64-msvc": "4.0.0"
1410
-
}
1411
-
},
1412
-
"node_modules/@tailwindcss/oxide-darwin-arm64": {
1413
-
"version": "4.0.0",
1414
-
"cpu": [
1415
-
"arm64"
1416
-
],
1417
-
"license": "MIT",
1418
-
"optional": true,
1419
-
"os": [
1420
-
"darwin"
1421
-
],
1422
-
"engines": {
1423
-
"node": ">= 10"
1424
-
}
1425
-
},
1426
-
"node_modules/@tailwindcss/postcss": {
1427
-
"version": "4.0.0",
1428
-
"dev": true,
1429
-
"license": "MIT",
1430
-
"dependencies": {
1431
-
"@alloc/quick-lru": "^5.2.0",
1432
-
"@tailwindcss/node": "^4.0.0",
1433
-
"@tailwindcss/oxide": "^4.0.0",
1434
-
"lightningcss": "^1.29.1",
1435
-
"postcss": "^8.4.41",
1436
-
"tailwindcss": "4.0.0"
1437
-
}
1438
-
},
1439
-
"node_modules/@tailwindcss/vite": {
1440
-
"version": "4.0.0",
1441
-
"license": "MIT",
1442
-
"dependencies": {
1443
-
"@tailwindcss/node": "^4.0.0",
1444
-
"@tailwindcss/oxide": "^4.0.0",
1445
-
"lightningcss": "^1.29.1",
1446
-
"tailwindcss": "4.0.0"
1447
-
},
1448
-
"peerDependencies": {
1449
-
"vite": "^5.2.0 || ^6"
1450
-
}
1451
-
},
1452
-
"node_modules/@types/babel__core": {
1453
-
"version": "7.20.5",
1454
-
"dev": true,
1455
-
"license": "MIT",
1456
-
"dependencies": {
1457
-
"@babel/parser": "^7.20.7",
1458
-
"@babel/types": "^7.20.7",
1459
-
"@types/babel__generator": "*",
1460
-
"@types/babel__template": "*",
1461
-
"@types/babel__traverse": "*"
1462
-
}
1463
-
},
1464
-
"node_modules/@types/babel__generator": {
1465
-
"version": "7.6.8",
1466
-
"dev": true,
1467
-
"license": "MIT",
1468
-
"dependencies": {
1469
-
"@babel/types": "^7.0.0"
1470
-
}
1471
-
},
1472
-
"node_modules/@types/babel__template": {
1473
-
"version": "7.4.4",
1474
-
"dev": true,
1475
-
"license": "MIT",
1476
-
"dependencies": {
1477
-
"@babel/parser": "^7.1.0",
1478
-
"@babel/types": "^7.0.0"
1479
-
}
1480
-
},
1481
-
"node_modules/@types/babel__traverse": {
1482
-
"version": "7.20.6",
1483
-
"dev": true,
1484
-
"license": "MIT",
1485
-
"dependencies": {
1486
-
"@babel/types": "^7.20.7"
1487
-
}
1488
-
},
1489
-
"node_modules/@types/d3-array": {
1490
-
"version": "3.2.1",
1491
-
"license": "MIT"
1492
-
},
1493
-
"node_modules/@types/d3-color": {
1494
-
"version": "3.1.3",
1495
-
"license": "MIT"
1496
-
},
1497
-
"node_modules/@types/d3-ease": {
1498
-
"version": "3.0.2",
1499
-
"license": "MIT"
1500
-
},
1501
-
"node_modules/@types/d3-interpolate": {
1502
-
"version": "3.0.4",
1503
-
"license": "MIT",
1504
-
"dependencies": {
1505
-
"@types/d3-color": "*"
1506
-
}
1507
-
},
1508
-
"node_modules/@types/d3-path": {
1509
-
"version": "3.1.0",
1510
-
"license": "MIT"
1511
-
},
1512
-
"node_modules/@types/d3-scale": {
1513
-
"version": "4.0.8",
1514
-
"license": "MIT",
1515
-
"dependencies": {
1516
-
"@types/d3-time": "*"
1517
-
}
1518
-
},
1519
-
"node_modules/@types/d3-shape": {
1520
-
"version": "3.1.7",
1521
-
"license": "MIT",
1522
-
"dependencies": {
1523
-
"@types/d3-path": "*"
1524
-
}
1525
-
},
1526
-
"node_modules/@types/d3-time": {
1527
-
"version": "3.0.4",
1528
-
"license": "MIT"
1529
-
},
1530
-
"node_modules/@types/d3-timer": {
1531
-
"version": "3.0.2",
1532
-
"license": "MIT"
1533
-
},
1534
-
"node_modules/@types/estree": {
1535
-
"version": "1.0.6",
1536
-
"license": "MIT"
1537
-
},
1538
-
"node_modules/@types/json-schema": {
1539
-
"version": "7.0.15",
1540
-
"dev": true,
1541
-
"license": "MIT"
1542
-
},
1543
-
"node_modules/@types/node": {
1544
-
"version": "22.10.10",
1545
-
"devOptional": true,
1546
-
"license": "MIT",
1547
-
"dependencies": {
1548
-
"undici-types": "~6.20.0"
1549
-
}
1550
-
},
1551
-
"node_modules/@types/parse-json": {
1552
-
"version": "4.0.2",
1553
-
"license": "MIT"
1554
-
},
1555
-
"node_modules/@types/prop-types": {
1556
-
"version": "15.7.14",
1557
-
"devOptional": true,
1558
-
"license": "MIT"
1559
-
},
1560
-
"node_modules/@types/react": {
1561
-
"version": "18.3.18",
1562
-
"devOptional": true,
1563
-
"license": "MIT",
1564
-
"dependencies": {
1565
-
"@types/prop-types": "*",
1566
-
"csstype": "^3.0.2"
1567
-
}
1568
-
},
1569
-
"node_modules/@types/react-dom": {
1570
-
"version": "18.3.5",
1571
-
"devOptional": true,
1572
-
"license": "MIT",
1573
-
"peerDependencies": {
1574
-
"@types/react": "^18.0.0"
1575
-
}
1576
-
},
1577
-
"node_modules/@typescript-eslint/eslint-plugin": {
1578
-
"version": "8.21.0",
1579
-
"dev": true,
1580
-
"license": "MIT",
1581
-
"dependencies": {
1582
-
"@eslint-community/regexpp": "^4.10.0",
1583
-
"@typescript-eslint/scope-manager": "8.21.0",
1584
-
"@typescript-eslint/type-utils": "8.21.0",
1585
-
"@typescript-eslint/utils": "8.21.0",
1586
-
"@typescript-eslint/visitor-keys": "8.21.0",
1587
-
"graphemer": "^1.4.0",
1588
-
"ignore": "^5.3.1",
1589
-
"natural-compare": "^1.4.0",
1590
-
"ts-api-utils": "^2.0.0"
1591
-
},
1592
-
"engines": {
1593
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1594
-
},
1595
-
"funding": {
1596
-
"type": "opencollective",
1597
-
"url": "https://opencollective.com/typescript-eslint"
1598
-
},
1599
-
"peerDependencies": {
1600
-
"@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
1601
-
"eslint": "^8.57.0 || ^9.0.0",
1602
-
"typescript": ">=4.8.4 <5.8.0"
1603
-
}
1604
-
},
1605
-
"node_modules/@typescript-eslint/parser": {
1606
-
"version": "8.21.0",
1607
-
"dev": true,
1608
-
"license": "MIT",
1609
-
"dependencies": {
1610
-
"@typescript-eslint/scope-manager": "8.21.0",
1611
-
"@typescript-eslint/types": "8.21.0",
1612
-
"@typescript-eslint/typescript-estree": "8.21.0",
1613
-
"@typescript-eslint/visitor-keys": "8.21.0",
1614
-
"debug": "^4.3.4"
1615
-
},
1616
-
"engines": {
1617
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1618
-
},
1619
-
"funding": {
1620
-
"type": "opencollective",
1621
-
"url": "https://opencollective.com/typescript-eslint"
1622
-
},
1623
-
"peerDependencies": {
1624
-
"eslint": "^8.57.0 || ^9.0.0",
1625
-
"typescript": ">=4.8.4 <5.8.0"
1626
-
}
1627
-
},
1628
-
"node_modules/@typescript-eslint/scope-manager": {
1629
-
"version": "8.21.0",
1630
-
"dev": true,
1631
-
"license": "MIT",
1632
-
"dependencies": {
1633
-
"@typescript-eslint/types": "8.21.0",
1634
-
"@typescript-eslint/visitor-keys": "8.21.0"
1635
-
},
1636
-
"engines": {
1637
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1638
-
},
1639
-
"funding": {
1640
-
"type": "opencollective",
1641
-
"url": "https://opencollective.com/typescript-eslint"
1642
-
}
1643
-
},
1644
-
"node_modules/@typescript-eslint/type-utils": {
1645
-
"version": "8.21.0",
1646
-
"dev": true,
1647
-
"license": "MIT",
1648
-
"dependencies": {
1649
-
"@typescript-eslint/typescript-estree": "8.21.0",
1650
-
"@typescript-eslint/utils": "8.21.0",
1651
-
"debug": "^4.3.4",
1652
-
"ts-api-utils": "^2.0.0"
1653
-
},
1654
-
"engines": {
1655
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1656
-
},
1657
-
"funding": {
1658
-
"type": "opencollective",
1659
-
"url": "https://opencollective.com/typescript-eslint"
1660
-
},
1661
-
"peerDependencies": {
1662
-
"eslint": "^8.57.0 || ^9.0.0",
1663
-
"typescript": ">=4.8.4 <5.8.0"
1664
-
}
1665
-
},
1666
-
"node_modules/@typescript-eslint/types": {
1667
-
"version": "8.21.0",
1668
-
"dev": true,
1669
-
"license": "MIT",
1670
-
"engines": {
1671
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1672
-
},
1673
-
"funding": {
1674
-
"type": "opencollective",
1675
-
"url": "https://opencollective.com/typescript-eslint"
1676
-
}
1677
-
},
1678
-
"node_modules/@typescript-eslint/typescript-estree": {
1679
-
"version": "8.21.0",
1680
-
"dev": true,
1681
-
"license": "MIT",
1682
-
"dependencies": {
1683
-
"@typescript-eslint/types": "8.21.0",
1684
-
"@typescript-eslint/visitor-keys": "8.21.0",
1685
-
"debug": "^4.3.4",
1686
-
"fast-glob": "^3.3.2",
1687
-
"is-glob": "^4.0.3",
1688
-
"minimatch": "^9.0.4",
1689
-
"semver": "^7.6.0",
1690
-
"ts-api-utils": "^2.0.0"
1691
-
},
1692
-
"engines": {
1693
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1694
-
},
1695
-
"funding": {
1696
-
"type": "opencollective",
1697
-
"url": "https://opencollective.com/typescript-eslint"
1698
-
},
1699
-
"peerDependencies": {
1700
-
"typescript": ">=4.8.4 <5.8.0"
1701
-
}
1702
-
},
1703
-
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
1704
-
"version": "9.0.5",
1705
-
"dev": true,
1706
-
"license": "ISC",
1707
-
"dependencies": {
1708
-
"brace-expansion": "^2.0.1"
1709
-
},
1710
-
"engines": {
1711
-
"node": ">=16 || 14 >=14.17"
1712
-
},
1713
-
"funding": {
1714
-
"url": "https://github.com/sponsors/isaacs"
1715
-
}
1716
-
},
1717
-
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": {
1718
-
"version": "2.0.1",
1719
-
"dev": true,
1720
-
"license": "MIT",
1721
-
"dependencies": {
1722
-
"balanced-match": "^1.0.0"
1723
-
}
1724
-
},
1725
-
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
1726
-
"version": "7.6.3",
1727
-
"dev": true,
1728
-
"license": "ISC",
1729
-
"bin": {
1730
-
"semver": "bin/semver.js"
1731
-
},
1732
-
"engines": {
1733
-
"node": ">=10"
1734
-
}
1735
-
},
1736
-
"node_modules/@typescript-eslint/utils": {
1737
-
"version": "8.21.0",
1738
-
"dev": true,
1739
-
"license": "MIT",
1740
-
"dependencies": {
1741
-
"@eslint-community/eslint-utils": "^4.4.0",
1742
-
"@typescript-eslint/scope-manager": "8.21.0",
1743
-
"@typescript-eslint/types": "8.21.0",
1744
-
"@typescript-eslint/typescript-estree": "8.21.0"
1745
-
},
1746
-
"engines": {
1747
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1748
-
},
1749
-
"funding": {
1750
-
"type": "opencollective",
1751
-
"url": "https://opencollective.com/typescript-eslint"
1752
-
},
1753
-
"peerDependencies": {
1754
-
"eslint": "^8.57.0 || ^9.0.0",
1755
-
"typescript": ">=4.8.4 <5.8.0"
1756
-
}
1757
-
},
1758
-
"node_modules/@typescript-eslint/visitor-keys": {
1759
-
"version": "8.21.0",
1760
-
"dev": true,
1761
-
"license": "MIT",
1762
-
"dependencies": {
1763
-
"@typescript-eslint/types": "8.21.0",
1764
-
"eslint-visitor-keys": "^4.2.0"
1765
-
},
1766
-
"engines": {
1767
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1768
-
},
1769
-
"funding": {
1770
-
"type": "opencollective",
1771
-
"url": "https://opencollective.com/typescript-eslint"
1772
-
}
1773
-
},
1774
-
"node_modules/@vitejs/plugin-react": {
1775
-
"version": "4.3.4",
1776
-
"dev": true,
1777
-
"license": "MIT",
1778
-
"dependencies": {
1779
-
"@babel/core": "^7.26.0",
1780
-
"@babel/plugin-transform-react-jsx-self": "^7.25.9",
1781
-
"@babel/plugin-transform-react-jsx-source": "^7.25.9",
1782
-
"@types/babel__core": "^7.20.5",
1783
-
"react-refresh": "^0.14.2"
1784
-
},
1785
-
"engines": {
1786
-
"node": "^14.18.0 || >=16.0.0"
1787
-
},
1788
-
"peerDependencies": {
1789
-
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
1790
-
}
1791
-
},
1792
-
"node_modules/acorn": {
1793
-
"version": "8.14.0",
1794
-
"dev": true,
1795
-
"license": "MIT",
1796
-
"bin": {
1797
-
"acorn": "bin/acorn"
1798
-
},
1799
-
"engines": {
1800
-
"node": ">=0.4.0"
1801
-
}
1802
-
},
1803
-
"node_modules/acorn-jsx": {
1804
-
"version": "5.3.2",
1805
-
"dev": true,
1806
-
"license": "MIT",
1807
-
"peerDependencies": {
1808
-
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1809
-
}
1810
-
},
1811
-
"node_modules/ajv": {
1812
-
"version": "6.12.6",
1813
-
"dev": true,
1814
-
"license": "MIT",
1815
-
"dependencies": {
1816
-
"fast-deep-equal": "^3.1.1",
1817
-
"fast-json-stable-stringify": "^2.0.0",
1818
-
"json-schema-traverse": "^0.4.1",
1819
-
"uri-js": "^4.2.2"
1820
-
},
1821
-
"funding": {
1822
-
"type": "github",
1823
-
"url": "https://github.com/sponsors/epoberezkin"
1824
-
}
1825
-
},
1826
-
"node_modules/ansi-styles": {
1827
-
"version": "4.3.0",
1828
-
"dev": true,
1829
-
"license": "MIT",
1830
-
"dependencies": {
1831
-
"color-convert": "^2.0.1"
1832
-
},
1833
-
"engines": {
1834
-
"node": ">=8"
1835
-
},
1836
-
"funding": {
1837
-
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
1838
-
}
1839
-
},
1840
-
"node_modules/argparse": {
1841
-
"version": "2.0.1",
1842
-
"dev": true,
1843
-
"license": "Python-2.0"
1844
-
},
1845
-
"node_modules/aria-hidden": {
1846
-
"version": "1.2.4",
1847
-
"license": "MIT",
1848
-
"dependencies": {
1849
-
"tslib": "^2.0.0"
1850
-
},
1851
-
"engines": {
1852
-
"node": ">=10"
1853
-
}
1854
-
},
1855
-
"node_modules/asynckit": {
1856
-
"version": "0.4.0",
1857
-
"license": "MIT"
1858
-
},
1859
-
"node_modules/axios": {
1860
-
"version": "1.7.9",
1861
-
"license": "MIT",
1862
-
"dependencies": {
1863
-
"follow-redirects": "^1.15.6",
1864
-
"form-data": "^4.0.0",
1865
-
"proxy-from-env": "^1.1.0"
1866
-
}
1867
-
},
1868
-
"node_modules/babel-plugin-macros": {
1869
-
"version": "3.1.0",
1870
-
"license": "MIT",
1871
-
"dependencies": {
1872
-
"@babel/runtime": "^7.12.5",
1873
-
"cosmiconfig": "^7.0.0",
1874
-
"resolve": "^1.19.0"
1875
-
},
1876
-
"engines": {
1877
-
"node": ">=10",
1878
-
"npm": ">=6"
1879
-
}
1880
-
},
1881
-
"node_modules/balanced-match": {
1882
-
"version": "1.0.2",
1883
-
"dev": true,
1884
-
"license": "MIT"
1885
-
},
1886
-
"node_modules/brace-expansion": {
1887
-
"version": "1.1.11",
1888
-
"dev": true,
1889
-
"license": "MIT",
1890
-
"dependencies": {
1891
-
"balanced-match": "^1.0.0",
1892
-
"concat-map": "0.0.1"
1893
-
}
1894
-
},
1895
-
"node_modules/braces": {
1896
-
"version": "3.0.3",
1897
-
"dev": true,
1898
-
"license": "MIT",
1899
-
"dependencies": {
1900
-
"fill-range": "^7.1.1"
1901
-
},
1902
-
"engines": {
1903
-
"node": ">=8"
1904
-
}
1905
-
},
1906
-
"node_modules/browserslist": {
1907
-
"version": "4.24.4",
1908
-
"dev": true,
1909
-
"funding": [
1910
-
{
1911
-
"type": "opencollective",
1912
-
"url": "https://opencollective.com/browserslist"
1913
-
},
1914
-
{
1915
-
"type": "tidelift",
1916
-
"url": "https://tidelift.com/funding/github/npm/browserslist"
1917
-
},
1918
-
{
1919
-
"type": "github",
1920
-
"url": "https://github.com/sponsors/ai"
1921
-
}
1922
-
],
1923
-
"license": "MIT",
1924
-
"dependencies": {
1925
-
"caniuse-lite": "^1.0.30001688",
1926
-
"electron-to-chromium": "^1.5.73",
1927
-
"node-releases": "^2.0.19",
1928
-
"update-browserslist-db": "^1.1.1"
1929
-
},
1930
-
"bin": {
1931
-
"browserslist": "cli.js"
1932
-
},
1933
-
"engines": {
1934
-
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1935
-
}
1936
-
},
1937
-
"node_modules/callsites": {
1938
-
"version": "3.1.0",
1939
-
"license": "MIT",
1940
-
"engines": {
1941
-
"node": ">=6"
1942
-
}
1943
-
},
1944
-
"node_modules/caniuse-lite": {
1945
-
"version": "1.0.30001695",
1946
-
"dev": true,
1947
-
"funding": [
1948
-
{
1949
-
"type": "opencollective",
1950
-
"url": "https://opencollective.com/browserslist"
1951
-
},
1952
-
{
1953
-
"type": "tidelift",
1954
-
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1955
-
},
1956
-
{
1957
-
"type": "github",
1958
-
"url": "https://github.com/sponsors/ai"
1959
-
}
1960
-
],
1961
-
"license": "CC-BY-4.0"
1962
-
},
1963
-
"node_modules/chalk": {
1964
-
"version": "4.1.2",
1965
-
"dev": true,
1966
-
"license": "MIT",
1967
-
"dependencies": {
1968
-
"ansi-styles": "^4.1.0",
1969
-
"supports-color": "^7.1.0"
1970
-
},
1971
-
"engines": {
1972
-
"node": ">=10"
1973
-
},
1974
-
"funding": {
1975
-
"url": "https://github.com/chalk/chalk?sponsor=1"
1976
-
}
1977
-
},
1978
-
"node_modules/class-variance-authority": {
1979
-
"version": "0.7.1",
1980
-
"license": "Apache-2.0",
1981
-
"dependencies": {
1982
-
"clsx": "^2.1.1"
1983
-
},
1984
-
"funding": {
1985
-
"url": "https://polar.sh/cva"
1986
-
}
1987
-
},
1988
-
"node_modules/clsx": {
1989
-
"version": "2.1.1",
1990
-
"license": "MIT",
1991
-
"engines": {
1992
-
"node": ">=6"
1993
-
}
1994
-
},
1995
-
"node_modules/color-convert": {
1996
-
"version": "2.0.1",
1997
-
"dev": true,
1998
-
"license": "MIT",
1999
-
"dependencies": {
2000
-
"color-name": "~1.1.4"
2001
-
},
2002
-
"engines": {
2003
-
"node": ">=7.0.0"
2004
-
}
2005
-
},
2006
-
"node_modules/color-name": {
2007
-
"version": "1.1.4",
2008
-
"dev": true,
2009
-
"license": "MIT"
2010
-
},
2011
-
"node_modules/combined-stream": {
2012
-
"version": "1.0.8",
2013
-
"license": "MIT",
2014
-
"dependencies": {
2015
-
"delayed-stream": "~1.0.0"
2016
-
},
2017
-
"engines": {
2018
-
"node": ">= 0.8"
2019
-
}
2020
-
},
2021
-
"node_modules/concat-map": {
2022
-
"version": "0.0.1",
2023
-
"dev": true,
2024
-
"license": "MIT"
2025
-
},
2026
-
"node_modules/convert-source-map": {
2027
-
"version": "2.0.0",
2028
-
"dev": true,
2029
-
"license": "MIT"
2030
-
},
2031
-
"node_modules/cosmiconfig": {
2032
-
"version": "7.1.0",
2033
-
"license": "MIT",
2034
-
"dependencies": {
2035
-
"@types/parse-json": "^4.0.0",
2036
-
"import-fresh": "^3.2.1",
2037
-
"parse-json": "^5.0.0",
2038
-
"path-type": "^4.0.0",
2039
-
"yaml": "^1.10.0"
2040
-
},
2041
-
"engines": {
2042
-
"node": ">=10"
2043
-
}
2044
-
},
2045
-
"node_modules/cosmiconfig/node_modules/yaml": {
2046
-
"version": "1.10.2",
2047
-
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
2048
-
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
2049
-
"license": "ISC",
2050
-
"engines": {
2051
-
"node": ">= 6"
2052
-
}
2053
-
},
2054
-
"node_modules/cross-spawn": {
2055
-
"version": "7.0.6",
2056
-
"dev": true,
2057
-
"license": "MIT",
2058
-
"dependencies": {
2059
-
"path-key": "^3.1.0",
2060
-
"shebang-command": "^2.0.0",
2061
-
"which": "^2.0.1"
2062
-
},
2063
-
"engines": {
2064
-
"node": ">= 8"
2065
-
}
2066
-
},
2067
-
"node_modules/csstype": {
2068
-
"version": "3.1.3",
2069
-
"license": "MIT"
2070
-
},
2071
-
"node_modules/d3-array": {
2072
-
"version": "3.2.4",
2073
-
"license": "ISC",
2074
-
"dependencies": {
2075
-
"internmap": "1 - 2"
2076
-
},
2077
-
"engines": {
2078
-
"node": ">=12"
2079
-
}
2080
-
},
2081
-
"node_modules/d3-color": {
2082
-
"version": "3.1.0",
2083
-
"license": "ISC",
2084
-
"engines": {
2085
-
"node": ">=12"
2086
-
}
2087
-
},
2088
-
"node_modules/d3-ease": {
2089
-
"version": "3.0.1",
2090
-
"license": "BSD-3-Clause",
2091
-
"engines": {
2092
-
"node": ">=12"
2093
-
}
2094
-
},
2095
-
"node_modules/d3-format": {
2096
-
"version": "3.1.0",
2097
-
"license": "ISC",
2098
-
"engines": {
2099
-
"node": ">=12"
2100
-
}
2101
-
},
2102
-
"node_modules/d3-interpolate": {
2103
-
"version": "3.0.1",
2104
-
"license": "ISC",
2105
-
"dependencies": {
2106
-
"d3-color": "1 - 3"
2107
-
},
2108
-
"engines": {
2109
-
"node": ">=12"
2110
-
}
2111
-
},
2112
-
"node_modules/d3-path": {
2113
-
"version": "3.1.0",
2114
-
"license": "ISC",
2115
-
"engines": {
2116
-
"node": ">=12"
2117
-
}
2118
-
},
2119
-
"node_modules/d3-scale": {
2120
-
"version": "4.0.2",
2121
-
"license": "ISC",
2122
-
"dependencies": {
2123
-
"d3-array": "2.10.0 - 3",
2124
-
"d3-format": "1 - 3",
2125
-
"d3-interpolate": "1.2.0 - 3",
2126
-
"d3-time": "2.1.1 - 3",
2127
-
"d3-time-format": "2 - 4"
2128
-
},
2129
-
"engines": {
2130
-
"node": ">=12"
2131
-
}
2132
-
},
2133
-
"node_modules/d3-shape": {
2134
-
"version": "3.2.0",
2135
-
"license": "ISC",
2136
-
"dependencies": {
2137
-
"d3-path": "^3.1.0"
2138
-
},
2139
-
"engines": {
2140
-
"node": ">=12"
2141
-
}
2142
-
},
2143
-
"node_modules/d3-time": {
2144
-
"version": "3.1.0",
2145
-
"license": "ISC",
2146
-
"dependencies": {
2147
-
"d3-array": "2 - 3"
2148
-
},
2149
-
"engines": {
2150
-
"node": ">=12"
2151
-
}
2152
-
},
2153
-
"node_modules/d3-time-format": {
2154
-
"version": "4.1.0",
2155
-
"license": "ISC",
2156
-
"dependencies": {
2157
-
"d3-time": "1 - 3"
2158
-
},
2159
-
"engines": {
2160
-
"node": ">=12"
2161
-
}
2162
-
},
2163
-
"node_modules/d3-timer": {
2164
-
"version": "3.0.1",
2165
-
"license": "ISC",
2166
-
"engines": {
2167
-
"node": ">=12"
2168
-
}
2169
-
},
2170
-
"node_modules/debug": {
2171
-
"version": "4.4.0",
2172
-
"license": "MIT",
2173
-
"dependencies": {
2174
-
"ms": "^2.1.3"
2175
-
},
2176
-
"engines": {
2177
-
"node": ">=6.0"
2178
-
},
2179
-
"peerDependenciesMeta": {
2180
-
"supports-color": {
2181
-
"optional": true
2182
-
}
2183
-
}
2184
-
},
2185
-
"node_modules/decimal.js-light": {
2186
-
"version": "2.5.1",
2187
-
"license": "MIT"
2188
-
},
2189
-
"node_modules/deep-is": {
2190
-
"version": "0.1.4",
2191
-
"dev": true,
2192
-
"license": "MIT"
2193
-
},
2194
-
"node_modules/delayed-stream": {
2195
-
"version": "1.0.0",
2196
-
"license": "MIT",
2197
-
"engines": {
2198
-
"node": ">=0.4.0"
2199
-
}
2200
-
},
2201
-
"node_modules/detect-libc": {
2202
-
"version": "1.0.3",
2203
-
"license": "Apache-2.0",
2204
-
"bin": {
2205
-
"detect-libc": "bin/detect-libc.js"
2206
-
},
2207
-
"engines": {
2208
-
"node": ">=0.10"
2209
-
}
2210
-
},
2211
-
"node_modules/detect-node-es": {
2212
-
"version": "1.1.0",
2213
-
"license": "MIT"
2214
-
},
2215
-
"node_modules/dom-helpers": {
2216
-
"version": "5.2.1",
2217
-
"license": "MIT",
2218
-
"dependencies": {
2219
-
"@babel/runtime": "^7.8.7",
2220
-
"csstype": "^3.0.2"
2221
-
}
2222
-
},
2223
-
"node_modules/electron-to-chromium": {
2224
-
"version": "1.5.88",
2225
-
"dev": true,
2226
-
"license": "ISC"
2227
-
},
2228
-
"node_modules/enhanced-resolve": {
2229
-
"version": "5.18.0",
2230
-
"license": "MIT",
2231
-
"dependencies": {
2232
-
"graceful-fs": "^4.2.4",
2233
-
"tapable": "^2.2.0"
2234
-
},
2235
-
"engines": {
2236
-
"node": ">=10.13.0"
2237
-
}
2238
-
},
2239
-
"node_modules/error-ex": {
2240
-
"version": "1.3.2",
2241
-
"license": "MIT",
2242
-
"dependencies": {
2243
-
"is-arrayish": "^0.2.1"
2244
-
}
2245
-
},
2246
-
"node_modules/esbuild": {
2247
-
"version": "0.24.2",
2248
-
"hasInstallScript": true,
2249
-
"license": "MIT",
2250
-
"bin": {
2251
-
"esbuild": "bin/esbuild"
2252
-
},
2253
-
"engines": {
2254
-
"node": ">=18"
2255
-
},
2256
-
"optionalDependencies": {
2257
-
"@esbuild/aix-ppc64": "0.24.2",
2258
-
"@esbuild/android-arm": "0.24.2",
2259
-
"@esbuild/android-arm64": "0.24.2",
2260
-
"@esbuild/android-x64": "0.24.2",
2261
-
"@esbuild/darwin-arm64": "0.24.2",
2262
-
"@esbuild/darwin-x64": "0.24.2",
2263
-
"@esbuild/freebsd-arm64": "0.24.2",
2264
-
"@esbuild/freebsd-x64": "0.24.2",
2265
-
"@esbuild/linux-arm": "0.24.2",
2266
-
"@esbuild/linux-arm64": "0.24.2",
2267
-
"@esbuild/linux-ia32": "0.24.2",
2268
-
"@esbuild/linux-loong64": "0.24.2",
2269
-
"@esbuild/linux-mips64el": "0.24.2",
2270
-
"@esbuild/linux-ppc64": "0.24.2",
2271
-
"@esbuild/linux-riscv64": "0.24.2",
2272
-
"@esbuild/linux-s390x": "0.24.2",
2273
-
"@esbuild/linux-x64": "0.24.2",
2274
-
"@esbuild/netbsd-arm64": "0.24.2",
2275
-
"@esbuild/netbsd-x64": "0.24.2",
2276
-
"@esbuild/openbsd-arm64": "0.24.2",
2277
-
"@esbuild/openbsd-x64": "0.24.2",
2278
-
"@esbuild/sunos-x64": "0.24.2",
2279
-
"@esbuild/win32-arm64": "0.24.2",
2280
-
"@esbuild/win32-ia32": "0.24.2",
2281
-
"@esbuild/win32-x64": "0.24.2"
2282
-
}
2283
-
},
2284
-
"node_modules/escalade": {
2285
-
"version": "3.2.0",
2286
-
"dev": true,
2287
-
"license": "MIT",
2288
-
"engines": {
2289
-
"node": ">=6"
2290
-
}
2291
-
},
2292
-
"node_modules/escape-string-regexp": {
2293
-
"version": "4.0.0",
2294
-
"license": "MIT",
2295
-
"engines": {
2296
-
"node": ">=10"
2297
-
},
2298
-
"funding": {
2299
-
"url": "https://github.com/sponsors/sindresorhus"
2300
-
}
2301
-
},
2302
-
"node_modules/eslint": {
2303
-
"version": "9.19.0",
2304
-
"dev": true,
2305
-
"license": "MIT",
2306
-
"dependencies": {
2307
-
"@eslint-community/eslint-utils": "^4.2.0",
2308
-
"@eslint-community/regexpp": "^4.12.1",
2309
-
"@eslint/config-array": "^0.19.0",
2310
-
"@eslint/core": "^0.10.0",
2311
-
"@eslint/eslintrc": "^3.2.0",
2312
-
"@eslint/js": "9.19.0",
2313
-
"@eslint/plugin-kit": "^0.2.5",
2314
-
"@humanfs/node": "^0.16.6",
2315
-
"@humanwhocodes/module-importer": "^1.0.1",
2316
-
"@humanwhocodes/retry": "^0.4.1",
2317
-
"@types/estree": "^1.0.6",
2318
-
"@types/json-schema": "^7.0.15",
2319
-
"ajv": "^6.12.4",
2320
-
"chalk": "^4.0.0",
2321
-
"cross-spawn": "^7.0.6",
2322
-
"debug": "^4.3.2",
2323
-
"escape-string-regexp": "^4.0.0",
2324
-
"eslint-scope": "^8.2.0",
2325
-
"eslint-visitor-keys": "^4.2.0",
2326
-
"espree": "^10.3.0",
2327
-
"esquery": "^1.5.0",
2328
-
"esutils": "^2.0.2",
2329
-
"fast-deep-equal": "^3.1.3",
2330
-
"file-entry-cache": "^8.0.0",
2331
-
"find-up": "^5.0.0",
2332
-
"glob-parent": "^6.0.2",
2333
-
"ignore": "^5.2.0",
2334
-
"imurmurhash": "^0.1.4",
2335
-
"is-glob": "^4.0.0",
2336
-
"json-stable-stringify-without-jsonify": "^1.0.1",
2337
-
"lodash.merge": "^4.6.2",
2338
-
"minimatch": "^3.1.2",
2339
-
"natural-compare": "^1.4.0",
2340
-
"optionator": "^0.9.3"
2341
-
},
2342
-
"bin": {
2343
-
"eslint": "bin/eslint.js"
2344
-
},
2345
-
"engines": {
2346
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2347
-
},
2348
-
"funding": {
2349
-
"url": "https://eslint.org/donate"
2350
-
},
2351
-
"peerDependencies": {
2352
-
"jiti": "*"
2353
-
},
2354
-
"peerDependenciesMeta": {
2355
-
"jiti": {
2356
-
"optional": true
2357
-
}
2358
-
}
2359
-
},
2360
-
"node_modules/eslint-plugin-react-hooks": {
2361
-
"version": "5.1.0",
2362
-
"dev": true,
2363
-
"license": "MIT",
2364
-
"engines": {
2365
-
"node": ">=10"
2366
-
},
2367
-
"peerDependencies": {
2368
-
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
2369
-
}
2370
-
},
2371
-
"node_modules/eslint-plugin-react-refresh": {
2372
-
"version": "0.4.18",
2373
-
"dev": true,
2374
-
"license": "MIT",
2375
-
"peerDependencies": {
2376
-
"eslint": ">=8.40"
2377
-
}
2378
-
},
2379
-
"node_modules/eslint-scope": {
2380
-
"version": "8.2.0",
2381
-
"dev": true,
2382
-
"license": "BSD-2-Clause",
2383
-
"dependencies": {
2384
-
"esrecurse": "^4.3.0",
2385
-
"estraverse": "^5.2.0"
2386
-
},
2387
-
"engines": {
2388
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2389
-
},
2390
-
"funding": {
2391
-
"url": "https://opencollective.com/eslint"
2392
-
}
2393
-
},
2394
-
"node_modules/eslint-visitor-keys": {
2395
-
"version": "4.2.0",
2396
-
"dev": true,
2397
-
"license": "Apache-2.0",
2398
-
"engines": {
2399
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2400
-
},
2401
-
"funding": {
2402
-
"url": "https://opencollective.com/eslint"
2403
-
}
2404
-
},
2405
-
"node_modules/espree": {
2406
-
"version": "10.3.0",
2407
-
"dev": true,
2408
-
"license": "BSD-2-Clause",
2409
-
"dependencies": {
2410
-
"acorn": "^8.14.0",
2411
-
"acorn-jsx": "^5.3.2",
2412
-
"eslint-visitor-keys": "^4.2.0"
2413
-
},
2414
-
"engines": {
2415
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2416
-
},
2417
-
"funding": {
2418
-
"url": "https://opencollective.com/eslint"
2419
-
}
2420
-
},
2421
-
"node_modules/esquery": {
2422
-
"version": "1.6.0",
2423
-
"dev": true,
2424
-
"license": "BSD-3-Clause",
2425
-
"dependencies": {
2426
-
"estraverse": "^5.1.0"
2427
-
},
2428
-
"engines": {
2429
-
"node": ">=0.10"
2430
-
}
2431
-
},
2432
-
"node_modules/esrecurse": {
2433
-
"version": "4.3.0",
2434
-
"dev": true,
2435
-
"license": "BSD-2-Clause",
2436
-
"dependencies": {
2437
-
"estraverse": "^5.2.0"
2438
-
},
2439
-
"engines": {
2440
-
"node": ">=4.0"
2441
-
}
2442
-
},
2443
-
"node_modules/estraverse": {
2444
-
"version": "5.3.0",
2445
-
"dev": true,
2446
-
"license": "BSD-2-Clause",
2447
-
"engines": {
2448
-
"node": ">=4.0"
2449
-
}
2450
-
},
2451
-
"node_modules/esutils": {
2452
-
"version": "2.0.3",
2453
-
"dev": true,
2454
-
"license": "BSD-2-Clause",
2455
-
"engines": {
2456
-
"node": ">=0.10.0"
2457
-
}
2458
-
},
2459
-
"node_modules/eventemitter3": {
2460
-
"version": "4.0.7",
2461
-
"license": "MIT"
2462
-
},
2463
-
"node_modules/fast-deep-equal": {
2464
-
"version": "3.1.3",
2465
-
"license": "MIT"
2466
-
},
2467
-
"node_modules/fast-equals": {
2468
-
"version": "5.2.2",
2469
-
"license": "MIT",
2470
-
"engines": {
2471
-
"node": ">=6.0.0"
2472
-
}
2473
-
},
2474
-
"node_modules/fast-glob": {
2475
-
"version": "3.3.3",
2476
-
"dev": true,
2477
-
"license": "MIT",
2478
-
"dependencies": {
2479
-
"@nodelib/fs.stat": "^2.0.2",
2480
-
"@nodelib/fs.walk": "^1.2.3",
2481
-
"glob-parent": "^5.1.2",
2482
-
"merge2": "^1.3.0",
2483
-
"micromatch": "^4.0.8"
2484
-
},
2485
-
"engines": {
2486
-
"node": ">=8.6.0"
2487
-
}
2488
-
},
2489
-
"node_modules/fast-glob/node_modules/glob-parent": {
2490
-
"version": "5.1.2",
2491
-
"dev": true,
2492
-
"license": "ISC",
2493
-
"dependencies": {
2494
-
"is-glob": "^4.0.1"
2495
-
},
2496
-
"engines": {
2497
-
"node": ">= 6"
2498
-
}
2499
-
},
2500
-
"node_modules/fast-json-stable-stringify": {
2501
-
"version": "2.1.0",
2502
-
"dev": true,
2503
-
"license": "MIT"
2504
-
},
2505
-
"node_modules/fast-levenshtein": {
2506
-
"version": "2.0.6",
2507
-
"dev": true,
2508
-
"license": "MIT"
2509
-
},
2510
-
"node_modules/fastq": {
2511
-
"version": "1.18.0",
2512
-
"dev": true,
2513
-
"license": "ISC",
2514
-
"dependencies": {
2515
-
"reusify": "^1.0.4"
2516
-
}
2517
-
},
2518
-
"node_modules/file-entry-cache": {
2519
-
"version": "8.0.0",
2520
-
"dev": true,
2521
-
"license": "MIT",
2522
-
"dependencies": {
2523
-
"flat-cache": "^4.0.0"
2524
-
},
2525
-
"engines": {
2526
-
"node": ">=16.0.0"
2527
-
}
2528
-
},
2529
-
"node_modules/fill-range": {
2530
-
"version": "7.1.1",
2531
-
"dev": true,
2532
-
"license": "MIT",
2533
-
"dependencies": {
2534
-
"to-regex-range": "^5.0.1"
2535
-
},
2536
-
"engines": {
2537
-
"node": ">=8"
2538
-
}
2539
-
},
2540
-
"node_modules/find-root": {
2541
-
"version": "1.1.0",
2542
-
"license": "MIT"
2543
-
},
2544
-
"node_modules/find-up": {
2545
-
"version": "5.0.0",
2546
-
"dev": true,
2547
-
"license": "MIT",
2548
-
"dependencies": {
2549
-
"locate-path": "^6.0.0",
2550
-
"path-exists": "^4.0.0"
2551
-
},
2552
-
"engines": {
2553
-
"node": ">=10"
2554
-
},
2555
-
"funding": {
2556
-
"url": "https://github.com/sponsors/sindresorhus"
2557
-
}
2558
-
},
2559
-
"node_modules/flat-cache": {
2560
-
"version": "4.0.1",
2561
-
"dev": true,
2562
-
"license": "MIT",
2563
-
"dependencies": {
2564
-
"flatted": "^3.2.9",
2565
-
"keyv": "^4.5.4"
2566
-
},
2567
-
"engines": {
2568
-
"node": ">=16"
2569
-
}
2570
-
},
2571
-
"node_modules/flatted": {
2572
-
"version": "3.3.2",
2573
-
"dev": true,
2574
-
"license": "ISC"
2575
-
},
2576
-
"node_modules/follow-redirects": {
2577
-
"version": "1.15.9",
2578
-
"funding": [
2579
-
{
2580
-
"type": "individual",
2581
-
"url": "https://github.com/sponsors/RubenVerborgh"
2582
-
}
2583
-
],
2584
-
"license": "MIT",
2585
-
"engines": {
2586
-
"node": ">=4.0"
2587
-
},
2588
-
"peerDependenciesMeta": {
2589
-
"debug": {
2590
-
"optional": true
2591
-
}
2592
-
}
2593
-
},
2594
-
"node_modules/form-data": {
2595
-
"version": "4.0.1",
2596
-
"license": "MIT",
2597
-
"dependencies": {
2598
-
"asynckit": "^0.4.0",
2599
-
"combined-stream": "^1.0.8",
2600
-
"mime-types": "^2.1.12"
2601
-
},
2602
-
"engines": {
2603
-
"node": ">= 6"
2604
-
}
2605
-
},
2606
-
"node_modules/fsevents": {
2607
-
"version": "2.3.3",
2608
-
"license": "MIT",
2609
-
"optional": true,
2610
-
"os": [
2611
-
"darwin"
2612
-
],
2613
-
"engines": {
2614
-
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
2615
-
}
2616
-
},
2617
-
"node_modules/function-bind": {
2618
-
"version": "1.1.2",
2619
-
"license": "MIT",
2620
-
"funding": {
2621
-
"url": "https://github.com/sponsors/ljharb"
2622
-
}
2623
-
},
2624
-
"node_modules/gensync": {
2625
-
"version": "1.0.0-beta.2",
2626
-
"dev": true,
2627
-
"license": "MIT",
2628
-
"engines": {
2629
-
"node": ">=6.9.0"
2630
-
}
2631
-
},
2632
-
"node_modules/get-nonce": {
2633
-
"version": "1.0.1",
2634
-
"license": "MIT",
2635
-
"engines": {
2636
-
"node": ">=6"
2637
-
}
2638
-
},
2639
-
"node_modules/glob-parent": {
2640
-
"version": "6.0.2",
2641
-
"dev": true,
2642
-
"license": "ISC",
2643
-
"dependencies": {
2644
-
"is-glob": "^4.0.3"
2645
-
},
2646
-
"engines": {
2647
-
"node": ">=10.13.0"
2648
-
}
2649
-
},
2650
-
"node_modules/globals": {
2651
-
"version": "15.14.0",
2652
-
"dev": true,
2653
-
"license": "MIT",
2654
-
"engines": {
2655
-
"node": ">=18"
2656
-
},
2657
-
"funding": {
2658
-
"url": "https://github.com/sponsors/sindresorhus"
2659
-
}
2660
-
},
2661
-
"node_modules/graceful-fs": {
2662
-
"version": "4.2.11",
2663
-
"license": "ISC"
2664
-
},
2665
-
"node_modules/graphemer": {
2666
-
"version": "1.4.0",
2667
-
"dev": true,
2668
-
"license": "MIT"
2669
-
},
2670
-
"node_modules/has-flag": {
2671
-
"version": "4.0.0",
2672
-
"dev": true,
2673
-
"license": "MIT",
2674
-
"engines": {
2675
-
"node": ">=8"
2676
-
}
2677
-
},
2678
-
"node_modules/hasown": {
2679
-
"version": "2.0.2",
2680
-
"license": "MIT",
2681
-
"dependencies": {
2682
-
"function-bind": "^1.1.2"
2683
-
},
2684
-
"engines": {
2685
-
"node": ">= 0.4"
2686
-
}
2687
-
},
2688
-
"node_modules/hoist-non-react-statics": {
2689
-
"version": "3.3.2",
2690
-
"license": "BSD-3-Clause",
2691
-
"dependencies": {
2692
-
"react-is": "^16.7.0"
2693
-
}
2694
-
},
2695
-
"node_modules/hoist-non-react-statics/node_modules/react-is": {
2696
-
"version": "16.13.1",
2697
-
"license": "MIT"
2698
-
},
2699
-
"node_modules/ignore": {
2700
-
"version": "5.3.2",
2701
-
"dev": true,
2702
-
"license": "MIT",
2703
-
"engines": {
2704
-
"node": ">= 4"
2705
-
}
2706
-
},
2707
-
"node_modules/import-fresh": {
2708
-
"version": "3.3.0",
2709
-
"license": "MIT",
2710
-
"dependencies": {
2711
-
"parent-module": "^1.0.0",
2712
-
"resolve-from": "^4.0.0"
2713
-
},
2714
-
"engines": {
2715
-
"node": ">=6"
2716
-
},
2717
-
"funding": {
2718
-
"url": "https://github.com/sponsors/sindresorhus"
2719
-
}
2720
-
},
2721
-
"node_modules/imurmurhash": {
2722
-
"version": "0.1.4",
2723
-
"dev": true,
2724
-
"license": "MIT",
2725
-
"engines": {
2726
-
"node": ">=0.8.19"
2727
-
}
2728
-
},
2729
-
"node_modules/internmap": {
2730
-
"version": "2.0.3",
2731
-
"license": "ISC",
2732
-
"engines": {
2733
-
"node": ">=12"
2734
-
}
2735
-
},
2736
-
"node_modules/is-arrayish": {
2737
-
"version": "0.2.1",
2738
-
"license": "MIT"
2739
-
},
2740
-
"node_modules/is-core-module": {
2741
-
"version": "2.16.1",
2742
-
"license": "MIT",
2743
-
"dependencies": {
2744
-
"hasown": "^2.0.2"
2745
-
},
2746
-
"engines": {
2747
-
"node": ">= 0.4"
2748
-
},
2749
-
"funding": {
2750
-
"url": "https://github.com/sponsors/ljharb"
2751
-
}
2752
-
},
2753
-
"node_modules/is-extglob": {
2754
-
"version": "2.1.1",
2755
-
"dev": true,
2756
-
"license": "MIT",
2757
-
"engines": {
2758
-
"node": ">=0.10.0"
2759
-
}
2760
-
},
2761
-
"node_modules/is-glob": {
2762
-
"version": "4.0.3",
2763
-
"dev": true,
2764
-
"license": "MIT",
2765
-
"dependencies": {
2766
-
"is-extglob": "^2.1.1"
2767
-
},
2768
-
"engines": {
2769
-
"node": ">=0.10.0"
2770
-
}
2771
-
},
2772
-
"node_modules/is-number": {
2773
-
"version": "7.0.0",
2774
-
"dev": true,
2775
-
"license": "MIT",
2776
-
"engines": {
2777
-
"node": ">=0.12.0"
2778
-
}
2779
-
},
2780
-
"node_modules/isexe": {
2781
-
"version": "2.0.0",
2782
-
"dev": true,
2783
-
"license": "ISC"
2784
-
},
2785
-
"node_modules/jiti": {
2786
-
"version": "2.4.2",
2787
-
"license": "MIT",
2788
-
"bin": {
2789
-
"jiti": "lib/jiti-cli.mjs"
2790
-
}
2791
-
},
2792
-
"node_modules/js-tokens": {
2793
-
"version": "4.0.0",
2794
-
"license": "MIT"
2795
-
},
2796
-
"node_modules/js-yaml": {
2797
-
"version": "4.1.0",
2798
-
"dev": true,
2799
-
"license": "MIT",
2800
-
"dependencies": {
2801
-
"argparse": "^2.0.1"
2802
-
},
2803
-
"bin": {
2804
-
"js-yaml": "bin/js-yaml.js"
2805
-
}
2806
-
},
2807
-
"node_modules/jsesc": {
2808
-
"version": "3.1.0",
2809
-
"license": "MIT",
2810
-
"bin": {
2811
-
"jsesc": "bin/jsesc"
2812
-
},
2813
-
"engines": {
2814
-
"node": ">=6"
2815
-
}
2816
-
},
2817
-
"node_modules/json-buffer": {
2818
-
"version": "3.0.1",
2819
-
"dev": true,
2820
-
"license": "MIT"
2821
-
},
2822
-
"node_modules/json-parse-even-better-errors": {
2823
-
"version": "2.3.1",
2824
-
"license": "MIT"
2825
-
},
2826
-
"node_modules/json-schema-traverse": {
2827
-
"version": "0.4.1",
2828
-
"dev": true,
2829
-
"license": "MIT"
2830
-
},
2831
-
"node_modules/json-stable-stringify-without-jsonify": {
2832
-
"version": "1.0.1",
2833
-
"dev": true,
2834
-
"license": "MIT"
2835
-
},
2836
-
"node_modules/json5": {
2837
-
"version": "2.2.3",
2838
-
"dev": true,
2839
-
"license": "MIT",
2840
-
"bin": {
2841
-
"json5": "lib/cli.js"
2842
-
},
2843
-
"engines": {
2844
-
"node": ">=6"
2845
-
}
2846
-
},
2847
-
"node_modules/keyv": {
2848
-
"version": "4.5.4",
2849
-
"dev": true,
2850
-
"license": "MIT",
2851
-
"dependencies": {
2852
-
"json-buffer": "3.0.1"
2853
-
}
2854
-
},
2855
-
"node_modules/klona": {
2856
-
"version": "2.0.6",
2857
-
"license": "MIT",
2858
-
"engines": {
2859
-
"node": ">= 8"
2860
-
}
2861
-
},
2862
-
"node_modules/levn": {
2863
-
"version": "0.4.1",
2864
-
"dev": true,
2865
-
"license": "MIT",
2866
-
"dependencies": {
2867
-
"prelude-ls": "^1.2.1",
2868
-
"type-check": "~0.4.0"
2869
-
},
2870
-
"engines": {
2871
-
"node": ">= 0.8.0"
2872
-
}
2873
-
},
2874
-
"node_modules/lightningcss": {
2875
-
"version": "1.29.1",
2876
-
"license": "MPL-2.0",
2877
-
"dependencies": {
2878
-
"detect-libc": "^1.0.3"
2879
-
},
2880
-
"engines": {
2881
-
"node": ">= 12.0.0"
2882
-
},
2883
-
"funding": {
2884
-
"type": "opencollective",
2885
-
"url": "https://opencollective.com/parcel"
2886
-
},
2887
-
"optionalDependencies": {
2888
-
"lightningcss-darwin-arm64": "1.29.1",
2889
-
"lightningcss-darwin-x64": "1.29.1",
2890
-
"lightningcss-freebsd-x64": "1.29.1",
2891
-
"lightningcss-linux-arm-gnueabihf": "1.29.1",
2892
-
"lightningcss-linux-arm64-gnu": "1.29.1",
2893
-
"lightningcss-linux-arm64-musl": "1.29.1",
2894
-
"lightningcss-linux-x64-gnu": "1.29.1",
2895
-
"lightningcss-linux-x64-musl": "1.29.1",
2896
-
"lightningcss-win32-arm64-msvc": "1.29.1",
2897
-
"lightningcss-win32-x64-msvc": "1.29.1"
2898
-
}
2899
-
},
2900
-
"node_modules/lightningcss-darwin-arm64": {
2901
-
"version": "1.29.1",
2902
-
"cpu": [
2903
-
"arm64"
2904
-
],
2905
-
"license": "MPL-2.0",
2906
-
"optional": true,
2907
-
"os": [
2908
-
"darwin"
2909
-
],
2910
-
"engines": {
2911
-
"node": ">= 12.0.0"
2912
-
},
2913
-
"funding": {
2914
-
"type": "opencollective",
2915
-
"url": "https://opencollective.com/parcel"
2916
-
}
2917
-
},
2918
-
"node_modules/lines-and-columns": {
2919
-
"version": "1.2.4",
2920
-
"license": "MIT"
2921
-
},
2922
-
"node_modules/locate-path": {
2923
-
"version": "6.0.0",
2924
-
"dev": true,
2925
-
"license": "MIT",
2926
-
"dependencies": {
2927
-
"p-locate": "^5.0.0"
2928
-
},
2929
-
"engines": {
2930
-
"node": ">=10"
2931
-
},
2932
-
"funding": {
2933
-
"url": "https://github.com/sponsors/sindresorhus"
2934
-
}
2935
-
},
2936
-
"node_modules/lodash": {
2937
-
"version": "4.17.21",
2938
-
"license": "MIT"
2939
-
},
2940
-
"node_modules/lodash.merge": {
2941
-
"version": "4.6.2",
2942
-
"dev": true,
2943
-
"license": "MIT"
2944
-
},
2945
-
"node_modules/loose-envify": {
2946
-
"version": "1.4.0",
2947
-
"license": "MIT",
2948
-
"dependencies": {
2949
-
"js-tokens": "^3.0.0 || ^4.0.0"
2950
-
},
2951
-
"bin": {
2952
-
"loose-envify": "cli.js"
2953
-
}
2954
-
},
2955
-
"node_modules/lru-cache": {
2956
-
"version": "5.1.1",
2957
-
"dev": true,
2958
-
"license": "ISC",
2959
-
"dependencies": {
2960
-
"yallist": "^3.0.2"
2961
-
}
2962
-
},
2963
-
"node_modules/lucide-react": {
2964
-
"version": "0.474.0",
2965
-
"license": "ISC",
2966
-
"peerDependencies": {
2967
-
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
2968
-
}
2969
-
},
2970
-
"node_modules/merge2": {
2971
-
"version": "1.4.1",
2972
-
"dev": true,
2973
-
"license": "MIT",
2974
-
"engines": {
2975
-
"node": ">= 8"
2976
-
}
2977
-
},
2978
-
"node_modules/micromatch": {
2979
-
"version": "4.0.8",
2980
-
"dev": true,
2981
-
"license": "MIT",
2982
-
"dependencies": {
2983
-
"braces": "^3.0.3",
2984
-
"picomatch": "^2.3.1"
2985
-
},
2986
-
"engines": {
2987
-
"node": ">=8.6"
2988
-
}
2989
-
},
2990
-
"node_modules/mime-db": {
2991
-
"version": "1.52.0",
2992
-
"license": "MIT",
2993
-
"engines": {
2994
-
"node": ">= 0.6"
2995
-
}
2996
-
},
2997
-
"node_modules/mime-types": {
2998
-
"version": "2.1.35",
2999
-
"license": "MIT",
3000
-
"dependencies": {
3001
-
"mime-db": "1.52.0"
3002
-
},
3003
-
"engines": {
3004
-
"node": ">= 0.6"
3005
-
}
3006
-
},
3007
-
"node_modules/minimatch": {
3008
-
"version": "3.1.2",
3009
-
"dev": true,
3010
-
"license": "ISC",
3011
-
"dependencies": {
3012
-
"brace-expansion": "^1.1.7"
3013
-
},
3014
-
"engines": {
3015
-
"node": "*"
3016
-
}
3017
-
},
3018
-
"node_modules/ms": {
3019
-
"version": "2.1.3",
3020
-
"license": "MIT"
3021
-
},
3022
-
"node_modules/nanoid": {
3023
-
"version": "3.3.8",
3024
-
"funding": [
3025
-
{
3026
-
"type": "github",
3027
-
"url": "https://github.com/sponsors/ai"
3028
-
}
3029
-
],
3030
-
"license": "MIT",
3031
-
"bin": {
3032
-
"nanoid": "bin/nanoid.cjs"
3033
-
},
3034
-
"engines": {
3035
-
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
3036
-
}
3037
-
},
3038
-
"node_modules/natural-compare": {
3039
-
"version": "1.4.0",
3040
-
"dev": true,
3041
-
"license": "MIT"
3042
-
},
3043
-
"node_modules/node-releases": {
3044
-
"version": "2.0.19",
3045
-
"dev": true,
3046
-
"license": "MIT"
3047
-
},
3048
-
"node_modules/object-assign": {
3049
-
"version": "4.1.1",
3050
-
"license": "MIT",
3051
-
"engines": {
3052
-
"node": ">=0.10.0"
3053
-
}
3054
-
},
3055
-
"node_modules/optionator": {
3056
-
"version": "0.9.4",
3057
-
"dev": true,
3058
-
"license": "MIT",
3059
-
"dependencies": {
3060
-
"deep-is": "^0.1.3",
3061
-
"fast-levenshtein": "^2.0.6",
3062
-
"levn": "^0.4.1",
3063
-
"prelude-ls": "^1.2.1",
3064
-
"type-check": "^0.4.0",
3065
-
"word-wrap": "^1.2.5"
3066
-
},
3067
-
"engines": {
3068
-
"node": ">= 0.8.0"
3069
-
}
3070
-
},
3071
-
"node_modules/p-limit": {
3072
-
"version": "3.1.0",
3073
-
"dev": true,
3074
-
"license": "MIT",
3075
-
"dependencies": {
3076
-
"yocto-queue": "^0.1.0"
3077
-
},
3078
-
"engines": {
3079
-
"node": ">=10"
3080
-
},
3081
-
"funding": {
3082
-
"url": "https://github.com/sponsors/sindresorhus"
3083
-
}
3084
-
},
3085
-
"node_modules/p-locate": {
3086
-
"version": "5.0.0",
3087
-
"dev": true,
3088
-
"license": "MIT",
3089
-
"dependencies": {
3090
-
"p-limit": "^3.0.2"
3091
-
},
3092
-
"engines": {
3093
-
"node": ">=10"
3094
-
},
3095
-
"funding": {
3096
-
"url": "https://github.com/sponsors/sindresorhus"
3097
-
}
3098
-
},
3099
-
"node_modules/parent-module": {
3100
-
"version": "1.0.1",
3101
-
"license": "MIT",
3102
-
"dependencies": {
3103
-
"callsites": "^3.0.0"
3104
-
},
3105
-
"engines": {
3106
-
"node": ">=6"
3107
-
}
3108
-
},
3109
-
"node_modules/parse-json": {
3110
-
"version": "5.2.0",
3111
-
"license": "MIT",
3112
-
"dependencies": {
3113
-
"@babel/code-frame": "^7.0.0",
3114
-
"error-ex": "^1.3.1",
3115
-
"json-parse-even-better-errors": "^2.3.0",
3116
-
"lines-and-columns": "^1.1.6"
3117
-
},
3118
-
"engines": {
3119
-
"node": ">=8"
3120
-
},
3121
-
"funding": {
3122
-
"url": "https://github.com/sponsors/sindresorhus"
3123
-
}
3124
-
},
3125
-
"node_modules/path-exists": {
3126
-
"version": "4.0.0",
3127
-
"dev": true,
3128
-
"license": "MIT",
3129
-
"engines": {
3130
-
"node": ">=8"
3131
-
}
3132
-
},
3133
-
"node_modules/path-key": {
3134
-
"version": "3.1.1",
3135
-
"dev": true,
3136
-
"license": "MIT",
3137
-
"engines": {
3138
-
"node": ">=8"
3139
-
}
3140
-
},
3141
-
"node_modules/path-parse": {
3142
-
"version": "1.0.7",
3143
-
"license": "MIT"
3144
-
},
3145
-
"node_modules/path-type": {
3146
-
"version": "4.0.0",
3147
-
"license": "MIT",
3148
-
"engines": {
3149
-
"node": ">=8"
3150
-
}
3151
-
},
3152
-
"node_modules/picocolors": {
3153
-
"version": "1.1.1",
3154
-
"license": "ISC"
3155
-
},
3156
-
"node_modules/picomatch": {
3157
-
"version": "2.3.1",
3158
-
"dev": true,
3159
-
"license": "MIT",
3160
-
"engines": {
3161
-
"node": ">=8.6"
3162
-
},
3163
-
"funding": {
3164
-
"url": "https://github.com/sponsors/jonschlinkert"
3165
-
}
3166
-
},
3167
-
"node_modules/postcss": {
3168
-
"version": "8.5.1",
3169
-
"funding": [
3170
-
{
3171
-
"type": "opencollective",
3172
-
"url": "https://opencollective.com/postcss/"
3173
-
},
3174
-
{
3175
-
"type": "tidelift",
3176
-
"url": "https://tidelift.com/funding/github/npm/postcss"
3177
-
},
3178
-
{
3179
-
"type": "github",
3180
-
"url": "https://github.com/sponsors/ai"
3181
-
}
3182
-
],
3183
-
"license": "MIT",
3184
-
"dependencies": {
3185
-
"nanoid": "^3.3.8",
3186
-
"picocolors": "^1.1.1",
3187
-
"source-map-js": "^1.2.1"
3188
-
},
3189
-
"engines": {
3190
-
"node": "^10 || ^12 || >=14"
3191
-
}
3192
-
},
3193
-
"node_modules/prelude-ls": {
3194
-
"version": "1.2.1",
3195
-
"dev": true,
3196
-
"license": "MIT",
3197
-
"engines": {
3198
-
"node": ">= 0.8.0"
3199
-
}
3200
-
},
3201
-
"node_modules/prop-types": {
3202
-
"version": "15.8.1",
3203
-
"license": "MIT",
3204
-
"dependencies": {
3205
-
"loose-envify": "^1.4.0",
3206
-
"object-assign": "^4.1.1",
3207
-
"react-is": "^16.13.1"
3208
-
}
3209
-
},
3210
-
"node_modules/prop-types/node_modules/react-is": {
3211
-
"version": "16.13.1",
3212
-
"license": "MIT"
3213
-
},
3214
-
"node_modules/proxy-from-env": {
3215
-
"version": "1.1.0",
3216
-
"license": "MIT"
3217
-
},
3218
-
"node_modules/punycode": {
3219
-
"version": "2.3.1",
3220
-
"dev": true,
3221
-
"license": "MIT",
3222
-
"engines": {
3223
-
"node": ">=6"
3224
-
}
3225
-
},
3226
-
"node_modules/queue-microtask": {
3227
-
"version": "1.2.3",
3228
-
"dev": true,
3229
-
"funding": [
3230
-
{
3231
-
"type": "github",
3232
-
"url": "https://github.com/sponsors/feross"
3233
-
},
3234
-
{
3235
-
"type": "patreon",
3236
-
"url": "https://www.patreon.com/feross"
3237
-
},
3238
-
{
3239
-
"type": "consulting",
3240
-
"url": "https://feross.org/support"
3241
-
}
3242
-
],
3243
-
"license": "MIT"
3244
-
},
3245
-
"node_modules/react": {
3246
-
"version": "18.3.1",
3247
-
"license": "MIT",
3248
-
"dependencies": {
3249
-
"loose-envify": "^1.1.0"
3250
-
},
3251
-
"engines": {
3252
-
"node": ">=0.10.0"
3253
-
}
3254
-
},
3255
-
"node_modules/react-dom": {
3256
-
"version": "18.3.1",
3257
-
"license": "MIT",
3258
-
"dependencies": {
3259
-
"loose-envify": "^1.1.0",
3260
-
"scheduler": "^0.23.2"
3261
-
},
3262
-
"peerDependencies": {
3263
-
"react": "^18.3.1"
3264
-
}
3265
-
},
3266
-
"node_modules/react-hook-form": {
3267
-
"version": "7.54.2",
3268
-
"license": "MIT",
3269
-
"engines": {
3270
-
"node": ">=18.0.0"
3271
-
},
3272
-
"funding": {
3273
-
"type": "opencollective",
3274
-
"url": "https://opencollective.com/react-hook-form"
3275
-
},
3276
-
"peerDependencies": {
3277
-
"react": "^16.8.0 || ^17 || ^18 || ^19"
3278
-
}
3279
-
},
3280
-
"node_modules/react-is": {
3281
-
"version": "18.3.1",
3282
-
"license": "MIT"
3283
-
},
3284
-
"node_modules/react-number-format": {
3285
-
"version": "5.4.3",
3286
-
"license": "MIT",
3287
-
"peerDependencies": {
3288
-
"react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
3289
-
"react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3290
-
}
3291
-
},
3292
-
"node_modules/react-refresh": {
3293
-
"version": "0.14.2",
3294
-
"dev": true,
3295
-
"license": "MIT",
3296
-
"engines": {
3297
-
"node": ">=0.10.0"
3298
-
}
3299
-
},
3300
-
"node_modules/react-remove-scroll": {
3301
-
"version": "2.6.3",
3302
-
"license": "MIT",
3303
-
"dependencies": {
3304
-
"react-remove-scroll-bar": "^2.3.7",
3305
-
"react-style-singleton": "^2.2.3",
3306
-
"tslib": "^2.1.0",
3307
-
"use-callback-ref": "^1.3.3",
3308
-
"use-sidecar": "^1.1.3"
3309
-
},
3310
-
"engines": {
3311
-
"node": ">=10"
3312
-
},
3313
-
"peerDependencies": {
3314
-
"@types/react": "*",
3315
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
3316
-
},
3317
-
"peerDependenciesMeta": {
3318
-
"@types/react": {
3319
-
"optional": true
3320
-
}
3321
-
}
3322
-
},
3323
-
"node_modules/react-remove-scroll-bar": {
3324
-
"version": "2.3.8",
3325
-
"license": "MIT",
3326
-
"dependencies": {
3327
-
"react-style-singleton": "^2.2.2",
3328
-
"tslib": "^2.0.0"
3329
-
},
3330
-
"engines": {
3331
-
"node": ">=10"
3332
-
},
3333
-
"peerDependencies": {
3334
-
"@types/react": "*",
3335
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3336
-
},
3337
-
"peerDependenciesMeta": {
3338
-
"@types/react": {
3339
-
"optional": true
3340
-
}
3341
-
}
3342
-
},
3343
-
"node_modules/react-smooth": {
3344
-
"version": "4.0.4",
3345
-
"license": "MIT",
3346
-
"dependencies": {
3347
-
"fast-equals": "^5.0.1",
3348
-
"prop-types": "^15.8.1",
3349
-
"react-transition-group": "^4.4.5"
3350
-
},
3351
-
"peerDependencies": {
3352
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
3353
-
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3354
-
}
3355
-
},
3356
-
"node_modules/react-style-singleton": {
3357
-
"version": "2.2.3",
3358
-
"license": "MIT",
3359
-
"dependencies": {
3360
-
"get-nonce": "^1.0.0",
3361
-
"tslib": "^2.0.0"
3362
-
},
3363
-
"engines": {
3364
-
"node": ">=10"
3365
-
},
3366
-
"peerDependencies": {
3367
-
"@types/react": "*",
3368
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
3369
-
},
3370
-
"peerDependenciesMeta": {
3371
-
"@types/react": {
3372
-
"optional": true
3373
-
}
3374
-
}
3375
-
},
3376
-
"node_modules/react-textarea-autosize": {
3377
-
"version": "8.5.6",
3378
-
"license": "MIT",
3379
-
"dependencies": {
3380
-
"@babel/runtime": "^7.20.13",
3381
-
"use-composed-ref": "^1.3.0",
3382
-
"use-latest": "^1.2.1"
3383
-
},
3384
-
"engines": {
3385
-
"node": ">=10"
3386
-
},
3387
-
"peerDependencies": {
3388
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3389
-
}
3390
-
},
3391
-
"node_modules/react-transition-group": {
3392
-
"version": "4.4.5",
3393
-
"license": "BSD-3-Clause",
3394
-
"dependencies": {
3395
-
"@babel/runtime": "^7.5.5",
3396
-
"dom-helpers": "^5.0.1",
3397
-
"loose-envify": "^1.4.0",
3398
-
"prop-types": "^15.6.2"
3399
-
},
3400
-
"peerDependencies": {
3401
-
"react": ">=16.6.0",
3402
-
"react-dom": ">=16.6.0"
3403
-
}
3404
-
},
3405
-
"node_modules/recharts": {
3406
-
"version": "2.15.0",
3407
-
"license": "MIT",
3408
-
"dependencies": {
3409
-
"clsx": "^2.0.0",
3410
-
"eventemitter3": "^4.0.1",
3411
-
"lodash": "^4.17.21",
3412
-
"react-is": "^18.3.1",
3413
-
"react-smooth": "^4.0.0",
3414
-
"recharts-scale": "^0.4.4",
3415
-
"tiny-invariant": "^1.3.1",
3416
-
"victory-vendor": "^36.6.8"
3417
-
},
3418
-
"engines": {
3419
-
"node": ">=14"
3420
-
},
3421
-
"peerDependencies": {
3422
-
"react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
3423
-
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3424
-
}
3425
-
},
3426
-
"node_modules/recharts-scale": {
3427
-
"version": "0.4.5",
3428
-
"license": "MIT",
3429
-
"dependencies": {
3430
-
"decimal.js-light": "^2.4.1"
3431
-
}
3432
-
},
3433
-
"node_modules/regenerator-runtime": {
3434
-
"version": "0.14.1",
3435
-
"license": "MIT"
3436
-
},
3437
-
"node_modules/resolve": {
3438
-
"version": "1.22.10",
3439
-
"license": "MIT",
3440
-
"dependencies": {
3441
-
"is-core-module": "^2.16.0",
3442
-
"path-parse": "^1.0.7",
3443
-
"supports-preserve-symlinks-flag": "^1.0.0"
3444
-
},
3445
-
"bin": {
3446
-
"resolve": "bin/resolve"
3447
-
},
3448
-
"engines": {
3449
-
"node": ">= 0.4"
3450
-
},
3451
-
"funding": {
3452
-
"url": "https://github.com/sponsors/ljharb"
3453
-
}
3454
-
},
3455
-
"node_modules/resolve-from": {
3456
-
"version": "4.0.0",
3457
-
"license": "MIT",
3458
-
"engines": {
3459
-
"node": ">=4"
3460
-
}
3461
-
},
3462
-
"node_modules/reusify": {
3463
-
"version": "1.0.4",
3464
-
"dev": true,
3465
-
"license": "MIT",
3466
-
"engines": {
3467
-
"iojs": ">=1.0.0",
3468
-
"node": ">=0.10.0"
3469
-
}
3470
-
},
3471
-
"node_modules/rollup": {
3472
-
"version": "4.32.0",
3473
-
"license": "MIT",
3474
-
"dependencies": {
3475
-
"@types/estree": "1.0.6"
3476
-
},
3477
-
"bin": {
3478
-
"rollup": "dist/bin/rollup"
3479
-
},
3480
-
"engines": {
3481
-
"node": ">=18.0.0",
3482
-
"npm": ">=8.0.0"
3483
-
},
3484
-
"optionalDependencies": {
3485
-
"@rollup/rollup-android-arm-eabi": "4.32.0",
3486
-
"@rollup/rollup-android-arm64": "4.32.0",
3487
-
"@rollup/rollup-darwin-arm64": "4.32.0",
3488
-
"@rollup/rollup-darwin-x64": "4.32.0",
3489
-
"@rollup/rollup-freebsd-arm64": "4.32.0",
3490
-
"@rollup/rollup-freebsd-x64": "4.32.0",
3491
-
"@rollup/rollup-linux-arm-gnueabihf": "4.32.0",
3492
-
"@rollup/rollup-linux-arm-musleabihf": "4.32.0",
3493
-
"@rollup/rollup-linux-arm64-gnu": "4.32.0",
3494
-
"@rollup/rollup-linux-arm64-musl": "4.32.0",
3495
-
"@rollup/rollup-linux-loongarch64-gnu": "4.32.0",
3496
-
"@rollup/rollup-linux-powerpc64le-gnu": "4.32.0",
3497
-
"@rollup/rollup-linux-riscv64-gnu": "4.32.0",
3498
-
"@rollup/rollup-linux-s390x-gnu": "4.32.0",
3499
-
"@rollup/rollup-linux-x64-gnu": "4.32.0",
3500
-
"@rollup/rollup-linux-x64-musl": "4.32.0",
3501
-
"@rollup/rollup-win32-arm64-msvc": "4.32.0",
3502
-
"@rollup/rollup-win32-ia32-msvc": "4.32.0",
3503
-
"@rollup/rollup-win32-x64-msvc": "4.32.0",
3504
-
"fsevents": "~2.3.2"
3505
-
}
3506
-
},
3507
-
"node_modules/run-parallel": {
3508
-
"version": "1.2.0",
3509
-
"dev": true,
3510
-
"funding": [
3511
-
{
3512
-
"type": "github",
3513
-
"url": "https://github.com/sponsors/feross"
3514
-
},
3515
-
{
3516
-
"type": "patreon",
3517
-
"url": "https://www.patreon.com/feross"
3518
-
},
3519
-
{
3520
-
"type": "consulting",
3521
-
"url": "https://feross.org/support"
3522
-
}
3523
-
],
3524
-
"license": "MIT",
3525
-
"dependencies": {
3526
-
"queue-microtask": "^1.2.2"
3527
-
}
3528
-
},
3529
-
"node_modules/scheduler": {
3530
-
"version": "0.23.2",
3531
-
"license": "MIT",
3532
-
"dependencies": {
3533
-
"loose-envify": "^1.1.0"
3534
-
}
3535
-
},
3536
-
"node_modules/semver": {
3537
-
"version": "6.3.1",
3538
-
"dev": true,
3539
-
"license": "ISC",
3540
-
"bin": {
3541
-
"semver": "bin/semver.js"
3542
-
}
3543
-
},
3544
-
"node_modules/shebang-command": {
3545
-
"version": "2.0.0",
3546
-
"dev": true,
3547
-
"license": "MIT",
3548
-
"dependencies": {
3549
-
"shebang-regex": "^3.0.0"
3550
-
},
3551
-
"engines": {
3552
-
"node": ">=8"
3553
-
}
3554
-
},
3555
-
"node_modules/shebang-regex": {
3556
-
"version": "3.0.0",
3557
-
"dev": true,
3558
-
"license": "MIT",
3559
-
"engines": {
3560
-
"node": ">=8"
3561
-
}
3562
-
},
3563
-
"node_modules/source-map": {
3564
-
"version": "0.5.7",
3565
-
"license": "BSD-3-Clause",
3566
-
"engines": {
3567
-
"node": ">=0.10.0"
3568
-
}
3569
-
},
3570
-
"node_modules/source-map-js": {
3571
-
"version": "1.2.1",
3572
-
"license": "BSD-3-Clause",
3573
-
"engines": {
3574
-
"node": ">=0.10.0"
3575
-
}
3576
-
},
3577
-
"node_modules/strip-json-comments": {
3578
-
"version": "3.1.1",
3579
-
"dev": true,
3580
-
"license": "MIT",
3581
-
"engines": {
3582
-
"node": ">=8"
3583
-
},
3584
-
"funding": {
3585
-
"url": "https://github.com/sponsors/sindresorhus"
3586
-
}
3587
-
},
3588
-
"node_modules/stylis": {
3589
-
"version": "4.2.0",
3590
-
"license": "MIT"
3591
-
},
3592
-
"node_modules/supports-color": {
3593
-
"version": "7.2.0",
3594
-
"dev": true,
3595
-
"license": "MIT",
3596
-
"dependencies": {
3597
-
"has-flag": "^4.0.0"
3598
-
},
3599
-
"engines": {
3600
-
"node": ">=8"
3601
-
}
3602
-
},
3603
-
"node_modules/supports-preserve-symlinks-flag": {
3604
-
"version": "1.0.0",
3605
-
"license": "MIT",
3606
-
"engines": {
3607
-
"node": ">= 0.4"
3608
-
},
3609
-
"funding": {
3610
-
"url": "https://github.com/sponsors/ljharb"
3611
-
}
3612
-
},
3613
-
"node_modules/tabbable": {
3614
-
"version": "6.2.0",
3615
-
"license": "MIT"
3616
-
},
3617
-
"node_modules/tailwind-merge": {
3618
-
"version": "2.6.0",
3619
-
"license": "MIT",
3620
-
"funding": {
3621
-
"type": "github",
3622
-
"url": "https://github.com/sponsors/dcastil"
3623
-
}
3624
-
},
3625
-
"node_modules/tailwindcss": {
3626
-
"version": "4.0.0",
3627
-
"license": "MIT"
3628
-
},
3629
-
"node_modules/tailwindcss-animate": {
3630
-
"version": "1.0.7",
3631
-
"license": "MIT",
3632
-
"peerDependencies": {
3633
-
"tailwindcss": ">=3.0.0 || insiders"
3634
-
}
3635
-
},
3636
-
"node_modules/tapable": {
3637
-
"version": "2.2.1",
3638
-
"license": "MIT",
3639
-
"engines": {
3640
-
"node": ">=6"
3641
-
}
3642
-
},
3643
-
"node_modules/tiny-invariant": {
3644
-
"version": "1.3.3",
3645
-
"license": "MIT"
3646
-
},
3647
-
"node_modules/to-regex-range": {
3648
-
"version": "5.0.1",
3649
-
"dev": true,
3650
-
"license": "MIT",
3651
-
"dependencies": {
3652
-
"is-number": "^7.0.0"
3653
-
},
3654
-
"engines": {
3655
-
"node": ">=8.0"
3656
-
}
3657
-
},
3658
-
"node_modules/ts-api-utils": {
3659
-
"version": "2.0.0",
3660
-
"dev": true,
3661
-
"license": "MIT",
3662
-
"engines": {
3663
-
"node": ">=18.12"
3664
-
},
3665
-
"peerDependencies": {
3666
-
"typescript": ">=4.8.4"
3667
-
}
3668
-
},
3669
-
"node_modules/tslib": {
3670
-
"version": "2.8.1",
3671
-
"license": "0BSD"
3672
-
},
3673
-
"node_modules/type-check": {
3674
-
"version": "0.4.0",
3675
-
"dev": true,
3676
-
"license": "MIT",
3677
-
"dependencies": {
3678
-
"prelude-ls": "^1.2.1"
3679
-
},
3680
-
"engines": {
3681
-
"node": ">= 0.8.0"
3682
-
}
3683
-
},
3684
-
"node_modules/type-fest": {
3685
-
"version": "4.33.0",
3686
-
"license": "(MIT OR CC0-1.0)",
3687
-
"engines": {
3688
-
"node": ">=16"
3689
-
},
3690
-
"funding": {
3691
-
"url": "https://github.com/sponsors/sindresorhus"
3692
-
}
3693
-
},
3694
-
"node_modules/typescript": {
3695
-
"version": "5.6.3",
3696
-
"dev": true,
3697
-
"license": "Apache-2.0",
3698
-
"bin": {
3699
-
"tsc": "bin/tsc",
3700
-
"tsserver": "bin/tsserver"
3701
-
},
3702
-
"engines": {
3703
-
"node": ">=14.17"
3704
-
}
3705
-
},
3706
-
"node_modules/typescript-eslint": {
3707
-
"version": "8.21.0",
3708
-
"dev": true,
3709
-
"license": "MIT",
3710
-
"dependencies": {
3711
-
"@typescript-eslint/eslint-plugin": "8.21.0",
3712
-
"@typescript-eslint/parser": "8.21.0",
3713
-
"@typescript-eslint/utils": "8.21.0"
3714
-
},
3715
-
"engines": {
3716
-
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
3717
-
},
3718
-
"funding": {
3719
-
"type": "opencollective",
3720
-
"url": "https://opencollective.com/typescript-eslint"
3721
-
},
3722
-
"peerDependencies": {
3723
-
"eslint": "^8.57.0 || ^9.0.0",
3724
-
"typescript": ">=4.8.4 <5.8.0"
3725
-
}
3726
-
},
3727
-
"node_modules/undici-types": {
3728
-
"version": "6.20.0",
3729
-
"devOptional": true,
3730
-
"license": "MIT"
3731
-
},
3732
-
"node_modules/update-browserslist-db": {
3733
-
"version": "1.1.2",
3734
-
"dev": true,
3735
-
"funding": [
3736
-
{
3737
-
"type": "opencollective",
3738
-
"url": "https://opencollective.com/browserslist"
3739
-
},
3740
-
{
3741
-
"type": "tidelift",
3742
-
"url": "https://tidelift.com/funding/github/npm/browserslist"
3743
-
},
3744
-
{
3745
-
"type": "github",
3746
-
"url": "https://github.com/sponsors/ai"
3747
-
}
3748
-
],
3749
-
"license": "MIT",
3750
-
"dependencies": {
3751
-
"escalade": "^3.2.0",
3752
-
"picocolors": "^1.1.1"
3753
-
},
3754
-
"bin": {
3755
-
"update-browserslist-db": "cli.js"
3756
-
},
3757
-
"peerDependencies": {
3758
-
"browserslist": ">= 4.21.0"
3759
-
}
3760
-
},
3761
-
"node_modules/uri-js": {
3762
-
"version": "4.4.1",
3763
-
"dev": true,
3764
-
"license": "BSD-2-Clause",
3765
-
"dependencies": {
3766
-
"punycode": "^2.1.0"
3767
-
}
3768
-
},
3769
-
"node_modules/use-callback-ref": {
3770
-
"version": "1.3.3",
3771
-
"license": "MIT",
3772
-
"dependencies": {
3773
-
"tslib": "^2.0.0"
3774
-
},
3775
-
"engines": {
3776
-
"node": ">=10"
3777
-
},
3778
-
"peerDependencies": {
3779
-
"@types/react": "*",
3780
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
3781
-
},
3782
-
"peerDependenciesMeta": {
3783
-
"@types/react": {
3784
-
"optional": true
3785
-
}
3786
-
}
3787
-
},
3788
-
"node_modules/use-composed-ref": {
3789
-
"version": "1.4.0",
3790
-
"license": "MIT",
3791
-
"peerDependencies": {
3792
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3793
-
},
3794
-
"peerDependenciesMeta": {
3795
-
"@types/react": {
3796
-
"optional": true
3797
-
}
3798
-
}
3799
-
},
3800
-
"node_modules/use-isomorphic-layout-effect": {
3801
-
"version": "1.2.0",
3802
-
"license": "MIT",
3803
-
"peerDependencies": {
3804
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3805
-
},
3806
-
"peerDependenciesMeta": {
3807
-
"@types/react": {
3808
-
"optional": true
3809
-
}
3810
-
}
3811
-
},
3812
-
"node_modules/use-latest": {
3813
-
"version": "1.3.0",
3814
-
"license": "MIT",
3815
-
"dependencies": {
3816
-
"use-isomorphic-layout-effect": "^1.1.1"
3817
-
},
3818
-
"peerDependencies": {
3819
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
3820
-
},
3821
-
"peerDependenciesMeta": {
3822
-
"@types/react": {
3823
-
"optional": true
3824
-
}
3825
-
}
3826
-
},
3827
-
"node_modules/use-sidecar": {
3828
-
"version": "1.1.3",
3829
-
"license": "MIT",
3830
-
"dependencies": {
3831
-
"detect-node-es": "^1.1.0",
3832
-
"tslib": "^2.0.0"
3833
-
},
3834
-
"engines": {
3835
-
"node": ">=10"
3836
-
},
3837
-
"peerDependencies": {
3838
-
"@types/react": "*",
3839
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
3840
-
},
3841
-
"peerDependenciesMeta": {
3842
-
"@types/react": {
3843
-
"optional": true
3844
-
}
3845
-
}
3846
-
},
3847
-
"node_modules/victory-vendor": {
3848
-
"version": "36.9.2",
3849
-
"license": "MIT AND ISC",
3850
-
"dependencies": {
3851
-
"@types/d3-array": "^3.0.3",
3852
-
"@types/d3-ease": "^3.0.0",
3853
-
"@types/d3-interpolate": "^3.0.1",
3854
-
"@types/d3-scale": "^4.0.2",
3855
-
"@types/d3-shape": "^3.1.0",
3856
-
"@types/d3-time": "^3.0.0",
3857
-
"@types/d3-timer": "^3.0.0",
3858
-
"d3-array": "^3.1.6",
3859
-
"d3-ease": "^3.0.1",
3860
-
"d3-interpolate": "^3.0.1",
3861
-
"d3-scale": "^4.0.2",
3862
-
"d3-shape": "^3.1.0",
3863
-
"d3-time": "^3.0.0",
3864
-
"d3-timer": "^3.0.1"
3865
-
}
3866
-
},
3867
-
"node_modules/vite": {
3868
-
"version": "6.0.11",
3869
-
"license": "MIT",
3870
-
"dependencies": {
3871
-
"esbuild": "^0.24.2",
3872
-
"postcss": "^8.4.49",
3873
-
"rollup": "^4.23.0"
3874
-
},
3875
-
"bin": {
3876
-
"vite": "bin/vite.js"
3877
-
},
3878
-
"engines": {
3879
-
"node": "^18.0.0 || ^20.0.0 || >=22.0.0"
3880
-
},
3881
-
"funding": {
3882
-
"url": "https://github.com/vitejs/vite?sponsor=1"
3883
-
},
3884
-
"optionalDependencies": {
3885
-
"fsevents": "~2.3.3"
3886
-
},
3887
-
"peerDependencies": {
3888
-
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
3889
-
"jiti": ">=1.21.0",
3890
-
"less": "*",
3891
-
"lightningcss": "^1.21.0",
3892
-
"sass": "*",
3893
-
"sass-embedded": "*",
3894
-
"stylus": "*",
3895
-
"sugarss": "*",
3896
-
"terser": "^5.16.0",
3897
-
"tsx": "^4.8.1",
3898
-
"yaml": "^2.4.2"
3899
-
},
3900
-
"peerDependenciesMeta": {
3901
-
"@types/node": {
3902
-
"optional": true
3903
-
},
3904
-
"jiti": {
3905
-
"optional": true
3906
-
},
3907
-
"less": {
3908
-
"optional": true
3909
-
},
3910
-
"lightningcss": {
3911
-
"optional": true
3912
-
},
3913
-
"sass": {
3914
-
"optional": true
3915
-
},
3916
-
"sass-embedded": {
3917
-
"optional": true
3918
-
},
3919
-
"stylus": {
3920
-
"optional": true
3921
-
},
3922
-
"sugarss": {
3923
-
"optional": true
3924
-
},
3925
-
"terser": {
3926
-
"optional": true
3927
-
},
3928
-
"tsx": {
3929
-
"optional": true
3930
-
},
3931
-
"yaml": {
3932
-
"optional": true
3933
-
}
3934
-
}
3935
-
},
3936
-
"node_modules/which": {
3937
-
"version": "2.0.2",
3938
-
"dev": true,
3939
-
"license": "ISC",
3940
-
"dependencies": {
3941
-
"isexe": "^2.0.0"
3942
-
},
3943
-
"bin": {
3944
-
"node-which": "bin/node-which"
3945
-
},
3946
-
"engines": {
3947
-
"node": ">= 8"
3948
-
}
3949
-
},
3950
-
"node_modules/word-wrap": {
3951
-
"version": "1.2.5",
3952
-
"dev": true,
3953
-
"license": "MIT",
3954
-
"engines": {
3955
-
"node": ">=0.10.0"
3956
-
}
3957
-
},
3958
-
"node_modules/yallist": {
3959
-
"version": "3.1.1",
3960
-
"dev": true,
3961
-
"license": "ISC"
3962
-
},
3963
-
"node_modules/yaml": {
3964
-
"version": "2.7.0",
3965
-
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
3966
-
"integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
3967
-
"license": "ISC",
3968
-
"optional": true,
3969
-
"peer": true,
3970
-
"bin": {
3971
-
"yaml": "bin.mjs"
3972
-
},
3973
-
"engines": {
3974
-
"node": ">= 14"
3975
-
}
3976
-
},
3977
-
"node_modules/yocto-queue": {
3978
-
"version": "0.1.0",
3979
-
"dev": true,
3980
-
"license": "MIT",
3981
-
"engines": {
3982
-
"node": ">=10"
3983
-
},
3984
-
"funding": {
3985
-
"url": "https://github.com/sponsors/sindresorhus"
3986
-
}
3987
-
},
3988
-
"node_modules/zod": {
3989
-
"version": "3.24.1",
3990
-
"license": "MIT",
3991
-
"funding": {
3992
-
"url": "https://github.com/sponsors/colinhacks"
3993
-
}
3994
-
}
3995
-
}
3996
-
}
+40
-4
frontend/src/api/client.ts
+40
-4
frontend/src/api/client.ts
···
15
15
return config;
16
16
});
17
17
18
+
api.interceptors.response.use(
19
+
(response) => response,
20
+
(error) => {
21
+
if (error.response?.status === 401) {
22
+
localStorage.removeItem('token');
23
+
localStorage.removeItem('user');
24
+
25
+
window.dispatchEvent(new Event('unauthorized'));
26
+
}
27
+
return Promise.reject(error);
28
+
}
29
+
);
30
+
31
+
18
32
// Auth endpoints
19
33
export const login = async (email: string, password: string) => {
20
34
const response = await api.post<AuthResponse>('/auth/login', {
···
44
58
return response.data;
45
59
};
46
60
61
+
export const editLink = async (id: number, data: Partial<CreateLinkRequest>) => {
62
+
const response = await api.patch<Link>(`/links/${id}`, data);
63
+
return response.data;
64
+
};
65
+
66
+
47
67
export const deleteLink = async (id: number) => {
48
68
await api.delete(`/links/${id}`);
49
69
};
50
70
51
71
export const getLinkClickStats = async (id: number) => {
52
-
const response = await api.get<ClickStats[]>(`/links/${id}/clicks`);
53
-
return response.data;
72
+
try {
73
+
const response = await api.get<ClickStats[]>(`/links/${id}/clicks`);
74
+
return response.data;
75
+
} catch (error) {
76
+
console.error('Error fetching click stats:', error);
77
+
throw error;
78
+
}
54
79
};
55
80
56
81
export const getLinkSourceStats = async (id: number) => {
57
-
const response = await api.get<SourceStats[]>(`/links/${id}/sources`);
58
-
return response.data;
82
+
try {
83
+
const response = await api.get<SourceStats[]>(`/links/${id}/sources`);
84
+
return response.data;
85
+
} catch (error) {
86
+
console.error('Error fetching source stats:', error);
87
+
throw error;
88
+
}
89
+
};
90
+
91
+
92
+
export const checkFirstUser = async () => {
93
+
const response = await api.get<{ isFirstUser: boolean }>('/auth/check-first-user');
94
+
return response.data.isFirstUser;
59
95
};
60
96
61
97
export { api };
+82
-62
frontend/src/components/AuthForms.tsx
+82
-62
frontend/src/components/AuthForms.tsx
···
1
-
import { useState } from 'react'
1
+
import { useState, useEffect } from 'react'
2
2
import { useForm } from 'react-hook-form'
3
3
import { z } from 'zod'
4
4
import { zodResolver } from '@hookform/resolvers/zod'
···
6
6
import { Button } from '@/components/ui/button'
7
7
import { Input } from '@/components/ui/input'
8
8
import { Card } from '@/components/ui/card'
9
-
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
10
9
import {
11
10
Form,
12
11
FormControl,
···
16
15
FormMessage,
17
16
} from '@/components/ui/form'
18
17
import { useToast } from '@/hooks/use-toast'
18
+
import { checkFirstUser } from '../api/client'
19
19
20
20
const formSchema = z.object({
21
21
email: z.string().email('Invalid email address'),
22
22
password: z.string().min(6, 'Password must be at least 6 characters long'),
23
-
adminToken: z.string(),
23
+
adminToken: z.string().optional(),
24
24
})
25
25
26
26
type FormValues = z.infer<typeof formSchema>
27
27
28
28
export function AuthForms() {
29
-
const [activeTab, setActiveTab] = useState<'login' | 'register'>('login')
29
+
const [isFirstUser, setIsFirstUser] = useState<boolean | null>(null)
30
30
const { login, register } = useAuth()
31
31
const { toast } = useToast()
32
32
···
39
39
},
40
40
})
41
41
42
+
useEffect(() => {
43
+
const init = async () => {
44
+
try {
45
+
const isFirst = await checkFirstUser()
46
+
setIsFirstUser(isFirst)
47
+
} catch (err) {
48
+
console.error('Error checking first user:', err)
49
+
setIsFirstUser(false)
50
+
}
51
+
}
52
+
53
+
init()
54
+
}, [])
55
+
42
56
const onSubmit = async (values: FormValues) => {
43
57
try {
44
-
if (activeTab === 'login') {
45
-
await login(values.email, values.password)
58
+
if (isFirstUser) {
59
+
await register(values.email, values.password, values.adminToken || '')
46
60
} else {
47
-
await register(values.email, values.password, values.adminToken)
61
+
await login(values.email, values.password)
48
62
}
49
63
form.reset()
50
64
} catch (err: any) {
···
56
70
}
57
71
}
58
72
73
+
if (isFirstUser === null) {
74
+
return <div>Loading...</div>
75
+
}
76
+
59
77
return (
60
78
<Card className="w-full max-w-md mx-auto p-6">
61
-
<Tabs value={activeTab} onValueChange={(value: string) => setActiveTab(value as 'login' | 'register')}>
62
-
<TabsList className="grid w-full grid-cols-2">
63
-
<TabsTrigger value="login">Login</TabsTrigger>
64
-
<TabsTrigger value="register">Register</TabsTrigger>
65
-
</TabsList>
79
+
<div className="mb-6 text-center">
80
+
<h2 className="text-2xl font-bold">
81
+
{isFirstUser ? 'Create Admin Account' : 'Login'}
82
+
</h2>
83
+
<p className="text-sm text-muted-foreground mt-1">
84
+
{isFirstUser
85
+
? 'Set up your admin account to get started'
86
+
: 'Welcome back! Please login to your account'}
87
+
</p>
88
+
</div>
66
89
67
-
<TabsContent value={activeTab}>
68
-
<Form {...form}>
69
-
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
70
-
<FormField
71
-
control={form.control}
72
-
name="email"
73
-
render={({ field }) => (
74
-
<FormItem>
75
-
<FormLabel>Email</FormLabel>
76
-
<FormControl>
77
-
<Input type="email" {...field} />
78
-
</FormControl>
79
-
<FormMessage />
80
-
</FormItem>
81
-
)}
82
-
/>
90
+
<Form {...form}>
91
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
92
+
<FormField
93
+
control={form.control}
94
+
name="email"
95
+
render={({ field }) => (
96
+
<FormItem>
97
+
<FormLabel>Email</FormLabel>
98
+
<FormControl>
99
+
<Input type="email" {...field} />
100
+
</FormControl>
101
+
<FormMessage />
102
+
</FormItem>
103
+
)}
104
+
/>
83
105
84
-
<FormField
85
-
control={form.control}
86
-
name="password"
87
-
render={({ field }) => (
88
-
<FormItem>
89
-
<FormLabel>Password</FormLabel>
90
-
<FormControl>
91
-
<Input type="password" {...field} />
92
-
</FormControl>
93
-
<FormMessage />
94
-
</FormItem>
95
-
)}
96
-
/>
106
+
<FormField
107
+
control={form.control}
108
+
name="password"
109
+
render={({ field }) => (
110
+
<FormItem>
111
+
<FormLabel>Password</FormLabel>
112
+
<FormControl>
113
+
<Input type="password" {...field} />
114
+
</FormControl>
115
+
<FormMessage />
116
+
</FormItem>
117
+
)}
118
+
/>
97
119
98
-
{activeTab === 'register' && (
99
-
<FormField
100
-
control={form.control}
101
-
name="adminToken"
102
-
render={({ field }) => (
103
-
<FormItem>
104
-
<FormLabel>Admin Setup Token</FormLabel>
105
-
<FormControl>
106
-
<Input type="text" {...field} />
107
-
</FormControl>
108
-
<FormMessage />
109
-
</FormItem>
110
-
)}
111
-
/>
120
+
{isFirstUser && (
121
+
<FormField
122
+
control={form.control}
123
+
name="adminToken"
124
+
render={({ field }) => (
125
+
<FormItem>
126
+
<FormLabel>Admin Setup Token</FormLabel>
127
+
<FormControl>
128
+
<Input type="text" {...field} />
129
+
</FormControl>
130
+
<FormMessage />
131
+
</FormItem>
112
132
)}
133
+
/>
134
+
)}
113
135
114
-
<Button type="submit" className="w-full">
115
-
{activeTab === 'login' ? 'Sign in' : 'Create account'}
116
-
</Button>
117
-
</form>
118
-
</Form>
119
-
</TabsContent>
120
-
</Tabs>
136
+
<Button type="submit" className="w-full">
137
+
{isFirstUser ? 'Create Account' : 'Sign in'}
138
+
</Button>
139
+
</form>
140
+
</Form>
121
141
</Card>
122
142
)
123
143
}
+139
frontend/src/components/EditModal.tsx
+139
frontend/src/components/EditModal.tsx
···
1
+
// src/components/EditModal.tsx
2
+
import { useState } from 'react';
3
+
import { useForm } from 'react-hook-form';
4
+
import { zodResolver } from '@hookform/resolvers/zod';
5
+
import * as z from 'zod';
6
+
import { Link } from '../types/api';
7
+
import { editLink } from '../api/client';
8
+
import { useToast } from '@/hooks/use-toast';
9
+
import {
10
+
Dialog,
11
+
DialogContent,
12
+
DialogHeader,
13
+
DialogTitle,
14
+
DialogFooter,
15
+
} from '@/components/ui/dialog';
16
+
import { Button } from '@/components/ui/button';
17
+
import { Input } from '@/components/ui/input';
18
+
import {
19
+
Form,
20
+
FormControl,
21
+
FormField,
22
+
FormItem,
23
+
FormLabel,
24
+
FormMessage,
25
+
} from '@/components/ui/form';
26
+
27
+
const formSchema = z.object({
28
+
url: z
29
+
.string()
30
+
.min(1, 'URL is required')
31
+
.url('Must be a valid URL')
32
+
.refine((val) => val.startsWith('http://') || val.startsWith('https://'), {
33
+
message: 'URL must start with http:// or https://',
34
+
}),
35
+
custom_code: z
36
+
.string()
37
+
.regex(/^[a-zA-Z0-9_-]{1,32}$/, {
38
+
message:
39
+
'Custom code must be 1-32 characters and contain only letters, numbers, underscores, and hyphens',
40
+
})
41
+
.optional(),
42
+
});
43
+
44
+
interface EditModalProps {
45
+
isOpen: boolean;
46
+
onClose: () => void;
47
+
link: Link;
48
+
onSuccess: () => void;
49
+
}
50
+
51
+
export function EditModal({ isOpen, onClose, link, onSuccess }: EditModalProps) {
52
+
const [loading, setLoading] = useState(false);
53
+
const { toast } = useToast();
54
+
55
+
const form = useForm<z.infer<typeof formSchema>>({
56
+
resolver: zodResolver(formSchema),
57
+
defaultValues: {
58
+
url: link.original_url,
59
+
custom_code: link.short_code,
60
+
},
61
+
});
62
+
63
+
const onSubmit = async (values: z.infer<typeof formSchema>) => {
64
+
try {
65
+
setLoading(true);
66
+
await editLink(link.id, values);
67
+
toast({
68
+
description: 'Link updated successfully',
69
+
});
70
+
onSuccess();
71
+
onClose();
72
+
} catch (err: unknown) {
73
+
const error = err as { response?: { data?: { error?: string } } };
74
+
toast({
75
+
variant: 'destructive',
76
+
title: 'Error',
77
+
description: error.response?.data?.error || 'Failed to update link',
78
+
});
79
+
} finally {
80
+
setLoading(false);
81
+
}
82
+
};
83
+
84
+
return (
85
+
<Dialog open={isOpen} onOpenChange={onClose}>
86
+
<DialogContent>
87
+
<DialogHeader>
88
+
<DialogTitle>Edit Link</DialogTitle>
89
+
</DialogHeader>
90
+
91
+
<Form {...form}>
92
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
93
+
<FormField
94
+
control={form.control}
95
+
name="url"
96
+
render={({ field }) => (
97
+
<FormItem>
98
+
<FormLabel>Destination URL</FormLabel>
99
+
<FormControl>
100
+
<Input placeholder="https://example.com" {...field} />
101
+
</FormControl>
102
+
<FormMessage />
103
+
</FormItem>
104
+
)}
105
+
/>
106
+
107
+
<FormField
108
+
control={form.control}
109
+
name="custom_code"
110
+
render={({ field }) => (
111
+
<FormItem>
112
+
<FormLabel>Short Code</FormLabel>
113
+
<FormControl>
114
+
<Input placeholder="custom-code" {...field} />
115
+
</FormControl>
116
+
<FormMessage />
117
+
</FormItem>
118
+
)}
119
+
/>
120
+
121
+
<DialogFooter>
122
+
<Button
123
+
type="button"
124
+
variant="outline"
125
+
onClick={onClose}
126
+
disabled={loading}
127
+
>
128
+
Cancel
129
+
</Button>
130
+
<Button type="submit" disabled={loading}>
131
+
{loading ? 'Saving...' : 'Save Changes'}
132
+
</Button>
133
+
</DialogFooter>
134
+
</form>
135
+
</Form>
136
+
</DialogContent>
137
+
</Dialog>
138
+
);
139
+
}
+45
-14
frontend/src/components/LinkList.tsx
+45
-14
frontend/src/components/LinkList.tsx
···
1
-
import { useEffect, useState } from 'react'
1
+
import { useCallback, useEffect, useState } from 'react'
2
2
import { Link } from '../types/api'
3
3
import { getAllLinks, deleteLink } from '../api/client'
4
4
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
···
12
12
} from "@/components/ui/table"
13
13
import { Button } from "@/components/ui/button"
14
14
import { useToast } from "@/hooks/use-toast"
15
-
import { Copy, Trash2, BarChart2 } from "lucide-react"
15
+
import { Copy, Trash2, BarChart2, Pencil } from "lucide-react"
16
16
import {
17
17
Dialog,
18
18
DialogContent,
···
23
23
} from "@/components/ui/dialog"
24
24
25
25
import { StatisticsModal } from "./StatisticsModal"
26
+
import { EditModal } from './EditModal'
26
27
27
28
interface LinkListProps {
28
29
refresh?: number;
···
39
40
isOpen: false,
40
41
linkId: null,
41
42
});
43
+
const [editModal, setEditModal] = useState<{ isOpen: boolean; link: Link | null }>({
44
+
isOpen: false,
45
+
link: null,
46
+
});
42
47
const { toast } = useToast()
43
48
44
-
const fetchLinks = async () => {
49
+
const fetchLinks = useCallback(async () => {
45
50
try {
46
51
setLoading(true)
47
52
const data = await getAllLinks()
48
53
setLinks(data)
49
-
} catch (err) {
54
+
} catch (err: unknown) {
55
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred';
50
56
toast({
51
57
title: "Error",
52
-
description: "Failed to load links",
58
+
description: `Failed to load links: ${errorMessage}`,
53
59
variant: "destructive",
54
60
})
55
61
} finally {
56
62
setLoading(false)
57
63
}
58
-
}
64
+
}, [toast, setLinks, setLoading])
59
65
60
66
useEffect(() => {
61
67
fetchLinks()
62
-
}, [refresh]) // Re-fetch when refresh counter changes
68
+
}, [fetchLinks, refresh]) // Re-fetch when refresh counter changes
63
69
64
70
const handleDelete = async () => {
65
71
if (!deleteModal.linkId) return
···
71
77
toast({
72
78
description: "Link deleted successfully",
73
79
})
74
-
} catch (err) {
80
+
} catch (err: unknown) {
81
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error occurred';
75
82
toast({
76
83
title: "Error",
77
-
description: "Failed to delete link",
84
+
description: `Failed to delete link: ${errorMessage}`,
78
85
variant: "destructive",
79
86
})
80
87
}
···
82
89
83
90
const handleCopy = (shortCode: string) => {
84
91
// Use import.meta.env.VITE_BASE_URL or fall back to window.location.origin
85
-
const baseUrl = import.meta.env.VITE_API_URL || window.location.origin
92
+
const baseUrl = window.location.origin
86
93
navigator.clipboard.writeText(`${baseUrl}/${shortCode}`)
87
94
toast({
88
-
description: "Link copied to clipboard",
95
+
description: (
96
+
<>
97
+
Link copied to clipboard
98
+
<br />
99
+
You can add ?source=TextHere to the end of the link to track the source of clicks
100
+
</>
101
+
),
89
102
})
90
103
}
91
104
···
121
134
</CardHeader>
122
135
<CardContent>
123
136
<div className="rounded-md border">
137
+
124
138
<Table>
125
139
<TableHeader>
126
140
<TableRow>
···
128
142
<TableHead className="hidden md:table-cell">Original URL</TableHead>
129
143
<TableHead>Clicks</TableHead>
130
144
<TableHead className="hidden md:table-cell">Created</TableHead>
131
-
<TableHead>Actions</TableHead>
145
+
<TableHead className="w-[1%] whitespace-nowrap pr-4">Actions</TableHead>
132
146
</TableRow>
133
147
</TableHeader>
134
148
<TableBody>
···
142
156
<TableCell className="hidden md:table-cell">
143
157
{new Date(link.created_at).toLocaleDateString()}
144
158
</TableCell>
145
-
<TableCell>
146
-
<div className="flex gap-2">
159
+
<TableCell className="p-2 pr-4">
160
+
<div className="flex items-center gap-1">
147
161
<Button
148
162
variant="ghost"
149
163
size="icon"
···
165
179
<Button
166
180
variant="ghost"
167
181
size="icon"
182
+
className="h-8 w-8"
183
+
onClick={() => setEditModal({ isOpen: true, link })}
184
+
>
185
+
<Pencil className="h-4 w-4" />
186
+
<span className="sr-only">Edit Link</span>
187
+
</Button>
188
+
<Button
189
+
variant="ghost"
190
+
size="icon"
168
191
className="h-8 w-8 text-destructive"
169
192
onClick={() => setDeleteModal({ isOpen: true, linkId: link.id })}
170
193
>
···
185
208
onClose={() => setStatsModal({ isOpen: false, linkId: null })}
186
209
linkId={statsModal.linkId!}
187
210
/>
211
+
{editModal.link && (
212
+
<EditModal
213
+
isOpen={editModal.isOpen}
214
+
onClose={() => setEditModal({ isOpen: false, link: null })}
215
+
link={editModal.link}
216
+
onSuccess={fetchLinks}
217
+
/>
218
+
)}
188
219
</>
189
220
)
190
221
}
+160
-98
frontend/src/components/StatisticsModal.tsx
+160
-98
frontend/src/components/StatisticsModal.tsx
···
1
1
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
2
2
import {
3
-
LineChart,
4
-
Line,
5
-
XAxis,
6
-
YAxis,
7
-
CartesianGrid,
8
-
Tooltip,
9
-
ResponsiveContainer,
3
+
LineChart,
4
+
Line,
5
+
XAxis,
6
+
YAxis,
7
+
CartesianGrid,
8
+
Tooltip,
9
+
ResponsiveContainer,
10
10
} from "recharts";
11
11
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
12
-
import { useState, useEffect } from "react";
12
+
import { toast } from "@/hooks/use-toast";
13
+
import { useState, useEffect, useMemo } from "react";
13
14
14
-
import { getLinkClickStats, getLinkSourceStats } from '../api/client';
15
-
import { ClickStats, SourceStats } from '../types/api';
15
+
import { getLinkClickStats, getLinkSourceStats } from "../api/client";
16
+
import { ClickStats, SourceStats } from "../types/api";
16
17
17
18
interface StatisticsModalProps {
18
-
isOpen: boolean;
19
-
onClose: () => void;
20
-
linkId: number;
19
+
isOpen: boolean;
20
+
onClose: () => void;
21
+
linkId: number;
21
22
}
22
23
24
+
interface EnhancedClickStats extends ClickStats {
25
+
sources?: { source: string; count: number }[];
26
+
}
27
+
28
+
const CustomTooltip = ({
29
+
active,
30
+
payload,
31
+
label,
32
+
}: {
33
+
active?: boolean;
34
+
payload?: { value: number; payload: EnhancedClickStats }[];
35
+
label?: string;
36
+
}) => {
37
+
if (active && payload && payload.length > 0) {
38
+
const data = payload[0].payload;
39
+
return (
40
+
<div className="bg-background text-foreground p-4 rounded-lg shadow-lg border">
41
+
<p className="font-medium">{label}</p>
42
+
<p className="text-sm">Clicks: {data.clicks}</p>
43
+
{data.sources && data.sources.length > 0 && (
44
+
<div className="mt-2">
45
+
<p className="font-medium text-sm">Sources:</p>
46
+
<ul className="text-sm">
47
+
{data.sources.map((source: { source: string; count: number }) => (
48
+
<li key={source.source}>
49
+
{source.source}: {source.count}
50
+
</li>
51
+
))}
52
+
</ul>
53
+
</div>
54
+
)}
55
+
</div>
56
+
);
57
+
}
58
+
return null;
59
+
};
60
+
23
61
export function StatisticsModal({ isOpen, onClose, linkId }: StatisticsModalProps) {
24
-
const [clicksOverTime, setClicksOverTime] = useState<ClickStats[]>([]);
25
-
const [sourcesData, setSourcesData] = useState<SourceStats[]>([]);
26
-
const [loading, setLoading] = useState(true);
62
+
const [clicksOverTime, setClicksOverTime] = useState<EnhancedClickStats[]>([]);
63
+
const [sourcesData, setSourcesData] = useState<SourceStats[]>([]);
64
+
const [loading, setLoading] = useState(true);
27
65
28
-
useEffect(() => {
29
-
if (isOpen && linkId) {
30
-
const fetchData = async () => {
31
-
try {
32
-
setLoading(true);
33
-
const [clicksData, sourcesData] = await Promise.all([
34
-
getLinkClickStats(linkId),
35
-
getLinkSourceStats(linkId),
36
-
]);
37
-
setClicksOverTime(clicksData);
38
-
setSourcesData(sourcesData);
39
-
} catch (error) {
40
-
console.error("Failed to fetch statistics:", error);
41
-
} finally {
42
-
setLoading(false);
43
-
}
44
-
};
66
+
useEffect(() => {
67
+
if (isOpen && linkId) {
68
+
const fetchData = async () => {
69
+
try {
70
+
setLoading(true);
71
+
const [clicksData, sourcesData] = await Promise.all([
72
+
getLinkClickStats(linkId),
73
+
getLinkSourceStats(linkId),
74
+
]);
45
75
46
-
fetchData();
47
-
}
48
-
}, [isOpen, linkId]);
76
+
// Enhance clicks data with source information
77
+
const enhancedClicksData = clicksData.map((clickData) => ({
78
+
...clickData,
79
+
sources: sourcesData.filter((source) => source.date === clickData.date),
80
+
}));
49
81
50
-
return (
51
-
<Dialog open={isOpen} onOpenChange={onClose}>
52
-
<DialogContent className="max-w-3xl">
53
-
<DialogHeader>
54
-
<DialogTitle>Link Statistics</DialogTitle>
55
-
</DialogHeader>
82
+
setClicksOverTime(enhancedClicksData);
83
+
setSourcesData(sourcesData);
84
+
} catch (error: unknown) {
85
+
console.error("Failed to fetch statistics:", error);
86
+
toast({
87
+
variant: "destructive",
88
+
title: "Error",
89
+
description: error instanceof Error ? error.message : "Failed to load statistics",
90
+
});
91
+
} finally {
92
+
setLoading(false);
93
+
}
94
+
};
56
95
57
-
{loading ? (
58
-
<div className="flex items-center justify-center h-64">Loading...</div>
59
-
) : (
60
-
<div className="grid gap-4">
61
-
<Card>
62
-
<CardHeader>
63
-
<CardTitle>Clicks Over Time</CardTitle>
64
-
</CardHeader>
65
-
<CardContent>
66
-
<div className="h-[300px]">
67
-
<ResponsiveContainer width="100%" height="100%">
68
-
<LineChart data={clicksOverTime}>
69
-
<CartesianGrid strokeDasharray="3 3" />
70
-
<XAxis dataKey="date" />
71
-
<YAxis />
72
-
<Tooltip />
73
-
<Line
74
-
type="monotone"
75
-
dataKey="clicks"
76
-
stroke="#8884d8"
77
-
strokeWidth={2}
78
-
/>
79
-
</LineChart>
80
-
</ResponsiveContainer>
81
-
</div>
82
-
</CardContent>
83
-
</Card>
96
+
fetchData();
97
+
}
98
+
}, [isOpen, linkId]);
84
99
85
-
<Card>
86
-
<CardHeader>
87
-
<CardTitle>Top Sources</CardTitle>
88
-
</CardHeader>
89
-
<CardContent>
90
-
<ul className="space-y-2">
91
-
{sourcesData.map((source, index) => (
92
-
<li
93
-
key={source.source}
94
-
className="flex items-center justify-between py-2 border-b last:border-0"
95
-
>
96
-
<span className="text-sm">
97
-
<span className="font-medium text-muted-foreground mr-2">
98
-
{index + 1}.
99
-
</span>
100
-
{source.source}
101
-
</span>
102
-
<span className="text-sm font-medium">
103
-
{source.count} clicks
104
-
</span>
105
-
</li>
106
-
))}
107
-
</ul>
108
-
</CardContent>
109
-
</Card>
110
-
</div>
111
-
)}
112
-
</DialogContent>
113
-
</Dialog>
100
+
const aggregatedSources = useMemo(() => {
101
+
const sourceMap = sourcesData.reduce<Record<string, number>>(
102
+
(acc, { source, count }) => ({
103
+
...acc,
104
+
[source]: (acc[source] || 0) + count
105
+
}),
106
+
{}
114
107
);
108
+
109
+
return Object.entries(sourceMap)
110
+
.map(([source, count]) => ({ source, count }))
111
+
.sort((a, b) => b.count - a.count);
112
+
}, [sourcesData]);
113
+
114
+
return (
115
+
<Dialog open={isOpen} onOpenChange={onClose}>
116
+
<DialogContent className="max-w-3xl">
117
+
<DialogHeader>
118
+
<DialogTitle>Link Statistics</DialogTitle>
119
+
</DialogHeader>
120
+
121
+
{loading ? (
122
+
<div className="flex items-center justify-center h-64">Loading...</div>
123
+
) : (
124
+
<div className="grid gap-4">
125
+
<Card>
126
+
<CardHeader>
127
+
<CardTitle>Clicks Over Time</CardTitle>
128
+
</CardHeader>
129
+
<CardContent>
130
+
<div className="h-[300px]">
131
+
<ResponsiveContainer width="100%" height="100%">
132
+
<LineChart data={clicksOverTime}>
133
+
<CartesianGrid strokeDasharray="3 3" />
134
+
<XAxis dataKey="date" />
135
+
<YAxis />
136
+
<Tooltip content={<CustomTooltip />} />
137
+
<Line
138
+
type="monotone"
139
+
dataKey="clicks"
140
+
stroke="#8884d8"
141
+
strokeWidth={2}
142
+
/>
143
+
</LineChart>
144
+
</ResponsiveContainer>
145
+
</div>
146
+
</CardContent>
147
+
</Card>
148
+
149
+
<Card>
150
+
<CardHeader>
151
+
<CardTitle>Top Sources</CardTitle>
152
+
</CardHeader>
153
+
<CardContent>
154
+
<ul className="space-y-2">
155
+
{aggregatedSources.map((source, index) => (
156
+
<li
157
+
key={source.source}
158
+
className="flex items-center justify-between py-2 border-b last:border-0"
159
+
>
160
+
<span className="text-sm">
161
+
<span className="font-medium text-muted-foreground mr-2">
162
+
{index + 1}.
163
+
</span>
164
+
{source.source}
165
+
</span>
166
+
<span className="text-sm font-medium">{source.count} clicks</span>
167
+
</li>
168
+
))}
169
+
</ul>
170
+
</CardContent>
171
+
</Card>
172
+
</div>
173
+
)}
174
+
</DialogContent>
175
+
</Dialog>
176
+
);
115
177
}
+10
frontend/src/context/AuthContext.tsx
+10
frontend/src/context/AuthContext.tsx
···
23
23
setUser(userData);
24
24
}
25
25
setIsLoading(false);
26
+
27
+
const handleUnauthorized = () => {
28
+
setUser(null);
29
+
};
30
+
31
+
window.addEventListener('unauthorized', handleUnauthorized);
32
+
33
+
return () => {
34
+
window.removeEventListener('unauthorized', handleUnauthorized);
35
+
};
26
36
}, []);
27
37
28
38
const login = async (email: string, password: string) => {
+1
frontend/src/types/api.ts
+1
frontend/src/types/api.ts
+28
-15
frontend/vite.config.ts
+28
-15
frontend/vite.config.ts
···
3
3
import tailwindcss from '@tailwindcss/vite'
4
4
import path from "path"
5
5
6
-
export default defineConfig(() => ({
7
-
plugins: [react(), tailwindcss()],
8
-
server: {
9
-
proxy: {
10
-
'/api': {
11
-
target: process.env.VITE_API_URL || 'http://localhost:8080',
12
-
changeOrigin: true,
6
+
export default defineConfig(({ command }) => {
7
+
if (command === 'serve') { //command == 'dev'
8
+
return {
9
+
server: {
10
+
proxy: {
11
+
'/api': {
12
+
target: process.env.VITE_API_URL || 'http://localhost:8080',
13
+
changeOrigin: true,
14
+
},
15
+
},
16
+
},
17
+
plugins: [react(), tailwindcss()],
18
+
resolve: {
19
+
alias: {
20
+
"@": path.resolve(__dirname, "./src"),
21
+
},
22
+
},
23
+
}
24
+
} else { //command === 'build'
25
+
return {
26
+
plugins: [react(), tailwindcss()],
27
+
resolve: {
28
+
alias: {
29
+
"@": path.resolve(__dirname, "./src"),
30
+
},
13
31
},
14
-
},
15
-
},
16
-
resolve: {
17
-
alias: {
18
-
"@": path.resolve(__dirname, "./src"),
19
-
},
20
-
},
21
-
}))
32
+
}
33
+
}
34
+
})
+3
migrations/20250219000000_extend_short_code.sql
+3
migrations/20250219000000_extend_short_code.sql
+42
migrations/sqlite/20250125000000_init.sql
+42
migrations/sqlite/20250125000000_init.sql
···
1
+
-- Enable foreign key support
2
+
PRAGMA foreign_keys = ON;
3
+
4
+
-- Add Migration Version
5
+
CREATE TABLE IF NOT EXISTS _sqlx_migrations (
6
+
version INTEGER PRIMARY KEY,
7
+
description TEXT NOT NULL,
8
+
installed_on TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
9
+
);
10
+
11
+
-- Create users table
12
+
CREATE TABLE users (
13
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
14
+
email VARCHAR(255) NOT NULL UNIQUE,
15
+
password_hash TEXT NOT NULL
16
+
);
17
+
18
+
-- Create links table
19
+
CREATE TABLE links (
20
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
21
+
original_url TEXT NOT NULL,
22
+
short_code VARCHAR(8) NOT NULL UNIQUE,
23
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
24
+
clicks INTEGER NOT NULL DEFAULT 0,
25
+
user_id INTEGER,
26
+
FOREIGN KEY (user_id) REFERENCES users(id)
27
+
);
28
+
29
+
-- Create clicks table
30
+
CREATE TABLE clicks (
31
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
32
+
link_id INTEGER,
33
+
source TEXT,
34
+
query_source TEXT,
35
+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
36
+
FOREIGN KEY (link_id) REFERENCES links(id)
37
+
);
38
+
39
+
-- Create indexes
40
+
CREATE INDEX idx_short_code ON links(short_code);
41
+
CREATE INDEX idx_user_id ON links(user_id);
42
+
CREATE INDEX idx_link_id ON clicks(link_id);
+8
-7
src/auth.rs
+8
-7
src/auth.rs
···
1
+
use crate::{error::AppError, models::Claims};
1
2
use actix_web::{dev::Payload, FromRequest, HttpRequest};
2
3
use jsonwebtoken::{decode, DecodingKey, Validation};
3
4
use std::future::{ready, Ready};
4
-
use crate::{error::AppError, models::Claims};
5
5
6
6
pub struct AuthenticatedUser {
7
7
pub user_id: i32,
···
12
12
type Future = Ready<Result<Self, Self::Error>>;
13
13
14
14
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
15
-
let auth_header = req.headers()
15
+
let auth_header = req
16
+
.headers()
16
17
.get("Authorization")
17
18
.and_then(|h| h.to_str().ok());
18
19
19
20
if let Some(auth_header) = auth_header {
20
21
if auth_header.starts_with("Bearer ") {
21
22
let token = &auth_header[7..];
22
-
let secret = std::env::var("JWT_SECRET").unwrap_or_else(|_| "default_secret".to_string());
23
-
23
+
let secret =
24
+
std::env::var("JWT_SECRET").unwrap_or_else(|_| "default_secret".to_string());
24
25
match decode::<Claims>(
25
26
token,
26
27
&DecodingKey::from_secret(secret.as_bytes()),
27
-
&Validation::default()
28
+
&Validation::default(),
28
29
) {
29
30
Ok(token_data) => {
30
31
return ready(Ok(AuthenticatedUser {
···
35
36
}
36
37
}
37
38
}
38
-
39
39
ready(Err(AppError::Unauthorized))
40
40
}
41
-
}
41
+
}
42
+
+583
-155
src/handlers.rs
+583
-155
src/handlers.rs
···
2
2
use crate::{
3
3
error::AppError,
4
4
models::{
5
-
AuthResponse, Claims, ClickStats, CreateLink, Link, LoginRequest, RegisterRequest,
6
-
SourceStats, User, UserResponse,
5
+
AuthResponse, Claims, ClickStats, CreateLink, DatabasePool, Link, LoginRequest,
6
+
RegisterRequest, SourceStats, User, UserResponse,
7
7
},
8
8
AppState,
9
9
};
···
16
16
use jsonwebtoken::{encode, EncodingKey, Header};
17
17
use lazy_static::lazy_static;
18
18
use regex::Regex;
19
+
use serde_json::json;
20
+
use sqlx::{Postgres, Sqlite};
19
21
20
22
lazy_static! {
21
23
static ref VALID_CODE_REGEX: Regex = Regex::new(r"^[a-zA-Z0-9_-]{1,32}$").unwrap();
···
27
29
payload: web::Json<CreateLink>,
28
30
) -> Result<impl Responder, AppError> {
29
31
tracing::debug!("Creating short URL with user_id: {}", user.user_id);
30
-
31
32
validate_url(&payload.url)?;
32
33
33
34
let short_code = if let Some(ref custom_code) = payload.custom_code {
34
35
validate_custom_code(custom_code)?;
35
36
36
-
tracing::debug!("Checking if custom code {} exists", custom_code);
37
-
// Check if code is already taken
38
-
if let Some(_) = sqlx::query_as::<_, Link>("SELECT * FROM links WHERE short_code = $1")
39
-
.bind(custom_code)
40
-
.fetch_optional(&state.db)
41
-
.await?
42
-
{
37
+
// Check if code exists using match on pool type
38
+
let exists = match &state.db {
39
+
DatabasePool::Postgres(pool) => {
40
+
sqlx::query_as::<_, Link>("SELECT * FROM links WHERE short_code = $1")
41
+
.bind(custom_code)
42
+
.fetch_optional(pool)
43
+
.await?
44
+
}
45
+
DatabasePool::Sqlite(pool) => {
46
+
sqlx::query_as::<_, Link>("SELECT * FROM links WHERE short_code = ?1")
47
+
.bind(custom_code)
48
+
.fetch_optional(pool)
49
+
.await?
50
+
}
51
+
};
52
+
53
+
if exists.is_some() {
43
54
return Err(AppError::InvalidInput(
44
55
"Custom code already taken".to_string(),
45
56
));
46
57
}
47
-
48
58
custom_code.clone()
49
59
} else {
50
60
generate_short_code()
51
61
};
52
62
53
-
// Start transaction
54
-
let mut tx = state.db.begin().await?;
63
+
// Start transaction based on pool type
64
+
let result = match &state.db {
65
+
DatabasePool::Postgres(pool) => {
66
+
let mut tx = pool.begin().await?;
67
+
68
+
let link = sqlx::query_as::<_, Link>(
69
+
"INSERT INTO links (original_url, short_code, user_id) VALUES ($1, $2, $3) RETURNING *"
70
+
)
71
+
.bind(&payload.url)
72
+
.bind(&short_code)
73
+
.bind(user.user_id)
74
+
.fetch_one(&mut *tx)
75
+
.await?;
76
+
77
+
if let Some(ref source) = payload.source {
78
+
sqlx::query("INSERT INTO clicks (link_id, source) VALUES ($1, $2)")
79
+
.bind(link.id)
80
+
.bind(source)
81
+
.execute(&mut *tx)
82
+
.await?;
83
+
}
55
84
56
-
tracing::debug!("Inserting new link with short_code: {}", short_code);
57
-
let link = sqlx::query_as::<_, Link>(
58
-
"INSERT INTO links (original_url, short_code, user_id) VALUES ($1, $2, $3) RETURNING *",
59
-
)
60
-
.bind(&payload.url)
61
-
.bind(&short_code)
62
-
.bind(user.user_id)
63
-
.fetch_one(&mut *tx)
64
-
.await?;
85
+
tx.commit().await?;
86
+
link
87
+
}
88
+
DatabasePool::Sqlite(pool) => {
89
+
let mut tx = pool.begin().await?;
65
90
66
-
if let Some(ref source) = payload.source {
67
-
tracing::debug!("Adding click source: {}", source);
68
-
sqlx::query("INSERT INTO clicks (link_id, source) VALUES ($1, $2)")
69
-
.bind(link.id)
70
-
.bind(source)
71
-
.execute(&mut *tx)
91
+
let link = sqlx::query_as::<_, Link>(
92
+
"INSERT INTO links (original_url, short_code, user_id) VALUES (?1, ?2, ?3) RETURNING *"
93
+
)
94
+
.bind(&payload.url)
95
+
.bind(&short_code)
96
+
.bind(user.user_id)
97
+
.fetch_one(&mut *tx)
72
98
.await?;
73
-
}
99
+
100
+
if let Some(ref source) = payload.source {
101
+
sqlx::query("INSERT INTO clicks (link_id, source) VALUES (?1, ?2)")
102
+
.bind(link.id)
103
+
.bind(source)
104
+
.execute(&mut *tx)
105
+
.await?;
106
+
}
107
+
108
+
tx.commit().await?;
109
+
link
110
+
}
111
+
};
74
112
75
-
tx.commit().await?;
76
-
Ok(HttpResponse::Created().json(link))
113
+
Ok(HttpResponse::Created().json(result))
77
114
}
78
115
79
116
fn validate_custom_code(code: &str) -> Result<(), AppError> {
···
94
131
Ok(())
95
132
}
96
133
97
-
fn validate_url(url: &String) -> Result<(), AppError> {
134
+
fn validate_url(url: &str) -> Result<(), AppError> {
98
135
if url.is_empty() {
99
136
return Err(AppError::InvalidInput("URL cannot be empty".to_string()));
100
137
}
···
120
157
.and_then(|q| web::Query::<std::collections::HashMap<String, String>>::from_query(q).ok())
121
158
.and_then(|params| params.get("source").cloned());
122
159
123
-
let mut tx = state.db.begin().await?;
124
-
125
-
let link = sqlx::query_as::<_, Link>(
126
-
"UPDATE links SET clicks = clicks + 1 WHERE short_code = $1 RETURNING *",
127
-
)
128
-
.bind(&short_code)
129
-
.fetch_optional(&mut *tx)
130
-
.await?;
160
+
let link = match &state.db {
161
+
DatabasePool::Postgres(pool) => {
162
+
let mut tx = pool.begin().await?;
163
+
let link = sqlx::query_as::<_, Link>(
164
+
"UPDATE links SET clicks = clicks + 1 WHERE short_code = $1 RETURNING *",
165
+
)
166
+
.bind(&short_code)
167
+
.fetch_optional(&mut *tx)
168
+
.await?;
169
+
tx.commit().await?;
170
+
link
171
+
}
172
+
DatabasePool::Sqlite(pool) => {
173
+
let mut tx = pool.begin().await?;
174
+
let link = sqlx::query_as::<_, Link>(
175
+
"UPDATE links SET clicks = clicks + 1 WHERE short_code = ?1 RETURNING *",
176
+
)
177
+
.bind(&short_code)
178
+
.fetch_optional(&mut *tx)
179
+
.await?;
180
+
tx.commit().await?;
181
+
link
182
+
}
183
+
};
131
184
132
185
match link {
133
186
Some(link) => {
134
-
// Record click with both user agent and query source
135
-
let user_agent = req
136
-
.headers()
137
-
.get("user-agent")
138
-
.and_then(|h| h.to_str().ok())
139
-
.unwrap_or("unknown")
140
-
.to_string();
187
+
// Handle click recording based on database type
188
+
match &state.db {
189
+
DatabasePool::Postgres(pool) => {
190
+
let mut tx = pool.begin().await?;
191
+
let user_agent = req
192
+
.headers()
193
+
.get("user-agent")
194
+
.and_then(|h| h.to_str().ok())
195
+
.unwrap_or("unknown")
196
+
.to_string();
141
197
142
-
sqlx::query("INSERT INTO clicks (link_id, source, query_source) VALUES ($1, $2, $3)")
143
-
.bind(link.id)
144
-
.bind(user_agent)
145
-
.bind(query_source)
146
-
.execute(&mut *tx)
147
-
.await?;
198
+
sqlx::query(
199
+
"INSERT INTO clicks (link_id, source, query_source) VALUES ($1, $2, $3)",
200
+
)
201
+
.bind(link.id)
202
+
.bind(user_agent)
203
+
.bind(query_source)
204
+
.execute(&mut *tx)
205
+
.await?;
148
206
149
-
tx.commit().await?;
207
+
tx.commit().await?;
208
+
}
209
+
DatabasePool::Sqlite(pool) => {
210
+
let mut tx = pool.begin().await?;
211
+
let user_agent = req
212
+
.headers()
213
+
.get("user-agent")
214
+
.and_then(|h| h.to_str().ok())
215
+
.unwrap_or("unknown")
216
+
.to_string();
217
+
218
+
sqlx::query(
219
+
"INSERT INTO clicks (link_id, source, query_source) VALUES (?1, ?2, ?3)",
220
+
)
221
+
.bind(link.id)
222
+
.bind(user_agent)
223
+
.bind(query_source)
224
+
.execute(&mut *tx)
225
+
.await?;
226
+
227
+
tx.commit().await?;
228
+
}
229
+
};
150
230
151
231
Ok(HttpResponse::TemporaryRedirect()
152
232
.append_header(("Location", link.original_url))
···
160
240
state: web::Data<AppState>,
161
241
user: AuthenticatedUser,
162
242
) -> Result<impl Responder, AppError> {
163
-
let links = sqlx::query_as::<_, Link>(
164
-
"SELECT * FROM links WHERE user_id = $1 ORDER BY created_at DESC",
165
-
)
166
-
.bind(user.user_id)
167
-
.fetch_all(&state.db)
168
-
.await?;
243
+
let links = match &state.db {
244
+
DatabasePool::Postgres(pool) => {
245
+
sqlx::query_as::<_, Link>(
246
+
"SELECT * FROM links WHERE user_id = $1 ORDER BY created_at DESC",
247
+
)
248
+
.bind(user.user_id)
249
+
.fetch_all(pool)
250
+
.await?
251
+
}
252
+
DatabasePool::Sqlite(pool) => {
253
+
sqlx::query_as::<_, Link>(
254
+
"SELECT * FROM links WHERE user_id = ?1 ORDER BY created_at DESC",
255
+
)
256
+
.bind(user.user_id)
257
+
.fetch_all(pool)
258
+
.await?
259
+
}
260
+
};
169
261
170
262
Ok(HttpResponse::Ok().json(links))
171
263
}
172
264
173
265
pub async fn health_check(state: web::Data<AppState>) -> impl Responder {
174
-
match sqlx::query("SELECT 1").execute(&state.db).await {
175
-
Ok(_) => HttpResponse::Ok().json("Healthy"),
176
-
Err(_) => HttpResponse::ServiceUnavailable().json("Database unavailable"),
266
+
let is_healthy = match &state.db {
267
+
DatabasePool::Postgres(pool) => sqlx::query("SELECT 1").execute(pool).await.is_ok(),
268
+
DatabasePool::Sqlite(pool) => sqlx::query("SELECT 1").execute(pool).await.is_ok(),
269
+
};
270
+
271
+
if is_healthy {
272
+
HttpResponse::Ok().json("Healthy")
273
+
} else {
274
+
HttpResponse::ServiceUnavailable().json("Database unavailable")
177
275
}
178
276
}
179
277
···
190
288
payload: web::Json<RegisterRequest>,
191
289
) -> Result<impl Responder, AppError> {
192
290
// Check if any users exist
193
-
let user_count = sqlx::query!("SELECT COUNT(*) as count FROM users")
194
-
.fetch_one(&state.db)
195
-
.await?
196
-
.count
197
-
.unwrap_or(0);
291
+
let user_count = match &state.db {
292
+
DatabasePool::Postgres(pool) => {
293
+
let mut tx = pool.begin().await?;
294
+
let count = sqlx::query_as::<Postgres, (i64,)>("SELECT COUNT(*)::bigint FROM users")
295
+
.fetch_one(&mut *tx)
296
+
.await?
297
+
.0;
298
+
tx.commit().await?;
299
+
count
300
+
}
301
+
DatabasePool::Sqlite(pool) => {
302
+
let mut tx = pool.begin().await?;
303
+
let count = sqlx::query_as::<Sqlite, (i64,)>("SELECT COUNT(*) FROM users")
304
+
.fetch_one(&mut *tx)
305
+
.await?
306
+
.0;
307
+
tx.commit().await?;
308
+
count
309
+
}
310
+
};
198
311
199
312
// If users exist, registration is closed - no exceptions
200
313
if user_count > 0 {
···
210
323
}
211
324
212
325
// Check if email already exists
213
-
let exists = sqlx::query!("SELECT id FROM users WHERE email = $1", payload.email)
214
-
.fetch_optional(&state.db)
215
-
.await?;
326
+
let exists = match &state.db {
327
+
DatabasePool::Postgres(pool) => {
328
+
let mut tx = pool.begin().await?;
329
+
let exists =
330
+
sqlx::query_as::<Postgres, (i32,)>("SELECT id FROM users WHERE email = $1")
331
+
.bind(&payload.email)
332
+
.fetch_optional(&mut *tx)
333
+
.await?;
334
+
tx.commit().await?;
335
+
exists
336
+
}
337
+
DatabasePool::Sqlite(pool) => {
338
+
let mut tx = pool.begin().await?;
339
+
let exists = sqlx::query_as::<Sqlite, (i32,)>("SELECT id FROM users WHERE email = ?")
340
+
.bind(&payload.email)
341
+
.fetch_optional(&mut *tx)
342
+
.await?;
343
+
tx.commit().await?;
344
+
exists
345
+
}
346
+
};
216
347
217
348
if exists.is_some() {
218
349
return Err(AppError::Auth("Email already registered".to_string()));
···
225
356
.map_err(|e| AppError::Auth(e.to_string()))?
226
357
.to_string();
227
358
228
-
let user = sqlx::query_as!(
229
-
User,
230
-
"INSERT INTO users (email, password_hash) VALUES ($1, $2) RETURNING *",
231
-
payload.email,
232
-
password_hash
233
-
)
234
-
.fetch_one(&state.db)
235
-
.await?;
359
+
// Insert new user
360
+
let user = match &state.db {
361
+
DatabasePool::Postgres(pool) => {
362
+
let mut tx = pool.begin().await?;
363
+
let user = sqlx::query_as::<Postgres, User>(
364
+
"INSERT INTO users (email, password_hash) VALUES ($1, $2) RETURNING *",
365
+
)
366
+
.bind(&payload.email)
367
+
.bind(&password_hash)
368
+
.fetch_one(&mut *tx)
369
+
.await?;
370
+
tx.commit().await?;
371
+
user
372
+
}
373
+
DatabasePool::Sqlite(pool) => {
374
+
let mut tx = pool.begin().await?;
375
+
let user = sqlx::query_as::<Sqlite, User>(
376
+
"INSERT INTO users (email, password_hash) VALUES (?, ?) RETURNING *",
377
+
)
378
+
.bind(&payload.email)
379
+
.bind(&password_hash)
380
+
.fetch_one(&mut *tx)
381
+
.await?;
382
+
tx.commit().await?;
383
+
user
384
+
}
385
+
};
236
386
237
387
let claims = Claims::new(user.id);
238
388
let secret = std::env::var("JWT_SECRET").unwrap_or_else(|_| "default_secret".to_string());
···
256
406
state: web::Data<AppState>,
257
407
payload: web::Json<LoginRequest>,
258
408
) -> Result<impl Responder, AppError> {
259
-
let user = sqlx::query_as!(User, "SELECT * FROM users WHERE email = $1", payload.email)
260
-
.fetch_optional(&state.db)
261
-
.await?
262
-
.ok_or_else(|| AppError::Auth("Invalid credentials".to_string()))?;
409
+
let user = match &state.db {
410
+
DatabasePool::Postgres(pool) => {
411
+
let mut tx = pool.begin().await?;
412
+
let user = sqlx::query_as::<Postgres, User>("SELECT * FROM users WHERE email = $1")
413
+
.bind(&payload.email)
414
+
.fetch_optional(&mut *tx)
415
+
.await?;
416
+
tx.commit().await?;
417
+
user
418
+
}
419
+
DatabasePool::Sqlite(pool) => {
420
+
let mut tx = pool.begin().await?;
421
+
let user = sqlx::query_as::<Sqlite, User>("SELECT * FROM users WHERE email = ?")
422
+
.bind(&payload.email)
423
+
.fetch_optional(&mut *tx)
424
+
.await?;
425
+
tx.commit().await?;
426
+
user
427
+
}
428
+
}
429
+
.ok_or_else(|| AppError::Auth("Invalid credentials".to_string()))?;
263
430
264
431
let argon2 = Argon2::default();
265
432
let parsed_hash =
···
290
457
}))
291
458
}
292
459
293
-
pub async fn delete_link(
460
+
pub async fn edit_link(
294
461
state: web::Data<AppState>,
295
462
user: AuthenticatedUser,
296
463
path: web::Path<i32>,
464
+
payload: web::Json<CreateLink>,
297
465
) -> Result<impl Responder, AppError> {
298
-
let link_id = path.into_inner();
466
+
let link_id: i32 = path.into_inner();
299
467
300
-
// Start transaction
301
-
let mut tx = state.db.begin().await?;
468
+
// Validate the new URL if provided
469
+
validate_url(&payload.url)?;
302
470
303
-
// Verify the link belongs to the user
304
-
let link = sqlx::query!(
305
-
"SELECT id FROM links WHERE id = $1 AND user_id = $2",
306
-
link_id,
307
-
user.user_id
308
-
)
309
-
.fetch_optional(&mut *tx)
310
-
.await?;
471
+
// Validate custom code if provided
472
+
if let Some(ref custom_code) = payload.custom_code {
473
+
validate_custom_code(custom_code)?;
311
474
312
-
if link.is_none() {
313
-
return Err(AppError::NotFound);
475
+
// Check if the custom code is already taken by another link
476
+
let existing_link = match &state.db {
477
+
DatabasePool::Postgres(pool) => {
478
+
sqlx::query_as::<_, Link>("SELECT * FROM links WHERE short_code = $1 AND id != $2")
479
+
.bind(custom_code)
480
+
.bind(link_id)
481
+
.fetch_optional(pool)
482
+
.await?
483
+
}
484
+
DatabasePool::Sqlite(pool) => {
485
+
sqlx::query_as::<_, Link>("SELECT * FROM links WHERE short_code = ?1 AND id != ?2")
486
+
.bind(custom_code)
487
+
.bind(link_id)
488
+
.fetch_optional(pool)
489
+
.await?
490
+
}
491
+
};
492
+
493
+
if existing_link.is_some() {
494
+
return Err(AppError::InvalidInput(
495
+
"Custom code already taken".to_string(),
496
+
));
497
+
}
314
498
}
315
499
316
-
// Delete associated clicks first due to foreign key constraint
317
-
sqlx::query!("DELETE FROM clicks WHERE link_id = $1", link_id)
318
-
.execute(&mut *tx)
319
-
.await?;
500
+
// Update the link
501
+
let updated_link = match &state.db {
502
+
DatabasePool::Postgres(pool) => {
503
+
let mut tx = pool.begin().await?;
504
+
505
+
// First verify the link belongs to the user
506
+
let link =
507
+
sqlx::query_as::<_, Link>("SELECT * FROM links WHERE id = $1 AND user_id = $2")
508
+
.bind(link_id)
509
+
.bind(user.user_id)
510
+
.fetch_optional(&mut *tx)
511
+
.await?;
512
+
513
+
if link.is_none() {
514
+
return Err(AppError::NotFound);
515
+
}
516
+
517
+
// Update the link
518
+
let updated = sqlx::query_as::<_, Link>(
519
+
r#"
520
+
UPDATE links
521
+
SET
522
+
original_url = $1,
523
+
short_code = COALESCE($2, short_code)
524
+
WHERE id = $3 AND user_id = $4
525
+
RETURNING *
526
+
"#,
527
+
)
528
+
.bind(&payload.url)
529
+
.bind(&payload.custom_code)
530
+
.bind(link_id)
531
+
.bind(user.user_id)
532
+
.fetch_one(&mut *tx)
533
+
.await?;
534
+
535
+
// If source is provided, add a click record
536
+
if let Some(ref source) = payload.source {
537
+
sqlx::query("INSERT INTO clicks (link_id, source) VALUES ($1, $2)")
538
+
.bind(link_id)
539
+
.bind(source)
540
+
.execute(&mut *tx)
541
+
.await?;
542
+
}
543
+
544
+
tx.commit().await?;
545
+
updated
546
+
}
547
+
DatabasePool::Sqlite(pool) => {
548
+
let mut tx = pool.begin().await?;
549
+
550
+
// First verify the link belongs to the user
551
+
let link =
552
+
sqlx::query_as::<_, Link>("SELECT * FROM links WHERE id = ?1 AND user_id = ?2")
553
+
.bind(link_id)
554
+
.bind(user.user_id)
555
+
.fetch_optional(&mut *tx)
556
+
.await?;
557
+
558
+
if link.is_none() {
559
+
return Err(AppError::NotFound);
560
+
}
561
+
562
+
// Update the link
563
+
let updated = sqlx::query_as::<_, Link>(
564
+
r#"
565
+
UPDATE links
566
+
SET
567
+
original_url = ?1,
568
+
short_code = COALESCE(?2, short_code)
569
+
WHERE id = ?3 AND user_id = ?4
570
+
RETURNING *
571
+
"#,
572
+
)
573
+
.bind(&payload.url)
574
+
.bind(&payload.custom_code)
575
+
.bind(link_id)
576
+
.bind(user.user_id)
577
+
.fetch_one(&mut *tx)
578
+
.await?;
579
+
580
+
// If source is provided, add a click record
581
+
if let Some(ref source) = payload.source {
582
+
sqlx::query("INSERT INTO clicks (link_id, source) VALUES (?1, ?2)")
583
+
.bind(link_id)
584
+
.bind(source)
585
+
.execute(&mut *tx)
586
+
.await?;
587
+
}
320
588
321
-
// Delete the link
322
-
sqlx::query!("DELETE FROM links WHERE id = $1", link_id)
323
-
.execute(&mut *tx)
324
-
.await?;
589
+
tx.commit().await?;
590
+
updated
591
+
}
592
+
};
325
593
326
-
tx.commit().await?;
594
+
Ok(HttpResponse::Ok().json(updated_link))
595
+
}
596
+
597
+
pub async fn delete_link(
598
+
state: web::Data<AppState>,
599
+
user: AuthenticatedUser,
600
+
path: web::Path<i32>,
601
+
) -> Result<impl Responder, AppError> {
602
+
let link_id: i32 = path.into_inner();
603
+
604
+
match &state.db {
605
+
DatabasePool::Postgres(pool) => {
606
+
let mut tx = pool.begin().await?;
607
+
608
+
// Verify the link belongs to the user
609
+
let link = sqlx::query_as::<Postgres, (i32,)>(
610
+
"SELECT id FROM links WHERE id = $1 AND user_id = $2",
611
+
)
612
+
.bind(link_id)
613
+
.bind(user.user_id)
614
+
.fetch_optional(&mut *tx)
615
+
.await?;
616
+
617
+
if link.is_none() {
618
+
return Err(AppError::NotFound);
619
+
}
620
+
621
+
// Delete associated clicks first due to foreign key constraint
622
+
sqlx::query("DELETE FROM clicks WHERE link_id = $1")
623
+
.bind(link_id)
624
+
.execute(&mut *tx)
625
+
.await?;
626
+
627
+
// Delete the link
628
+
sqlx::query("DELETE FROM links WHERE id = $1")
629
+
.bind(link_id)
630
+
.execute(&mut *tx)
631
+
.await?;
632
+
633
+
tx.commit().await?;
634
+
}
635
+
DatabasePool::Sqlite(pool) => {
636
+
let mut tx = pool.begin().await?;
637
+
638
+
// Verify the link belongs to the user
639
+
let link = sqlx::query_as::<Sqlite, (i32,)>(
640
+
"SELECT id FROM links WHERE id = ? AND user_id = ?",
641
+
)
642
+
.bind(link_id)
643
+
.bind(user.user_id)
644
+
.fetch_optional(&mut *tx)
645
+
.await?;
646
+
647
+
if link.is_none() {
648
+
return Err(AppError::NotFound);
649
+
}
650
+
651
+
// Delete associated clicks first due to foreign key constraint
652
+
sqlx::query("DELETE FROM clicks WHERE link_id = ?")
653
+
.bind(link_id)
654
+
.execute(&mut *tx)
655
+
.await?;
656
+
657
+
// Delete the link
658
+
sqlx::query("DELETE FROM links WHERE id = ?")
659
+
.bind(link_id)
660
+
.execute(&mut *tx)
661
+
.await?;
662
+
663
+
tx.commit().await?;
664
+
}
665
+
}
327
666
328
667
Ok(HttpResponse::NoContent().finish())
329
668
}
···
335
674
) -> Result<impl Responder, AppError> {
336
675
let link_id = path.into_inner();
337
676
338
-
// Verify the link belongs to the user
339
-
let link = sqlx::query!(
340
-
"SELECT id FROM links WHERE id = $1 AND user_id = $2",
341
-
link_id,
342
-
user.user_id
343
-
)
344
-
.fetch_optional(&state.db)
345
-
.await?;
677
+
// First verify the link belongs to the user
678
+
let link = match &state.db {
679
+
DatabasePool::Postgres(pool) => {
680
+
sqlx::query_as::<_, (i32,)>("SELECT id FROM links WHERE id = $1 AND user_id = $2")
681
+
.bind(link_id)
682
+
.bind(user.user_id)
683
+
.fetch_optional(pool)
684
+
.await?
685
+
}
686
+
DatabasePool::Sqlite(pool) => {
687
+
sqlx::query_as::<_, (i32,)>("SELECT id FROM links WHERE id = ? AND user_id = ?")
688
+
.bind(link_id)
689
+
.bind(user.user_id)
690
+
.fetch_optional(pool)
691
+
.await?
692
+
}
693
+
};
346
694
347
695
if link.is_none() {
348
696
return Err(AppError::NotFound);
349
697
}
350
698
351
-
let clicks = sqlx::query_as!(
352
-
ClickStats,
353
-
r#"
354
-
SELECT
355
-
DATE(created_at)::date as "date!",
356
-
COUNT(*)::bigint as "clicks!"
357
-
FROM clicks
358
-
WHERE link_id = $1
359
-
GROUP BY DATE(created_at)
360
-
ORDER BY DATE(created_at) ASC -- Changed from DESC to ASC
361
-
LIMIT 30
362
-
"#,
363
-
link_id
364
-
)
365
-
.fetch_all(&state.db)
366
-
.await?;
699
+
let clicks = match &state.db {
700
+
DatabasePool::Postgres(pool) => {
701
+
sqlx::query_as::<_, ClickStats>(
702
+
r#"
703
+
SELECT
704
+
DATE(created_at)::text as date,
705
+
COUNT(*)::bigint as clicks
706
+
FROM clicks
707
+
WHERE link_id = $1
708
+
GROUP BY DATE(created_at)
709
+
ORDER BY DATE(created_at) ASC
710
+
"#,
711
+
)
712
+
.bind(link_id)
713
+
.fetch_all(pool)
714
+
.await?
715
+
}
716
+
DatabasePool::Sqlite(pool) => {
717
+
sqlx::query_as::<_, ClickStats>(
718
+
r#"
719
+
SELECT
720
+
DATE(created_at) as date,
721
+
COUNT(*) as clicks
722
+
FROM clicks
723
+
WHERE link_id = ?
724
+
GROUP BY DATE(created_at)
725
+
ORDER BY DATE(created_at) ASC
726
+
"#,
727
+
)
728
+
.bind(link_id)
729
+
.fetch_all(pool)
730
+
.await?
731
+
}
732
+
};
367
733
368
734
Ok(HttpResponse::Ok().json(clicks))
369
735
}
···
376
742
let link_id = path.into_inner();
377
743
378
744
// Verify the link belongs to the user
379
-
let link = sqlx::query!(
380
-
"SELECT id FROM links WHERE id = $1 AND user_id = $2",
381
-
link_id,
382
-
user.user_id
383
-
)
384
-
.fetch_optional(&state.db)
385
-
.await?;
745
+
let link = match &state.db {
746
+
DatabasePool::Postgres(pool) => {
747
+
let mut tx = pool.begin().await?;
748
+
let link = sqlx::query_as::<Postgres, (i32,)>(
749
+
"SELECT id FROM links WHERE id = $1 AND user_id = $2",
750
+
)
751
+
.bind(link_id)
752
+
.bind(user.user_id)
753
+
.fetch_optional(&mut *tx)
754
+
.await?;
755
+
tx.commit().await?;
756
+
link
757
+
}
758
+
DatabasePool::Sqlite(pool) => {
759
+
let mut tx = pool.begin().await?;
760
+
let link = sqlx::query_as::<Sqlite, (i32,)>(
761
+
"SELECT id FROM links WHERE id = ? AND user_id = ?",
762
+
)
763
+
.bind(link_id)
764
+
.bind(user.user_id)
765
+
.fetch_optional(&mut *tx)
766
+
.await?;
767
+
tx.commit().await?;
768
+
link
769
+
}
770
+
};
386
771
387
772
if link.is_none() {
388
773
return Err(AppError::NotFound);
389
774
}
390
775
391
-
let sources = sqlx::query_as!(
392
-
SourceStats,
393
-
r#"
394
-
SELECT
395
-
query_source as "source!",
396
-
COUNT(*)::bigint as "count!"
397
-
FROM clicks
398
-
WHERE link_id = $1
399
-
AND query_source IS NOT NULL
400
-
AND query_source != ''
401
-
GROUP BY query_source
402
-
ORDER BY COUNT(*) DESC
403
-
LIMIT 10
404
-
"#,
405
-
link_id
406
-
)
407
-
.fetch_all(&state.db)
408
-
.await?;
776
+
let sources = match &state.db {
777
+
DatabasePool::Postgres(pool) => {
778
+
sqlx::query_as::<_, SourceStats>(
779
+
r#"
780
+
SELECT
781
+
DATE(created_at)::text as date,
782
+
query_source as source,
783
+
COUNT(*)::bigint as count
784
+
FROM clicks
785
+
WHERE link_id = $1
786
+
AND query_source IS NOT NULL
787
+
AND query_source != ''
788
+
GROUP BY DATE(created_at), query_source
789
+
ORDER BY DATE(created_at) ASC, COUNT(*) DESC
790
+
"#,
791
+
)
792
+
.bind(link_id)
793
+
.fetch_all(pool)
794
+
.await?
795
+
}
796
+
DatabasePool::Sqlite(pool) => {
797
+
sqlx::query_as::<_, SourceStats>(
798
+
r#"
799
+
SELECT
800
+
DATE(created_at) as date,
801
+
query_source as source,
802
+
COUNT(*) as count
803
+
FROM clicks
804
+
WHERE link_id = ?
805
+
AND query_source IS NOT NULL
806
+
AND query_source != ''
807
+
GROUP BY DATE(created_at), query_source
808
+
ORDER BY DATE(created_at) ASC, COUNT(*) DESC
809
+
"#,
810
+
)
811
+
.bind(link_id)
812
+
.fetch_all(pool)
813
+
.await?
814
+
}
815
+
};
409
816
410
817
Ok(HttpResponse::Ok().json(sources))
411
818
}
819
+
820
+
pub async fn check_first_user(state: web::Data<AppState>) -> Result<impl Responder, AppError> {
821
+
let user_count = match &state.db {
822
+
DatabasePool::Postgres(pool) => {
823
+
sqlx::query_as::<Postgres, (i64,)>("SELECT COUNT(*)::bigint FROM users")
824
+
.fetch_one(pool)
825
+
.await?
826
+
.0
827
+
}
828
+
DatabasePool::Sqlite(pool) => {
829
+
sqlx::query_as::<Sqlite, (i64,)>("SELECT COUNT(*) FROM users")
830
+
.fetch_one(pool)
831
+
.await?
832
+
.0
833
+
}
834
+
};
835
+
836
+
Ok(HttpResponse::Ok().json(json!({
837
+
"isFirstUser": user_count == 0
838
+
})))
839
+
}
+94
-10
src/lib.rs
+94
-10
src/lib.rs
···
1
+
use anyhow::Result;
1
2
use rand::Rng;
2
-
use sqlx::PgPool;
3
+
use sqlx::migrate::MigrateDatabase;
4
+
use sqlx::postgres::PgPoolOptions;
5
+
use sqlx::{Postgres, Sqlite};
3
6
use std::fs::File;
4
7
use std::io::Write;
5
8
use tracing::info;
9
+
10
+
use models::DatabasePool;
6
11
7
12
pub mod auth;
8
13
pub mod error;
···
11
16
12
17
#[derive(Clone)]
13
18
pub struct AppState {
14
-
pub db: PgPool,
19
+
pub db: DatabasePool,
15
20
pub admin_token: Option<String>,
16
21
}
17
22
18
-
pub async fn check_and_generate_admin_token(pool: &sqlx::PgPool) -> anyhow::Result<Option<String>> {
23
+
pub async fn create_db_pool() -> Result<DatabasePool> {
24
+
let database_url = std::env::var("DATABASE_URL").ok();
25
+
26
+
match database_url {
27
+
Some(url) if url.starts_with("postgres://") || url.starts_with("postgresql://") => {
28
+
info!("Using PostgreSQL database");
29
+
let pool = PgPoolOptions::new()
30
+
.max_connections(5)
31
+
.acquire_timeout(std::time::Duration::from_secs(3))
32
+
.connect(&url)
33
+
.await?;
34
+
35
+
Ok(DatabasePool::Postgres(pool))
36
+
}
37
+
_ => {
38
+
info!("No PostgreSQL connection string found, using SQLite");
39
+
40
+
// Get the project root directory
41
+
let project_root = std::env::current_dir()?;
42
+
let data_dir = project_root.join("data");
43
+
44
+
// Create a data directory if it doesn't exist
45
+
if !data_dir.exists() {
46
+
std::fs::create_dir_all(&data_dir)?;
47
+
}
48
+
49
+
let db_path = data_dir.join("simplelink.db");
50
+
let sqlite_url = format!("sqlite://{}", db_path.display());
51
+
52
+
// Check if database exists and create it if it doesn't
53
+
if !Sqlite::database_exists(&sqlite_url).await.unwrap_or(false) {
54
+
info!("Creating new SQLite database at {}", db_path.display());
55
+
Sqlite::create_database(&sqlite_url).await?;
56
+
info!("Database created successfully");
57
+
} else {
58
+
info!("Database already exists");
59
+
}
60
+
61
+
let pool = sqlx::sqlite::SqlitePoolOptions::new()
62
+
.max_connections(5)
63
+
.connect(&sqlite_url)
64
+
.await?;
65
+
66
+
Ok(DatabasePool::Sqlite(pool))
67
+
}
68
+
}
69
+
}
70
+
71
+
pub async fn run_migrations(pool: &DatabasePool) -> Result<()> {
72
+
match pool {
73
+
DatabasePool::Postgres(pool) => {
74
+
// Use the root migrations directory for postgres
75
+
sqlx::migrate!().run(pool).await?;
76
+
}
77
+
DatabasePool::Sqlite(pool) => {
78
+
sqlx::migrate!("./migrations/sqlite").run(pool).await?;
79
+
}
80
+
}
81
+
Ok(())
82
+
}
83
+
84
+
pub async fn check_and_generate_admin_token(db: &DatabasePool) -> anyhow::Result<Option<String>> {
19
85
// Check if any users exist
20
-
let user_count = sqlx::query!("SELECT COUNT(*) as count FROM users")
21
-
.fetch_one(pool)
22
-
.await?
23
-
.count
24
-
.unwrap_or(0);
86
+
let user_count = match db {
87
+
DatabasePool::Postgres(pool) => {
88
+
let mut tx = pool.begin().await?;
89
+
let count = sqlx::query_as::<Postgres, (i64,)>("SELECT COUNT(*)::bigint FROM users")
90
+
.fetch_one(&mut *tx)
91
+
.await?
92
+
.0;
93
+
tx.commit().await?;
94
+
count
95
+
}
96
+
DatabasePool::Sqlite(pool) => {
97
+
let mut tx = pool.begin().await?;
98
+
let count = sqlx::query_as::<Sqlite, (i64,)>("SELECT COUNT(*) FROM users")
99
+
.fetch_one(&mut *tx)
100
+
.await?
101
+
.0;
102
+
tx.commit().await?;
103
+
count
104
+
}
105
+
};
25
106
26
107
if user_count == 0 {
27
-
// Generate a random token using simple characters
28
108
let token: String = (0..32)
29
109
.map(|_| {
30
110
let idx = rand::thread_rng().gen_range(0..62);
···
36
116
})
37
117
.collect();
38
118
119
+
// Get the project root directory
120
+
let project_root = std::env::current_dir()?;
121
+
let token_path = project_root.join("admin-setup-token.txt");
122
+
39
123
// Save token to file
40
-
let mut file = File::create("admin-setup-token.txt")?;
124
+
let mut file = File::create(token_path)?;
41
125
writeln!(file, "{}", token)?;
42
126
43
127
info!("No users found - generated admin setup token");
+165
-12
src/main.rs
+165
-12
src/main.rs
···
1
1
use actix_cors::Cors;
2
2
use actix_web::{web, App, HttpResponse, HttpServer};
3
3
use anyhow::Result;
4
+
use clap::Parser;
4
5
use rust_embed::RustEmbed;
5
6
use simplelink::check_and_generate_admin_token;
7
+
use simplelink::models::DatabasePool;
8
+
use simplelink::{create_db_pool, run_migrations};
6
9
use simplelink::{handlers, AppState};
7
-
use sqlx::postgres::PgPoolOptions;
8
-
use tracing::info;
10
+
use sqlx::{Postgres, Sqlite};
11
+
use tracing::{error, info};
9
12
13
+
#[derive(Parser, Debug)]
14
+
#[command(author, version, about, long_about = None)]
10
15
#[derive(RustEmbed)]
11
16
#[folder = "static/"]
12
17
struct Asset;
···
23
28
}
24
29
}
25
30
31
+
async fn create_initial_links(pool: &DatabasePool) -> Result<()> {
32
+
if let Ok(links) = std::env::var("INITIAL_LINKS") {
33
+
for link_entry in links.split(';') {
34
+
let parts: Vec<&str> = link_entry.split(',').collect();
35
+
if parts.len() >= 2 {
36
+
let url = parts[0];
37
+
let code = parts[1];
38
+
39
+
match pool {
40
+
DatabasePool::Postgres(pool) => {
41
+
sqlx::query(
42
+
"INSERT INTO links (original_url, short_code, user_id)
43
+
VALUES ($1, $2, $3)
44
+
ON CONFLICT (short_code)
45
+
DO UPDATE SET short_code = EXCLUDED.short_code
46
+
WHERE links.original_url = EXCLUDED.original_url",
47
+
)
48
+
.bind(url)
49
+
.bind(code)
50
+
.bind(1)
51
+
.execute(pool)
52
+
.await?;
53
+
}
54
+
DatabasePool::Sqlite(pool) => {
55
+
// First check if the exact combination exists
56
+
let exists = sqlx::query_scalar::<_, bool>(
57
+
"SELECT EXISTS(
58
+
SELECT 1 FROM links
59
+
WHERE original_url = ?1
60
+
AND short_code = ?2
61
+
)",
62
+
)
63
+
.bind(url)
64
+
.bind(code)
65
+
.fetch_one(pool)
66
+
.await?;
67
+
68
+
// Only insert if the exact combination doesn't exist
69
+
if !exists {
70
+
sqlx::query(
71
+
"INSERT INTO links (original_url, short_code, user_id)
72
+
VALUES (?1, ?2, ?3)",
73
+
)
74
+
.bind(url)
75
+
.bind(code)
76
+
.bind(1)
77
+
.execute(pool)
78
+
.await?;
79
+
info!("Created initial link: {} -> {} for user_id: 1", code, url);
80
+
} else {
81
+
info!("Skipped existing link: {} -> {} for user_id: 1", code, url);
82
+
}
83
+
}
84
+
}
85
+
}
86
+
}
87
+
}
88
+
Ok(())
89
+
}
90
+
91
+
async fn create_admin_user(pool: &DatabasePool, email: &str, password: &str) -> Result<()> {
92
+
use argon2::{
93
+
password_hash::{rand_core::OsRng, SaltString},
94
+
Argon2, PasswordHasher,
95
+
};
96
+
97
+
let salt = SaltString::generate(&mut OsRng);
98
+
let argon2 = Argon2::default();
99
+
let password_hash = argon2
100
+
.hash_password(password.as_bytes(), &salt)
101
+
.map_err(|e| anyhow::anyhow!("Password hashing error: {}", e))?
102
+
.to_string();
103
+
104
+
match pool {
105
+
DatabasePool::Postgres(pool) => {
106
+
sqlx::query(
107
+
"INSERT INTO users (email, password_hash)
108
+
VALUES ($1, $2)
109
+
ON CONFLICT (email) DO NOTHING",
110
+
)
111
+
.bind(email)
112
+
.bind(&password_hash)
113
+
.execute(pool)
114
+
.await?;
115
+
}
116
+
DatabasePool::Sqlite(pool) => {
117
+
sqlx::query(
118
+
"INSERT OR IGNORE INTO users (email, password_hash)
119
+
VALUES (?1, ?2)",
120
+
)
121
+
.bind(email)
122
+
.bind(&password_hash)
123
+
.execute(pool)
124
+
.await?;
125
+
}
126
+
}
127
+
info!("Created admin user: {}", email);
128
+
Ok(())
129
+
}
130
+
26
131
#[actix_web::main]
27
132
async fn main() -> Result<()> {
28
133
// Load environment variables from .env file
···
31
136
// Initialize logging
32
137
tracing_subscriber::fmt::init();
33
138
34
-
// Database connection string from environment
35
-
let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
36
-
37
139
// Create database connection pool
38
-
let pool = PgPoolOptions::new()
39
-
.max_connections(5)
40
-
.acquire_timeout(std::time::Duration::from_secs(3))
41
-
.connect(&database_url)
42
-
.await?;
140
+
let pool = create_db_pool().await?;
141
+
run_migrations(&pool).await?;
43
142
44
-
// Run database migrations
45
-
sqlx::migrate!("./migrations").run(&pool).await?;
143
+
// First check if admin credentials are provided in environment variables
144
+
let admin_credentials = match (
145
+
std::env::var("SIMPLELINK_USER"),
146
+
std::env::var("SIMPLELINK_PASS"),
147
+
) {
148
+
(Ok(user), Ok(pass)) => Some((user, pass)),
149
+
_ => None,
150
+
};
151
+
152
+
if let Some((email, password)) = admin_credentials {
153
+
// Now check for existing users
154
+
let user_count = match &pool {
155
+
DatabasePool::Postgres(pool) => {
156
+
let mut tx = pool.begin().await?;
157
+
let count =
158
+
sqlx::query_as::<Postgres, (i64,)>("SELECT COUNT(*)::bigint FROM users")
159
+
.fetch_one(&mut *tx)
160
+
.await?
161
+
.0;
162
+
tx.commit().await?;
163
+
count
164
+
}
165
+
DatabasePool::Sqlite(pool) => {
166
+
let mut tx = pool.begin().await?;
167
+
let count = sqlx::query_as::<Sqlite, (i64,)>("SELECT COUNT(*) FROM users")
168
+
.fetch_one(&mut *tx)
169
+
.await?
170
+
.0;
171
+
tx.commit().await?;
172
+
count
173
+
}
174
+
};
175
+
176
+
if user_count == 0 {
177
+
info!("No users found, creating admin user: {}", email);
178
+
match create_admin_user(&pool, &email, &password).await {
179
+
Ok(_) => info!("Successfully created admin user"),
180
+
Err(e) => {
181
+
error!("Failed to create admin user: {}", e);
182
+
return Err(anyhow::anyhow!("Failed to create admin user: {}", e));
183
+
}
184
+
}
185
+
}
186
+
} else {
187
+
info!(
188
+
"No admin credentials provided in environment variables, skipping admin user creation"
189
+
);
190
+
}
191
+
192
+
// Create initial links from environment variables
193
+
create_initial_links(&pool).await?;
46
194
47
195
let admin_token = check_and_generate_admin_token(&pool).await?;
48
196
···
79
227
"/links/{id}/sources",
80
228
web::get().to(handlers::get_link_sources),
81
229
)
230
+
.route("/links/{id}", web::patch().to(handlers::edit_link))
82
231
.route("/auth/register", web::post().to(handlers::register))
83
232
.route("/auth/login", web::post().to(handlers::login))
233
+
.route(
234
+
"/auth/check-first-user",
235
+
web::get().to(handlers::check_first_user),
236
+
)
84
237
.route("/health", web::get().to(handlers::health_check)),
85
238
)
86
239
.service(web::resource("/{short_code}").route(web::get().to(handlers::redirect_to_url)))
+77
-5
src/models.rs
+77
-5
src/models.rs
···
1
+
use anyhow::Result;
2
+
use futures::future::BoxFuture;
3
+
use serde::{Deserialize, Serialize};
4
+
use sqlx::postgres::PgRow;
5
+
use sqlx::sqlite::SqliteRow;
6
+
use sqlx::FromRow;
7
+
use sqlx::Pool;
8
+
use sqlx::Postgres;
9
+
use sqlx::Sqlite;
10
+
use sqlx::Transaction;
1
11
use std::time::{SystemTime, UNIX_EPOCH};
2
12
3
-
use chrono::NaiveDate;
4
-
use serde::{Deserialize, Serialize};
5
-
use sqlx::FromRow;
13
+
#[derive(Clone)]
14
+
pub enum DatabasePool {
15
+
Postgres(Pool<Postgres>),
16
+
Sqlite(Pool<Sqlite>),
17
+
}
18
+
19
+
impl DatabasePool {
20
+
pub async fn begin(&self) -> Result<Box<dyn std::any::Any + Send>> {
21
+
match self {
22
+
DatabasePool::Postgres(pool) => Ok(Box::new(pool.begin().await?)),
23
+
DatabasePool::Sqlite(pool) => Ok(Box::new(pool.begin().await?)),
24
+
}
25
+
}
26
+
27
+
pub async fn fetch_optional<T>(&self, pg_query: &str, sqlite_query: &str) -> Result<Option<T>>
28
+
where
29
+
T: for<'r> FromRow<'r, PgRow> + for<'r> FromRow<'r, SqliteRow> + Send + Sync + Unpin,
30
+
{
31
+
match self {
32
+
DatabasePool::Postgres(pool) => {
33
+
Ok(sqlx::query_as(pg_query).fetch_optional(pool).await?)
34
+
}
35
+
DatabasePool::Sqlite(pool) => {
36
+
Ok(sqlx::query_as(sqlite_query).fetch_optional(pool).await?)
37
+
}
38
+
}
39
+
}
40
+
41
+
pub async fn execute(&self, pg_query: &str, sqlite_query: &str) -> Result<()> {
42
+
match self {
43
+
DatabasePool::Postgres(pool) => {
44
+
sqlx::query(pg_query).execute(pool).await?;
45
+
Ok(())
46
+
}
47
+
DatabasePool::Sqlite(pool) => {
48
+
sqlx::query(sqlite_query).execute(pool).await?;
49
+
Ok(())
50
+
}
51
+
}
52
+
}
53
+
54
+
pub async fn transaction<'a, F, R>(&'a self, f: F) -> Result<R>
55
+
where
56
+
F: for<'c> Fn(&'c mut Transaction<'_, Postgres>) -> BoxFuture<'c, Result<R>>
57
+
+ for<'c> Fn(&'c mut Transaction<'_, Sqlite>) -> BoxFuture<'c, Result<R>>
58
+
+ Copy,
59
+
R: Send + 'static,
60
+
{
61
+
match self {
62
+
DatabasePool::Postgres(pool) => {
63
+
let mut tx = pool.begin().await?;
64
+
let result = f(&mut tx).await?;
65
+
tx.commit().await?;
66
+
Ok(result)
67
+
}
68
+
DatabasePool::Sqlite(pool) => {
69
+
let mut tx = pool.begin().await?;
70
+
let result = f(&mut tx).await?;
71
+
tx.commit().await?;
72
+
Ok(result)
73
+
}
74
+
}
75
+
}
76
+
}
6
77
7
78
#[derive(Debug, Serialize, Deserialize)]
8
79
pub struct Claims {
···
16
87
.duration_since(UNIX_EPOCH)
17
88
.unwrap()
18
89
.as_secs() as usize
19
-
+ 24 * 60 * 60; // 24 hours from now
90
+
+ 14 * 24 * 60 * 60; // 2 weeks from now
20
91
21
92
Self { sub: user_id, exp }
22
93
}
···
73
144
74
145
#[derive(sqlx::FromRow, Serialize)]
75
146
pub struct ClickStats {
76
-
pub date: NaiveDate,
147
+
pub date: String,
77
148
pub clicks: i64,
78
149
}
79
150
80
151
#[derive(sqlx::FromRow, Serialize)]
81
152
pub struct SourceStats {
153
+
pub date: String,
82
154
pub source: String,
83
155
pub count: i64,
84
156
}