+216
API.md
+216
API.md
···
1
+
# Link Shortener API Documentation
2
+
3
+
## Base URL
4
+
`http://localhost:8080`
5
+
6
+
## Endpoints
7
+
8
+
### Health Check
9
+
Check if the service and database are running.
10
+
11
+
```bash
12
+
GET /health
13
+
```
14
+
15
+
Example:
16
+
```bash
17
+
curl http://localhost:8080/health
18
+
```
19
+
20
+
Response (200 OK):
21
+
```json
22
+
"Healthy"
23
+
```
24
+
25
+
Response (503 Service Unavailable):
26
+
```json
27
+
"Database unavailable"
28
+
```
29
+
30
+
### Create Short URL
31
+
Create a new shortened URL with optional custom code.
32
+
33
+
```bash
34
+
POST /api/shorten
35
+
```
36
+
37
+
Request Body:
38
+
```json
39
+
{
40
+
"url": string, // Required: The URL to shorten
41
+
"custom_code": string, // Optional: Custom short code
42
+
"source": string // Optional: Source of the request
43
+
}
44
+
```
45
+
46
+
Examples:
47
+
48
+
1. Create with auto-generated code:
49
+
```bash
50
+
curl -X POST http://localhost:8080/api/shorten \
51
+
-H "Content-Type: application/json" \
52
+
-d '{
53
+
"url": "https://example.com",
54
+
"source": "curl-test"
55
+
}'
56
+
```
57
+
58
+
Response (201 Created):
59
+
```json
60
+
{
61
+
"id": 1,
62
+
"original_url": "https://example.com",
63
+
"short_code": "Xa7Bc9",
64
+
"created_at": "2024-03-01T12:34:56Z",
65
+
"clicks": 0
66
+
}
67
+
```
68
+
69
+
2. Create with custom code:
70
+
```bash
71
+
curl -X POST http://localhost:8080/api/shorten \
72
+
-H "Content-Type: application/json" \
73
+
-d '{
74
+
"url": "https://example.com",
75
+
"custom_code": "example",
76
+
"source": "curl-test"
77
+
}'
78
+
```
79
+
80
+
Response (201 Created):
81
+
```json
82
+
{
83
+
"id": 2,
84
+
"original_url": "https://example.com",
85
+
"short_code": "example",
86
+
"created_at": "2024-03-01T12:34:56Z",
87
+
"clicks": 0
88
+
}
89
+
```
90
+
91
+
Error Responses:
92
+
93
+
Invalid URL (400 Bad Request):
94
+
```json
95
+
{
96
+
"error": "URL must start with http:// or https://"
97
+
}
98
+
```
99
+
100
+
Custom code taken (400 Bad Request):
101
+
```json
102
+
{
103
+
"error": "Custom code already taken"
104
+
}
105
+
```
106
+
107
+
Invalid custom code (400 Bad Request):
108
+
```json
109
+
{
110
+
"error": "Custom code must be 1-32 characters long and contain only letters, numbers, underscores, and hyphens"
111
+
}
112
+
```
113
+
114
+
### Get All Links
115
+
Retrieve all shortened URLs.
116
+
117
+
```bash
118
+
GET /api/links
119
+
```
120
+
121
+
Example:
122
+
```bash
123
+
curl http://localhost:8080/api/links
124
+
```
125
+
126
+
Response (200 OK):
127
+
```json
128
+
[
129
+
{
130
+
"id": 1,
131
+
"original_url": "https://example.com",
132
+
"short_code": "Xa7Bc9",
133
+
"created_at": "2024-03-01T12:34:56Z",
134
+
"clicks": 5
135
+
},
136
+
{
137
+
"id": 2,
138
+
"original_url": "https://example.org",
139
+
"short_code": "example",
140
+
"created_at": "2024-03-01T12:35:00Z",
141
+
"clicks": 3
142
+
}
143
+
]
144
+
```
145
+
146
+
### Redirect to Original URL
147
+
Use the shortened URL to redirect to the original URL.
148
+
149
+
```bash
150
+
GET /{short_code}
151
+
```
152
+
153
+
Example:
154
+
```bash
155
+
curl -i http://localhost:8080/example
156
+
```
157
+
158
+
Response (307 Temporary Redirect):
159
+
```http
160
+
HTTP/1.1 307 Temporary Redirect
161
+
Location: https://example.com
162
+
```
163
+
164
+
Error Response (404 Not Found):
165
+
```json
166
+
{
167
+
"error": "Not found"
168
+
}
169
+
```
170
+
171
+
## Custom Code Rules
172
+
173
+
1. Length: 1-32 characters
174
+
2. Allowed characters: letters, numbers, underscores, and hyphens
175
+
3. Case-sensitive
176
+
4. Cannot use reserved words: ["api", "health", "admin", "static", "assets"]
177
+
178
+
## Rate Limiting
179
+
180
+
Currently, no rate limiting is implemented.
181
+
182
+
## Notes
183
+
184
+
1. All timestamps are in UTC
185
+
2. Click counts are incremented on successful redirects
186
+
3. Source tracking is optional but recommended for analytics
187
+
4. Custom codes are case-sensitive
188
+
5. URLs must include protocol (http:// or https://)
189
+
190
+
## Error Codes
191
+
192
+
- 200: Success
193
+
- 201: Created
194
+
- 307: Temporary Redirect
195
+
- 400: Bad Request (invalid input)
196
+
- 404: Not Found
197
+
- 503: Service Unavailable
198
+
199
+
## Database Schema
200
+
201
+
```sql
202
+
CREATE TABLE links (
203
+
id SERIAL PRIMARY KEY,
204
+
original_url TEXT NOT NULL,
205
+
short_code VARCHAR(8) NOT NULL UNIQUE,
206
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
207
+
clicks BIGINT NOT NULL DEFAULT 0
208
+
);
209
+
210
+
CREATE TABLE clicks (
211
+
id SERIAL PRIMARY KEY,
212
+
link_id INTEGER REFERENCES links(id),
213
+
source TEXT,
214
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
215
+
);
216
+
```
+2962
Cargo.lock
+2962
Cargo.lock
···
1
+
# This file is automatically @generated by Cargo.
2
+
# It is not intended for manual editing.
3
+
version = 4
4
+
5
+
[[package]]
6
+
name = "SimpleLink"
7
+
version = "0.1.0"
8
+
dependencies = [
9
+
"actix-cors",
10
+
"actix-web",
11
+
"anyhow",
12
+
"base62",
13
+
"chrono",
14
+
"clap",
15
+
"dotenv",
16
+
"lazy_static",
17
+
"regex",
18
+
"serde",
19
+
"serde_json",
20
+
"sqlx",
21
+
"thiserror",
22
+
"tokio",
23
+
"tracing",
24
+
"tracing-subscriber",
25
+
"uuid",
26
+
]
27
+
28
+
[[package]]
29
+
name = "actix-codec"
30
+
version = "0.5.2"
31
+
source = "registry+https://github.com/rust-lang/crates.io-index"
32
+
checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a"
33
+
dependencies = [
34
+
"bitflags",
35
+
"bytes",
36
+
"futures-core",
37
+
"futures-sink",
38
+
"memchr",
39
+
"pin-project-lite",
40
+
"tokio",
41
+
"tokio-util",
42
+
"tracing",
43
+
]
44
+
45
+
[[package]]
46
+
name = "actix-cors"
47
+
version = "0.6.5"
48
+
source = "registry+https://github.com/rust-lang/crates.io-index"
49
+
checksum = "0346d8c1f762b41b458ed3145eea914966bb9ad20b9be0d6d463b20d45586370"
50
+
dependencies = [
51
+
"actix-utils",
52
+
"actix-web",
53
+
"derive_more",
54
+
"futures-util",
55
+
"log",
56
+
"once_cell",
57
+
"smallvec",
58
+
]
59
+
60
+
[[package]]
61
+
name = "actix-http"
62
+
version = "3.9.0"
63
+
source = "registry+https://github.com/rust-lang/crates.io-index"
64
+
checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4"
65
+
dependencies = [
66
+
"actix-codec",
67
+
"actix-rt",
68
+
"actix-service",
69
+
"actix-utils",
70
+
"ahash",
71
+
"base64 0.22.1",
72
+
"bitflags",
73
+
"brotli",
74
+
"bytes",
75
+
"bytestring",
76
+
"derive_more",
77
+
"encoding_rs",
78
+
"flate2",
79
+
"futures-core",
80
+
"h2",
81
+
"http",
82
+
"httparse",
83
+
"httpdate",
84
+
"itoa",
85
+
"language-tags",
86
+
"local-channel",
87
+
"mime",
88
+
"percent-encoding",
89
+
"pin-project-lite",
90
+
"rand",
91
+
"sha1",
92
+
"smallvec",
93
+
"tokio",
94
+
"tokio-util",
95
+
"tracing",
96
+
"zstd",
97
+
]
98
+
99
+
[[package]]
100
+
name = "actix-macros"
101
+
version = "0.2.4"
102
+
source = "registry+https://github.com/rust-lang/crates.io-index"
103
+
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
104
+
dependencies = [
105
+
"quote",
106
+
"syn 2.0.96",
107
+
]
108
+
109
+
[[package]]
110
+
name = "actix-router"
111
+
version = "0.5.3"
112
+
source = "registry+https://github.com/rust-lang/crates.io-index"
113
+
checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8"
114
+
dependencies = [
115
+
"bytestring",
116
+
"cfg-if",
117
+
"http",
118
+
"regex",
119
+
"regex-lite",
120
+
"serde",
121
+
"tracing",
122
+
]
123
+
124
+
[[package]]
125
+
name = "actix-rt"
126
+
version = "2.10.0"
127
+
source = "registry+https://github.com/rust-lang/crates.io-index"
128
+
checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208"
129
+
dependencies = [
130
+
"futures-core",
131
+
"tokio",
132
+
]
133
+
134
+
[[package]]
135
+
name = "actix-server"
136
+
version = "2.5.0"
137
+
source = "registry+https://github.com/rust-lang/crates.io-index"
138
+
checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894"
139
+
dependencies = [
140
+
"actix-rt",
141
+
"actix-service",
142
+
"actix-utils",
143
+
"futures-core",
144
+
"futures-util",
145
+
"mio",
146
+
"socket2",
147
+
"tokio",
148
+
"tracing",
149
+
]
150
+
151
+
[[package]]
152
+
name = "actix-service"
153
+
version = "2.0.2"
154
+
source = "registry+https://github.com/rust-lang/crates.io-index"
155
+
checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a"
156
+
dependencies = [
157
+
"futures-core",
158
+
"paste",
159
+
"pin-project-lite",
160
+
]
161
+
162
+
[[package]]
163
+
name = "actix-utils"
164
+
version = "3.0.1"
165
+
source = "registry+https://github.com/rust-lang/crates.io-index"
166
+
checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8"
167
+
dependencies = [
168
+
"local-waker",
169
+
"pin-project-lite",
170
+
]
171
+
172
+
[[package]]
173
+
name = "actix-web"
174
+
version = "4.9.0"
175
+
source = "registry+https://github.com/rust-lang/crates.io-index"
176
+
checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38"
177
+
dependencies = [
178
+
"actix-codec",
179
+
"actix-http",
180
+
"actix-macros",
181
+
"actix-router",
182
+
"actix-rt",
183
+
"actix-server",
184
+
"actix-service",
185
+
"actix-utils",
186
+
"actix-web-codegen",
187
+
"ahash",
188
+
"bytes",
189
+
"bytestring",
190
+
"cfg-if",
191
+
"cookie",
192
+
"derive_more",
193
+
"encoding_rs",
194
+
"futures-core",
195
+
"futures-util",
196
+
"impl-more",
197
+
"itoa",
198
+
"language-tags",
199
+
"log",
200
+
"mime",
201
+
"once_cell",
202
+
"pin-project-lite",
203
+
"regex",
204
+
"regex-lite",
205
+
"serde",
206
+
"serde_json",
207
+
"serde_urlencoded",
208
+
"smallvec",
209
+
"socket2",
210
+
"time",
211
+
"url",
212
+
]
213
+
214
+
[[package]]
215
+
name = "actix-web-codegen"
216
+
version = "4.3.0"
217
+
source = "registry+https://github.com/rust-lang/crates.io-index"
218
+
checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8"
219
+
dependencies = [
220
+
"actix-router",
221
+
"proc-macro2",
222
+
"quote",
223
+
"syn 2.0.96",
224
+
]
225
+
226
+
[[package]]
227
+
name = "addr2line"
228
+
version = "0.24.2"
229
+
source = "registry+https://github.com/rust-lang/crates.io-index"
230
+
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
231
+
dependencies = [
232
+
"gimli",
233
+
]
234
+
235
+
[[package]]
236
+
name = "adler2"
237
+
version = "2.0.0"
238
+
source = "registry+https://github.com/rust-lang/crates.io-index"
239
+
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
240
+
241
+
[[package]]
242
+
name = "ahash"
243
+
version = "0.8.11"
244
+
source = "registry+https://github.com/rust-lang/crates.io-index"
245
+
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
246
+
dependencies = [
247
+
"cfg-if",
248
+
"getrandom",
249
+
"once_cell",
250
+
"version_check",
251
+
"zerocopy",
252
+
]
253
+
254
+
[[package]]
255
+
name = "aho-corasick"
256
+
version = "1.1.3"
257
+
source = "registry+https://github.com/rust-lang/crates.io-index"
258
+
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
259
+
dependencies = [
260
+
"memchr",
261
+
]
262
+
263
+
[[package]]
264
+
name = "alloc-no-stdlib"
265
+
version = "2.0.4"
266
+
source = "registry+https://github.com/rust-lang/crates.io-index"
267
+
checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
268
+
269
+
[[package]]
270
+
name = "alloc-stdlib"
271
+
version = "0.2.2"
272
+
source = "registry+https://github.com/rust-lang/crates.io-index"
273
+
checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
274
+
dependencies = [
275
+
"alloc-no-stdlib",
276
+
]
277
+
278
+
[[package]]
279
+
name = "allocator-api2"
280
+
version = "0.2.21"
281
+
source = "registry+https://github.com/rust-lang/crates.io-index"
282
+
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
283
+
284
+
[[package]]
285
+
name = "android-tzdata"
286
+
version = "0.1.1"
287
+
source = "registry+https://github.com/rust-lang/crates.io-index"
288
+
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
289
+
290
+
[[package]]
291
+
name = "android_system_properties"
292
+
version = "0.1.5"
293
+
source = "registry+https://github.com/rust-lang/crates.io-index"
294
+
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
295
+
dependencies = [
296
+
"libc",
297
+
]
298
+
299
+
[[package]]
300
+
name = "anstream"
301
+
version = "0.6.18"
302
+
source = "registry+https://github.com/rust-lang/crates.io-index"
303
+
checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
304
+
dependencies = [
305
+
"anstyle",
306
+
"anstyle-parse",
307
+
"anstyle-query",
308
+
"anstyle-wincon",
309
+
"colorchoice",
310
+
"is_terminal_polyfill",
311
+
"utf8parse",
312
+
]
313
+
314
+
[[package]]
315
+
name = "anstyle"
316
+
version = "1.0.10"
317
+
source = "registry+https://github.com/rust-lang/crates.io-index"
318
+
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
319
+
320
+
[[package]]
321
+
name = "anstyle-parse"
322
+
version = "0.2.6"
323
+
source = "registry+https://github.com/rust-lang/crates.io-index"
324
+
checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
325
+
dependencies = [
326
+
"utf8parse",
327
+
]
328
+
329
+
[[package]]
330
+
name = "anstyle-query"
331
+
version = "1.1.2"
332
+
source = "registry+https://github.com/rust-lang/crates.io-index"
333
+
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
334
+
dependencies = [
335
+
"windows-sys 0.59.0",
336
+
]
337
+
338
+
[[package]]
339
+
name = "anstyle-wincon"
340
+
version = "3.0.7"
341
+
source = "registry+https://github.com/rust-lang/crates.io-index"
342
+
checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
343
+
dependencies = [
344
+
"anstyle",
345
+
"once_cell",
346
+
"windows-sys 0.59.0",
347
+
]
348
+
349
+
[[package]]
350
+
name = "anyhow"
351
+
version = "1.0.95"
352
+
source = "registry+https://github.com/rust-lang/crates.io-index"
353
+
checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
354
+
355
+
[[package]]
356
+
name = "atoi"
357
+
version = "2.0.0"
358
+
source = "registry+https://github.com/rust-lang/crates.io-index"
359
+
checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
360
+
dependencies = [
361
+
"num-traits",
362
+
]
363
+
364
+
[[package]]
365
+
name = "autocfg"
366
+
version = "1.4.0"
367
+
source = "registry+https://github.com/rust-lang/crates.io-index"
368
+
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
369
+
370
+
[[package]]
371
+
name = "backtrace"
372
+
version = "0.3.74"
373
+
source = "registry+https://github.com/rust-lang/crates.io-index"
374
+
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
375
+
dependencies = [
376
+
"addr2line",
377
+
"cfg-if",
378
+
"libc",
379
+
"miniz_oxide",
380
+
"object",
381
+
"rustc-demangle",
382
+
"windows-targets 0.52.6",
383
+
]
384
+
385
+
[[package]]
386
+
name = "base62"
387
+
version = "2.2.1"
388
+
source = "registry+https://github.com/rust-lang/crates.io-index"
389
+
checksum = "10e52a7bcb1d6beebee21fb5053af9e3cbb7a7ed1a4909e534040e676437ab1f"
390
+
dependencies = [
391
+
"rustversion",
392
+
]
393
+
394
+
[[package]]
395
+
name = "base64"
396
+
version = "0.21.7"
397
+
source = "registry+https://github.com/rust-lang/crates.io-index"
398
+
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
399
+
400
+
[[package]]
401
+
name = "base64"
402
+
version = "0.22.1"
403
+
source = "registry+https://github.com/rust-lang/crates.io-index"
404
+
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
405
+
406
+
[[package]]
407
+
name = "base64ct"
408
+
version = "1.6.0"
409
+
source = "registry+https://github.com/rust-lang/crates.io-index"
410
+
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
411
+
412
+
[[package]]
413
+
name = "bitflags"
414
+
version = "2.8.0"
415
+
source = "registry+https://github.com/rust-lang/crates.io-index"
416
+
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
417
+
dependencies = [
418
+
"serde",
419
+
]
420
+
421
+
[[package]]
422
+
name = "block-buffer"
423
+
version = "0.10.4"
424
+
source = "registry+https://github.com/rust-lang/crates.io-index"
425
+
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
426
+
dependencies = [
427
+
"generic-array",
428
+
]
429
+
430
+
[[package]]
431
+
name = "brotli"
432
+
version = "6.0.0"
433
+
source = "registry+https://github.com/rust-lang/crates.io-index"
434
+
checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b"
435
+
dependencies = [
436
+
"alloc-no-stdlib",
437
+
"alloc-stdlib",
438
+
"brotli-decompressor",
439
+
]
440
+
441
+
[[package]]
442
+
name = "brotli-decompressor"
443
+
version = "4.0.2"
444
+
source = "registry+https://github.com/rust-lang/crates.io-index"
445
+
checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37"
446
+
dependencies = [
447
+
"alloc-no-stdlib",
448
+
"alloc-stdlib",
449
+
]
450
+
451
+
[[package]]
452
+
name = "bumpalo"
453
+
version = "3.16.0"
454
+
source = "registry+https://github.com/rust-lang/crates.io-index"
455
+
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
456
+
457
+
[[package]]
458
+
name = "byteorder"
459
+
version = "1.5.0"
460
+
source = "registry+https://github.com/rust-lang/crates.io-index"
461
+
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
462
+
463
+
[[package]]
464
+
name = "bytes"
465
+
version = "1.9.0"
466
+
source = "registry+https://github.com/rust-lang/crates.io-index"
467
+
checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
468
+
469
+
[[package]]
470
+
name = "bytestring"
471
+
version = "1.4.0"
472
+
source = "registry+https://github.com/rust-lang/crates.io-index"
473
+
checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f"
474
+
dependencies = [
475
+
"bytes",
476
+
]
477
+
478
+
[[package]]
479
+
name = "cc"
480
+
version = "1.2.10"
481
+
source = "registry+https://github.com/rust-lang/crates.io-index"
482
+
checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229"
483
+
dependencies = [
484
+
"jobserver",
485
+
"libc",
486
+
"shlex",
487
+
]
488
+
489
+
[[package]]
490
+
name = "cfg-if"
491
+
version = "1.0.0"
492
+
source = "registry+https://github.com/rust-lang/crates.io-index"
493
+
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
494
+
495
+
[[package]]
496
+
name = "chrono"
497
+
version = "0.4.39"
498
+
source = "registry+https://github.com/rust-lang/crates.io-index"
499
+
checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
500
+
dependencies = [
501
+
"android-tzdata",
502
+
"iana-time-zone",
503
+
"js-sys",
504
+
"num-traits",
505
+
"serde",
506
+
"wasm-bindgen",
507
+
"windows-targets 0.52.6",
508
+
]
509
+
510
+
[[package]]
511
+
name = "clap"
512
+
version = "4.5.27"
513
+
source = "registry+https://github.com/rust-lang/crates.io-index"
514
+
checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796"
515
+
dependencies = [
516
+
"clap_builder",
517
+
"clap_derive",
518
+
]
519
+
520
+
[[package]]
521
+
name = "clap_builder"
522
+
version = "4.5.27"
523
+
source = "registry+https://github.com/rust-lang/crates.io-index"
524
+
checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7"
525
+
dependencies = [
526
+
"anstream",
527
+
"anstyle",
528
+
"clap_lex",
529
+
"strsim",
530
+
]
531
+
532
+
[[package]]
533
+
name = "clap_derive"
534
+
version = "4.5.24"
535
+
source = "registry+https://github.com/rust-lang/crates.io-index"
536
+
checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c"
537
+
dependencies = [
538
+
"heck 0.5.0",
539
+
"proc-macro2",
540
+
"quote",
541
+
"syn 2.0.96",
542
+
]
543
+
544
+
[[package]]
545
+
name = "clap_lex"
546
+
version = "0.7.4"
547
+
source = "registry+https://github.com/rust-lang/crates.io-index"
548
+
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
549
+
550
+
[[package]]
551
+
name = "colorchoice"
552
+
version = "1.0.3"
553
+
source = "registry+https://github.com/rust-lang/crates.io-index"
554
+
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
555
+
556
+
[[package]]
557
+
name = "const-oid"
558
+
version = "0.9.6"
559
+
source = "registry+https://github.com/rust-lang/crates.io-index"
560
+
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
561
+
562
+
[[package]]
563
+
name = "convert_case"
564
+
version = "0.4.0"
565
+
source = "registry+https://github.com/rust-lang/crates.io-index"
566
+
checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
567
+
568
+
[[package]]
569
+
name = "cookie"
570
+
version = "0.16.2"
571
+
source = "registry+https://github.com/rust-lang/crates.io-index"
572
+
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
573
+
dependencies = [
574
+
"percent-encoding",
575
+
"time",
576
+
"version_check",
577
+
]
578
+
579
+
[[package]]
580
+
name = "core-foundation"
581
+
version = "0.9.4"
582
+
source = "registry+https://github.com/rust-lang/crates.io-index"
583
+
checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
584
+
dependencies = [
585
+
"core-foundation-sys",
586
+
"libc",
587
+
]
588
+
589
+
[[package]]
590
+
name = "core-foundation-sys"
591
+
version = "0.8.7"
592
+
source = "registry+https://github.com/rust-lang/crates.io-index"
593
+
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
594
+
595
+
[[package]]
596
+
name = "cpufeatures"
597
+
version = "0.2.17"
598
+
source = "registry+https://github.com/rust-lang/crates.io-index"
599
+
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
600
+
dependencies = [
601
+
"libc",
602
+
]
603
+
604
+
[[package]]
605
+
name = "crc"
606
+
version = "3.2.1"
607
+
source = "registry+https://github.com/rust-lang/crates.io-index"
608
+
checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
609
+
dependencies = [
610
+
"crc-catalog",
611
+
]
612
+
613
+
[[package]]
614
+
name = "crc-catalog"
615
+
version = "2.4.0"
616
+
source = "registry+https://github.com/rust-lang/crates.io-index"
617
+
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
618
+
619
+
[[package]]
620
+
name = "crc32fast"
621
+
version = "1.4.2"
622
+
source = "registry+https://github.com/rust-lang/crates.io-index"
623
+
checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
624
+
dependencies = [
625
+
"cfg-if",
626
+
]
627
+
628
+
[[package]]
629
+
name = "crossbeam-queue"
630
+
version = "0.3.12"
631
+
source = "registry+https://github.com/rust-lang/crates.io-index"
632
+
checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
633
+
dependencies = [
634
+
"crossbeam-utils",
635
+
]
636
+
637
+
[[package]]
638
+
name = "crossbeam-utils"
639
+
version = "0.8.21"
640
+
source = "registry+https://github.com/rust-lang/crates.io-index"
641
+
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
642
+
643
+
[[package]]
644
+
name = "crypto-common"
645
+
version = "0.1.6"
646
+
source = "registry+https://github.com/rust-lang/crates.io-index"
647
+
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
648
+
dependencies = [
649
+
"generic-array",
650
+
"typenum",
651
+
]
652
+
653
+
[[package]]
654
+
name = "der"
655
+
version = "0.7.9"
656
+
source = "registry+https://github.com/rust-lang/crates.io-index"
657
+
checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
658
+
dependencies = [
659
+
"const-oid",
660
+
"pem-rfc7468",
661
+
"zeroize",
662
+
]
663
+
664
+
[[package]]
665
+
name = "deranged"
666
+
version = "0.3.11"
667
+
source = "registry+https://github.com/rust-lang/crates.io-index"
668
+
checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
669
+
dependencies = [
670
+
"powerfmt",
671
+
]
672
+
673
+
[[package]]
674
+
name = "derive_more"
675
+
version = "0.99.18"
676
+
source = "registry+https://github.com/rust-lang/crates.io-index"
677
+
checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce"
678
+
dependencies = [
679
+
"convert_case",
680
+
"proc-macro2",
681
+
"quote",
682
+
"rustc_version",
683
+
"syn 2.0.96",
684
+
]
685
+
686
+
[[package]]
687
+
name = "digest"
688
+
version = "0.10.7"
689
+
source = "registry+https://github.com/rust-lang/crates.io-index"
690
+
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
691
+
dependencies = [
692
+
"block-buffer",
693
+
"const-oid",
694
+
"crypto-common",
695
+
"subtle",
696
+
]
697
+
698
+
[[package]]
699
+
name = "displaydoc"
700
+
version = "0.2.5"
701
+
source = "registry+https://github.com/rust-lang/crates.io-index"
702
+
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
703
+
dependencies = [
704
+
"proc-macro2",
705
+
"quote",
706
+
"syn 2.0.96",
707
+
]
708
+
709
+
[[package]]
710
+
name = "dotenv"
711
+
version = "0.15.0"
712
+
source = "registry+https://github.com/rust-lang/crates.io-index"
713
+
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
714
+
715
+
[[package]]
716
+
name = "dotenvy"
717
+
version = "0.15.7"
718
+
source = "registry+https://github.com/rust-lang/crates.io-index"
719
+
checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
720
+
721
+
[[package]]
722
+
name = "either"
723
+
version = "1.13.0"
724
+
source = "registry+https://github.com/rust-lang/crates.io-index"
725
+
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
726
+
dependencies = [
727
+
"serde",
728
+
]
729
+
730
+
[[package]]
731
+
name = "encoding_rs"
732
+
version = "0.8.35"
733
+
source = "registry+https://github.com/rust-lang/crates.io-index"
734
+
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
735
+
dependencies = [
736
+
"cfg-if",
737
+
]
738
+
739
+
[[package]]
740
+
name = "equivalent"
741
+
version = "1.0.1"
742
+
source = "registry+https://github.com/rust-lang/crates.io-index"
743
+
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
744
+
745
+
[[package]]
746
+
name = "errno"
747
+
version = "0.3.10"
748
+
source = "registry+https://github.com/rust-lang/crates.io-index"
749
+
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
750
+
dependencies = [
751
+
"libc",
752
+
"windows-sys 0.59.0",
753
+
]
754
+
755
+
[[package]]
756
+
name = "etcetera"
757
+
version = "0.8.0"
758
+
source = "registry+https://github.com/rust-lang/crates.io-index"
759
+
checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943"
760
+
dependencies = [
761
+
"cfg-if",
762
+
"home",
763
+
"windows-sys 0.48.0",
764
+
]
765
+
766
+
[[package]]
767
+
name = "event-listener"
768
+
version = "2.5.3"
769
+
source = "registry+https://github.com/rust-lang/crates.io-index"
770
+
checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
771
+
772
+
[[package]]
773
+
name = "fastrand"
774
+
version = "2.3.0"
775
+
source = "registry+https://github.com/rust-lang/crates.io-index"
776
+
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
777
+
778
+
[[package]]
779
+
name = "flate2"
780
+
version = "1.0.35"
781
+
source = "registry+https://github.com/rust-lang/crates.io-index"
782
+
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
783
+
dependencies = [
784
+
"crc32fast",
785
+
"miniz_oxide",
786
+
]
787
+
788
+
[[package]]
789
+
name = "flume"
790
+
version = "0.11.1"
791
+
source = "registry+https://github.com/rust-lang/crates.io-index"
792
+
checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
793
+
dependencies = [
794
+
"futures-core",
795
+
"futures-sink",
796
+
"spin",
797
+
]
798
+
799
+
[[package]]
800
+
name = "fnv"
801
+
version = "1.0.7"
802
+
source = "registry+https://github.com/rust-lang/crates.io-index"
803
+
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
804
+
805
+
[[package]]
806
+
name = "foreign-types"
807
+
version = "0.3.2"
808
+
source = "registry+https://github.com/rust-lang/crates.io-index"
809
+
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
810
+
dependencies = [
811
+
"foreign-types-shared",
812
+
]
813
+
814
+
[[package]]
815
+
name = "foreign-types-shared"
816
+
version = "0.1.1"
817
+
source = "registry+https://github.com/rust-lang/crates.io-index"
818
+
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
819
+
820
+
[[package]]
821
+
name = "form_urlencoded"
822
+
version = "1.2.1"
823
+
source = "registry+https://github.com/rust-lang/crates.io-index"
824
+
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
825
+
dependencies = [
826
+
"percent-encoding",
827
+
]
828
+
829
+
[[package]]
830
+
name = "futures-channel"
831
+
version = "0.3.31"
832
+
source = "registry+https://github.com/rust-lang/crates.io-index"
833
+
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
834
+
dependencies = [
835
+
"futures-core",
836
+
"futures-sink",
837
+
]
838
+
839
+
[[package]]
840
+
name = "futures-core"
841
+
version = "0.3.31"
842
+
source = "registry+https://github.com/rust-lang/crates.io-index"
843
+
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
844
+
845
+
[[package]]
846
+
name = "futures-executor"
847
+
version = "0.3.31"
848
+
source = "registry+https://github.com/rust-lang/crates.io-index"
849
+
checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
850
+
dependencies = [
851
+
"futures-core",
852
+
"futures-task",
853
+
"futures-util",
854
+
]
855
+
856
+
[[package]]
857
+
name = "futures-intrusive"
858
+
version = "0.5.0"
859
+
source = "registry+https://github.com/rust-lang/crates.io-index"
860
+
checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f"
861
+
dependencies = [
862
+
"futures-core",
863
+
"lock_api",
864
+
"parking_lot",
865
+
]
866
+
867
+
[[package]]
868
+
name = "futures-io"
869
+
version = "0.3.31"
870
+
source = "registry+https://github.com/rust-lang/crates.io-index"
871
+
checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
872
+
873
+
[[package]]
874
+
name = "futures-sink"
875
+
version = "0.3.31"
876
+
source = "registry+https://github.com/rust-lang/crates.io-index"
877
+
checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
878
+
879
+
[[package]]
880
+
name = "futures-task"
881
+
version = "0.3.31"
882
+
source = "registry+https://github.com/rust-lang/crates.io-index"
883
+
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
884
+
885
+
[[package]]
886
+
name = "futures-util"
887
+
version = "0.3.31"
888
+
source = "registry+https://github.com/rust-lang/crates.io-index"
889
+
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
890
+
dependencies = [
891
+
"futures-core",
892
+
"futures-io",
893
+
"futures-sink",
894
+
"futures-task",
895
+
"memchr",
896
+
"pin-project-lite",
897
+
"pin-utils",
898
+
"slab",
899
+
]
900
+
901
+
[[package]]
902
+
name = "generic-array"
903
+
version = "0.14.7"
904
+
source = "registry+https://github.com/rust-lang/crates.io-index"
905
+
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
906
+
dependencies = [
907
+
"typenum",
908
+
"version_check",
909
+
]
910
+
911
+
[[package]]
912
+
name = "getrandom"
913
+
version = "0.2.15"
914
+
source = "registry+https://github.com/rust-lang/crates.io-index"
915
+
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
916
+
dependencies = [
917
+
"cfg-if",
918
+
"libc",
919
+
"wasi",
920
+
]
921
+
922
+
[[package]]
923
+
name = "gimli"
924
+
version = "0.31.1"
925
+
source = "registry+https://github.com/rust-lang/crates.io-index"
926
+
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
927
+
928
+
[[package]]
929
+
name = "h2"
930
+
version = "0.3.26"
931
+
source = "registry+https://github.com/rust-lang/crates.io-index"
932
+
checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
933
+
dependencies = [
934
+
"bytes",
935
+
"fnv",
936
+
"futures-core",
937
+
"futures-sink",
938
+
"futures-util",
939
+
"http",
940
+
"indexmap",
941
+
"slab",
942
+
"tokio",
943
+
"tokio-util",
944
+
"tracing",
945
+
]
946
+
947
+
[[package]]
948
+
name = "hashbrown"
949
+
version = "0.14.5"
950
+
source = "registry+https://github.com/rust-lang/crates.io-index"
951
+
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
952
+
dependencies = [
953
+
"ahash",
954
+
"allocator-api2",
955
+
]
956
+
957
+
[[package]]
958
+
name = "hashbrown"
959
+
version = "0.15.2"
960
+
source = "registry+https://github.com/rust-lang/crates.io-index"
961
+
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
962
+
963
+
[[package]]
964
+
name = "hashlink"
965
+
version = "0.8.4"
966
+
source = "registry+https://github.com/rust-lang/crates.io-index"
967
+
checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
968
+
dependencies = [
969
+
"hashbrown 0.14.5",
970
+
]
971
+
972
+
[[package]]
973
+
name = "heck"
974
+
version = "0.4.1"
975
+
source = "registry+https://github.com/rust-lang/crates.io-index"
976
+
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
977
+
dependencies = [
978
+
"unicode-segmentation",
979
+
]
980
+
981
+
[[package]]
982
+
name = "heck"
983
+
version = "0.5.0"
984
+
source = "registry+https://github.com/rust-lang/crates.io-index"
985
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
986
+
987
+
[[package]]
988
+
name = "hex"
989
+
version = "0.4.3"
990
+
source = "registry+https://github.com/rust-lang/crates.io-index"
991
+
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
992
+
993
+
[[package]]
994
+
name = "hkdf"
995
+
version = "0.12.4"
996
+
source = "registry+https://github.com/rust-lang/crates.io-index"
997
+
checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
998
+
dependencies = [
999
+
"hmac",
1000
+
]
1001
+
1002
+
[[package]]
1003
+
name = "hmac"
1004
+
version = "0.12.1"
1005
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1006
+
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
1007
+
dependencies = [
1008
+
"digest",
1009
+
]
1010
+
1011
+
[[package]]
1012
+
name = "home"
1013
+
version = "0.5.11"
1014
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1015
+
checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf"
1016
+
dependencies = [
1017
+
"windows-sys 0.59.0",
1018
+
]
1019
+
1020
+
[[package]]
1021
+
name = "http"
1022
+
version = "0.2.12"
1023
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1024
+
checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
1025
+
dependencies = [
1026
+
"bytes",
1027
+
"fnv",
1028
+
"itoa",
1029
+
]
1030
+
1031
+
[[package]]
1032
+
name = "httparse"
1033
+
version = "1.9.5"
1034
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1035
+
checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
1036
+
1037
+
[[package]]
1038
+
name = "httpdate"
1039
+
version = "1.0.3"
1040
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1041
+
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
1042
+
1043
+
[[package]]
1044
+
name = "iana-time-zone"
1045
+
version = "0.1.61"
1046
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1047
+
checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
1048
+
dependencies = [
1049
+
"android_system_properties",
1050
+
"core-foundation-sys",
1051
+
"iana-time-zone-haiku",
1052
+
"js-sys",
1053
+
"wasm-bindgen",
1054
+
"windows-core",
1055
+
]
1056
+
1057
+
[[package]]
1058
+
name = "iana-time-zone-haiku"
1059
+
version = "0.1.2"
1060
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1061
+
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
1062
+
dependencies = [
1063
+
"cc",
1064
+
]
1065
+
1066
+
[[package]]
1067
+
name = "icu_collections"
1068
+
version = "1.5.0"
1069
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1070
+
checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
1071
+
dependencies = [
1072
+
"displaydoc",
1073
+
"yoke",
1074
+
"zerofrom",
1075
+
"zerovec",
1076
+
]
1077
+
1078
+
[[package]]
1079
+
name = "icu_locid"
1080
+
version = "1.5.0"
1081
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1082
+
checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
1083
+
dependencies = [
1084
+
"displaydoc",
1085
+
"litemap",
1086
+
"tinystr",
1087
+
"writeable",
1088
+
"zerovec",
1089
+
]
1090
+
1091
+
[[package]]
1092
+
name = "icu_locid_transform"
1093
+
version = "1.5.0"
1094
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1095
+
checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
1096
+
dependencies = [
1097
+
"displaydoc",
1098
+
"icu_locid",
1099
+
"icu_locid_transform_data",
1100
+
"icu_provider",
1101
+
"tinystr",
1102
+
"zerovec",
1103
+
]
1104
+
1105
+
[[package]]
1106
+
name = "icu_locid_transform_data"
1107
+
version = "1.5.0"
1108
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1109
+
checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
1110
+
1111
+
[[package]]
1112
+
name = "icu_normalizer"
1113
+
version = "1.5.0"
1114
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1115
+
checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
1116
+
dependencies = [
1117
+
"displaydoc",
1118
+
"icu_collections",
1119
+
"icu_normalizer_data",
1120
+
"icu_properties",
1121
+
"icu_provider",
1122
+
"smallvec",
1123
+
"utf16_iter",
1124
+
"utf8_iter",
1125
+
"write16",
1126
+
"zerovec",
1127
+
]
1128
+
1129
+
[[package]]
1130
+
name = "icu_normalizer_data"
1131
+
version = "1.5.0"
1132
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1133
+
checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
1134
+
1135
+
[[package]]
1136
+
name = "icu_properties"
1137
+
version = "1.5.1"
1138
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1139
+
checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
1140
+
dependencies = [
1141
+
"displaydoc",
1142
+
"icu_collections",
1143
+
"icu_locid_transform",
1144
+
"icu_properties_data",
1145
+
"icu_provider",
1146
+
"tinystr",
1147
+
"zerovec",
1148
+
]
1149
+
1150
+
[[package]]
1151
+
name = "icu_properties_data"
1152
+
version = "1.5.0"
1153
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1154
+
checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
1155
+
1156
+
[[package]]
1157
+
name = "icu_provider"
1158
+
version = "1.5.0"
1159
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1160
+
checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
1161
+
dependencies = [
1162
+
"displaydoc",
1163
+
"icu_locid",
1164
+
"icu_provider_macros",
1165
+
"stable_deref_trait",
1166
+
"tinystr",
1167
+
"writeable",
1168
+
"yoke",
1169
+
"zerofrom",
1170
+
"zerovec",
1171
+
]
1172
+
1173
+
[[package]]
1174
+
name = "icu_provider_macros"
1175
+
version = "1.5.0"
1176
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1177
+
checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
1178
+
dependencies = [
1179
+
"proc-macro2",
1180
+
"quote",
1181
+
"syn 2.0.96",
1182
+
]
1183
+
1184
+
[[package]]
1185
+
name = "idna"
1186
+
version = "1.0.3"
1187
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1188
+
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
1189
+
dependencies = [
1190
+
"idna_adapter",
1191
+
"smallvec",
1192
+
"utf8_iter",
1193
+
]
1194
+
1195
+
[[package]]
1196
+
name = "idna_adapter"
1197
+
version = "1.2.0"
1198
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1199
+
checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
1200
+
dependencies = [
1201
+
"icu_normalizer",
1202
+
"icu_properties",
1203
+
]
1204
+
1205
+
[[package]]
1206
+
name = "impl-more"
1207
+
version = "0.1.9"
1208
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1209
+
checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2"
1210
+
1211
+
[[package]]
1212
+
name = "indexmap"
1213
+
version = "2.7.1"
1214
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1215
+
checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
1216
+
dependencies = [
1217
+
"equivalent",
1218
+
"hashbrown 0.15.2",
1219
+
]
1220
+
1221
+
[[package]]
1222
+
name = "is_terminal_polyfill"
1223
+
version = "1.70.1"
1224
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1225
+
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
1226
+
1227
+
[[package]]
1228
+
name = "itoa"
1229
+
version = "1.0.14"
1230
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1231
+
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
1232
+
1233
+
[[package]]
1234
+
name = "jobserver"
1235
+
version = "0.1.32"
1236
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1237
+
checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
1238
+
dependencies = [
1239
+
"libc",
1240
+
]
1241
+
1242
+
[[package]]
1243
+
name = "js-sys"
1244
+
version = "0.3.77"
1245
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1246
+
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
1247
+
dependencies = [
1248
+
"once_cell",
1249
+
"wasm-bindgen",
1250
+
]
1251
+
1252
+
[[package]]
1253
+
name = "language-tags"
1254
+
version = "0.3.2"
1255
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1256
+
checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
1257
+
1258
+
[[package]]
1259
+
name = "lazy_static"
1260
+
version = "1.5.0"
1261
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1262
+
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
1263
+
dependencies = [
1264
+
"spin",
1265
+
]
1266
+
1267
+
[[package]]
1268
+
name = "libc"
1269
+
version = "0.2.169"
1270
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1271
+
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
1272
+
1273
+
[[package]]
1274
+
name = "libm"
1275
+
version = "0.2.11"
1276
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1277
+
checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
1278
+
1279
+
[[package]]
1280
+
name = "libsqlite3-sys"
1281
+
version = "0.27.0"
1282
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1283
+
checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
1284
+
dependencies = [
1285
+
"cc",
1286
+
"pkg-config",
1287
+
"vcpkg",
1288
+
]
1289
+
1290
+
[[package]]
1291
+
name = "linux-raw-sys"
1292
+
version = "0.4.15"
1293
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1294
+
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
1295
+
1296
+
[[package]]
1297
+
name = "litemap"
1298
+
version = "0.7.4"
1299
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1300
+
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
1301
+
1302
+
[[package]]
1303
+
name = "local-channel"
1304
+
version = "0.1.5"
1305
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1306
+
checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8"
1307
+
dependencies = [
1308
+
"futures-core",
1309
+
"futures-sink",
1310
+
"local-waker",
1311
+
]
1312
+
1313
+
[[package]]
1314
+
name = "local-waker"
1315
+
version = "0.1.4"
1316
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1317
+
checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487"
1318
+
1319
+
[[package]]
1320
+
name = "lock_api"
1321
+
version = "0.4.12"
1322
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1323
+
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
1324
+
dependencies = [
1325
+
"autocfg",
1326
+
"scopeguard",
1327
+
]
1328
+
1329
+
[[package]]
1330
+
name = "log"
1331
+
version = "0.4.25"
1332
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1333
+
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
1334
+
1335
+
[[package]]
1336
+
name = "md-5"
1337
+
version = "0.10.6"
1338
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1339
+
checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
1340
+
dependencies = [
1341
+
"cfg-if",
1342
+
"digest",
1343
+
]
1344
+
1345
+
[[package]]
1346
+
name = "memchr"
1347
+
version = "2.7.4"
1348
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1349
+
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
1350
+
1351
+
[[package]]
1352
+
name = "mime"
1353
+
version = "0.3.17"
1354
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1355
+
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1356
+
1357
+
[[package]]
1358
+
name = "minimal-lexical"
1359
+
version = "0.2.1"
1360
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1361
+
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
1362
+
1363
+
[[package]]
1364
+
name = "miniz_oxide"
1365
+
version = "0.8.3"
1366
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1367
+
checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924"
1368
+
dependencies = [
1369
+
"adler2",
1370
+
]
1371
+
1372
+
[[package]]
1373
+
name = "mio"
1374
+
version = "1.0.3"
1375
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1376
+
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
1377
+
dependencies = [
1378
+
"libc",
1379
+
"log",
1380
+
"wasi",
1381
+
"windows-sys 0.52.0",
1382
+
]
1383
+
1384
+
[[package]]
1385
+
name = "native-tls"
1386
+
version = "0.2.12"
1387
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1388
+
checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
1389
+
dependencies = [
1390
+
"libc",
1391
+
"log",
1392
+
"openssl",
1393
+
"openssl-probe",
1394
+
"openssl-sys",
1395
+
"schannel",
1396
+
"security-framework",
1397
+
"security-framework-sys",
1398
+
"tempfile",
1399
+
]
1400
+
1401
+
[[package]]
1402
+
name = "nom"
1403
+
version = "7.1.3"
1404
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1405
+
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
1406
+
dependencies = [
1407
+
"memchr",
1408
+
"minimal-lexical",
1409
+
]
1410
+
1411
+
[[package]]
1412
+
name = "nu-ansi-term"
1413
+
version = "0.46.0"
1414
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1415
+
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
1416
+
dependencies = [
1417
+
"overload",
1418
+
"winapi",
1419
+
]
1420
+
1421
+
[[package]]
1422
+
name = "num-bigint-dig"
1423
+
version = "0.8.4"
1424
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1425
+
checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151"
1426
+
dependencies = [
1427
+
"byteorder",
1428
+
"lazy_static",
1429
+
"libm",
1430
+
"num-integer",
1431
+
"num-iter",
1432
+
"num-traits",
1433
+
"rand",
1434
+
"smallvec",
1435
+
"zeroize",
1436
+
]
1437
+
1438
+
[[package]]
1439
+
name = "num-conv"
1440
+
version = "0.1.0"
1441
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1442
+
checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
1443
+
1444
+
[[package]]
1445
+
name = "num-integer"
1446
+
version = "0.1.46"
1447
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1448
+
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
1449
+
dependencies = [
1450
+
"num-traits",
1451
+
]
1452
+
1453
+
[[package]]
1454
+
name = "num-iter"
1455
+
version = "0.1.45"
1456
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1457
+
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
1458
+
dependencies = [
1459
+
"autocfg",
1460
+
"num-integer",
1461
+
"num-traits",
1462
+
]
1463
+
1464
+
[[package]]
1465
+
name = "num-traits"
1466
+
version = "0.2.19"
1467
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1468
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1469
+
dependencies = [
1470
+
"autocfg",
1471
+
"libm",
1472
+
]
1473
+
1474
+
[[package]]
1475
+
name = "object"
1476
+
version = "0.36.7"
1477
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1478
+
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
1479
+
dependencies = [
1480
+
"memchr",
1481
+
]
1482
+
1483
+
[[package]]
1484
+
name = "once_cell"
1485
+
version = "1.20.2"
1486
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1487
+
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
1488
+
1489
+
[[package]]
1490
+
name = "openssl"
1491
+
version = "0.10.68"
1492
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1493
+
checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
1494
+
dependencies = [
1495
+
"bitflags",
1496
+
"cfg-if",
1497
+
"foreign-types",
1498
+
"libc",
1499
+
"once_cell",
1500
+
"openssl-macros",
1501
+
"openssl-sys",
1502
+
]
1503
+
1504
+
[[package]]
1505
+
name = "openssl-macros"
1506
+
version = "0.1.1"
1507
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1508
+
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
1509
+
dependencies = [
1510
+
"proc-macro2",
1511
+
"quote",
1512
+
"syn 2.0.96",
1513
+
]
1514
+
1515
+
[[package]]
1516
+
name = "openssl-probe"
1517
+
version = "0.1.6"
1518
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1519
+
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
1520
+
1521
+
[[package]]
1522
+
name = "openssl-sys"
1523
+
version = "0.9.104"
1524
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1525
+
checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
1526
+
dependencies = [
1527
+
"cc",
1528
+
"libc",
1529
+
"pkg-config",
1530
+
"vcpkg",
1531
+
]
1532
+
1533
+
[[package]]
1534
+
name = "overload"
1535
+
version = "0.1.1"
1536
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1537
+
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
1538
+
1539
+
[[package]]
1540
+
name = "parking_lot"
1541
+
version = "0.12.3"
1542
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1543
+
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
1544
+
dependencies = [
1545
+
"lock_api",
1546
+
"parking_lot_core",
1547
+
]
1548
+
1549
+
[[package]]
1550
+
name = "parking_lot_core"
1551
+
version = "0.9.10"
1552
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1553
+
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
1554
+
dependencies = [
1555
+
"cfg-if",
1556
+
"libc",
1557
+
"redox_syscall",
1558
+
"smallvec",
1559
+
"windows-targets 0.52.6",
1560
+
]
1561
+
1562
+
[[package]]
1563
+
name = "paste"
1564
+
version = "1.0.15"
1565
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1566
+
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
1567
+
1568
+
[[package]]
1569
+
name = "pem-rfc7468"
1570
+
version = "0.7.0"
1571
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1572
+
checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
1573
+
dependencies = [
1574
+
"base64ct",
1575
+
]
1576
+
1577
+
[[package]]
1578
+
name = "percent-encoding"
1579
+
version = "2.3.1"
1580
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1581
+
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1582
+
1583
+
[[package]]
1584
+
name = "pin-project-lite"
1585
+
version = "0.2.16"
1586
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1587
+
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
1588
+
1589
+
[[package]]
1590
+
name = "pin-utils"
1591
+
version = "0.1.0"
1592
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1593
+
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
1594
+
1595
+
[[package]]
1596
+
name = "pkcs1"
1597
+
version = "0.7.5"
1598
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1599
+
checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
1600
+
dependencies = [
1601
+
"der",
1602
+
"pkcs8",
1603
+
"spki",
1604
+
]
1605
+
1606
+
[[package]]
1607
+
name = "pkcs8"
1608
+
version = "0.10.2"
1609
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1610
+
checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
1611
+
dependencies = [
1612
+
"der",
1613
+
"spki",
1614
+
]
1615
+
1616
+
[[package]]
1617
+
name = "pkg-config"
1618
+
version = "0.3.31"
1619
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1620
+
checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
1621
+
1622
+
[[package]]
1623
+
name = "powerfmt"
1624
+
version = "0.2.0"
1625
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1626
+
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
1627
+
1628
+
[[package]]
1629
+
name = "ppv-lite86"
1630
+
version = "0.2.20"
1631
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1632
+
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
1633
+
dependencies = [
1634
+
"zerocopy",
1635
+
]
1636
+
1637
+
[[package]]
1638
+
name = "proc-macro2"
1639
+
version = "1.0.93"
1640
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1641
+
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
1642
+
dependencies = [
1643
+
"unicode-ident",
1644
+
]
1645
+
1646
+
[[package]]
1647
+
name = "quote"
1648
+
version = "1.0.38"
1649
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1650
+
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
1651
+
dependencies = [
1652
+
"proc-macro2",
1653
+
]
1654
+
1655
+
[[package]]
1656
+
name = "rand"
1657
+
version = "0.8.5"
1658
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1659
+
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
1660
+
dependencies = [
1661
+
"libc",
1662
+
"rand_chacha",
1663
+
"rand_core",
1664
+
]
1665
+
1666
+
[[package]]
1667
+
name = "rand_chacha"
1668
+
version = "0.3.1"
1669
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1670
+
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1671
+
dependencies = [
1672
+
"ppv-lite86",
1673
+
"rand_core",
1674
+
]
1675
+
1676
+
[[package]]
1677
+
name = "rand_core"
1678
+
version = "0.6.4"
1679
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1680
+
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1681
+
dependencies = [
1682
+
"getrandom",
1683
+
]
1684
+
1685
+
[[package]]
1686
+
name = "redox_syscall"
1687
+
version = "0.5.8"
1688
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1689
+
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
1690
+
dependencies = [
1691
+
"bitflags",
1692
+
]
1693
+
1694
+
[[package]]
1695
+
name = "regex"
1696
+
version = "1.11.1"
1697
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1698
+
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
1699
+
dependencies = [
1700
+
"aho-corasick",
1701
+
"memchr",
1702
+
"regex-automata",
1703
+
"regex-syntax",
1704
+
]
1705
+
1706
+
[[package]]
1707
+
name = "regex-automata"
1708
+
version = "0.4.9"
1709
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1710
+
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
1711
+
dependencies = [
1712
+
"aho-corasick",
1713
+
"memchr",
1714
+
"regex-syntax",
1715
+
]
1716
+
1717
+
[[package]]
1718
+
name = "regex-lite"
1719
+
version = "0.1.6"
1720
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1721
+
checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
1722
+
1723
+
[[package]]
1724
+
name = "regex-syntax"
1725
+
version = "0.8.5"
1726
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1727
+
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1728
+
1729
+
[[package]]
1730
+
name = "rsa"
1731
+
version = "0.9.7"
1732
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1733
+
checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519"
1734
+
dependencies = [
1735
+
"const-oid",
1736
+
"digest",
1737
+
"num-bigint-dig",
1738
+
"num-integer",
1739
+
"num-traits",
1740
+
"pkcs1",
1741
+
"pkcs8",
1742
+
"rand_core",
1743
+
"signature",
1744
+
"spki",
1745
+
"subtle",
1746
+
"zeroize",
1747
+
]
1748
+
1749
+
[[package]]
1750
+
name = "rustc-demangle"
1751
+
version = "0.1.24"
1752
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1753
+
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
1754
+
1755
+
[[package]]
1756
+
name = "rustc_version"
1757
+
version = "0.4.1"
1758
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1759
+
checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1760
+
dependencies = [
1761
+
"semver",
1762
+
]
1763
+
1764
+
[[package]]
1765
+
name = "rustix"
1766
+
version = "0.38.44"
1767
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1768
+
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
1769
+
dependencies = [
1770
+
"bitflags",
1771
+
"errno",
1772
+
"libc",
1773
+
"linux-raw-sys",
1774
+
"windows-sys 0.59.0",
1775
+
]
1776
+
1777
+
[[package]]
1778
+
name = "rustversion"
1779
+
version = "1.0.19"
1780
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1781
+
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
1782
+
1783
+
[[package]]
1784
+
name = "ryu"
1785
+
version = "1.0.18"
1786
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1787
+
checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
1788
+
1789
+
[[package]]
1790
+
name = "schannel"
1791
+
version = "0.1.27"
1792
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1793
+
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1794
+
dependencies = [
1795
+
"windows-sys 0.59.0",
1796
+
]
1797
+
1798
+
[[package]]
1799
+
name = "scopeguard"
1800
+
version = "1.2.0"
1801
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1802
+
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1803
+
1804
+
[[package]]
1805
+
name = "security-framework"
1806
+
version = "2.11.1"
1807
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1808
+
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1809
+
dependencies = [
1810
+
"bitflags",
1811
+
"core-foundation",
1812
+
"core-foundation-sys",
1813
+
"libc",
1814
+
"security-framework-sys",
1815
+
]
1816
+
1817
+
[[package]]
1818
+
name = "security-framework-sys"
1819
+
version = "2.14.0"
1820
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1821
+
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1822
+
dependencies = [
1823
+
"core-foundation-sys",
1824
+
"libc",
1825
+
]
1826
+
1827
+
[[package]]
1828
+
name = "semver"
1829
+
version = "1.0.25"
1830
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1831
+
checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03"
1832
+
1833
+
[[package]]
1834
+
name = "serde"
1835
+
version = "1.0.217"
1836
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1837
+
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
1838
+
dependencies = [
1839
+
"serde_derive",
1840
+
]
1841
+
1842
+
[[package]]
1843
+
name = "serde_derive"
1844
+
version = "1.0.217"
1845
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1846
+
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
1847
+
dependencies = [
1848
+
"proc-macro2",
1849
+
"quote",
1850
+
"syn 2.0.96",
1851
+
]
1852
+
1853
+
[[package]]
1854
+
name = "serde_json"
1855
+
version = "1.0.137"
1856
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1857
+
checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b"
1858
+
dependencies = [
1859
+
"itoa",
1860
+
"memchr",
1861
+
"ryu",
1862
+
"serde",
1863
+
]
1864
+
1865
+
[[package]]
1866
+
name = "serde_urlencoded"
1867
+
version = "0.7.1"
1868
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1869
+
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1870
+
dependencies = [
1871
+
"form_urlencoded",
1872
+
"itoa",
1873
+
"ryu",
1874
+
"serde",
1875
+
]
1876
+
1877
+
[[package]]
1878
+
name = "sha1"
1879
+
version = "0.10.6"
1880
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1881
+
checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
1882
+
dependencies = [
1883
+
"cfg-if",
1884
+
"cpufeatures",
1885
+
"digest",
1886
+
]
1887
+
1888
+
[[package]]
1889
+
name = "sha2"
1890
+
version = "0.10.8"
1891
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1892
+
checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
1893
+
dependencies = [
1894
+
"cfg-if",
1895
+
"cpufeatures",
1896
+
"digest",
1897
+
]
1898
+
1899
+
[[package]]
1900
+
name = "sharded-slab"
1901
+
version = "0.1.7"
1902
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1903
+
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
1904
+
dependencies = [
1905
+
"lazy_static",
1906
+
]
1907
+
1908
+
[[package]]
1909
+
name = "shlex"
1910
+
version = "1.3.0"
1911
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1912
+
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1913
+
1914
+
[[package]]
1915
+
name = "signal-hook-registry"
1916
+
version = "1.4.2"
1917
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1918
+
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
1919
+
dependencies = [
1920
+
"libc",
1921
+
]
1922
+
1923
+
[[package]]
1924
+
name = "signature"
1925
+
version = "2.2.0"
1926
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1927
+
checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
1928
+
dependencies = [
1929
+
"digest",
1930
+
"rand_core",
1931
+
]
1932
+
1933
+
[[package]]
1934
+
name = "slab"
1935
+
version = "0.4.9"
1936
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1937
+
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
1938
+
dependencies = [
1939
+
"autocfg",
1940
+
]
1941
+
1942
+
[[package]]
1943
+
name = "smallvec"
1944
+
version = "1.13.2"
1945
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1946
+
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
1947
+
1948
+
[[package]]
1949
+
name = "socket2"
1950
+
version = "0.5.8"
1951
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1952
+
checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
1953
+
dependencies = [
1954
+
"libc",
1955
+
"windows-sys 0.52.0",
1956
+
]
1957
+
1958
+
[[package]]
1959
+
name = "spin"
1960
+
version = "0.9.8"
1961
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1962
+
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
1963
+
dependencies = [
1964
+
"lock_api",
1965
+
]
1966
+
1967
+
[[package]]
1968
+
name = "spki"
1969
+
version = "0.7.3"
1970
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1971
+
checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
1972
+
dependencies = [
1973
+
"base64ct",
1974
+
"der",
1975
+
]
1976
+
1977
+
[[package]]
1978
+
name = "sqlformat"
1979
+
version = "0.2.6"
1980
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1981
+
checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790"
1982
+
dependencies = [
1983
+
"nom",
1984
+
"unicode_categories",
1985
+
]
1986
+
1987
+
[[package]]
1988
+
name = "sqlx"
1989
+
version = "0.7.4"
1990
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1991
+
checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa"
1992
+
dependencies = [
1993
+
"sqlx-core",
1994
+
"sqlx-macros",
1995
+
"sqlx-mysql",
1996
+
"sqlx-postgres",
1997
+
"sqlx-sqlite",
1998
+
]
1999
+
2000
+
[[package]]
2001
+
name = "sqlx-core"
2002
+
version = "0.7.4"
2003
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2004
+
checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6"
2005
+
dependencies = [
2006
+
"ahash",
2007
+
"atoi",
2008
+
"byteorder",
2009
+
"bytes",
2010
+
"chrono",
2011
+
"crc",
2012
+
"crossbeam-queue",
2013
+
"either",
2014
+
"event-listener",
2015
+
"futures-channel",
2016
+
"futures-core",
2017
+
"futures-intrusive",
2018
+
"futures-io",
2019
+
"futures-util",
2020
+
"hashlink",
2021
+
"hex",
2022
+
"indexmap",
2023
+
"log",
2024
+
"memchr",
2025
+
"native-tls",
2026
+
"once_cell",
2027
+
"paste",
2028
+
"percent-encoding",
2029
+
"serde",
2030
+
"serde_json",
2031
+
"sha2",
2032
+
"smallvec",
2033
+
"sqlformat",
2034
+
"thiserror",
2035
+
"tokio",
2036
+
"tokio-stream",
2037
+
"tracing",
2038
+
"url",
2039
+
"uuid",
2040
+
]
2041
+
2042
+
[[package]]
2043
+
name = "sqlx-macros"
2044
+
version = "0.7.4"
2045
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2046
+
checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127"
2047
+
dependencies = [
2048
+
"proc-macro2",
2049
+
"quote",
2050
+
"sqlx-core",
2051
+
"sqlx-macros-core",
2052
+
"syn 1.0.109",
2053
+
]
2054
+
2055
+
[[package]]
2056
+
name = "sqlx-macros-core"
2057
+
version = "0.7.4"
2058
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2059
+
checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8"
2060
+
dependencies = [
2061
+
"dotenvy",
2062
+
"either",
2063
+
"heck 0.4.1",
2064
+
"hex",
2065
+
"once_cell",
2066
+
"proc-macro2",
2067
+
"quote",
2068
+
"serde",
2069
+
"serde_json",
2070
+
"sha2",
2071
+
"sqlx-core",
2072
+
"sqlx-mysql",
2073
+
"sqlx-postgres",
2074
+
"sqlx-sqlite",
2075
+
"syn 1.0.109",
2076
+
"tempfile",
2077
+
"tokio",
2078
+
"url",
2079
+
]
2080
+
2081
+
[[package]]
2082
+
name = "sqlx-mysql"
2083
+
version = "0.7.4"
2084
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2085
+
checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
2086
+
dependencies = [
2087
+
"atoi",
2088
+
"base64 0.21.7",
2089
+
"bitflags",
2090
+
"byteorder",
2091
+
"bytes",
2092
+
"chrono",
2093
+
"crc",
2094
+
"digest",
2095
+
"dotenvy",
2096
+
"either",
2097
+
"futures-channel",
2098
+
"futures-core",
2099
+
"futures-io",
2100
+
"futures-util",
2101
+
"generic-array",
2102
+
"hex",
2103
+
"hkdf",
2104
+
"hmac",
2105
+
"itoa",
2106
+
"log",
2107
+
"md-5",
2108
+
"memchr",
2109
+
"once_cell",
2110
+
"percent-encoding",
2111
+
"rand",
2112
+
"rsa",
2113
+
"serde",
2114
+
"sha1",
2115
+
"sha2",
2116
+
"smallvec",
2117
+
"sqlx-core",
2118
+
"stringprep",
2119
+
"thiserror",
2120
+
"tracing",
2121
+
"uuid",
2122
+
"whoami",
2123
+
]
2124
+
2125
+
[[package]]
2126
+
name = "sqlx-postgres"
2127
+
version = "0.7.4"
2128
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2129
+
checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
2130
+
dependencies = [
2131
+
"atoi",
2132
+
"base64 0.21.7",
2133
+
"bitflags",
2134
+
"byteorder",
2135
+
"chrono",
2136
+
"crc",
2137
+
"dotenvy",
2138
+
"etcetera",
2139
+
"futures-channel",
2140
+
"futures-core",
2141
+
"futures-io",
2142
+
"futures-util",
2143
+
"hex",
2144
+
"hkdf",
2145
+
"hmac",
2146
+
"home",
2147
+
"itoa",
2148
+
"log",
2149
+
"md-5",
2150
+
"memchr",
2151
+
"once_cell",
2152
+
"rand",
2153
+
"serde",
2154
+
"serde_json",
2155
+
"sha2",
2156
+
"smallvec",
2157
+
"sqlx-core",
2158
+
"stringprep",
2159
+
"thiserror",
2160
+
"tracing",
2161
+
"uuid",
2162
+
"whoami",
2163
+
]
2164
+
2165
+
[[package]]
2166
+
name = "sqlx-sqlite"
2167
+
version = "0.7.4"
2168
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2169
+
checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa"
2170
+
dependencies = [
2171
+
"atoi",
2172
+
"chrono",
2173
+
"flume",
2174
+
"futures-channel",
2175
+
"futures-core",
2176
+
"futures-executor",
2177
+
"futures-intrusive",
2178
+
"futures-util",
2179
+
"libsqlite3-sys",
2180
+
"log",
2181
+
"percent-encoding",
2182
+
"serde",
2183
+
"sqlx-core",
2184
+
"tracing",
2185
+
"url",
2186
+
"urlencoding",
2187
+
"uuid",
2188
+
]
2189
+
2190
+
[[package]]
2191
+
name = "stable_deref_trait"
2192
+
version = "1.2.0"
2193
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2194
+
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
2195
+
2196
+
[[package]]
2197
+
name = "stringprep"
2198
+
version = "0.1.5"
2199
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2200
+
checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1"
2201
+
dependencies = [
2202
+
"unicode-bidi",
2203
+
"unicode-normalization",
2204
+
"unicode-properties",
2205
+
]
2206
+
2207
+
[[package]]
2208
+
name = "strsim"
2209
+
version = "0.11.1"
2210
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2211
+
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
2212
+
2213
+
[[package]]
2214
+
name = "subtle"
2215
+
version = "2.6.1"
2216
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2217
+
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
2218
+
2219
+
[[package]]
2220
+
name = "syn"
2221
+
version = "1.0.109"
2222
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2223
+
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
2224
+
dependencies = [
2225
+
"proc-macro2",
2226
+
"quote",
2227
+
"unicode-ident",
2228
+
]
2229
+
2230
+
[[package]]
2231
+
name = "syn"
2232
+
version = "2.0.96"
2233
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2234
+
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
2235
+
dependencies = [
2236
+
"proc-macro2",
2237
+
"quote",
2238
+
"unicode-ident",
2239
+
]
2240
+
2241
+
[[package]]
2242
+
name = "synstructure"
2243
+
version = "0.13.1"
2244
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2245
+
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
2246
+
dependencies = [
2247
+
"proc-macro2",
2248
+
"quote",
2249
+
"syn 2.0.96",
2250
+
]
2251
+
2252
+
[[package]]
2253
+
name = "tempfile"
2254
+
version = "3.15.0"
2255
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2256
+
checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704"
2257
+
dependencies = [
2258
+
"cfg-if",
2259
+
"fastrand",
2260
+
"getrandom",
2261
+
"once_cell",
2262
+
"rustix",
2263
+
"windows-sys 0.59.0",
2264
+
]
2265
+
2266
+
[[package]]
2267
+
name = "thiserror"
2268
+
version = "1.0.69"
2269
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2270
+
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
2271
+
dependencies = [
2272
+
"thiserror-impl",
2273
+
]
2274
+
2275
+
[[package]]
2276
+
name = "thiserror-impl"
2277
+
version = "1.0.69"
2278
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2279
+
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
2280
+
dependencies = [
2281
+
"proc-macro2",
2282
+
"quote",
2283
+
"syn 2.0.96",
2284
+
]
2285
+
2286
+
[[package]]
2287
+
name = "thread_local"
2288
+
version = "1.1.8"
2289
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2290
+
checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
2291
+
dependencies = [
2292
+
"cfg-if",
2293
+
"once_cell",
2294
+
]
2295
+
2296
+
[[package]]
2297
+
name = "time"
2298
+
version = "0.3.37"
2299
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2300
+
checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
2301
+
dependencies = [
2302
+
"deranged",
2303
+
"itoa",
2304
+
"num-conv",
2305
+
"powerfmt",
2306
+
"serde",
2307
+
"time-core",
2308
+
"time-macros",
2309
+
]
2310
+
2311
+
[[package]]
2312
+
name = "time-core"
2313
+
version = "0.1.2"
2314
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2315
+
checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
2316
+
2317
+
[[package]]
2318
+
name = "time-macros"
2319
+
version = "0.2.19"
2320
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2321
+
checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
2322
+
dependencies = [
2323
+
"num-conv",
2324
+
"time-core",
2325
+
]
2326
+
2327
+
[[package]]
2328
+
name = "tinystr"
2329
+
version = "0.7.6"
2330
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2331
+
checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
2332
+
dependencies = [
2333
+
"displaydoc",
2334
+
"zerovec",
2335
+
]
2336
+
2337
+
[[package]]
2338
+
name = "tinyvec"
2339
+
version = "1.8.1"
2340
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2341
+
checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8"
2342
+
dependencies = [
2343
+
"tinyvec_macros",
2344
+
]
2345
+
2346
+
[[package]]
2347
+
name = "tinyvec_macros"
2348
+
version = "0.1.1"
2349
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2350
+
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
2351
+
2352
+
[[package]]
2353
+
name = "tokio"
2354
+
version = "1.43.0"
2355
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2356
+
checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
2357
+
dependencies = [
2358
+
"backtrace",
2359
+
"bytes",
2360
+
"libc",
2361
+
"mio",
2362
+
"parking_lot",
2363
+
"pin-project-lite",
2364
+
"signal-hook-registry",
2365
+
"socket2",
2366
+
"tokio-macros",
2367
+
"windows-sys 0.52.0",
2368
+
]
2369
+
2370
+
[[package]]
2371
+
name = "tokio-macros"
2372
+
version = "2.5.0"
2373
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2374
+
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
2375
+
dependencies = [
2376
+
"proc-macro2",
2377
+
"quote",
2378
+
"syn 2.0.96",
2379
+
]
2380
+
2381
+
[[package]]
2382
+
name = "tokio-stream"
2383
+
version = "0.1.17"
2384
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2385
+
checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047"
2386
+
dependencies = [
2387
+
"futures-core",
2388
+
"pin-project-lite",
2389
+
"tokio",
2390
+
]
2391
+
2392
+
[[package]]
2393
+
name = "tokio-util"
2394
+
version = "0.7.13"
2395
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2396
+
checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
2397
+
dependencies = [
2398
+
"bytes",
2399
+
"futures-core",
2400
+
"futures-sink",
2401
+
"pin-project-lite",
2402
+
"tokio",
2403
+
]
2404
+
2405
+
[[package]]
2406
+
name = "tracing"
2407
+
version = "0.1.41"
2408
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2409
+
checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
2410
+
dependencies = [
2411
+
"log",
2412
+
"pin-project-lite",
2413
+
"tracing-attributes",
2414
+
"tracing-core",
2415
+
]
2416
+
2417
+
[[package]]
2418
+
name = "tracing-attributes"
2419
+
version = "0.1.28"
2420
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2421
+
checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
2422
+
dependencies = [
2423
+
"proc-macro2",
2424
+
"quote",
2425
+
"syn 2.0.96",
2426
+
]
2427
+
2428
+
[[package]]
2429
+
name = "tracing-core"
2430
+
version = "0.1.33"
2431
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2432
+
checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
2433
+
dependencies = [
2434
+
"once_cell",
2435
+
"valuable",
2436
+
]
2437
+
2438
+
[[package]]
2439
+
name = "tracing-log"
2440
+
version = "0.2.0"
2441
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2442
+
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
2443
+
dependencies = [
2444
+
"log",
2445
+
"once_cell",
2446
+
"tracing-core",
2447
+
]
2448
+
2449
+
[[package]]
2450
+
name = "tracing-subscriber"
2451
+
version = "0.3.19"
2452
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2453
+
checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
2454
+
dependencies = [
2455
+
"nu-ansi-term",
2456
+
"sharded-slab",
2457
+
"smallvec",
2458
+
"thread_local",
2459
+
"tracing-core",
2460
+
"tracing-log",
2461
+
]
2462
+
2463
+
[[package]]
2464
+
name = "typenum"
2465
+
version = "1.17.0"
2466
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2467
+
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
2468
+
2469
+
[[package]]
2470
+
name = "unicode-bidi"
2471
+
version = "0.3.18"
2472
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2473
+
checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
2474
+
2475
+
[[package]]
2476
+
name = "unicode-ident"
2477
+
version = "1.0.15"
2478
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2479
+
checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243"
2480
+
2481
+
[[package]]
2482
+
name = "unicode-normalization"
2483
+
version = "0.1.24"
2484
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2485
+
checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
2486
+
dependencies = [
2487
+
"tinyvec",
2488
+
]
2489
+
2490
+
[[package]]
2491
+
name = "unicode-properties"
2492
+
version = "0.1.3"
2493
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2494
+
checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
2495
+
2496
+
[[package]]
2497
+
name = "unicode-segmentation"
2498
+
version = "1.12.0"
2499
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2500
+
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
2501
+
2502
+
[[package]]
2503
+
name = "unicode_categories"
2504
+
version = "0.1.1"
2505
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2506
+
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
2507
+
2508
+
[[package]]
2509
+
name = "url"
2510
+
version = "2.5.4"
2511
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2512
+
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
2513
+
dependencies = [
2514
+
"form_urlencoded",
2515
+
"idna",
2516
+
"percent-encoding",
2517
+
]
2518
+
2519
+
[[package]]
2520
+
name = "urlencoding"
2521
+
version = "2.1.3"
2522
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2523
+
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
2524
+
2525
+
[[package]]
2526
+
name = "utf16_iter"
2527
+
version = "1.0.5"
2528
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2529
+
checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
2530
+
2531
+
[[package]]
2532
+
name = "utf8_iter"
2533
+
version = "1.0.4"
2534
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2535
+
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2536
+
2537
+
[[package]]
2538
+
name = "utf8parse"
2539
+
version = "0.2.2"
2540
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2541
+
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
2542
+
2543
+
[[package]]
2544
+
name = "uuid"
2545
+
version = "1.12.1"
2546
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2547
+
checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b"
2548
+
dependencies = [
2549
+
"getrandom",
2550
+
"serde",
2551
+
]
2552
+
2553
+
[[package]]
2554
+
name = "valuable"
2555
+
version = "0.1.1"
2556
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2557
+
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
2558
+
2559
+
[[package]]
2560
+
name = "vcpkg"
2561
+
version = "0.2.15"
2562
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2563
+
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
2564
+
2565
+
[[package]]
2566
+
name = "version_check"
2567
+
version = "0.9.5"
2568
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2569
+
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2570
+
2571
+
[[package]]
2572
+
name = "wasi"
2573
+
version = "0.11.0+wasi-snapshot-preview1"
2574
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2575
+
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
2576
+
2577
+
[[package]]
2578
+
name = "wasite"
2579
+
version = "0.1.0"
2580
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2581
+
checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
2582
+
2583
+
[[package]]
2584
+
name = "wasm-bindgen"
2585
+
version = "0.2.100"
2586
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2587
+
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
2588
+
dependencies = [
2589
+
"cfg-if",
2590
+
"once_cell",
2591
+
"rustversion",
2592
+
"wasm-bindgen-macro",
2593
+
]
2594
+
2595
+
[[package]]
2596
+
name = "wasm-bindgen-backend"
2597
+
version = "0.2.100"
2598
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2599
+
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
2600
+
dependencies = [
2601
+
"bumpalo",
2602
+
"log",
2603
+
"proc-macro2",
2604
+
"quote",
2605
+
"syn 2.0.96",
2606
+
"wasm-bindgen-shared",
2607
+
]
2608
+
2609
+
[[package]]
2610
+
name = "wasm-bindgen-macro"
2611
+
version = "0.2.100"
2612
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2613
+
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
2614
+
dependencies = [
2615
+
"quote",
2616
+
"wasm-bindgen-macro-support",
2617
+
]
2618
+
2619
+
[[package]]
2620
+
name = "wasm-bindgen-macro-support"
2621
+
version = "0.2.100"
2622
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2623
+
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
2624
+
dependencies = [
2625
+
"proc-macro2",
2626
+
"quote",
2627
+
"syn 2.0.96",
2628
+
"wasm-bindgen-backend",
2629
+
"wasm-bindgen-shared",
2630
+
]
2631
+
2632
+
[[package]]
2633
+
name = "wasm-bindgen-shared"
2634
+
version = "0.2.100"
2635
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2636
+
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
2637
+
dependencies = [
2638
+
"unicode-ident",
2639
+
]
2640
+
2641
+
[[package]]
2642
+
name = "whoami"
2643
+
version = "1.5.2"
2644
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2645
+
checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d"
2646
+
dependencies = [
2647
+
"redox_syscall",
2648
+
"wasite",
2649
+
]
2650
+
2651
+
[[package]]
2652
+
name = "winapi"
2653
+
version = "0.3.9"
2654
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2655
+
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2656
+
dependencies = [
2657
+
"winapi-i686-pc-windows-gnu",
2658
+
"winapi-x86_64-pc-windows-gnu",
2659
+
]
2660
+
2661
+
[[package]]
2662
+
name = "winapi-i686-pc-windows-gnu"
2663
+
version = "0.4.0"
2664
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2665
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2666
+
2667
+
[[package]]
2668
+
name = "winapi-x86_64-pc-windows-gnu"
2669
+
version = "0.4.0"
2670
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2671
+
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2672
+
2673
+
[[package]]
2674
+
name = "windows-core"
2675
+
version = "0.52.0"
2676
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2677
+
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
2678
+
dependencies = [
2679
+
"windows-targets 0.52.6",
2680
+
]
2681
+
2682
+
[[package]]
2683
+
name = "windows-sys"
2684
+
version = "0.48.0"
2685
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2686
+
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
2687
+
dependencies = [
2688
+
"windows-targets 0.48.5",
2689
+
]
2690
+
2691
+
[[package]]
2692
+
name = "windows-sys"
2693
+
version = "0.52.0"
2694
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2695
+
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2696
+
dependencies = [
2697
+
"windows-targets 0.52.6",
2698
+
]
2699
+
2700
+
[[package]]
2701
+
name = "windows-sys"
2702
+
version = "0.59.0"
2703
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2704
+
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2705
+
dependencies = [
2706
+
"windows-targets 0.52.6",
2707
+
]
2708
+
2709
+
[[package]]
2710
+
name = "windows-targets"
2711
+
version = "0.48.5"
2712
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2713
+
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
2714
+
dependencies = [
2715
+
"windows_aarch64_gnullvm 0.48.5",
2716
+
"windows_aarch64_msvc 0.48.5",
2717
+
"windows_i686_gnu 0.48.5",
2718
+
"windows_i686_msvc 0.48.5",
2719
+
"windows_x86_64_gnu 0.48.5",
2720
+
"windows_x86_64_gnullvm 0.48.5",
2721
+
"windows_x86_64_msvc 0.48.5",
2722
+
]
2723
+
2724
+
[[package]]
2725
+
name = "windows-targets"
2726
+
version = "0.52.6"
2727
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2728
+
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2729
+
dependencies = [
2730
+
"windows_aarch64_gnullvm 0.52.6",
2731
+
"windows_aarch64_msvc 0.52.6",
2732
+
"windows_i686_gnu 0.52.6",
2733
+
"windows_i686_gnullvm",
2734
+
"windows_i686_msvc 0.52.6",
2735
+
"windows_x86_64_gnu 0.52.6",
2736
+
"windows_x86_64_gnullvm 0.52.6",
2737
+
"windows_x86_64_msvc 0.52.6",
2738
+
]
2739
+
2740
+
[[package]]
2741
+
name = "windows_aarch64_gnullvm"
2742
+
version = "0.48.5"
2743
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2744
+
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
2745
+
2746
+
[[package]]
2747
+
name = "windows_aarch64_gnullvm"
2748
+
version = "0.52.6"
2749
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2750
+
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2751
+
2752
+
[[package]]
2753
+
name = "windows_aarch64_msvc"
2754
+
version = "0.48.5"
2755
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2756
+
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
2757
+
2758
+
[[package]]
2759
+
name = "windows_aarch64_msvc"
2760
+
version = "0.52.6"
2761
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2762
+
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2763
+
2764
+
[[package]]
2765
+
name = "windows_i686_gnu"
2766
+
version = "0.48.5"
2767
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2768
+
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
2769
+
2770
+
[[package]]
2771
+
name = "windows_i686_gnu"
2772
+
version = "0.52.6"
2773
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2774
+
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2775
+
2776
+
[[package]]
2777
+
name = "windows_i686_gnullvm"
2778
+
version = "0.52.6"
2779
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2780
+
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2781
+
2782
+
[[package]]
2783
+
name = "windows_i686_msvc"
2784
+
version = "0.48.5"
2785
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2786
+
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
2787
+
2788
+
[[package]]
2789
+
name = "windows_i686_msvc"
2790
+
version = "0.52.6"
2791
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2792
+
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2793
+
2794
+
[[package]]
2795
+
name = "windows_x86_64_gnu"
2796
+
version = "0.48.5"
2797
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2798
+
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
2799
+
2800
+
[[package]]
2801
+
name = "windows_x86_64_gnu"
2802
+
version = "0.52.6"
2803
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2804
+
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2805
+
2806
+
[[package]]
2807
+
name = "windows_x86_64_gnullvm"
2808
+
version = "0.48.5"
2809
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2810
+
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
2811
+
2812
+
[[package]]
2813
+
name = "windows_x86_64_gnullvm"
2814
+
version = "0.52.6"
2815
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2816
+
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2817
+
2818
+
[[package]]
2819
+
name = "windows_x86_64_msvc"
2820
+
version = "0.48.5"
2821
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2822
+
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
2823
+
2824
+
[[package]]
2825
+
name = "windows_x86_64_msvc"
2826
+
version = "0.52.6"
2827
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2828
+
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2829
+
2830
+
[[package]]
2831
+
name = "write16"
2832
+
version = "1.0.0"
2833
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2834
+
checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
2835
+
2836
+
[[package]]
2837
+
name = "writeable"
2838
+
version = "0.5.5"
2839
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2840
+
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
2841
+
2842
+
[[package]]
2843
+
name = "yoke"
2844
+
version = "0.7.5"
2845
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2846
+
checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
2847
+
dependencies = [
2848
+
"serde",
2849
+
"stable_deref_trait",
2850
+
"yoke-derive",
2851
+
"zerofrom",
2852
+
]
2853
+
2854
+
[[package]]
2855
+
name = "yoke-derive"
2856
+
version = "0.7.5"
2857
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2858
+
checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
2859
+
dependencies = [
2860
+
"proc-macro2",
2861
+
"quote",
2862
+
"syn 2.0.96",
2863
+
"synstructure",
2864
+
]
2865
+
2866
+
[[package]]
2867
+
name = "zerocopy"
2868
+
version = "0.7.35"
2869
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2870
+
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
2871
+
dependencies = [
2872
+
"byteorder",
2873
+
"zerocopy-derive",
2874
+
]
2875
+
2876
+
[[package]]
2877
+
name = "zerocopy-derive"
2878
+
version = "0.7.35"
2879
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2880
+
checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
2881
+
dependencies = [
2882
+
"proc-macro2",
2883
+
"quote",
2884
+
"syn 2.0.96",
2885
+
]
2886
+
2887
+
[[package]]
2888
+
name = "zerofrom"
2889
+
version = "0.1.5"
2890
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2891
+
checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
2892
+
dependencies = [
2893
+
"zerofrom-derive",
2894
+
]
2895
+
2896
+
[[package]]
2897
+
name = "zerofrom-derive"
2898
+
version = "0.1.5"
2899
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2900
+
checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
2901
+
dependencies = [
2902
+
"proc-macro2",
2903
+
"quote",
2904
+
"syn 2.0.96",
2905
+
"synstructure",
2906
+
]
2907
+
2908
+
[[package]]
2909
+
name = "zeroize"
2910
+
version = "1.8.1"
2911
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2912
+
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
2913
+
2914
+
[[package]]
2915
+
name = "zerovec"
2916
+
version = "0.10.4"
2917
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2918
+
checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
2919
+
dependencies = [
2920
+
"yoke",
2921
+
"zerofrom",
2922
+
"zerovec-derive",
2923
+
]
2924
+
2925
+
[[package]]
2926
+
name = "zerovec-derive"
2927
+
version = "0.10.3"
2928
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2929
+
checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
2930
+
dependencies = [
2931
+
"proc-macro2",
2932
+
"quote",
2933
+
"syn 2.0.96",
2934
+
]
2935
+
2936
+
[[package]]
2937
+
name = "zstd"
2938
+
version = "0.13.2"
2939
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2940
+
checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
2941
+
dependencies = [
2942
+
"zstd-safe",
2943
+
]
2944
+
2945
+
[[package]]
2946
+
name = "zstd-safe"
2947
+
version = "7.2.1"
2948
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2949
+
checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059"
2950
+
dependencies = [
2951
+
"zstd-sys",
2952
+
]
2953
+
2954
+
[[package]]
2955
+
name = "zstd-sys"
2956
+
version = "2.0.13+zstd.1.5.6"
2957
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2958
+
checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
2959
+
dependencies = [
2960
+
"cc",
2961
+
"pkg-config",
2962
+
]
+23
Cargo.toml
+23
Cargo.toml
···
1
+
[package]
2
+
name = "SimpleLink"
3
+
version = "0.1.0"
4
+
edition = "2021"
5
+
6
+
[dependencies]
7
+
actix-web = "4.4"
8
+
actix-cors = "0.6"
9
+
tokio = { version = "1.36", features = ["full"] }
10
+
sqlx = { version = "0.7", features = ["runtime-tokio-native-tls", "postgres", "uuid", "chrono"] }
11
+
serde = { version = "1.0", features = ["derive"] }
12
+
serde_json = "1.0"
13
+
anyhow = "1.0"
14
+
thiserror = "1.0"
15
+
tracing = "0.1"
16
+
tracing-subscriber = "0.3"
17
+
uuid = { version = "1.7", features = ["v4", "serde"] }
18
+
base62 = "2.0"
19
+
clap = { version = "4.5", features = ["derive"] }
20
+
dotenv = "0.15"
21
+
chrono = { version = "0.4", features = ["serde"] }
22
+
regex = "1.10"
23
+
lazy_static = "1.4"
+22
docker-compose.yml
+22
docker-compose.yml
···
1
+
version: '3.8'
2
+
services:
3
+
db:
4
+
image: postgres:15-alpine
5
+
container_name: shortener-db
6
+
environment:
7
+
POSTGRES_DB: shortener
8
+
POSTGRES_USER: shortener
9
+
POSTGRES_PASSWORD: shortener123
10
+
ports:
11
+
- "5432:5432"
12
+
volumes:
13
+
- shortener-data:/var/lib/postgresql/data
14
+
healthcheck:
15
+
test: ["CMD-SHELL", "pg_isready -U shortener"]
16
+
interval: 5s
17
+
timeout: 5s
18
+
retries: 5
19
+
20
+
volumes:
21
+
shortener-data:
22
+
+24
frontend/.gitignore
+24
frontend/.gitignore
···
1
+
# Logs
2
+
logs
3
+
*.log
4
+
npm-debug.log*
5
+
yarn-debug.log*
6
+
yarn-error.log*
7
+
pnpm-debug.log*
8
+
lerna-debug.log*
9
+
10
+
node_modules
11
+
dist
12
+
dist-ssr
13
+
*.local
14
+
15
+
# Editor directories and files
16
+
.vscode/*
17
+
!.vscode/extensions.json
18
+
.idea
19
+
.DS_Store
20
+
*.suo
21
+
*.ntvs*
22
+
*.njsproj
23
+
*.sln
24
+
*.sw?
+50
frontend/README.md
+50
frontend/README.md
···
1
+
# React + TypeScript + Vite
2
+
3
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
+
5
+
Currently, two official plugins are available:
6
+
7
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
+
10
+
## Expanding the ESLint configuration
11
+
12
+
If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
13
+
14
+
- Configure the top-level `parserOptions` property like this:
15
+
16
+
```js
17
+
export default tseslint.config({
18
+
languageOptions: {
19
+
// other options...
20
+
parserOptions: {
21
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
22
+
tsconfigRootDir: import.meta.dirname,
23
+
},
24
+
},
25
+
})
26
+
```
27
+
28
+
- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked`
29
+
- Optionally add `...tseslint.configs.stylisticTypeChecked`
30
+
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config:
31
+
32
+
```js
33
+
// eslint.config.js
34
+
import react from 'eslint-plugin-react'
35
+
36
+
export default tseslint.config({
37
+
// Set the react version
38
+
settings: { react: { version: '18.3' } },
39
+
plugins: {
40
+
// Add the react plugin
41
+
react,
42
+
},
43
+
rules: {
44
+
// other rules...
45
+
// Enable its recommended rules
46
+
...react.configs.recommended.rules,
47
+
...react.configs['jsx-runtime'].rules,
48
+
},
49
+
})
50
+
```
+622
frontend/bun.lock
+622
frontend/bun.lock
···
1
+
{
2
+
"lockfileVersion": 1,
3
+
"workspaces": {
4
+
"": {
5
+
"name": "frontend",
6
+
"dependencies": {
7
+
"@emotion/react": "^11.14.0",
8
+
"@mantine/core": "^7.16.1",
9
+
"@mantine/form": "^7.16.1",
10
+
"@mantine/hooks": "^7.16.1",
11
+
"axios": "^1.7.9",
12
+
"react": "^18.3.1",
13
+
"react-dom": "^18.3.1",
14
+
},
15
+
"devDependencies": {
16
+
"@eslint/js": "^9.17.0",
17
+
"@types/node": "^22.10.10",
18
+
"@types/react": "^18.3.18",
19
+
"@types/react-dom": "^18.3.5",
20
+
"@vitejs/plugin-react": "^4.3.4",
21
+
"eslint": "^9.17.0",
22
+
"eslint-plugin-react-hooks": "^5.0.0",
23
+
"eslint-plugin-react-refresh": "^0.4.16",
24
+
"globals": "^15.14.0",
25
+
"typescript": "~5.6.2",
26
+
"typescript-eslint": "^8.18.2",
27
+
"vite": "^6.0.5",
28
+
},
29
+
},
30
+
},
31
+
"packages": {
32
+
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
33
+
34
+
"@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=="],
35
+
36
+
"@babel/compat-data": ["@babel/compat-data@7.26.5", "", {}, "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg=="],
37
+
38
+
"@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=="],
39
+
40
+
"@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=="],
41
+
42
+
"@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=="],
43
+
44
+
"@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="],
45
+
46
+
"@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=="],
47
+
48
+
"@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="],
49
+
50
+
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="],
51
+
52
+
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
53
+
54
+
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="],
55
+
56
+
"@babel/helpers": ["@babel/helpers@7.26.7", "", { "dependencies": { "@babel/template": "^7.25.9", "@babel/types": "^7.26.7" } }, "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A=="],
57
+
58
+
"@babel/parser": ["@babel/parser@7.26.7", "", { "dependencies": { "@babel/types": "^7.26.7" }, "bin": "./bin/babel-parser.js" }, "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w=="],
59
+
60
+
"@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=="],
61
+
62
+
"@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=="],
63
+
64
+
"@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="],
65
+
66
+
"@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=="],
67
+
68
+
"@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=="],
69
+
70
+
"@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=="],
71
+
72
+
"@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=="],
73
+
74
+
"@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=="],
75
+
76
+
"@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="],
77
+
78
+
"@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="],
79
+
80
+
"@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=="],
81
+
82
+
"@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=="],
83
+
84
+
"@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="],
85
+
86
+
"@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="],
87
+
88
+
"@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=="],
89
+
90
+
"@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="],
91
+
92
+
"@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="],
93
+
94
+
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="],
95
+
96
+
"@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="],
97
+
98
+
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="],
99
+
100
+
"@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="],
101
+
102
+
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="],
103
+
104
+
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="],
105
+
106
+
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="],
107
+
108
+
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="],
109
+
110
+
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="],
111
+
112
+
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="],
113
+
114
+
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="],
115
+
116
+
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="],
117
+
118
+
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="],
119
+
120
+
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="],
121
+
122
+
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="],
123
+
124
+
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="],
125
+
126
+
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="],
127
+
128
+
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="],
129
+
130
+
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="],
131
+
132
+
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="],
133
+
134
+
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="],
135
+
136
+
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="],
137
+
138
+
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="],
139
+
140
+
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="],
141
+
142
+
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="],
143
+
144
+
"@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=="],
145
+
146
+
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="],
147
+
148
+
"@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=="],
149
+
150
+
"@eslint/core": ["@eslint/core@0.10.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw=="],
151
+
152
+
"@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=="],
153
+
154
+
"@eslint/js": ["@eslint/js@9.19.0", "", {}, "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ=="],
155
+
156
+
"@eslint/object-schema": ["@eslint/object-schema@2.1.5", "", {}, "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ=="],
157
+
158
+
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.5", "", { "dependencies": { "@eslint/core": "^0.10.0", "levn": "^0.4.1" } }, "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A=="],
159
+
160
+
"@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="],
161
+
162
+
"@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="],
163
+
164
+
"@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=="],
165
+
166
+
"@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=="],
167
+
168
+
"@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="],
169
+
170
+
"@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
171
+
172
+
"@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="],
173
+
174
+
"@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
175
+
176
+
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.1", "", {}, "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA=="],
177
+
178
+
"@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=="],
179
+
180
+
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
181
+
182
+
"@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
183
+
184
+
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
185
+
186
+
"@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=="],
187
+
188
+
"@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=="],
189
+
190
+
"@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=="],
191
+
192
+
"@mantine/hooks": ["@mantine/hooks@7.16.1", "", { "peerDependencies": { "react": "^18.x || ^19.x" } }, "sha512-+hER8E4d2ByfQ/DKIXGM3Euxb7IH5ArSjzzzoF21sG095iXIryOCob22ZanrmiXCoAzKKdxqgVj4Di67ikLYSQ=="],
193
+
194
+
"@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=="],
195
+
196
+
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
197
+
198
+
"@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=="],
199
+
200
+
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.32.0", "", { "os": "android", "cpu": "arm" }, "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg=="],
201
+
202
+
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A=="],
203
+
204
+
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ=="],
205
+
206
+
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ=="],
207
+
208
+
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.32.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA=="],
209
+
210
+
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ=="],
211
+
212
+
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A=="],
213
+
214
+
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ=="],
215
+
216
+
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w=="],
217
+
218
+
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw=="],
219
+
220
+
"@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.32.0", "", { "os": "linux", "cpu": "none" }, "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw=="],
221
+
222
+
"@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.32.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ=="],
223
+
224
+
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.32.0", "", { "os": "linux", "cpu": "none" }, "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw=="],
225
+
226
+
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.32.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw=="],
227
+
228
+
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A=="],
229
+
230
+
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg=="],
231
+
232
+
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg=="],
233
+
234
+
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.32.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw=="],
235
+
236
+
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA=="],
237
+
238
+
"@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=="],
239
+
240
+
"@types/babel__generator": ["@types/babel__generator@7.6.8", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="],
241
+
242
+
"@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=="],
243
+
244
+
"@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="],
245
+
246
+
"@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
247
+
248
+
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
249
+
250
+
"@types/node": ["@types/node@22.10.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww=="],
251
+
252
+
"@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="],
253
+
254
+
"@types/prop-types": ["@types/prop-types@15.7.14", "", {}, "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="],
255
+
256
+
"@types/react": ["@types/react@18.3.18", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ=="],
257
+
258
+
"@types/react-dom": ["@types/react-dom@18.3.5", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q=="],
259
+
260
+
"@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=="],
261
+
262
+
"@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=="],
263
+
264
+
"@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=="],
265
+
266
+
"@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=="],
267
+
268
+
"@typescript-eslint/types": ["@typescript-eslint/types@8.21.0", "", {}, "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A=="],
269
+
270
+
"@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=="],
271
+
272
+
"@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=="],
273
+
274
+
"@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=="],
275
+
276
+
"@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=="],
277
+
278
+
"acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
279
+
280
+
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
281
+
282
+
"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=="],
283
+
284
+
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
285
+
286
+
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
287
+
288
+
"asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
289
+
290
+
"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=="],
291
+
292
+
"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=="],
293
+
294
+
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
295
+
296
+
"brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="],
297
+
298
+
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
299
+
300
+
"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=="],
301
+
302
+
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
303
+
304
+
"caniuse-lite": ["caniuse-lite@1.0.30001695", "", {}, "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw=="],
305
+
306
+
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
307
+
308
+
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
309
+
310
+
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
311
+
312
+
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
313
+
314
+
"combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
315
+
316
+
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
317
+
318
+
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
319
+
320
+
"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=="],
321
+
322
+
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
323
+
324
+
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
325
+
326
+
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
327
+
328
+
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
329
+
330
+
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
331
+
332
+
"detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
333
+
334
+
"electron-to-chromium": ["electron-to-chromium@1.5.88", "", {}, "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw=="],
335
+
336
+
"error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="],
337
+
338
+
"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=="],
339
+
340
+
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
341
+
342
+
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
343
+
344
+
"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=="],
345
+
346
+
"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=="],
347
+
348
+
"eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.18", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-IRGEoFn3OKalm3hjfolEWGqoF/jPqeEYFp+C8B0WMzwGwBMvlRDQd06kghDhF0C61uJ6WfSDhEZE/sAQjduKgw=="],
349
+
350
+
"eslint-scope": ["eslint-scope@8.2.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A=="],
351
+
352
+
"eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="],
353
+
354
+
"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=="],
355
+
356
+
"esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
357
+
358
+
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
359
+
360
+
"estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
361
+
362
+
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
363
+
364
+
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
365
+
366
+
"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=="],
367
+
368
+
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
369
+
370
+
"fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
371
+
372
+
"fastq": ["fastq@1.18.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw=="],
373
+
374
+
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
375
+
376
+
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
377
+
378
+
"find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="],
379
+
380
+
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
381
+
382
+
"flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
383
+
384
+
"flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="],
385
+
386
+
"follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
387
+
388
+
"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=="],
389
+
390
+
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
391
+
392
+
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
393
+
394
+
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
395
+
396
+
"get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
397
+
398
+
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
399
+
400
+
"globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="],
401
+
402
+
"graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
403
+
404
+
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
405
+
406
+
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
407
+
408
+
"hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="],
409
+
410
+
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
411
+
412
+
"import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="],
413
+
414
+
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
415
+
416
+
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
417
+
418
+
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
419
+
420
+
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
421
+
422
+
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
423
+
424
+
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
425
+
426
+
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
427
+
428
+
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
429
+
430
+
"js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
431
+
432
+
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
433
+
434
+
"json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
435
+
436
+
"json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
437
+
438
+
"json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
439
+
440
+
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
441
+
442
+
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
443
+
444
+
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
445
+
446
+
"klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="],
447
+
448
+
"levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
449
+
450
+
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
451
+
452
+
"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
453
+
454
+
"lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
455
+
456
+
"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=="],
457
+
458
+
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
459
+
460
+
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
461
+
462
+
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
463
+
464
+
"mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
465
+
466
+
"mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
467
+
468
+
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
469
+
470
+
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
471
+
472
+
"nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
473
+
474
+
"natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
475
+
476
+
"node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
477
+
478
+
"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=="],
479
+
480
+
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
481
+
482
+
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
483
+
484
+
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
485
+
486
+
"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=="],
487
+
488
+
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
489
+
490
+
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
491
+
492
+
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
493
+
494
+
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
495
+
496
+
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
497
+
498
+
"picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
499
+
500
+
"postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="],
501
+
502
+
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
503
+
504
+
"proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
505
+
506
+
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
507
+
508
+
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
509
+
510
+
"react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
511
+
512
+
"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=="],
513
+
514
+
"react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
515
+
516
+
"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=="],
517
+
518
+
"react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="],
519
+
520
+
"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=="],
521
+
522
+
"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=="],
523
+
524
+
"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=="],
525
+
526
+
"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=="],
527
+
528
+
"regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="],
529
+
530
+
"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=="],
531
+
532
+
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
533
+
534
+
"reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="],
535
+
536
+
"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=="],
537
+
538
+
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
539
+
540
+
"scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="],
541
+
542
+
"semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
543
+
544
+
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
545
+
546
+
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
547
+
548
+
"source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
549
+
550
+
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
551
+
552
+
"strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
553
+
554
+
"stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="],
555
+
556
+
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
557
+
558
+
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
559
+
560
+
"tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
561
+
562
+
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
563
+
564
+
"ts-api-utils": ["ts-api-utils@2.0.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ=="],
565
+
566
+
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
567
+
568
+
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
569
+
570
+
"type-fest": ["type-fest@4.33.0", "", {}, "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g=="],
571
+
572
+
"typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
573
+
574
+
"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=="],
575
+
576
+
"undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
577
+
578
+
"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=="],
579
+
580
+
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
581
+
582
+
"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=="],
583
+
584
+
"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=="],
585
+
586
+
"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=="],
587
+
588
+
"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=="],
589
+
590
+
"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=="],
591
+
592
+
"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=="],
593
+
594
+
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
595
+
596
+
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
597
+
598
+
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
599
+
600
+
"yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
601
+
602
+
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
603
+
604
+
"@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
605
+
606
+
"@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="],
607
+
608
+
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
609
+
610
+
"@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
611
+
612
+
"@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
613
+
614
+
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
615
+
616
+
"@typescript-eslint/typescript-estree/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="],
617
+
618
+
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
619
+
620
+
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
621
+
}
622
+
}
+28
frontend/eslint.config.js
+28
frontend/eslint.config.js
···
1
+
import js from '@eslint/js'
2
+
import globals from 'globals'
3
+
import reactHooks from 'eslint-plugin-react-hooks'
4
+
import reactRefresh from 'eslint-plugin-react-refresh'
5
+
import tseslint from 'typescript-eslint'
6
+
7
+
export default tseslint.config(
8
+
{ ignores: ['dist'] },
9
+
{
10
+
extends: [js.configs.recommended, ...tseslint.configs.recommended],
11
+
files: ['**/*.{ts,tsx}'],
12
+
languageOptions: {
13
+
ecmaVersion: 2020,
14
+
globals: globals.browser,
15
+
},
16
+
plugins: {
17
+
'react-hooks': reactHooks,
18
+
'react-refresh': reactRefresh,
19
+
},
20
+
rules: {
21
+
...reactHooks.configs.recommended.rules,
22
+
'react-refresh/only-export-components': [
23
+
'warn',
24
+
{ allowConstantExport: true },
25
+
],
26
+
},
27
+
},
28
+
)
+13
frontend/index.html
+13
frontend/index.html
···
1
+
<!doctype html>
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>
+35
frontend/package.json
+35
frontend/package.json
···
1
+
{
2
+
"name": "frontend",
3
+
"private": true,
4
+
"version": "0.0.0",
5
+
"type": "module",
6
+
"scripts": {
7
+
"dev": "vite",
8
+
"build": "tsc -b && vite build",
9
+
"lint": "eslint .",
10
+
"preview": "vite preview"
11
+
},
12
+
"dependencies": {
13
+
"@emotion/react": "^11.14.0",
14
+
"@mantine/core": "^7.16.1",
15
+
"@mantine/form": "^7.16.1",
16
+
"@mantine/hooks": "^7.16.1",
17
+
"axios": "^1.7.9",
18
+
"react": "^18.3.1",
19
+
"react-dom": "^18.3.1"
20
+
},
21
+
"devDependencies": {
22
+
"@eslint/js": "^9.17.0",
23
+
"@types/node": "^22.10.10",
24
+
"@types/react": "^18.3.18",
25
+
"@types/react-dom": "^18.3.5",
26
+
"@vitejs/plugin-react": "^4.3.4",
27
+
"eslint": "^9.17.0",
28
+
"eslint-plugin-react-hooks": "^5.0.0",
29
+
"eslint-plugin-react-refresh": "^0.4.16",
30
+
"globals": "^15.14.0",
31
+
"typescript": "~5.6.2",
32
+
"typescript-eslint": "^8.18.2",
33
+
"vite": "^6.0.5"
34
+
}
35
+
}
+1
frontend/public/vite.svg
+1
frontend/public/vite.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
+42
frontend/src/App.css
+42
frontend/src/App.css
···
1
+
#root {
2
+
max-width: 1280px;
3
+
margin: 0 auto;
4
+
padding: 2rem;
5
+
text-align: center;
6
+
}
7
+
8
+
.logo {
9
+
height: 6em;
10
+
padding: 1.5em;
11
+
will-change: filter;
12
+
transition: filter 300ms;
13
+
}
14
+
.logo:hover {
15
+
filter: drop-shadow(0 0 2em #646cffaa);
16
+
}
17
+
.logo.react:hover {
18
+
filter: drop-shadow(0 0 2em #61dafbaa);
19
+
}
20
+
21
+
@keyframes logo-spin {
22
+
from {
23
+
transform: rotate(0deg);
24
+
}
25
+
to {
26
+
transform: rotate(360deg);
27
+
}
28
+
}
29
+
30
+
@media (prefers-reduced-motion: no-preference) {
31
+
a:nth-of-type(2) .logo {
32
+
animation: logo-spin infinite 20s linear;
33
+
}
34
+
}
35
+
36
+
.card {
37
+
padding: 2em;
38
+
}
39
+
40
+
.read-the-docs {
41
+
color: #888;
42
+
}
+26
frontend/src/App.tsx
+26
frontend/src/App.tsx
···
1
+
import { MantineProvider, Container, Title, Stack } from '@mantine/core';
2
+
import { LinkForm } from './components/LinkForm';
3
+
import { LinkList } from './components/LinkList';
4
+
import { Link } from './types/api';
5
+
6
+
function App() {
7
+
const handleLinkCreated = (link: Link) => {
8
+
// You could update the list here or show a success message
9
+
window.location.reload();
10
+
};
11
+
12
+
return (
13
+
<MantineProvider withGlobalStyles withNormalizeCSS>
14
+
<Container size="lg" py="xl">
15
+
<Stack spacing="xl">
16
+
<Title order={1}>URL Shortener</Title>
17
+
<LinkForm onSuccess={handleLinkCreated} />
18
+
<LinkList />
19
+
</Stack>
20
+
</Container>
21
+
</MantineProvider>
22
+
);
23
+
}
24
+
25
+
export default App;
26
+
+17
frontend/src/api/client.ts
+17
frontend/src/api/client.ts
···
1
+
import axios from 'axios';
2
+
import { CreateLinkRequest, Link } from '../types/api';
3
+
4
+
const api = axios.create({
5
+
baseURL: '/api',
6
+
});
7
+
8
+
export const createShortLink = async (data: CreateLinkRequest) => {
9
+
const response = await api.post<Link>('/shorten', data);
10
+
return response.data;
11
+
};
12
+
13
+
export const getAllLinks = async () => {
14
+
const response = await api.get<Link[]>('/links');
15
+
return response.data;
16
+
};
17
+
+1
frontend/src/assets/react.svg
+1
frontend/src/assets/react.svg
···
1
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
+83
frontend/src/components/LinkForm.tsx
+83
frontend/src/components/LinkForm.tsx
···
1
+
import { useState } from 'react';
2
+
import { TextInput, Button, Group, Box, Text } from '@mantine/core';
3
+
import { useForm } from '@mantine/form';
4
+
import { CreateLinkRequest, Link } from '../types/api';
5
+
import { createShortLink } from '../api/client';
6
+
7
+
interface LinkFormProps {
8
+
onSuccess: (link: Link) => void;
9
+
}
10
+
11
+
export function LinkForm({ onSuccess }: LinkFormProps) {
12
+
const [error, setError] = useState<string | null>(null);
13
+
const [loading, setLoading] = useState(false);
14
+
15
+
const form = useForm<CreateLinkRequest>({
16
+
initialValues: {
17
+
url: '',
18
+
custom_code: '',
19
+
},
20
+
validate: {
21
+
url: (value) => {
22
+
if (!value) return 'URL is required';
23
+
if (!value.startsWith('http://') && !value.startsWith('https://')) {
24
+
return 'URL must start with http:// or https://';
25
+
}
26
+
return null;
27
+
},
28
+
custom_code: (value) => {
29
+
if (value && !/^[a-zA-Z0-9_-]{1,32}$/.test(value)) {
30
+
return 'Custom code must be 1-32 characters and contain only letters, numbers, underscores, and hyphens';
31
+
}
32
+
return null;
33
+
},
34
+
},
35
+
});
36
+
37
+
const handleSubmit = async (values: CreateLinkRequest) => {
38
+
try {
39
+
setLoading(true);
40
+
setError(null);
41
+
const link = await createShortLink(values);
42
+
form.reset();
43
+
onSuccess(link);
44
+
} catch (err) {
45
+
setError(err.response?.data?.error || 'An error occurred');
46
+
} finally {
47
+
setLoading(false);
48
+
}
49
+
};
50
+
51
+
return (
52
+
<Box mx="auto" sx={{ maxWidth: 500 }}>
53
+
<form onSubmit={form.onSubmit(handleSubmit)}>
54
+
<TextInput
55
+
required
56
+
label="URL"
57
+
placeholder="https://example.com"
58
+
{...form.getInputProps('url')}
59
+
/>
60
+
61
+
<TextInput
62
+
label="Custom Code (optional)"
63
+
placeholder="example"
64
+
mt="md"
65
+
{...form.getInputProps('custom_code')}
66
+
/>
67
+
68
+
{error && (
69
+
<Text color="red" size="sm" mt="sm">
70
+
{error}
71
+
</Text>
72
+
)}
73
+
74
+
<Group position="right" mt="md">
75
+
<Button type="submit" loading={loading}>
76
+
Create Short Link
77
+
</Button>
78
+
</Group>
79
+
</form>
80
+
</Box>
81
+
);
82
+
}
83
+
+69
frontend/src/components/LinkList.tsx
+69
frontend/src/components/LinkList.tsx
···
1
+
import { useEffect, useState } from 'react';
2
+
import { Table, Text, Box, CopyButton, Button } from '@mantine/core';
3
+
import { Link } from '../types/api';
4
+
import { getAllLinks } from '../api/client';
5
+
6
+
export function LinkList() {
7
+
const [links, setLinks] = useState<Link[]>([]);
8
+
const [loading, setLoading] = useState(true);
9
+
const [error, setError] = useState<string | null>(null);
10
+
11
+
const fetchLinks = async () => {
12
+
try {
13
+
setLoading(true);
14
+
const data = await getAllLinks();
15
+
setLinks(data);
16
+
} catch (err) {
17
+
setError('Failed to load links');
18
+
} finally {
19
+
setLoading(false);
20
+
}
21
+
};
22
+
23
+
useEffect(() => {
24
+
fetchLinks();
25
+
}, []);
26
+
27
+
if (loading) return <Text>Loading...</Text>;
28
+
if (error) return <Text color="red">{error}</Text>;
29
+
30
+
return (
31
+
<Box>
32
+
<Table>
33
+
<thead>
34
+
<tr>
35
+
<th>Short Code</th>
36
+
<th>Original URL</th>
37
+
<th>Clicks</th>
38
+
<th>Created</th>
39
+
<th>Actions</th>
40
+
</tr>
41
+
</thead>
42
+
<tbody>
43
+
{links.map((link) => (
44
+
<tr key={link.id}>
45
+
<td>{link.short_code}</td>
46
+
<td>{link.original_url}</td>
47
+
<td>{link.clicks}</td>
48
+
<td>{new Date(link.created_at).toLocaleDateString()}</td>
49
+
<td>
50
+
<CopyButton value={`${window.location.origin}/${link.short_code}`}>
51
+
{({ copied, copy }) => (
52
+
<Button
53
+
color={copied ? 'teal' : 'blue'}
54
+
onClick={copy}
55
+
size="xs"
56
+
>
57
+
{copied ? 'Copied' : 'Copy'}
58
+
</Button>
59
+
)}
60
+
</CopyButton>
61
+
</td>
62
+
</tr>
63
+
))}
64
+
</tbody>
65
+
</Table>
66
+
</Box>
67
+
);
68
+
}
69
+
+68
frontend/src/index.css
+68
frontend/src/index.css
···
1
+
:root {
2
+
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
3
+
line-height: 1.5;
4
+
font-weight: 400;
5
+
6
+
color-scheme: light dark;
7
+
color: rgba(255, 255, 255, 0.87);
8
+
background-color: #242424;
9
+
10
+
font-synthesis: none;
11
+
text-rendering: optimizeLegibility;
12
+
-webkit-font-smoothing: antialiased;
13
+
-moz-osx-font-smoothing: grayscale;
14
+
}
15
+
16
+
a {
17
+
font-weight: 500;
18
+
color: #646cff;
19
+
text-decoration: inherit;
20
+
}
21
+
a:hover {
22
+
color: #535bf2;
23
+
}
24
+
25
+
body {
26
+
margin: 0;
27
+
display: flex;
28
+
place-items: center;
29
+
min-width: 320px;
30
+
min-height: 100vh;
31
+
}
32
+
33
+
h1 {
34
+
font-size: 3.2em;
35
+
line-height: 1.1;
36
+
}
37
+
38
+
button {
39
+
border-radius: 8px;
40
+
border: 1px solid transparent;
41
+
padding: 0.6em 1.2em;
42
+
font-size: 1em;
43
+
font-weight: 500;
44
+
font-family: inherit;
45
+
background-color: #1a1a1a;
46
+
cursor: pointer;
47
+
transition: border-color 0.25s;
48
+
}
49
+
button:hover {
50
+
border-color: #646cff;
51
+
}
52
+
button:focus,
53
+
button:focus-visible {
54
+
outline: 4px auto -webkit-focus-ring-color;
55
+
}
56
+
57
+
@media (prefers-color-scheme: light) {
58
+
:root {
59
+
color: #213547;
60
+
background-color: #ffffff;
61
+
}
62
+
a:hover {
63
+
color: #747bff;
64
+
}
65
+
button {
66
+
background-color: #f9f9f9;
67
+
}
68
+
}
+10
frontend/src/main.tsx
+10
frontend/src/main.tsx
+18
frontend/src/types/api.ts
+18
frontend/src/types/api.ts
···
1
+
export interface CreateLinkRequest {
2
+
url: string;
3
+
custom_code?: string;
4
+
source?: string;
5
+
}
6
+
7
+
export interface Link {
8
+
id: number;
9
+
original_url: string;
10
+
short_code: string;
11
+
created_at: string;
12
+
clicks: number;
13
+
}
14
+
15
+
export interface ApiError {
16
+
error: string;
17
+
}
18
+
+1
frontend/src/vite-env.d.ts
+1
frontend/src/vite-env.d.ts
···
1
+
/// <reference types="vite/client" />
+26
frontend/tsconfig.app.json
+26
frontend/tsconfig.app.json
···
1
+
{
2
+
"compilerOptions": {
3
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+
"target": "ES2020",
5
+
"useDefineForClassFields": true,
6
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+
"module": "ESNext",
8
+
"skipLibCheck": true,
9
+
10
+
/* Bundler mode */
11
+
"moduleResolution": "bundler",
12
+
"allowImportingTsExtensions": true,
13
+
"isolatedModules": true,
14
+
"moduleDetection": "force",
15
+
"noEmit": true,
16
+
"jsx": "react-jsx",
17
+
18
+
/* Linting */
19
+
"strict": true,
20
+
"noUnusedLocals": true,
21
+
"noUnusedParameters": true,
22
+
"noFallthroughCasesInSwitch": true,
23
+
"noUncheckedSideEffectImports": true
24
+
},
25
+
"include": ["src"]
26
+
}
+7
frontend/tsconfig.json
+7
frontend/tsconfig.json
+24
frontend/tsconfig.node.json
+24
frontend/tsconfig.node.json
···
1
+
{
2
+
"compilerOptions": {
3
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+
"target": "ES2022",
5
+
"lib": ["ES2023"],
6
+
"module": "ESNext",
7
+
"skipLibCheck": true,
8
+
9
+
/* Bundler mode */
10
+
"moduleResolution": "bundler",
11
+
"allowImportingTsExtensions": true,
12
+
"isolatedModules": true,
13
+
"moduleDetection": "force",
14
+
"noEmit": true,
15
+
16
+
/* Linting */
17
+
"strict": true,
18
+
"noUnusedLocals": true,
19
+
"noUnusedParameters": true,
20
+
"noFallthroughCasesInSwitch": true,
21
+
"noUncheckedSideEffectImports": true
22
+
},
23
+
"include": ["vite.config.ts"]
24
+
}
+15
frontend/vite.config.ts
+15
frontend/vite.config.ts
+18
migrations/20240301000000_initial.sql
+18
migrations/20240301000000_initial.sql
···
1
+
CREATE TABLE links (
2
+
id SERIAL PRIMARY KEY,
3
+
original_url TEXT NOT NULL,
4
+
short_code VARCHAR(8) NOT NULL UNIQUE,
5
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
6
+
clicks BIGINT NOT NULL DEFAULT 0
7
+
);
8
+
9
+
CREATE INDEX idx_short_code ON links(short_code);
10
+
11
+
CREATE TABLE clicks (
12
+
id SERIAL PRIMARY KEY,
13
+
link_id INTEGER REFERENCES links(id),
14
+
source TEXT,
15
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
16
+
);
17
+
18
+
CREATE INDEX idx_link_id ON clicks(link_id);
+15
migrations/20240302000000_auth_and_tracking.sql:
+15
migrations/20240302000000_auth_and_tracking.sql:
···
1
+
-- Add users table
2
+
CREATE TABLE users (
3
+
id SERIAL PRIMARY KEY,
4
+
email TEXT UNIQUE NOT NULL,
5
+
password_hash TEXT NOT NULL,
6
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
7
+
);
8
+
9
+
-- Add user_id to links
10
+
ALTER TABLE links
11
+
ADD COLUMN user_id INTEGER REFERENCES users(id);
12
+
13
+
-- Add query_source to clicks
14
+
ALTER TABLE clicks
15
+
ADD COLUMN query_source TEXT;
+24
src/error.rs
+24
src/error.rs
···
1
+
use actix_web::{HttpResponse, ResponseError};
2
+
use thiserror::Error;
3
+
4
+
#[derive(Error, Debug)]
5
+
pub enum AppError {
6
+
#[error("Database error: {0}")]
7
+
Database(#[from] sqlx::Error),
8
+
9
+
#[error("Not found")]
10
+
NotFound,
11
+
12
+
#[error("Invalid input: {0}")]
13
+
InvalidInput(String),
14
+
}
15
+
16
+
impl ResponseError for AppError {
17
+
fn error_response(&self) -> HttpResponse {
18
+
match self {
19
+
AppError::NotFound => HttpResponse::NotFound().json("Not found"),
20
+
AppError::Database(_) => HttpResponse::InternalServerError().json("Internal server error"),
21
+
AppError::InvalidInput(msg) => HttpResponse::BadRequest().json(msg),
22
+
}
23
+
}
24
+
}
+160
src/handlers.rs
+160
src/handlers.rs
···
1
+
use actix_web::{web, HttpResponse, Responder, HttpRequest};
2
+
use crate::{AppState, error::AppError, models::{CreateLink, Link}};
3
+
use regex::Regex;
4
+
use lazy_static::lazy_static;
5
+
6
+
lazy_static! {
7
+
static ref VALID_CODE_REGEX: Regex = Regex::new(r"^[a-zA-Z0-9_-]{1,32}$").unwrap();
8
+
}
9
+
10
+
pub async fn create_short_url(
11
+
state: web::Data<AppState>,
12
+
payload: web::Json<CreateLink>,
13
+
req: HttpRequest,
14
+
) -> Result<impl Responder, AppError> {
15
+
validate_url(&payload.url)?;
16
+
17
+
let short_code = if let Some(ref custom_code) = payload.custom_code {
18
+
validate_custom_code(custom_code)?;
19
+
20
+
// Check if code is already taken
21
+
if let Some(_) = sqlx::query_as::<_, Link>(
22
+
"SELECT * FROM links WHERE short_code = $1"
23
+
)
24
+
.bind(custom_code)
25
+
.fetch_optional(&state.db)
26
+
.await? {
27
+
return Err(AppError::InvalidInput(
28
+
"Custom code already taken".to_string()
29
+
));
30
+
}
31
+
32
+
custom_code.clone()
33
+
} else {
34
+
generate_short_code()
35
+
};
36
+
37
+
// Start transaction
38
+
let mut tx = state.db.begin().await?;
39
+
40
+
let link = sqlx::query_as::<_, Link>(
41
+
"INSERT INTO links (original_url, short_code) VALUES ($1, $2) RETURNING *"
42
+
)
43
+
.bind(&payload.url)
44
+
.bind(&short_code)
45
+
.fetch_one(&mut *tx)
46
+
.await?;
47
+
48
+
if let Some(ref source) = payload.source {
49
+
sqlx::query(
50
+
"INSERT INTO clicks (link_id, source) VALUES ($1, $2)"
51
+
)
52
+
.bind(link.id)
53
+
.bind(source)
54
+
.execute(&mut *tx)
55
+
.await?;
56
+
}
57
+
58
+
tx.commit().await?;
59
+
Ok(HttpResponse::Created().json(link))
60
+
}
61
+
62
+
fn validate_custom_code(code: &str) -> Result<(), AppError> {
63
+
if !VALID_CODE_REGEX.is_match(code) {
64
+
return Err(AppError::InvalidInput(
65
+
"Custom code must be 1-32 characters long and contain only letters, numbers, underscores, and hyphens".to_string()
66
+
));
67
+
}
68
+
69
+
// Add reserved words check
70
+
let reserved_words = ["api", "health", "admin", "static", "assets"];
71
+
if reserved_words.contains(&code.to_lowercase().as_str()) {
72
+
return Err(AppError::InvalidInput(
73
+
"This code is reserved and cannot be used".to_string()
74
+
));
75
+
}
76
+
77
+
Ok(())
78
+
}
79
+
80
+
fn validate_url(url: &String) -> Result<(), AppError> {
81
+
if url.is_empty() {
82
+
return Err(AppError::InvalidInput("URL cannot be empty".to_string()));
83
+
}
84
+
if !url.starts_with("http://") && !url.starts_with("https://") {
85
+
return Err(AppError::InvalidInput("URL must start with http:// or https://".to_string()));
86
+
}
87
+
Ok(())
88
+
}
89
+
90
+
pub async fn redirect_to_url(
91
+
state: web::Data<AppState>,
92
+
path: web::Path<String>,
93
+
req: HttpRequest,
94
+
) -> Result<impl Responder, AppError> {
95
+
let short_code = path.into_inner();
96
+
97
+
let mut tx = state.db.begin().await?;
98
+
99
+
let link = sqlx::query_as::<_, Link>(
100
+
"UPDATE links SET clicks = clicks + 1 WHERE short_code = $1 RETURNING *"
101
+
)
102
+
.bind(&short_code)
103
+
.fetch_optional(&mut *tx)
104
+
.await?;
105
+
106
+
match link {
107
+
Some(link) => {
108
+
// Record click with user agent as source
109
+
let user_agent = req.headers()
110
+
.get("user-agent")
111
+
.and_then(|h| h.to_str().ok())
112
+
.unwrap_or("unknown")
113
+
.to_string();
114
+
115
+
sqlx::query(
116
+
"INSERT INTO clicks (link_id, source) VALUES ($1, $2)"
117
+
)
118
+
.bind(link.id)
119
+
.bind(user_agent)
120
+
.execute(&mut *tx)
121
+
.await?;
122
+
123
+
tx.commit().await?;
124
+
125
+
Ok(HttpResponse::TemporaryRedirect()
126
+
.append_header(("Location", link.original_url))
127
+
.finish())
128
+
},
129
+
None => Err(AppError::NotFound),
130
+
}
131
+
}
132
+
133
+
pub async fn get_all_links(
134
+
state: web::Data<AppState>,
135
+
) -> Result<impl Responder, AppError> {
136
+
let links = sqlx::query_as::<_, Link>(
137
+
"SELECT * FROM links ORDER BY created_at DESC"
138
+
)
139
+
.fetch_all(&state.db)
140
+
.await?;
141
+
142
+
Ok(HttpResponse::Ok().json(links))
143
+
}
144
+
145
+
pub async fn health_check(
146
+
state: web::Data<AppState>,
147
+
) -> impl Responder {
148
+
match sqlx::query("SELECT 1").execute(&state.db).await {
149
+
Ok(_) => HttpResponse::Ok().json("Healthy"),
150
+
Err(_) => HttpResponse::ServiceUnavailable().json("Database unavailable"),
151
+
}
152
+
}
153
+
154
+
fn generate_short_code() -> String {
155
+
use base62::encode;
156
+
use uuid::Uuid;
157
+
158
+
let uuid = Uuid::new_v4();
159
+
encode(uuid.as_u128() as u64).chars().take(8).collect()
160
+
}
+74
src/main.rs
+74
src/main.rs
···
1
+
use actix_web::{web, App, HttpServer};
2
+
use actix_cors::Cors;
3
+
use anyhow::Result;
4
+
use sqlx::PgPool;
5
+
use tracing::info;
6
+
7
+
mod error;
8
+
mod handlers;
9
+
mod models;
10
+
11
+
#[derive(Clone)]
12
+
pub struct AppState {
13
+
db: PgPool,
14
+
}
15
+
16
+
#[actix_web::main]
17
+
async fn main() -> Result<()> {
18
+
// Load environment variables from .env file
19
+
dotenv::dotenv().ok();
20
+
21
+
// Initialize logging
22
+
tracing_subscriber::fmt::init();
23
+
24
+
// Database connection string from environment
25
+
let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
26
+
27
+
// Create database connection pool
28
+
use sqlx::postgres::PgPoolOptions;
29
+
30
+
// In main(), replace the PgPool::connect with:
31
+
let pool = PgPoolOptions::new()
32
+
.max_connections(5)
33
+
.acquire_timeout(std::time::Duration::from_secs(3))
34
+
.connect(&database_url)
35
+
.await?;
36
+
37
+
// Run database migrations
38
+
sqlx::migrate!("./migrations").run(&pool).await?;
39
+
40
+
let state = AppState { db: pool };
41
+
42
+
info!("Starting server at http://127.0.0.1:8080");
43
+
44
+
// Start HTTP server
45
+
HttpServer::new(move || {
46
+
let cors = Cors::default()
47
+
.allow_any_origin()
48
+
.allow_any_method()
49
+
.allow_any_header()
50
+
.max_age(3600);
51
+
52
+
App::new()
53
+
.wrap(cors)
54
+
.app_data(web::Data::new(state.clone()))
55
+
.service(
56
+
web::scope("/api")
57
+
.route("/shorten", web::post().to(handlers::create_short_url))
58
+
.route("/links", web::get().to(handlers::get_all_links)),
59
+
60
+
)
61
+
.service(
62
+
web::resource("/{short_code}")
63
+
.route(web::get().to(handlers::redirect_to_url))
64
+
)
65
+
.service(web::resource("/{short_code}").route(web::get().to(handlers::redirect_to_url)))
66
+
})
67
+
.workers(2) // Limit worker threads
68
+
.backlog(10_000)
69
+
.bind("127.0.0.1:8080")?
70
+
.run()
71
+
.await?;
72
+
73
+
Ok(())
74
+
}
+50
src/models.rs
+50
src/models.rs
···
1
+
use serde::{Deserialize, Serialize};
2
+
use sqlx::FromRow;
3
+
4
+
#[derive(Deserialize)]
5
+
pub struct CreateLink {
6
+
pub url: String,
7
+
pub source: Option<String>,
8
+
pub custom_code: Option<String>,
9
+
}
10
+
11
+
#[derive(Serialize, FromRow)]
12
+
pub struct Link {
13
+
pub id: i32,
14
+
pub user_id: i32,
15
+
pub original_url: String,
16
+
pub short_code: String,
17
+
pub created_at: chrono::DateTime<chrono::Utc>,
18
+
pub clicks: i64,
19
+
}
20
+
21
+
#[derive(Deserialize)]
22
+
pub struct LoginRequest {
23
+
pub email: String,
24
+
pub password: String,
25
+
}
26
+
27
+
#[derive(Deserialize)]
28
+
pub struct RegisterRequest {
29
+
pub email: String,
30
+
pub password: String,
31
+
}
32
+
33
+
#[derive(Serialize)]
34
+
pub struct AuthResponse {
35
+
pub token: String,
36
+
pub user: UserResponse,
37
+
}
38
+
39
+
#[derive(Serialize)]
40
+
pub struct UserResponse {
41
+
pub id: i32,
42
+
pub email: String,
43
+
}
44
+
45
+
#[derive(FromRow)]
46
+
pub struct User {
47
+
pub id: i32,
48
+
pub email: String,
49
+
pub password_hash: String,
50
+
}