admin interface (incomplete)

Massimo Melina committed Feb 2, 2022 at 00:01 UTC 1a781ec3b0d4932b38b3d1442c7b6cfbdcb130c4
47 files changed +30467 -54
admin/.gitignore new
+23
@@ -0,0 +1,23 @@
1 +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 +
3 +# dependencies
4 +/node_modules
5 +/.pnp
6 +.pnp.js
7 +
8 +# testing
9 +/coverage
10 +
11 +# production
12 +/build
13 +
14 +# misc
15 +.DS_Store
16 +.env.local
17 +.env.development.local
18 +.env.test.local
19 +.env.production.local
20 +
21 +npm-debug.log*
22 +yarn-debug.log*
23 +yarn-error.log*
admin/package-lock.json new
+28653
@@ -0,0 +1,28653 @@
1 +{
2 + "name": "admin",
3 + "version": "0.8.0",
4 + "lockfileVersion": 2,
5 + "requires": true,
6 + "packages": {
7 + "": {
8 + "name": "admin",
9 + "version": "0.8.0",
10 + "dependencies": {
11 + "@emotion/react": "^11.7.1",
12 + "@emotion/styled": "^11.6.0",
13 + "@mui/icons-material": "^5.3.0",
14 + "@mui/lab": "^5.0.0-alpha.66",
15 + "@mui/material": "^5.3.0",
16 + "@mui/styles": "^5.3.0",
17 + "@mui/x-data-grid": "^5.3.0",
18 + "@testing-library/jest-dom": "^5.16.1",
19 + "@testing-library/react": "^12.1.2",
20 + "@testing-library/user-event": "^13.5.0",
21 + "@types/jest": "^27.4.0",
22 + "@types/node": "^16.11.21",
23 + "@types/react": "^17.0.38",
24 + "@types/react-dom": "^17.0.11",
25 + "react": "^17.0.2",
26 + "react-dom": "^17.0.2",
27 + "react-router-dom": "^6.2.1",
28 + "react-scripts": "5.0.0",
29 + "typescript": "^4.5.5",
30 + "valtio": "^1.2.9",
31 + "web-vitals": "^2.1.4"
32 + }
33 + },
34 + "node_modules/@babel/code-frame": {
35 + "version": "7.16.7",
36 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
37 + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
38 + "dependencies": {
39 + "@babel/highlight": "^7.16.7"
40 + },
41 + "engines": {
42 + "node": ">=6.9.0"
43 + }
44 + },
45 + "node_modules/@babel/compat-data": {
46 + "version": "7.16.8",
47 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz",
48 + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==",
49 + "engines": {
50 + "node": ">=6.9.0"
51 + }
52 + },
53 + "node_modules/@babel/core": {
54 + "version": "7.16.12",
55 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz",
56 + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==",
57 + "dependencies": {
58 + "@babel/code-frame": "^7.16.7",
59 + "@babel/generator": "^7.16.8",
60 + "@babel/helper-compilation-targets": "^7.16.7",
61 + "@babel/helper-module-transforms": "^7.16.7",
62 + "@babel/helpers": "^7.16.7",
63 + "@babel/parser": "^7.16.12",
64 + "@babel/template": "^7.16.7",
65 + "@babel/traverse": "^7.16.10",
66 + "@babel/types": "^7.16.8",
67 + "convert-source-map": "^1.7.0",
68 + "debug": "^4.1.0",
69 + "gensync": "^1.0.0-beta.2",
70 + "json5": "^2.1.2",
71 + "semver": "^6.3.0",
72 + "source-map": "^0.5.0"
73 + },
74 + "engines": {
75 + "node": ">=6.9.0"
76 + },
77 + "funding": {
78 + "type": "opencollective",
79 + "url": "https://opencollective.com/babel"
80 + }
81 + },
82 + "node_modules/@babel/core/node_modules/semver": {
83 + "version": "6.3.0",
84 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
85 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
86 + "bin": {
87 + "semver": "bin/semver.js"
88 + }
89 + },
90 + "node_modules/@babel/eslint-parser": {
91 + "version": "7.16.5",
92 + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz",
93 + "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==",
94 + "dependencies": {
95 + "eslint-scope": "^5.1.1",
96 + "eslint-visitor-keys": "^2.1.0",
97 + "semver": "^6.3.0"
98 + },
99 + "engines": {
100 + "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
101 + },
102 + "peerDependencies": {
103 + "@babel/core": ">=7.11.0",
104 + "eslint": "^7.5.0 || ^8.0.0"
105 + }
106 + },
107 + "node_modules/@babel/eslint-parser/node_modules/eslint-scope": {
108 + "version": "5.1.1",
109 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
110 + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
111 + "dependencies": {
112 + "esrecurse": "^4.3.0",
113 + "estraverse": "^4.1.1"
114 + },
115 + "engines": {
116 + "node": ">=8.0.0"
117 + }
118 + },
119 + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
120 + "version": "2.1.0",
121 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
122 + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
123 + "engines": {
124 + "node": ">=10"
125 + }
126 + },
127 + "node_modules/@babel/eslint-parser/node_modules/estraverse": {
128 + "version": "4.3.0",
129 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
130 + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
131 + "engines": {
132 + "node": ">=4.0"
133 + }
134 + },
135 + "node_modules/@babel/eslint-parser/node_modules/semver": {
136 + "version": "6.3.0",
137 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
138 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
139 + "bin": {
140 + "semver": "bin/semver.js"
141 + }
142 + },
143 + "node_modules/@babel/generator": {
144 + "version": "7.16.8",
145 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz",
146 + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==",
147 + "dependencies": {
148 + "@babel/types": "^7.16.8",
149 + "jsesc": "^2.5.1",
150 + "source-map": "^0.5.0"
151 + },
152 + "engines": {
153 + "node": ">=6.9.0"
154 + }
155 + },
156 + "node_modules/@babel/helper-annotate-as-pure": {
157 + "version": "7.16.7",
158 + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
159 + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
160 + "dependencies": {
161 + "@babel/types": "^7.16.7"
162 + },
163 + "engines": {
164 + "node": ">=6.9.0"
165 + }
166 + },
167 + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
168 + "version": "7.16.7",
169 + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
170 + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
171 + "dependencies": {
172 + "@babel/helper-explode-assignable-expression": "^7.16.7",
173 + "@babel/types": "^7.16.7"
174 + },
175 + "engines": {
176 + "node": ">=6.9.0"
177 + }
178 + },
179 + "node_modules/@babel/helper-compilation-targets": {
180 + "version": "7.16.7",
181 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
182 + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
183 + "dependencies": {
184 + "@babel/compat-data": "^7.16.4",
185 + "@babel/helper-validator-option": "^7.16.7",
186 + "browserslist": "^4.17.5",
187 + "semver": "^6.3.0"
188 + },
189 + "engines": {
190 + "node": ">=6.9.0"
191 + },
192 + "peerDependencies": {
193 + "@babel/core": "^7.0.0"
194 + }
195 + },
196 + "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
197 + "version": "6.3.0",
198 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
199 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
200 + "bin": {
201 + "semver": "bin/semver.js"
202 + }
203 + },
204 + "node_modules/@babel/helper-create-class-features-plugin": {
205 + "version": "7.16.10",
206 + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz",
207 + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==",
208 + "dependencies": {
209 + "@babel/helper-annotate-as-pure": "^7.16.7",
210 + "@babel/helper-environment-visitor": "^7.16.7",
211 + "@babel/helper-function-name": "^7.16.7",
212 + "@babel/helper-member-expression-to-functions": "^7.16.7",
213 + "@babel/helper-optimise-call-expression": "^7.16.7",
214 + "@babel/helper-replace-supers": "^7.16.7",
215 + "@babel/helper-split-export-declaration": "^7.16.7"
216 + },
217 + "engines": {
218 + "node": ">=6.9.0"
219 + },
220 + "peerDependencies": {
221 + "@babel/core": "^7.0.0"
222 + }
223 + },
224 + "node_modules/@babel/helper-create-regexp-features-plugin": {
225 + "version": "7.16.7",
226 + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz",
227 + "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==",
228 + "dependencies": {
229 + "@babel/helper-annotate-as-pure": "^7.16.7",
230 + "regexpu-core": "^4.7.1"
231 + },
232 + "engines": {
233 + "node": ">=6.9.0"
234 + },
235 + "peerDependencies": {
236 + "@babel/core": "^7.0.0"
237 + }
238 + },
239 + "node_modules/@babel/helper-define-polyfill-provider": {
240 + "version": "0.3.1",
241 + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
242 + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
243 + "dependencies": {
244 + "@babel/helper-compilation-targets": "^7.13.0",
245 + "@babel/helper-module-imports": "^7.12.13",
246 + "@babel/helper-plugin-utils": "^7.13.0",
247 + "@babel/traverse": "^7.13.0",
248 + "debug": "^4.1.1",
249 + "lodash.debounce": "^4.0.8",
250 + "resolve": "^1.14.2",
251 + "semver": "^6.1.2"
252 + },
253 + "peerDependencies": {
254 + "@babel/core": "^7.4.0-0"
255 + }
256 + },
257 + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
258 + "version": "6.3.0",
259 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
260 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
261 + "bin": {
262 + "semver": "bin/semver.js"
263 + }
264 + },
265 + "node_modules/@babel/helper-environment-visitor": {
266 + "version": "7.16.7",
267 + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
268 + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
269 + "dependencies": {
270 + "@babel/types": "^7.16.7"
271 + },
272 + "engines": {
273 + "node": ">=6.9.0"
274 + }
275 + },
276 + "node_modules/@babel/helper-explode-assignable-expression": {
277 + "version": "7.16.7",
278 + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
279 + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
280 + "dependencies": {
281 + "@babel/types": "^7.16.7"
282 + },
283 + "engines": {
284 + "node": ">=6.9.0"
285 + }
286 + },
287 + "node_modules/@babel/helper-function-name": {
288 + "version": "7.16.7",
289 + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
290 + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
291 + "dependencies": {
292 + "@babel/helper-get-function-arity": "^7.16.7",
293 + "@babel/template": "^7.16.7",
294 + "@babel/types": "^7.16.7"
295 + },
296 + "engines": {
297 + "node": ">=6.9.0"
298 + }
299 + },
300 + "node_modules/@babel/helper-get-function-arity": {
301 + "version": "7.16.7",
302 + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
303 + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
304 + "dependencies": {
305 + "@babel/types": "^7.16.7"
306 + },
307 + "engines": {
308 + "node": ">=6.9.0"
309 + }
310 + },
311 + "node_modules/@babel/helper-hoist-variables": {
312 + "version": "7.16.7",
313 + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
314 + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
315 + "dependencies": {
316 + "@babel/types": "^7.16.7"
317 + },
318 + "engines": {
319 + "node": ">=6.9.0"
320 + }
321 + },
322 + "node_modules/@babel/helper-member-expression-to-functions": {
323 + "version": "7.16.7",
324 + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
325 + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
326 + "dependencies": {
327 + "@babel/types": "^7.16.7"
328 + },
329 + "engines": {
330 + "node": ">=6.9.0"
331 + }
332 + },
333 + "node_modules/@babel/helper-module-imports": {
334 + "version": "7.16.7",
335 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
336 + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
337 + "dependencies": {
338 + "@babel/types": "^7.16.7"
339 + },
340 + "engines": {
341 + "node": ">=6.9.0"
342 + }
343 + },
344 + "node_modules/@babel/helper-module-transforms": {
345 + "version": "7.16.7",
346 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz",
347 + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==",
348 + "dependencies": {
349 + "@babel/helper-environment-visitor": "^7.16.7",
350 + "@babel/helper-module-imports": "^7.16.7",
351 + "@babel/helper-simple-access": "^7.16.7",
352 + "@babel/helper-split-export-declaration": "^7.16.7",
353 + "@babel/helper-validator-identifier": "^7.16.7",
354 + "@babel/template": "^7.16.7",
355 + "@babel/traverse": "^7.16.7",
356 + "@babel/types": "^7.16.7"
357 + },
358 + "engines": {
359 + "node": ">=6.9.0"
360 + }
361 + },
362 + "node_modules/@babel/helper-optimise-call-expression": {
363 + "version": "7.16.7",
364 + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
365 + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
366 + "dependencies": {
367 + "@babel/types": "^7.16.7"
368 + },
369 + "engines": {
370 + "node": ">=6.9.0"
371 + }
372 + },
373 + "node_modules/@babel/helper-plugin-utils": {
374 + "version": "7.16.7",
375 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
376 + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
377 + "engines": {
378 + "node": ">=6.9.0"
379 + }
380 + },
381 + "node_modules/@babel/helper-remap-async-to-generator": {
382 + "version": "7.16.8",
383 + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
384 + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
385 + "dependencies": {
386 + "@babel/helper-annotate-as-pure": "^7.16.7",
387 + "@babel/helper-wrap-function": "^7.16.8",
388 + "@babel/types": "^7.16.8"
389 + },
390 + "engines": {
391 + "node": ">=6.9.0"
392 + }
393 + },
394 + "node_modules/@babel/helper-replace-supers": {
395 + "version": "7.16.7",
396 + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
397 + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
398 + "dependencies": {
399 + "@babel/helper-environment-visitor": "^7.16.7",
400 + "@babel/helper-member-expression-to-functions": "^7.16.7",
401 + "@babel/helper-optimise-call-expression": "^7.16.7",
402 + "@babel/traverse": "^7.16.7",
403 + "@babel/types": "^7.16.7"
404 + },
405 + "engines": {
406 + "node": ">=6.9.0"
407 + }
408 + },
409 + "node_modules/@babel/helper-simple-access": {
410 + "version": "7.16.7",
411 + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
412 + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
413 + "dependencies": {
414 + "@babel/types": "^7.16.7"
415 + },
416 + "engines": {
417 + "node": ">=6.9.0"
418 + }
419 + },
420 + "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
421 + "version": "7.16.0",
422 + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
423 + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
424 + "dependencies": {
425 + "@babel/types": "^7.16.0"
426 + },
427 + "engines": {
428 + "node": ">=6.9.0"
429 + }
430 + },
431 + "node_modules/@babel/helper-split-export-declaration": {
432 + "version": "7.16.7",
433 + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
434 + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
435 + "dependencies": {
436 + "@babel/types": "^7.16.7"
437 + },
438 + "engines": {
439 + "node": ">=6.9.0"
440 + }
441 + },
442 + "node_modules/@babel/helper-validator-identifier": {
443 + "version": "7.16.7",
444 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
445 + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
446 + "engines": {
447 + "node": ">=6.9.0"
448 + }
449 + },
450 + "node_modules/@babel/helper-validator-option": {
451 + "version": "7.16.7",
452 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
453 + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
454 + "engines": {
455 + "node": ">=6.9.0"
456 + }
457 + },
458 + "node_modules/@babel/helper-wrap-function": {
459 + "version": "7.16.8",
460 + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
461 + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
462 + "dependencies": {
463 + "@babel/helper-function-name": "^7.16.7",
464 + "@babel/template": "^7.16.7",
465 + "@babel/traverse": "^7.16.8",
466 + "@babel/types": "^7.16.8"
467 + },
468 + "engines": {
469 + "node": ">=6.9.0"
470 + }
471 + },
472 + "node_modules/@babel/helpers": {
473 + "version": "7.16.7",
474 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz",
475 + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==",
476 + "dependencies": {
477 + "@babel/template": "^7.16.7",
478 + "@babel/traverse": "^7.16.7",
479 + "@babel/types": "^7.16.7"
480 + },
481 + "engines": {
482 + "node": ">=6.9.0"
483 + }
484 + },
485 + "node_modules/@babel/highlight": {
486 + "version": "7.16.10",
487 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
488 + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
489 + "dependencies": {
490 + "@babel/helper-validator-identifier": "^7.16.7",
491 + "chalk": "^2.0.0",
492 + "js-tokens": "^4.0.0"
493 + },
494 + "engines": {
495 + "node": ">=6.9.0"
496 + }
497 + },
498 + "node_modules/@babel/parser": {
499 + "version": "7.16.12",
500 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz",
501 + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==",
502 + "bin": {
503 + "parser": "bin/babel-parser.js"
504 + },
505 + "engines": {
506 + "node": ">=6.0.0"
507 + }
508 + },
509 + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
510 + "version": "7.16.7",
511 + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
512 + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
513 + "dependencies": {
514 + "@babel/helper-plugin-utils": "^7.16.7"
515 + },
516 + "engines": {
517 + "node": ">=6.9.0"
518 + },
519 + "peerDependencies": {
520 + "@babel/core": "^7.0.0"
521 + }
522 + },
523 + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
524 + "version": "7.16.7",
525 + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
526 + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
527 + "dependencies": {
528 + "@babel/helper-plugin-utils": "^7.16.7",
529 + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
530 + "@babel/plugin-proposal-optional-chaining": "^7.16.7"
531 + },
532 + "engines": {
533 + "node": ">=6.9.0"
534 + },
535 + "peerDependencies": {
536 + "@babel/core": "^7.13.0"
537 + }
538 + },
539 + "node_modules/@babel/plugin-proposal-async-generator-functions": {
540 + "version": "7.16.8",
541 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
542 + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
543 + "dependencies": {
544 + "@babel/helper-plugin-utils": "^7.16.7",
545 + "@babel/helper-remap-async-to-generator": "^7.16.8",
546 + "@babel/plugin-syntax-async-generators": "^7.8.4"
547 + },
548 + "engines": {
549 + "node": ">=6.9.0"
550 + },
551 + "peerDependencies": {
552 + "@babel/core": "^7.0.0-0"
553 + }
554 + },
555 + "node_modules/@babel/plugin-proposal-class-properties": {
556 + "version": "7.16.7",
557 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
558 + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
559 + "dependencies": {
560 + "@babel/helper-create-class-features-plugin": "^7.16.7",
561 + "@babel/helper-plugin-utils": "^7.16.7"
562 + },
563 + "engines": {
564 + "node": ">=6.9.0"
565 + },
566 + "peerDependencies": {
567 + "@babel/core": "^7.0.0-0"
568 + }
569 + },
570 + "node_modules/@babel/plugin-proposal-class-static-block": {
571 + "version": "7.16.7",
572 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz",
573 + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==",
574 + "dependencies": {
575 + "@babel/helper-create-class-features-plugin": "^7.16.7",
576 + "@babel/helper-plugin-utils": "^7.16.7",
577 + "@babel/plugin-syntax-class-static-block": "^7.14.5"
578 + },
579 + "engines": {
580 + "node": ">=6.9.0"
581 + },
582 + "peerDependencies": {
583 + "@babel/core": "^7.12.0"
584 + }
585 + },
586 + "node_modules/@babel/plugin-proposal-decorators": {
587 + "version": "7.16.7",
588 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz",
589 + "integrity": "sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ==",
590 + "dependencies": {
591 + "@babel/helper-create-class-features-plugin": "^7.16.7",
592 + "@babel/helper-plugin-utils": "^7.16.7",
593 + "@babel/plugin-syntax-decorators": "^7.16.7"
594 + },
595 + "engines": {
596 + "node": ">=6.9.0"
597 + },
598 + "peerDependencies": {
599 + "@babel/core": "^7.0.0-0"
600 + }
601 + },
602 + "node_modules/@babel/plugin-proposal-dynamic-import": {
603 + "version": "7.16.7",
604 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
605 + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
606 + "dependencies": {
607 + "@babel/helper-plugin-utils": "^7.16.7",
608 + "@babel/plugin-syntax-dynamic-import": "^7.8.3"
609 + },
610 + "engines": {
611 + "node": ">=6.9.0"
612 + },
613 + "peerDependencies": {
614 + "@babel/core": "^7.0.0-0"
615 + }
616 + },
617 + "node_modules/@babel/plugin-proposal-export-namespace-from": {
618 + "version": "7.16.7",
619 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
620 + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
621 + "dependencies": {
622 + "@babel/helper-plugin-utils": "^7.16.7",
623 + "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
624 + },
625 + "engines": {
626 + "node": ">=6.9.0"
627 + },
628 + "peerDependencies": {
629 + "@babel/core": "^7.0.0-0"
630 + }
631 + },
632 + "node_modules/@babel/plugin-proposal-json-strings": {
633 + "version": "7.16.7",
634 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
635 + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
636 + "dependencies": {
637 + "@babel/helper-plugin-utils": "^7.16.7",
638 + "@babel/plugin-syntax-json-strings": "^7.8.3"
639 + },
640 + "engines": {
641 + "node": ">=6.9.0"
642 + },
643 + "peerDependencies": {
644 + "@babel/core": "^7.0.0-0"
645 + }
646 + },
647 + "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
648 + "version": "7.16.7",
649 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
650 + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
651 + "dependencies": {
652 + "@babel/helper-plugin-utils": "^7.16.7",
653 + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
654 + },
655 + "engines": {
656 + "node": ">=6.9.0"
657 + },
658 + "peerDependencies": {
659 + "@babel/core": "^7.0.0-0"
660 + }
661 + },
662 + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
663 + "version": "7.16.7",
664 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
665 + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
666 + "dependencies": {
667 + "@babel/helper-plugin-utils": "^7.16.7",
668 + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
669 + },
670 + "engines": {
671 + "node": ">=6.9.0"
672 + },
673 + "peerDependencies": {
674 + "@babel/core": "^7.0.0-0"
675 + }
676 + },
677 + "node_modules/@babel/plugin-proposal-numeric-separator": {
678 + "version": "7.16.7",
679 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
680 + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
681 + "dependencies": {
682 + "@babel/helper-plugin-utils": "^7.16.7",
683 + "@babel/plugin-syntax-numeric-separator": "^7.10.4"
684 + },
685 + "engines": {
686 + "node": ">=6.9.0"
687 + },
688 + "peerDependencies": {
689 + "@babel/core": "^7.0.0-0"
690 + }
691 + },
692 + "node_modules/@babel/plugin-proposal-object-rest-spread": {
693 + "version": "7.16.7",
694 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz",
695 + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==",
696 + "dependencies": {
697 + "@babel/compat-data": "^7.16.4",
698 + "@babel/helper-compilation-targets": "^7.16.7",
699 + "@babel/helper-plugin-utils": "^7.16.7",
700 + "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
701 + "@babel/plugin-transform-parameters": "^7.16.7"
702 + },
703 + "engines": {
704 + "node": ">=6.9.0"
705 + },
706 + "peerDependencies": {
707 + "@babel/core": "^7.0.0-0"
708 + }
709 + },
710 + "node_modules/@babel/plugin-proposal-optional-catch-binding": {
711 + "version": "7.16.7",
712 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
713 + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
714 + "dependencies": {
715 + "@babel/helper-plugin-utils": "^7.16.7",
716 + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
717 + },
718 + "engines": {
719 + "node": ">=6.9.0"
720 + },
721 + "peerDependencies": {
722 + "@babel/core": "^7.0.0-0"
723 + }
724 + },
725 + "node_modules/@babel/plugin-proposal-optional-chaining": {
726 + "version": "7.16.7",
727 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
728 + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
729 + "dependencies": {
730 + "@babel/helper-plugin-utils": "^7.16.7",
731 + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
732 + "@babel/plugin-syntax-optional-chaining": "^7.8.3"
733 + },
734 + "engines": {
735 + "node": ">=6.9.0"
736 + },
737 + "peerDependencies": {
738 + "@babel/core": "^7.0.0-0"
739 + }
740 + },
741 + "node_modules/@babel/plugin-proposal-private-methods": {
742 + "version": "7.16.11",
743 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
744 + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
745 + "dependencies": {
746 + "@babel/helper-create-class-features-plugin": "^7.16.10",
747 + "@babel/helper-plugin-utils": "^7.16.7"
748 + },
749 + "engines": {
750 + "node": ">=6.9.0"
751 + },
752 + "peerDependencies": {
753 + "@babel/core": "^7.0.0-0"
754 + }
755 + },
756 + "node_modules/@babel/plugin-proposal-private-property-in-object": {
757 + "version": "7.16.7",
758 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
759 + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
760 + "dependencies": {
761 + "@babel/helper-annotate-as-pure": "^7.16.7",
762 + "@babel/helper-create-class-features-plugin": "^7.16.7",
763 + "@babel/helper-plugin-utils": "^7.16.7",
764 + "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
765 + },
766 + "engines": {
767 + "node": ">=6.9.0"
768 + },
769 + "peerDependencies": {
770 + "@babel/core": "^7.0.0-0"
771 + }
772 + },
773 + "node_modules/@babel/plugin-proposal-unicode-property-regex": {
774 + "version": "7.16.7",
775 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
776 + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
777 + "dependencies": {
778 + "@babel/helper-create-regexp-features-plugin": "^7.16.7",
779 + "@babel/helper-plugin-utils": "^7.16.7"
780 + },
781 + "engines": {
782 + "node": ">=4"
783 + },
784 + "peerDependencies": {
785 + "@babel/core": "^7.0.0-0"
786 + }
787 + },
788 + "node_modules/@babel/plugin-syntax-async-generators": {
789 + "version": "7.8.4",
790 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
791 + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
792 + "dependencies": {
793 + "@babel/helper-plugin-utils": "^7.8.0"
794 + },
795 + "peerDependencies": {
796 + "@babel/core": "^7.0.0-0"
797 + }
798 + },
799 + "node_modules/@babel/plugin-syntax-bigint": {
800 + "version": "7.8.3",
801 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
802 + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
803 + "dependencies": {
804 + "@babel/helper-plugin-utils": "^7.8.0"
805 + },
806 + "peerDependencies": {
807 + "@babel/core": "^7.0.0-0"
808 + }
809 + },
810 + "node_modules/@babel/plugin-syntax-class-properties": {
811 + "version": "7.12.13",
812 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
813 + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
814 + "dependencies": {
815 + "@babel/helper-plugin-utils": "^7.12.13"
816 + },
817 + "peerDependencies": {
818 + "@babel/core": "^7.0.0-0"
819 + }
820 + },
821 + "node_modules/@babel/plugin-syntax-class-static-block": {
822 + "version": "7.14.5",
823 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
824 + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
825 + "dependencies": {
826 + "@babel/helper-plugin-utils": "^7.14.5"
827 + },
828 + "engines": {
829 + "node": ">=6.9.0"
830 + },
831 + "peerDependencies": {
832 + "@babel/core": "^7.0.0-0"
833 + }
834 + },
835 + "node_modules/@babel/plugin-syntax-decorators": {
836 + "version": "7.16.7",
837 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz",
838 + "integrity": "sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw==",
839 + "dependencies": {
840 + "@babel/helper-plugin-utils": "^7.16.7"
841 + },
842 + "engines": {
843 + "node": ">=6.9.0"
844 + },
845 + "peerDependencies": {
846 + "@babel/core": "^7.0.0-0"
847 + }
848 + },
849 + "node_modules/@babel/plugin-syntax-dynamic-import": {
850 + "version": "7.8.3",
851 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
852 + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
853 + "dependencies": {
854 + "@babel/helper-plugin-utils": "^7.8.0"
855 + },
856 + "peerDependencies": {
857 + "@babel/core": "^7.0.0-0"
858 + }
859 + },
860 + "node_modules/@babel/plugin-syntax-export-namespace-from": {
861 + "version": "7.8.3",
862 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
863 + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
864 + "dependencies": {
865 + "@babel/helper-plugin-utils": "^7.8.3"
866 + },
867 + "peerDependencies": {
868 + "@babel/core": "^7.0.0-0"
869 + }
870 + },
871 + "node_modules/@babel/plugin-syntax-flow": {
872 + "version": "7.16.7",
873 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz",
874 + "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==",
875 + "dependencies": {
876 + "@babel/helper-plugin-utils": "^7.16.7"
877 + },
878 + "engines": {
879 + "node": ">=6.9.0"
880 + },
881 + "peerDependencies": {
882 + "@babel/core": "^7.0.0-0"
883 + }
884 + },
885 + "node_modules/@babel/plugin-syntax-import-meta": {
886 + "version": "7.10.4",
887 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
888 + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
889 + "dependencies": {
890 + "@babel/helper-plugin-utils": "^7.10.4"
891 + },
892 + "peerDependencies": {
893 + "@babel/core": "^7.0.0-0"
894 + }
895 + },
896 + "node_modules/@babel/plugin-syntax-json-strings": {
897 + "version": "7.8.3",
898 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
899 + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
900 + "dependencies": {
901 + "@babel/helper-plugin-utils": "^7.8.0"
902 + },
903 + "peerDependencies": {
904 + "@babel/core": "^7.0.0-0"
905 + }
906 + },
907 + "node_modules/@babel/plugin-syntax-jsx": {
908 + "version": "7.16.7",
909 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
910 + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
911 + "dependencies": {
912 + "@babel/helper-plugin-utils": "^7.16.7"
913 + },
914 + "engines": {
915 + "node": ">=6.9.0"
916 + },
917 + "peerDependencies": {
918 + "@babel/core": "^7.0.0-0"
919 + }
920 + },
921 + "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
922 + "version": "7.10.4",
923 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
924 + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
925 + "dependencies": {
926 + "@babel/helper-plugin-utils": "^7.10.4"
927 + },
928 + "peerDependencies": {
929 + "@babel/core": "^7.0.0-0"
930 + }
931 + },
932 + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
933 + "version": "7.8.3",
934 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
935 + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
936 + "dependencies": {
937 + "@babel/helper-plugin-utils": "^7.8.0"
938 + },
939 + "peerDependencies": {
940 + "@babel/core": "^7.0.0-0"
941 + }
942 + },
943 + "node_modules/@babel/plugin-syntax-numeric-separator": {
944 + "version": "7.10.4",
945 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
946 + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
947 + "dependencies": {
948 + "@babel/helper-plugin-utils": "^7.10.4"
949 + },
950 + "peerDependencies": {
951 + "@babel/core": "^7.0.0-0"
952 + }
953 + },
954 + "node_modules/@babel/plugin-syntax-object-rest-spread": {
955 + "version": "7.8.3",
956 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
957 + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
958 + "dependencies": {
959 + "@babel/helper-plugin-utils": "^7.8.0"
960 + },
961 + "peerDependencies": {
962 + "@babel/core": "^7.0.0-0"
963 + }
964 + },
965 + "node_modules/@babel/plugin-syntax-optional-catch-binding": {
966 + "version": "7.8.3",
967 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
968 + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
969 + "dependencies": {
970 + "@babel/helper-plugin-utils": "^7.8.0"
971 + },
972 + "peerDependencies": {
973 + "@babel/core": "^7.0.0-0"
974 + }
975 + },
976 + "node_modules/@babel/plugin-syntax-optional-chaining": {
977 + "version": "7.8.3",
978 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
979 + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
980 + "dependencies": {
981 + "@babel/helper-plugin-utils": "^7.8.0"
982 + },
983 + "peerDependencies": {
984 + "@babel/core": "^7.0.0-0"
985 + }
986 + },
987 + "node_modules/@babel/plugin-syntax-private-property-in-object": {
988 + "version": "7.14.5",
989 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
990 + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
991 + "dependencies": {
992 + "@babel/helper-plugin-utils": "^7.14.5"
993 + },
994 + "engines": {
995 + "node": ">=6.9.0"
996 + },
997 + "peerDependencies": {
998 + "@babel/core": "^7.0.0-0"
999 + }
1000 + },
1001 + "node_modules/@babel/plugin-syntax-top-level-await": {
1002 + "version": "7.14.5",
1003 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
1004 + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
1005 + "dependencies": {
1006 + "@babel/helper-plugin-utils": "^7.14.5"
1007 + },
1008 + "engines": {
1009 + "node": ">=6.9.0"
1010 + },
1011 + "peerDependencies": {
1012 + "@babel/core": "^7.0.0-0"
1013 + }
1014 + },
1015 + "node_modules/@babel/plugin-syntax-typescript": {
1016 + "version": "7.16.7",
1017 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
1018 + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
1019 + "dependencies": {
1020 + "@babel/helper-plugin-utils": "^7.16.7"
1021 + },
1022 + "engines": {
1023 + "node": ">=6.9.0"
1024 + },
1025 + "peerDependencies": {
1026 + "@babel/core": "^7.0.0-0"
1027 + }
1028 + },
1029 + "node_modules/@babel/plugin-transform-arrow-functions": {
1030 + "version": "7.16.7",
1031 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
1032 + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
1033 + "dependencies": {
1034 + "@babel/helper-plugin-utils": "^7.16.7"
1035 + },
1036 + "engines": {
1037 + "node": ">=6.9.0"
1038 + },
1039 + "peerDependencies": {
1040 + "@babel/core": "^7.0.0-0"
1041 + }
1042 + },
1043 + "node_modules/@babel/plugin-transform-async-to-generator": {
1044 + "version": "7.16.8",
1045 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
1046 + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
1047 + "dependencies": {
1048 + "@babel/helper-module-imports": "^7.16.7",
1049 + "@babel/helper-plugin-utils": "^7.16.7",
1050 + "@babel/helper-remap-async-to-generator": "^7.16.8"
1051 + },
1052 + "engines": {
1053 + "node": ">=6.9.0"
1054 + },
1055 + "peerDependencies": {
1056 + "@babel/core": "^7.0.0-0"
1057 + }
1058 + },
1059 + "node_modules/@babel/plugin-transform-block-scoped-functions": {
1060 + "version": "7.16.7",
1061 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
1062 + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
1063 + "dependencies": {
1064 + "@babel/helper-plugin-utils": "^7.16.7"
1065 + },
1066 + "engines": {
1067 + "node": ">=6.9.0"
1068 + },
1069 + "peerDependencies": {
1070 + "@babel/core": "^7.0.0-0"
1071 + }
1072 + },
1073 + "node_modules/@babel/plugin-transform-block-scoping": {
1074 + "version": "7.16.7",
1075 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
1076 + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
1077 + "dependencies": {
1078 + "@babel/helper-plugin-utils": "^7.16.7"
1079 + },
1080 + "engines": {
1081 + "node": ">=6.9.0"
1082 + },
1083 + "peerDependencies": {
1084 + "@babel/core": "^7.0.0-0"
1085 + }
1086 + },
1087 + "node_modules/@babel/plugin-transform-classes": {
1088 + "version": "7.16.7",
1089 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
1090 + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
1091 + "dependencies": {
1092 + "@babel/helper-annotate-as-pure": "^7.16.7",
1093 + "@babel/helper-environment-visitor": "^7.16.7",
1094 + "@babel/helper-function-name": "^7.16.7",
1095 + "@babel/helper-optimise-call-expression": "^7.16.7",
1096 + "@babel/helper-plugin-utils": "^7.16.7",
1097 + "@babel/helper-replace-supers": "^7.16.7",
1098 + "@babel/helper-split-export-declaration": "^7.16.7",
1099 + "globals": "^11.1.0"
1100 + },
1101 + "engines": {
1102 + "node": ">=6.9.0"
1103 + },
1104 + "peerDependencies": {
1105 + "@babel/core": "^7.0.0-0"
1106 + }
1107 + },
1108 + "node_modules/@babel/plugin-transform-computed-properties": {
1109 + "version": "7.16.7",
1110 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
1111 + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
1112 + "dependencies": {
1113 + "@babel/helper-plugin-utils": "^7.16.7"
1114 + },
1115 + "engines": {
1116 + "node": ">=6.9.0"
1117 + },
1118 + "peerDependencies": {
1119 + "@babel/core": "^7.0.0-0"
1120 + }
1121 + },
1122 + "node_modules/@babel/plugin-transform-destructuring": {
1123 + "version": "7.16.7",
1124 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz",
1125 + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==",
1126 + "dependencies": {
1127 + "@babel/helper-plugin-utils": "^7.16.7"
1128 + },
1129 + "engines": {
1130 + "node": ">=6.9.0"
1131 + },
1132 + "peerDependencies": {
1133 + "@babel/core": "^7.0.0-0"
1134 + }
1135 + },
1136 + "node_modules/@babel/plugin-transform-dotall-regex": {
1137 + "version": "7.16.7",
1138 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
1139 + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
1140 + "dependencies": {
1141 + "@babel/helper-create-regexp-features-plugin": "^7.16.7",
1142 + "@babel/helper-plugin-utils": "^7.16.7"
1143 + },
1144 + "engines": {
1145 + "node": ">=6.9.0"
1146 + },
1147 + "peerDependencies": {
1148 + "@babel/core": "^7.0.0-0"
1149 + }
1150 + },
1151 + "node_modules/@babel/plugin-transform-duplicate-keys": {
1152 + "version": "7.16.7",
1153 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
1154 + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
1155 + "dependencies": {
1156 + "@babel/helper-plugin-utils": "^7.16.7"
1157 + },
1158 + "engines": {
1159 + "node": ">=6.9.0"
1160 + },
1161 + "peerDependencies": {
1162 + "@babel/core": "^7.0.0-0"
1163 + }
1164 + },
1165 + "node_modules/@babel/plugin-transform-exponentiation-operator": {
1166 + "version": "7.16.7",
1167 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
1168 + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
1169 + "dependencies": {
1170 + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
1171 + "@babel/helper-plugin-utils": "^7.16.7"
1172 + },
1173 + "engines": {
1174 + "node": ">=6.9.0"
1175 + },
1176 + "peerDependencies": {
1177 + "@babel/core": "^7.0.0-0"
1178 + }
1179 + },
1180 + "node_modules/@babel/plugin-transform-flow-strip-types": {
1181 + "version": "7.16.7",
1182 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz",
1183 + "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==",
1184 + "dependencies": {
1185 + "@babel/helper-plugin-utils": "^7.16.7",
1186 + "@babel/plugin-syntax-flow": "^7.16.7"
1187 + },
1188 + "engines": {
1189 + "node": ">=6.9.0"
1190 + },
1191 + "peerDependencies": {
1192 + "@babel/core": "^7.0.0-0"
1193 + }
1194 + },
1195 + "node_modules/@babel/plugin-transform-for-of": {
1196 + "version": "7.16.7",
1197 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
1198 + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
1199 + "dependencies": {
1200 + "@babel/helper-plugin-utils": "^7.16.7"
1201 + },
1202 + "engines": {
1203 + "node": ">=6.9.0"
1204 + },
1205 + "peerDependencies": {
1206 + "@babel/core": "^7.0.0-0"
1207 + }
1208 + },
1209 + "node_modules/@babel/plugin-transform-function-name": {
1210 + "version": "7.16.7",
1211 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
1212 + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
1213 + "dependencies": {
1214 + "@babel/helper-compilation-targets": "^7.16.7",
1215 + "@babel/helper-function-name": "^7.16.7",
1216 + "@babel/helper-plugin-utils": "^7.16.7"
1217 + },
1218 + "engines": {
1219 + "node": ">=6.9.0"
1220 + },
1221 + "peerDependencies": {
1222 + "@babel/core": "^7.0.0-0"
1223 + }
1224 + },
1225 + "node_modules/@babel/plugin-transform-literals": {
1226 + "version": "7.16.7",
1227 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
1228 + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
1229 + "dependencies": {
1230 + "@babel/helper-plugin-utils": "^7.16.7"
1231 + },
1232 + "engines": {
1233 + "node": ">=6.9.0"
1234 + },
1235 + "peerDependencies": {
1236 + "@babel/core": "^7.0.0-0"
1237 + }
1238 + },
1239 + "node_modules/@babel/plugin-transform-member-expression-literals": {
1240 + "version": "7.16.7",
1241 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
1242 + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
1243 + "dependencies": {
1244 + "@babel/helper-plugin-utils": "^7.16.7"
1245 + },
1246 + "engines": {
1247 + "node": ">=6.9.0"
1248 + },
1249 + "peerDependencies": {
1250 + "@babel/core": "^7.0.0-0"
1251 + }
1252 + },
1253 + "node_modules/@babel/plugin-transform-modules-amd": {
1254 + "version": "7.16.7",
1255 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
1256 + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
1257 + "dependencies": {
1258 + "@babel/helper-module-transforms": "^7.16.7",
1259 + "@babel/helper-plugin-utils": "^7.16.7",
1260 + "babel-plugin-dynamic-import-node": "^2.3.3"
1261 + },
1262 + "engines": {
1263 + "node": ">=6.9.0"
1264 + },
1265 + "peerDependencies": {
1266 + "@babel/core": "^7.0.0-0"
1267 + }
1268 + },
1269 + "node_modules/@babel/plugin-transform-modules-commonjs": {
1270 + "version": "7.16.8",
1271 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
1272 + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
1273 + "dependencies": {
1274 + "@babel/helper-module-transforms": "^7.16.7",
1275 + "@babel/helper-plugin-utils": "^7.16.7",
1276 + "@babel/helper-simple-access": "^7.16.7",
1277 + "babel-plugin-dynamic-import-node": "^2.3.3"
1278 + },
1279 + "engines": {
1280 + "node": ">=6.9.0"
1281 + },
1282 + "peerDependencies": {
1283 + "@babel/core": "^7.0.0-0"
1284 + }
1285 + },
1286 + "node_modules/@babel/plugin-transform-modules-systemjs": {
1287 + "version": "7.16.7",
1288 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
1289 + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
1290 + "dependencies": {
1291 + "@babel/helper-hoist-variables": "^7.16.7",
1292 + "@babel/helper-module-transforms": "^7.16.7",
1293 + "@babel/helper-plugin-utils": "^7.16.7",
1294 + "@babel/helper-validator-identifier": "^7.16.7",
1295 + "babel-plugin-dynamic-import-node": "^2.3.3"
1296 + },
1297 + "engines": {
1298 + "node": ">=6.9.0"
1299 + },
1300 + "peerDependencies": {
1301 + "@babel/core": "^7.0.0-0"
1302 + }
1303 + },
1304 + "node_modules/@babel/plugin-transform-modules-umd": {
1305 + "version": "7.16.7",
1306 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
1307 + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
1308 + "dependencies": {
1309 + "@babel/helper-module-transforms": "^7.16.7",
1310 + "@babel/helper-plugin-utils": "^7.16.7"
1311 + },
1312 + "engines": {
1313 + "node": ">=6.9.0"
1314 + },
1315 + "peerDependencies": {
1316 + "@babel/core": "^7.0.0-0"
1317 + }
1318 + },
1319 + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
1320 + "version": "7.16.8",
1321 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
1322 + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
1323 + "dependencies": {
1324 + "@babel/helper-create-regexp-features-plugin": "^7.16.7"
1325 + },
1326 + "engines": {
1327 + "node": ">=6.9.0"
1328 + },
1329 + "peerDependencies": {
1330 + "@babel/core": "^7.0.0"
1331 + }
1332 + },
1333 + "node_modules/@babel/plugin-transform-new-target": {
1334 + "version": "7.16.7",
1335 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
1336 + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
1337 + "dependencies": {
1338 + "@babel/helper-plugin-utils": "^7.16.7"
1339 + },
1340 + "engines": {
1341 + "node": ">=6.9.0"
1342 + },
1343 + "peerDependencies": {
1344 + "@babel/core": "^7.0.0-0"
1345 + }
1346 + },
1347 + "node_modules/@babel/plugin-transform-object-super": {
1348 + "version": "7.16.7",
1349 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
1350 + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
1351 + "dependencies": {
1352 + "@babel/helper-plugin-utils": "^7.16.7",
1353 + "@babel/helper-replace-supers": "^7.16.7"
1354 + },
1355 + "engines": {
1356 + "node": ">=6.9.0"
1357 + },
1358 + "peerDependencies": {
1359 + "@babel/core": "^7.0.0-0"
1360 + }
1361 + },
1362 + "node_modules/@babel/plugin-transform-parameters": {
1363 + "version": "7.16.7",
1364 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
1365 + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
1366 + "dependencies": {
1367 + "@babel/helper-plugin-utils": "^7.16.7"
1368 + },
1369 + "engines": {
1370 + "node": ">=6.9.0"
1371 + },
1372 + "peerDependencies": {
1373 + "@babel/core": "^7.0.0-0"
1374 + }
1375 + },
1376 + "node_modules/@babel/plugin-transform-property-literals": {
1377 + "version": "7.16.7",
1378 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
1379 + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
1380 + "dependencies": {
1381 + "@babel/helper-plugin-utils": "^7.16.7"
1382 + },
1383 + "engines": {
1384 + "node": ">=6.9.0"
1385 + },
1386 + "peerDependencies": {
1387 + "@babel/core": "^7.0.0-0"
1388 + }
1389 + },
1390 + "node_modules/@babel/plugin-transform-react-constant-elements": {
1391 + "version": "7.16.7",
1392 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz",
1393 + "integrity": "sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ==",
1394 + "dependencies": {
1395 + "@babel/helper-plugin-utils": "^7.16.7"
1396 + },
1397 + "engines": {
1398 + "node": ">=6.9.0"
1399 + },
1400 + "peerDependencies": {
1401 + "@babel/core": "^7.0.0-0"
1402 + }
1403 + },
1404 + "node_modules/@babel/plugin-transform-react-display-name": {
1405 + "version": "7.16.7",
1406 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz",
1407 + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==",
1408 + "dependencies": {
1409 + "@babel/helper-plugin-utils": "^7.16.7"
1410 + },
1411 + "engines": {
1412 + "node": ">=6.9.0"
1413 + },
1414 + "peerDependencies": {
1415 + "@babel/core": "^7.0.0-0"
1416 + }
1417 + },
1418 + "node_modules/@babel/plugin-transform-react-jsx": {
1419 + "version": "7.16.7",
1420 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz",
1421 + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==",
1422 + "dependencies": {
1423 + "@babel/helper-annotate-as-pure": "^7.16.7",
1424 + "@babel/helper-module-imports": "^7.16.7",
1425 + "@babel/helper-plugin-utils": "^7.16.7",
1426 + "@babel/plugin-syntax-jsx": "^7.16.7",
1427 + "@babel/types": "^7.16.7"
1428 + },
1429 + "engines": {
1430 + "node": ">=6.9.0"
1431 + },
1432 + "peerDependencies": {
1433 + "@babel/core": "^7.0.0-0"
1434 + }
1435 + },
1436 + "node_modules/@babel/plugin-transform-react-jsx-development": {
1437 + "version": "7.16.7",
1438 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
1439 + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
1440 + "dependencies": {
1441 + "@babel/plugin-transform-react-jsx": "^7.16.7"
1442 + },
1443 + "engines": {
1444 + "node": ">=6.9.0"
1445 + },
1446 + "peerDependencies": {
1447 + "@babel/core": "^7.0.0-0"
1448 + }
1449 + },
1450 + "node_modules/@babel/plugin-transform-react-pure-annotations": {
1451 + "version": "7.16.7",
1452 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
1453 + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
1454 + "dependencies": {
1455 + "@babel/helper-annotate-as-pure": "^7.16.7",
1456 + "@babel/helper-plugin-utils": "^7.16.7"
1457 + },
1458 + "engines": {
1459 + "node": ">=6.9.0"
1460 + },
1461 + "peerDependencies": {
1462 + "@babel/core": "^7.0.0-0"
1463 + }
1464 + },
1465 + "node_modules/@babel/plugin-transform-regenerator": {
1466 + "version": "7.16.7",
1467 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
1468 + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
1469 + "dependencies": {
1470 + "regenerator-transform": "^0.14.2"
1471 + },
1472 + "engines": {
1473 + "node": ">=6.9.0"
1474 + },
1475 + "peerDependencies": {
1476 + "@babel/core": "^7.0.0-0"
1477 + }
1478 + },
1479 + "node_modules/@babel/plugin-transform-reserved-words": {
1480 + "version": "7.16.7",
1481 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
1482 + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
1483 + "dependencies": {
1484 + "@babel/helper-plugin-utils": "^7.16.7"
1485 + },
1486 + "engines": {
1487 + "node": ">=6.9.0"
1488 + },
1489 + "peerDependencies": {
1490 + "@babel/core": "^7.0.0-0"
1491 + }
1492 + },
1493 + "node_modules/@babel/plugin-transform-runtime": {
1494 + "version": "7.16.10",
1495 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz",
1496 + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==",
1497 + "dependencies": {
1498 + "@babel/helper-module-imports": "^7.16.7",
1499 + "@babel/helper-plugin-utils": "^7.16.7",
1500 + "babel-plugin-polyfill-corejs2": "^0.3.0",
1501 + "babel-plugin-polyfill-corejs3": "^0.5.0",
1502 + "babel-plugin-polyfill-regenerator": "^0.3.0",
1503 + "semver": "^6.3.0"
1504 + },
1505 + "engines": {
1506 + "node": ">=6.9.0"
1507 + },
1508 + "peerDependencies": {
1509 + "@babel/core": "^7.0.0-0"
1510 + }
1511 + },
1512 + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
1513 + "version": "6.3.0",
1514 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1515 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1516 + "bin": {
1517 + "semver": "bin/semver.js"
1518 + }
1519 + },
1520 + "node_modules/@babel/plugin-transform-shorthand-properties": {
1521 + "version": "7.16.7",
1522 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
1523 + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
1524 + "dependencies": {
1525 + "@babel/helper-plugin-utils": "^7.16.7"
1526 + },
1527 + "engines": {
1528 + "node": ">=6.9.0"
1529 + },
1530 + "peerDependencies": {
1531 + "@babel/core": "^7.0.0-0"
1532 + }
1533 + },
1534 + "node_modules/@babel/plugin-transform-spread": {
1535 + "version": "7.16.7",
1536 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
1537 + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
1538 + "dependencies": {
1539 + "@babel/helper-plugin-utils": "^7.16.7",
1540 + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
1541 + },
1542 + "engines": {
1543 + "node": ">=6.9.0"
1544 + },
1545 + "peerDependencies": {
1546 + "@babel/core": "^7.0.0-0"
1547 + }
1548 + },
1549 + "node_modules/@babel/plugin-transform-sticky-regex": {
1550 + "version": "7.16.7",
1551 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
1552 + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
1553 + "dependencies": {
1554 + "@babel/helper-plugin-utils": "^7.16.7"
1555 + },
1556 + "engines": {
1557 + "node": ">=6.9.0"
1558 + },
1559 + "peerDependencies": {
1560 + "@babel/core": "^7.0.0-0"
1561 + }
1562 + },
1563 + "node_modules/@babel/plugin-transform-template-literals": {
1564 + "version": "7.16.7",
1565 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
1566 + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
1567 + "dependencies": {
1568 + "@babel/helper-plugin-utils": "^7.16.7"
1569 + },
1570 + "engines": {
1571 + "node": ">=6.9.0"
1572 + },
1573 + "peerDependencies": {
1574 + "@babel/core": "^7.0.0-0"
1575 + }
1576 + },
1577 + "node_modules/@babel/plugin-transform-typeof-symbol": {
1578 + "version": "7.16.7",
1579 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
1580 + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
1581 + "dependencies": {
1582 + "@babel/helper-plugin-utils": "^7.16.7"
1583 + },
1584 + "engines": {
1585 + "node": ">=6.9.0"
1586 + },
1587 + "peerDependencies": {
1588 + "@babel/core": "^7.0.0-0"
1589 + }
1590 + },
1591 + "node_modules/@babel/plugin-transform-typescript": {
1592 + "version": "7.16.8",
1593 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz",
1594 + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==",
1595 + "dependencies": {
1596 + "@babel/helper-create-class-features-plugin": "^7.16.7",
1597 + "@babel/helper-plugin-utils": "^7.16.7",
1598 + "@babel/plugin-syntax-typescript": "^7.16.7"
1599 + },
1600 + "engines": {
1601 + "node": ">=6.9.0"
1602 + },
1603 + "peerDependencies": {
1604 + "@babel/core": "^7.0.0-0"
1605 + }
1606 + },
1607 + "node_modules/@babel/plugin-transform-unicode-escapes": {
1608 + "version": "7.16.7",
1609 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
1610 + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
1611 + "dependencies": {
1612 + "@babel/helper-plugin-utils": "^7.16.7"
1613 + },
1614 + "engines": {
1615 + "node": ">=6.9.0"
1616 + },
1617 + "peerDependencies": {
1618 + "@babel/core": "^7.0.0-0"
1619 + }
1620 + },
1621 + "node_modules/@babel/plugin-transform-unicode-regex": {
1622 + "version": "7.16.7",
1623 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
1624 + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
1625 + "dependencies": {
1626 + "@babel/helper-create-regexp-features-plugin": "^7.16.7",
1627 + "@babel/helper-plugin-utils": "^7.16.7"
1628 + },
1629 + "engines": {
1630 + "node": ">=6.9.0"
1631 + },
1632 + "peerDependencies": {
1633 + "@babel/core": "^7.0.0-0"
1634 + }
1635 + },
1636 + "node_modules/@babel/preset-env": {
1637 + "version": "7.16.11",
1638 + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
1639 + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
1640 + "dependencies": {
1641 + "@babel/compat-data": "^7.16.8",
1642 + "@babel/helper-compilation-targets": "^7.16.7",
1643 + "@babel/helper-plugin-utils": "^7.16.7",
1644 + "@babel/helper-validator-option": "^7.16.7",
1645 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
1646 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
1647 + "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
1648 + "@babel/plugin-proposal-class-properties": "^7.16.7",
1649 + "@babel/plugin-proposal-class-static-block": "^7.16.7",
1650 + "@babel/plugin-proposal-dynamic-import": "^7.16.7",
1651 + "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
1652 + "@babel/plugin-proposal-json-strings": "^7.16.7",
1653 + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
1654 + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
1655 + "@babel/plugin-proposal-numeric-separator": "^7.16.7",
1656 + "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
1657 + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
1658 + "@babel/plugin-proposal-optional-chaining": "^7.16.7",
1659 + "@babel/plugin-proposal-private-methods": "^7.16.11",
1660 + "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
1661 + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
1662 + "@babel/plugin-syntax-async-generators": "^7.8.4",
1663 + "@babel/plugin-syntax-class-properties": "^7.12.13",
1664 + "@babel/plugin-syntax-class-static-block": "^7.14.5",
1665 + "@babel/plugin-syntax-dynamic-import": "^7.8.3",
1666 + "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
1667 + "@babel/plugin-syntax-json-strings": "^7.8.3",
1668 + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
1669 + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
1670 + "@babel/plugin-syntax-numeric-separator": "^7.10.4",
1671 + "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
1672 + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
1673 + "@babel/plugin-syntax-optional-chaining": "^7.8.3",
1674 + "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
1675 + "@babel/plugin-syntax-top-level-await": "^7.14.5",
1676 + "@babel/plugin-transform-arrow-functions": "^7.16.7",
1677 + "@babel/plugin-transform-async-to-generator": "^7.16.8",
1678 + "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
1679 + "@babel/plugin-transform-block-scoping": "^7.16.7",
1680 + "@babel/plugin-transform-classes": "^7.16.7",
1681 + "@babel/plugin-transform-computed-properties": "^7.16.7",
1682 + "@babel/plugin-transform-destructuring": "^7.16.7",
1683 + "@babel/plugin-transform-dotall-regex": "^7.16.7",
1684 + "@babel/plugin-transform-duplicate-keys": "^7.16.7",
1685 + "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
1686 + "@babel/plugin-transform-for-of": "^7.16.7",
1687 + "@babel/plugin-transform-function-name": "^7.16.7",
1688 + "@babel/plugin-transform-literals": "^7.16.7",
1689 + "@babel/plugin-transform-member-expression-literals": "^7.16.7",
1690 + "@babel/plugin-transform-modules-amd": "^7.16.7",
1691 + "@babel/plugin-transform-modules-commonjs": "^7.16.8",
1692 + "@babel/plugin-transform-modules-systemjs": "^7.16.7",
1693 + "@babel/plugin-transform-modules-umd": "^7.16.7",
1694 + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
1695 + "@babel/plugin-transform-new-target": "^7.16.7",
1696 + "@babel/plugin-transform-object-super": "^7.16.7",
1697 + "@babel/plugin-transform-parameters": "^7.16.7",
1698 + "@babel/plugin-transform-property-literals": "^7.16.7",
1699 + "@babel/plugin-transform-regenerator": "^7.16.7",
1700 + "@babel/plugin-transform-reserved-words": "^7.16.7",
1701 + "@babel/plugin-transform-shorthand-properties": "^7.16.7",
1702 + "@babel/plugin-transform-spread": "^7.16.7",
1703 + "@babel/plugin-transform-sticky-regex": "^7.16.7",
1704 + "@babel/plugin-transform-template-literals": "^7.16.7",
1705 + "@babel/plugin-transform-typeof-symbol": "^7.16.7",
1706 + "@babel/plugin-transform-unicode-escapes": "^7.16.7",
1707 + "@babel/plugin-transform-unicode-regex": "^7.16.7",
1708 + "@babel/preset-modules": "^0.1.5",
1709 + "@babel/types": "^7.16.8",
1710 + "babel-plugin-polyfill-corejs2": "^0.3.0",
1711 + "babel-plugin-polyfill-corejs3": "^0.5.0",
1712 + "babel-plugin-polyfill-regenerator": "^0.3.0",
1713 + "core-js-compat": "^3.20.2",
1714 + "semver": "^6.3.0"
1715 + },
1716 + "engines": {
1717 + "node": ">=6.9.0"
1718 + },
1719 + "peerDependencies": {
1720 + "@babel/core": "^7.0.0-0"
1721 + }
1722 + },
1723 + "node_modules/@babel/preset-env/node_modules/semver": {
1724 + "version": "6.3.0",
1725 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1726 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1727 + "bin": {
1728 + "semver": "bin/semver.js"
1729 + }
1730 + },
1731 + "node_modules/@babel/preset-modules": {
1732 + "version": "0.1.5",
1733 + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
1734 + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
1735 + "dependencies": {
1736 + "@babel/helper-plugin-utils": "^7.0.0",
1737 + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
1738 + "@babel/plugin-transform-dotall-regex": "^7.4.4",
1739 + "@babel/types": "^7.4.4",
1740 + "esutils": "^2.0.2"
1741 + },
1742 + "peerDependencies": {
1743 + "@babel/core": "^7.0.0-0"
1744 + }
1745 + },
1746 + "node_modules/@babel/preset-react": {
1747 + "version": "7.16.7",
1748 + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
1749 + "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
1750 + "dependencies": {
1751 + "@babel/helper-plugin-utils": "^7.16.7",
1752 + "@babel/helper-validator-option": "^7.16.7",
1753 + "@babel/plugin-transform-react-display-name": "^7.16.7",
1754 + "@babel/plugin-transform-react-jsx": "^7.16.7",
1755 + "@babel/plugin-transform-react-jsx-development": "^7.16.7",
1756 + "@babel/plugin-transform-react-pure-annotations": "^7.16.7"
1757 + },
1758 + "engines": {
1759 + "node": ">=6.9.0"
1760 + },
1761 + "peerDependencies": {
1762 + "@babel/core": "^7.0.0-0"
1763 + }
1764 + },
1765 + "node_modules/@babel/preset-typescript": {
1766 + "version": "7.16.7",
1767 + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz",
1768 + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==",
1769 + "dependencies": {
1770 + "@babel/helper-plugin-utils": "^7.16.7",
1771 + "@babel/helper-validator-option": "^7.16.7",
1772 + "@babel/plugin-transform-typescript": "^7.16.7"
1773 + },
1774 + "engines": {
1775 + "node": ">=6.9.0"
1776 + },
1777 + "peerDependencies": {
1778 + "@babel/core": "^7.0.0-0"
1779 + }
1780 + },
1781 + "node_modules/@babel/runtime": {
1782 + "version": "7.16.7",
1783 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz",
1784 + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==",
1785 + "dependencies": {
1786 + "regenerator-runtime": "^0.13.4"
1787 + },
1788 + "engines": {
1789 + "node": ">=6.9.0"
1790 + }
1791 + },
1792 + "node_modules/@babel/runtime-corejs3": {
1793 + "version": "7.16.8",
1794 + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz",
1795 + "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==",
1796 + "dependencies": {
1797 + "core-js-pure": "^3.20.2",
1798 + "regenerator-runtime": "^0.13.4"
1799 + },
1800 + "engines": {
1801 + "node": ">=6.9.0"
1802 + }
1803 + },
1804 + "node_modules/@babel/template": {
1805 + "version": "7.16.7",
1806 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
1807 + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
1808 + "dependencies": {
1809 + "@babel/code-frame": "^7.16.7",
1810 + "@babel/parser": "^7.16.7",
1811 + "@babel/types": "^7.16.7"
1812 + },
1813 + "engines": {
1814 + "node": ">=6.9.0"
1815 + }
1816 + },
1817 + "node_modules/@babel/traverse": {
1818 + "version": "7.16.10",
1819 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz",
1820 + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==",
1821 + "dependencies": {
1822 + "@babel/code-frame": "^7.16.7",
1823 + "@babel/generator": "^7.16.8",
1824 + "@babel/helper-environment-visitor": "^7.16.7",
1825 + "@babel/helper-function-name": "^7.16.7",
1826 + "@babel/helper-hoist-variables": "^7.16.7",
1827 + "@babel/helper-split-export-declaration": "^7.16.7",
1828 + "@babel/parser": "^7.16.10",
1829 + "@babel/types": "^7.16.8",
1830 + "debug": "^4.1.0",
1831 + "globals": "^11.1.0"
1832 + },
1833 + "engines": {
1834 + "node": ">=6.9.0"
1835 + }
1836 + },
1837 + "node_modules/@babel/types": {
1838 + "version": "7.16.8",
1839 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
1840 + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
1841 + "dependencies": {
1842 + "@babel/helper-validator-identifier": "^7.16.7",
1843 + "to-fast-properties": "^2.0.0"
1844 + },
1845 + "engines": {
1846 + "node": ">=6.9.0"
1847 + }
1848 + },
1849 + "node_modules/@bcoe/v8-coverage": {
1850 + "version": "0.2.3",
1851 + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
1852 + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
1853 + },
1854 + "node_modules/@csstools/normalize.css": {
1855 + "version": "12.0.0",
1856 + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
1857 + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg=="
1858 + },
1859 + "node_modules/@date-io/core": {
1860 + "version": "2.13.1",
1861 + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.13.1.tgz",
1862 + "integrity": "sha512-pVI9nfkf2qClb2Cxdq0Q4zJhdawMG4ybWZUVGifT78FDwzRMX2SwXBb55s5NRJk0HcIicDuxktmCtemZqMH1Zg=="
1863 + },
1864 + "node_modules/@date-io/date-fns": {
1865 + "version": "2.13.1",
1866 + "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.13.1.tgz",
1867 + "integrity": "sha512-8fmfwjiLMpFLD+t4NBwDx0eblWnNcgt4NgfT/uiiQTGI81fnPu9tpBMYdAcuWxaV7LLpXgzLBx1SYWAMDVUDQQ==",
1868 + "dependencies": {
1869 + "@date-io/core": "^2.13.1"
1870 + },
1871 + "peerDependencies": {
1872 + "date-fns": "^2.0.0"
1873 + },
1874 + "peerDependenciesMeta": {
1875 + "date-fns": {
1876 + "optional": true
1877 + }
1878 + }
1879 + },
1880 + "node_modules/@date-io/dayjs": {
1881 + "version": "2.13.1",
1882 + "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.13.1.tgz",
1883 + "integrity": "sha512-5bL4WWWmlI4uGZVScANhHJV7Mjp93ec2gNeUHDqqLaMZhp51S0NgD25oqj/k0LqBn1cdU2MvzNpk/ObMmVv5cQ==",
1884 + "dependencies": {
1885 + "@date-io/core": "^2.13.1"
1886 + },
1887 + "peerDependencies": {
1888 + "dayjs": "^1.8.17"
1889 + },
1890 + "peerDependenciesMeta": {
1891 + "dayjs": {
1892 + "optional": true
1893 + }
1894 + }
1895 + },
1896 + "node_modules/@date-io/luxon": {
1897 + "version": "2.13.1",
1898 + "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.13.1.tgz",
1899 + "integrity": "sha512-yG+uM7lXfwLyKKEwjvP8oZ7qblpmfl9gxQYae55ifbwiTs0CoCTkYkxEaQHGkYtTqGTzLqcb0O9Pzx6vgWg+yg==",
1900 + "dependencies": {
1901 + "@date-io/core": "^2.13.1"
1902 + },
1903 + "peerDependencies": {
1904 + "luxon": "^1.21.3 || ^2.x"
1905 + },
1906 + "peerDependenciesMeta": {
1907 + "luxon": {
1908 + "optional": true
1909 + }
1910 + }
1911 + },
1912 + "node_modules/@date-io/moment": {
1913 + "version": "2.13.1",
1914 + "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.13.1.tgz",
1915 + "integrity": "sha512-XX1X/Tlvl3TdqQy2j0ZUtEJV6Rl8tOyc5WOS3ki52He28Uzme4Ro/JuPWTMBDH63weSWIZDlbR7zBgp3ZA2y1A==",
1916 + "dependencies": {
1917 + "@date-io/core": "^2.13.1"
1918 + },
1919 + "peerDependencies": {
1920 + "moment": "^2.24.0"
1921 + },
1922 + "peerDependenciesMeta": {
1923 + "moment": {
1924 + "optional": true
1925 + }
1926 + }
1927 + },
1928 + "node_modules/@emotion/babel-plugin": {
1929 + "version": "11.7.2",
1930 + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz",
1931 + "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==",
1932 + "dependencies": {
1933 + "@babel/helper-module-imports": "^7.12.13",
1934 + "@babel/plugin-syntax-jsx": "^7.12.13",
1935 + "@babel/runtime": "^7.13.10",
1936 + "@emotion/hash": "^0.8.0",
1937 + "@emotion/memoize": "^0.7.5",
1938 + "@emotion/serialize": "^1.0.2",
1939 + "babel-plugin-macros": "^2.6.1",
1940 + "convert-source-map": "^1.5.0",
1941 + "escape-string-regexp": "^4.0.0",
1942 + "find-root": "^1.1.0",
1943 + "source-map": "^0.5.7",
1944 + "stylis": "4.0.13"
1945 + },
1946 + "peerDependencies": {
1947 + "@babel/core": "^7.0.0"
1948 + }
1949 + },
1950 + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": {
1951 + "version": "2.8.0",
1952 + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
1953 + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
1954 + "dependencies": {
1955 + "@babel/runtime": "^7.7.2",
1956 + "cosmiconfig": "^6.0.0",
1957 + "resolve": "^1.12.0"
1958 + }
1959 + },
1960 + "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": {
1961 + "version": "6.0.0",
1962 + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
1963 + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
1964 + "dependencies": {
1965 + "@types/parse-json": "^4.0.0",
1966 + "import-fresh": "^3.1.0",
1967 + "parse-json": "^5.0.0",
1968 + "path-type": "^4.0.0",
1969 + "yaml": "^1.7.2"
1970 + },
1971 + "engines": {
1972 + "node": ">=8"
1973 + }
1974 + },
1975 + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": {
1976 + "version": "4.0.0",
1977 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1978 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1979 + "engines": {
1980 + "node": ">=10"
1981 + },
1982 + "funding": {
1983 + "url": "https://github.com/sponsors/sindresorhus"
1984 + }
1985 + },
1986 + "node_modules/@emotion/cache": {
1987 + "version": "11.7.1",
1988 + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz",
1989 + "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==",
1990 + "dependencies": {
1991 + "@emotion/memoize": "^0.7.4",
1992 + "@emotion/sheet": "^1.1.0",
1993 + "@emotion/utils": "^1.0.0",
1994 + "@emotion/weak-memoize": "^0.2.5",
1995 + "stylis": "4.0.13"
1996 + }
1997 + },
1998 + "node_modules/@emotion/hash": {
1999 + "version": "0.8.0",
2000 + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
2001 + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
2002 + },
2003 + "node_modules/@emotion/is-prop-valid": {
2004 + "version": "1.1.1",
2005 + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz",
2006 + "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==",
2007 + "dependencies": {
2008 + "@emotion/memoize": "^0.7.4"
2009 + }
2010 + },
2011 + "node_modules/@emotion/memoize": {
2012 + "version": "0.7.5",
2013 + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz",
2014 + "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ=="
2015 + },
2016 + "node_modules/@emotion/react": {
2017 + "version": "11.7.1",
2018 + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz",
2019 + "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==",
2020 + "dependencies": {
2021 + "@babel/runtime": "^7.13.10",
2022 + "@emotion/cache": "^11.7.1",
2023 + "@emotion/serialize": "^1.0.2",
2024 + "@emotion/sheet": "^1.1.0",
2025 + "@emotion/utils": "^1.0.0",
2026 + "@emotion/weak-memoize": "^0.2.5",
2027 + "hoist-non-react-statics": "^3.3.1"
2028 + },
2029 + "peerDependencies": {
2030 + "@babel/core": "^7.0.0",
2031 + "react": ">=16.8.0"
2032 + },
2033 + "peerDependenciesMeta": {
2034 + "@babel/core": {
2035 + "optional": true
2036 + },
2037 + "@types/react": {
2038 + "optional": true
2039 + }
2040 + }
2041 + },
2042 + "node_modules/@emotion/serialize": {
2043 + "version": "1.0.2",
2044 + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz",
2045 + "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==",
2046 + "dependencies": {
2047 + "@emotion/hash": "^0.8.0",
2048 + "@emotion/memoize": "^0.7.4",
2049 + "@emotion/unitless": "^0.7.5",
2050 + "@emotion/utils": "^1.0.0",
2051 + "csstype": "^3.0.2"
2052 + }
2053 + },
2054 + "node_modules/@emotion/sheet": {
2055 + "version": "1.1.0",
2056 + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz",
2057 + "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g=="
2058 + },
2059 + "node_modules/@emotion/styled": {
2060 + "version": "11.6.0",
2061 + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz",
2062 + "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==",
2063 + "dependencies": {
2064 + "@babel/runtime": "^7.13.10",
2065 + "@emotion/babel-plugin": "^11.3.0",
2066 + "@emotion/is-prop-valid": "^1.1.1",
2067 + "@emotion/serialize": "^1.0.2",
2068 + "@emotion/utils": "^1.0.0"
2069 + },
2070 + "peerDependencies": {
2071 + "@babel/core": "^7.0.0",
2072 + "@emotion/react": "^11.0.0-rc.0",
2073 + "react": ">=16.8.0"
2074 + },
2075 + "peerDependenciesMeta": {
2076 + "@babel/core": {
2077 + "optional": true
2078 + },
2079 + "@types/react": {
2080 + "optional": true
2081 + }
2082 + }
2083 + },
2084 + "node_modules/@emotion/unitless": {
2085 + "version": "0.7.5",
2086 + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
2087 + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
2088 + },
2089 + "node_modules/@emotion/utils": {
2090 + "version": "1.0.0",
2091 + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz",
2092 + "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
2093 + },
2094 + "node_modules/@emotion/weak-memoize": {
2095 + "version": "0.2.5",
2096 + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
2097 + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
2098 + },
2099 + "node_modules/@eslint/eslintrc": {
2100 + "version": "1.0.5",
2101 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
2102 + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
2103 + "dependencies": {
2104 + "ajv": "^6.12.4",
2105 + "debug": "^4.3.2",
2106 + "espree": "^9.2.0",
2107 + "globals": "^13.9.0",
2108 + "ignore": "^4.0.6",
2109 + "import-fresh": "^3.2.1",
2110 + "js-yaml": "^4.1.0",
2111 + "minimatch": "^3.0.4",
2112 + "strip-json-comments": "^3.1.1"
2113 + },
2114 + "engines": {
2115 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
2116 + }
2117 + },
2118 + "node_modules/@eslint/eslintrc/node_modules/argparse": {
2119 + "version": "2.0.1",
2120 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
2121 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
2122 + },
2123 + "node_modules/@eslint/eslintrc/node_modules/globals": {
2124 + "version": "13.12.0",
2125 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
2126 + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
2127 + "dependencies": {
2128 + "type-fest": "^0.20.2"
2129 + },
2130 + "engines": {
2131 + "node": ">=8"
2132 + },
2133 + "funding": {
2134 + "url": "https://github.com/sponsors/sindresorhus"
2135 + }
2136 + },
2137 + "node_modules/@eslint/eslintrc/node_modules/ignore": {
2138 + "version": "4.0.6",
2139 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
2140 + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
2141 + "engines": {
2142 + "node": ">= 4"
2143 + }
2144 + },
2145 + "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
2146 + "version": "4.1.0",
2147 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2148 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2149 + "dependencies": {
2150 + "argparse": "^2.0.1"
2151 + },
2152 + "bin": {
2153 + "js-yaml": "bin/js-yaml.js"
2154 + }
2155 + },
2156 + "node_modules/@eslint/eslintrc/node_modules/type-fest": {
2157 + "version": "0.20.2",
2158 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
2159 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
2160 + "engines": {
2161 + "node": ">=10"
2162 + },
2163 + "funding": {
2164 + "url": "https://github.com/sponsors/sindresorhus"
2165 + }
2166 + },
2167 + "node_modules/@humanwhocodes/config-array": {
2168 + "version": "0.9.2",
2169 + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
2170 + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
2171 + "dependencies": {
2172 + "@humanwhocodes/object-schema": "^1.2.1",
2173 + "debug": "^4.1.1",
2174 + "minimatch": "^3.0.4"
2175 + },
2176 + "engines": {
2177 + "node": ">=10.10.0"
2178 + }
2179 + },
2180 + "node_modules/@humanwhocodes/object-schema": {
2181 + "version": "1.2.1",
2182 + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
2183 + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
2184 + },
2185 + "node_modules/@istanbuljs/load-nyc-config": {
2186 + "version": "1.1.0",
2187 + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
2188 + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
2189 + "dependencies": {
2190 + "camelcase": "^5.3.1",
2191 + "find-up": "^4.1.0",
2192 + "get-package-type": "^0.1.0",
2193 + "js-yaml": "^3.13.1",
2194 + "resolve-from": "^5.0.0"
2195 + },
2196 + "engines": {
2197 + "node": ">=8"
2198 + }
2199 + },
2200 + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
2201 + "version": "5.3.1",
2202 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
2203 + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
2204 + "engines": {
2205 + "node": ">=6"
2206 + }
2207 + },
2208 + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
2209 + "version": "4.1.0",
2210 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
2211 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
2212 + "dependencies": {
2213 + "locate-path": "^5.0.0",
2214 + "path-exists": "^4.0.0"
2215 + },
2216 + "engines": {
2217 + "node": ">=8"
2218 + }
2219 + },
2220 + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
2221 + "version": "5.0.0",
2222 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
2223 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
2224 + "dependencies": {
2225 + "p-locate": "^4.1.0"
2226 + },
2227 + "engines": {
2228 + "node": ">=8"
2229 + }
2230 + },
2231 + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
2232 + "version": "2.3.0",
2233 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2234 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2235 + "dependencies": {
2236 + "p-try": "^2.0.0"
2237 + },
2238 + "engines": {
2239 + "node": ">=6"
2240 + },
2241 + "funding": {
2242 + "url": "https://github.com/sponsors/sindresorhus"
2243 + }
2244 + },
2245 + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
2246 + "version": "4.1.0",
2247 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
2248 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
2249 + "dependencies": {
2250 + "p-limit": "^2.2.0"
2251 + },
2252 + "engines": {
2253 + "node": ">=8"
2254 + }
2255 + },
2256 + "node_modules/@istanbuljs/schema": {
2257 + "version": "0.1.3",
2258 + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
2259 + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
2260 + "engines": {
2261 + "node": ">=8"
2262 + }
2263 + },
2264 + "node_modules/@jest/console": {
2265 + "version": "27.4.6",
2266 + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz",
2267 + "integrity": "sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA==",
2268 + "dependencies": {
2269 + "@jest/types": "^27.4.2",
2270 + "@types/node": "*",
2271 + "chalk": "^4.0.0",
2272 + "jest-message-util": "^27.4.6",
2273 + "jest-util": "^27.4.2",
2274 + "slash": "^3.0.0"
2275 + },
2276 + "engines": {
2277 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2278 + }
2279 + },
2280 + "node_modules/@jest/console/node_modules/ansi-styles": {
2281 + "version": "4.3.0",
2282 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2283 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2284 + "dependencies": {
2285 + "color-convert": "^2.0.1"
2286 + },
2287 + "engines": {
2288 + "node": ">=8"
2289 + },
2290 + "funding": {
2291 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2292 + }
2293 + },
2294 + "node_modules/@jest/console/node_modules/chalk": {
2295 + "version": "4.1.2",
2296 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2297 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2298 + "dependencies": {
2299 + "ansi-styles": "^4.1.0",
2300 + "supports-color": "^7.1.0"
2301 + },
2302 + "engines": {
2303 + "node": ">=10"
2304 + },
2305 + "funding": {
2306 + "url": "https://github.com/chalk/chalk?sponsor=1"
2307 + }
2308 + },
2309 + "node_modules/@jest/console/node_modules/color-convert": {
2310 + "version": "2.0.1",
2311 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2312 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2313 + "dependencies": {
2314 + "color-name": "~1.1.4"
2315 + },
2316 + "engines": {
2317 + "node": ">=7.0.0"
2318 + }
2319 + },
2320 + "node_modules/@jest/console/node_modules/color-name": {
2321 + "version": "1.1.4",
2322 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2323 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2324 + },
2325 + "node_modules/@jest/console/node_modules/has-flag": {
2326 + "version": "4.0.0",
2327 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2328 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2329 + "engines": {
2330 + "node": ">=8"
2331 + }
2332 + },
2333 + "node_modules/@jest/console/node_modules/supports-color": {
2334 + "version": "7.2.0",
2335 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2336 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2337 + "dependencies": {
2338 + "has-flag": "^4.0.0"
2339 + },
2340 + "engines": {
2341 + "node": ">=8"
2342 + }
2343 + },
2344 + "node_modules/@jest/core": {
2345 + "version": "27.4.7",
2346 + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz",
2347 + "integrity": "sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg==",
2348 + "dependencies": {
2349 + "@jest/console": "^27.4.6",
2350 + "@jest/reporters": "^27.4.6",
2351 + "@jest/test-result": "^27.4.6",
2352 + "@jest/transform": "^27.4.6",
2353 + "@jest/types": "^27.4.2",
2354 + "@types/node": "*",
2355 + "ansi-escapes": "^4.2.1",
2356 + "chalk": "^4.0.0",
2357 + "emittery": "^0.8.1",
2358 + "exit": "^0.1.2",
2359 + "graceful-fs": "^4.2.4",
2360 + "jest-changed-files": "^27.4.2",
2361 + "jest-config": "^27.4.7",
2362 + "jest-haste-map": "^27.4.6",
2363 + "jest-message-util": "^27.4.6",
2364 + "jest-regex-util": "^27.4.0",
2365 + "jest-resolve": "^27.4.6",
2366 + "jest-resolve-dependencies": "^27.4.6",
2367 + "jest-runner": "^27.4.6",
2368 + "jest-runtime": "^27.4.6",
2369 + "jest-snapshot": "^27.4.6",
2370 + "jest-util": "^27.4.2",
2371 + "jest-validate": "^27.4.6",
2372 + "jest-watcher": "^27.4.6",
2373 + "micromatch": "^4.0.4",
2374 + "rimraf": "^3.0.0",
2375 + "slash": "^3.0.0",
2376 + "strip-ansi": "^6.0.0"
2377 + },
2378 + "engines": {
2379 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2380 + },
2381 + "peerDependencies": {
2382 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
2383 + },
2384 + "peerDependenciesMeta": {
2385 + "node-notifier": {
2386 + "optional": true
2387 + }
2388 + }
2389 + },
2390 + "node_modules/@jest/core/node_modules/ansi-styles": {
2391 + "version": "4.3.0",
2392 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2393 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2394 + "dependencies": {
2395 + "color-convert": "^2.0.1"
2396 + },
2397 + "engines": {
2398 + "node": ">=8"
2399 + },
2400 + "funding": {
2401 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2402 + }
2403 + },
2404 + "node_modules/@jest/core/node_modules/chalk": {
2405 + "version": "4.1.2",
2406 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2407 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2408 + "dependencies": {
2409 + "ansi-styles": "^4.1.0",
2410 + "supports-color": "^7.1.0"
2411 + },
2412 + "engines": {
2413 + "node": ">=10"
2414 + },
2415 + "funding": {
2416 + "url": "https://github.com/chalk/chalk?sponsor=1"
2417 + }
2418 + },
2419 + "node_modules/@jest/core/node_modules/color-convert": {
2420 + "version": "2.0.1",
2421 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2422 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2423 + "dependencies": {
2424 + "color-name": "~1.1.4"
2425 + },
2426 + "engines": {
2427 + "node": ">=7.0.0"
2428 + }
2429 + },
2430 + "node_modules/@jest/core/node_modules/color-name": {
2431 + "version": "1.1.4",
2432 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2433 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2434 + },
2435 + "node_modules/@jest/core/node_modules/has-flag": {
2436 + "version": "4.0.0",
2437 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2438 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2439 + "engines": {
2440 + "node": ">=8"
2441 + }
2442 + },
2443 + "node_modules/@jest/core/node_modules/supports-color": {
2444 + "version": "7.2.0",
2445 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2446 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2447 + "dependencies": {
2448 + "has-flag": "^4.0.0"
2449 + },
2450 + "engines": {
2451 + "node": ">=8"
2452 + }
2453 + },
2454 + "node_modules/@jest/environment": {
2455 + "version": "27.4.6",
2456 + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz",
2457 + "integrity": "sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg==",
2458 + "dependencies": {
2459 + "@jest/fake-timers": "^27.4.6",
2460 + "@jest/types": "^27.4.2",
2461 + "@types/node": "*",
2462 + "jest-mock": "^27.4.6"
2463 + },
2464 + "engines": {
2465 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2466 + }
2467 + },
2468 + "node_modules/@jest/fake-timers": {
2469 + "version": "27.4.6",
2470 + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz",
2471 + "integrity": "sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A==",
2472 + "dependencies": {
2473 + "@jest/types": "^27.4.2",
2474 + "@sinonjs/fake-timers": "^8.0.1",
2475 + "@types/node": "*",
2476 + "jest-message-util": "^27.4.6",
2477 + "jest-mock": "^27.4.6",
2478 + "jest-util": "^27.4.2"
2479 + },
2480 + "engines": {
2481 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2482 + }
2483 + },
2484 + "node_modules/@jest/globals": {
2485 + "version": "27.4.6",
2486 + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz",
2487 + "integrity": "sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw==",
2488 + "dependencies": {
2489 + "@jest/environment": "^27.4.6",
2490 + "@jest/types": "^27.4.2",
2491 + "expect": "^27.4.6"
2492 + },
2493 + "engines": {
2494 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2495 + }
2496 + },
2497 + "node_modules/@jest/reporters": {
2498 + "version": "27.4.6",
2499 + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz",
2500 + "integrity": "sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ==",
2501 + "dependencies": {
2502 + "@bcoe/v8-coverage": "^0.2.3",
2503 + "@jest/console": "^27.4.6",
2504 + "@jest/test-result": "^27.4.6",
2505 + "@jest/transform": "^27.4.6",
2506 + "@jest/types": "^27.4.2",
2507 + "@types/node": "*",
2508 + "chalk": "^4.0.0",
2509 + "collect-v8-coverage": "^1.0.0",
2510 + "exit": "^0.1.2",
2511 + "glob": "^7.1.2",
2512 + "graceful-fs": "^4.2.4",
2513 + "istanbul-lib-coverage": "^3.0.0",
2514 + "istanbul-lib-instrument": "^5.1.0",
2515 + "istanbul-lib-report": "^3.0.0",
2516 + "istanbul-lib-source-maps": "^4.0.0",
2517 + "istanbul-reports": "^3.1.3",
2518 + "jest-haste-map": "^27.4.6",
2519 + "jest-resolve": "^27.4.6",
2520 + "jest-util": "^27.4.2",
2521 + "jest-worker": "^27.4.6",
2522 + "slash": "^3.0.0",
2523 + "source-map": "^0.6.0",
2524 + "string-length": "^4.0.1",
2525 + "terminal-link": "^2.0.0",
2526 + "v8-to-istanbul": "^8.1.0"
2527 + },
2528 + "engines": {
2529 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2530 + },
2531 + "peerDependencies": {
2532 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
2533 + },
2534 + "peerDependenciesMeta": {
2535 + "node-notifier": {
2536 + "optional": true
2537 + }
2538 + }
2539 + },
2540 + "node_modules/@jest/reporters/node_modules/ansi-styles": {
2541 + "version": "4.3.0",
2542 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2543 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2544 + "dependencies": {
2545 + "color-convert": "^2.0.1"
2546 + },
2547 + "engines": {
2548 + "node": ">=8"
2549 + },
2550 + "funding": {
2551 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2552 + }
2553 + },
2554 + "node_modules/@jest/reporters/node_modules/chalk": {
2555 + "version": "4.1.2",
2556 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2557 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2558 + "dependencies": {
2559 + "ansi-styles": "^4.1.0",
2560 + "supports-color": "^7.1.0"
2561 + },
2562 + "engines": {
2563 + "node": ">=10"
2564 + },
2565 + "funding": {
2566 + "url": "https://github.com/chalk/chalk?sponsor=1"
2567 + }
2568 + },
2569 + "node_modules/@jest/reporters/node_modules/color-convert": {
2570 + "version": "2.0.1",
2571 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2572 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2573 + "dependencies": {
2574 + "color-name": "~1.1.4"
2575 + },
2576 + "engines": {
2577 + "node": ">=7.0.0"
2578 + }
2579 + },
2580 + "node_modules/@jest/reporters/node_modules/color-name": {
2581 + "version": "1.1.4",
2582 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2583 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2584 + },
2585 + "node_modules/@jest/reporters/node_modules/has-flag": {
2586 + "version": "4.0.0",
2587 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2588 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2589 + "engines": {
2590 + "node": ">=8"
2591 + }
2592 + },
2593 + "node_modules/@jest/reporters/node_modules/source-map": {
2594 + "version": "0.6.1",
2595 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2596 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2597 + "engines": {
2598 + "node": ">=0.10.0"
2599 + }
2600 + },
2601 + "node_modules/@jest/reporters/node_modules/supports-color": {
2602 + "version": "7.2.0",
2603 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2604 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2605 + "dependencies": {
2606 + "has-flag": "^4.0.0"
2607 + },
2608 + "engines": {
2609 + "node": ">=8"
2610 + }
2611 + },
2612 + "node_modules/@jest/source-map": {
2613 + "version": "27.4.0",
2614 + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz",
2615 + "integrity": "sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ==",
2616 + "dependencies": {
2617 + "callsites": "^3.0.0",
2618 + "graceful-fs": "^4.2.4",
2619 + "source-map": "^0.6.0"
2620 + },
2621 + "engines": {
2622 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2623 + }
2624 + },
2625 + "node_modules/@jest/source-map/node_modules/source-map": {
2626 + "version": "0.6.1",
2627 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2628 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2629 + "engines": {
2630 + "node": ">=0.10.0"
2631 + }
2632 + },
2633 + "node_modules/@jest/test-result": {
2634 + "version": "27.4.6",
2635 + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz",
2636 + "integrity": "sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ==",
2637 + "dependencies": {
2638 + "@jest/console": "^27.4.6",
2639 + "@jest/types": "^27.4.2",
2640 + "@types/istanbul-lib-coverage": "^2.0.0",
2641 + "collect-v8-coverage": "^1.0.0"
2642 + },
2643 + "engines": {
2644 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2645 + }
2646 + },
2647 + "node_modules/@jest/test-sequencer": {
2648 + "version": "27.4.6",
2649 + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz",
2650 + "integrity": "sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw==",
2651 + "dependencies": {
2652 + "@jest/test-result": "^27.4.6",
2653 + "graceful-fs": "^4.2.4",
2654 + "jest-haste-map": "^27.4.6",
2655 + "jest-runtime": "^27.4.6"
2656 + },
2657 + "engines": {
2658 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2659 + }
2660 + },
2661 + "node_modules/@jest/transform": {
2662 + "version": "27.4.6",
2663 + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz",
2664 + "integrity": "sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw==",
2665 + "dependencies": {
2666 + "@babel/core": "^7.1.0",
2667 + "@jest/types": "^27.4.2",
2668 + "babel-plugin-istanbul": "^6.1.1",
2669 + "chalk": "^4.0.0",
2670 + "convert-source-map": "^1.4.0",
2671 + "fast-json-stable-stringify": "^2.0.0",
2672 + "graceful-fs": "^4.2.4",
2673 + "jest-haste-map": "^27.4.6",
2674 + "jest-regex-util": "^27.4.0",
2675 + "jest-util": "^27.4.2",
2676 + "micromatch": "^4.0.4",
2677 + "pirates": "^4.0.4",
2678 + "slash": "^3.0.0",
2679 + "source-map": "^0.6.1",
2680 + "write-file-atomic": "^3.0.0"
2681 + },
2682 + "engines": {
2683 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2684 + }
2685 + },
2686 + "node_modules/@jest/transform/node_modules/ansi-styles": {
2687 + "version": "4.3.0",
2688 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2689 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2690 + "dependencies": {
2691 + "color-convert": "^2.0.1"
2692 + },
2693 + "engines": {
2694 + "node": ">=8"
2695 + },
2696 + "funding": {
2697 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2698 + }
2699 + },
2700 + "node_modules/@jest/transform/node_modules/chalk": {
2701 + "version": "4.1.2",
2702 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2703 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2704 + "dependencies": {
2705 + "ansi-styles": "^4.1.0",
2706 + "supports-color": "^7.1.0"
2707 + },
2708 + "engines": {
2709 + "node": ">=10"
2710 + },
2711 + "funding": {
2712 + "url": "https://github.com/chalk/chalk?sponsor=1"
2713 + }
2714 + },
2715 + "node_modules/@jest/transform/node_modules/color-convert": {
2716 + "version": "2.0.1",
2717 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2718 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2719 + "dependencies": {
2720 + "color-name": "~1.1.4"
2721 + },
2722 + "engines": {
2723 + "node": ">=7.0.0"
2724 + }
2725 + },
2726 + "node_modules/@jest/transform/node_modules/color-name": {
2727 + "version": "1.1.4",
2728 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2729 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2730 + },
2731 + "node_modules/@jest/transform/node_modules/has-flag": {
2732 + "version": "4.0.0",
2733 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2734 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2735 + "engines": {
2736 + "node": ">=8"
2737 + }
2738 + },
2739 + "node_modules/@jest/transform/node_modules/source-map": {
2740 + "version": "0.6.1",
2741 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2742 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2743 + "engines": {
2744 + "node": ">=0.10.0"
2745 + }
2746 + },
2747 + "node_modules/@jest/transform/node_modules/supports-color": {
2748 + "version": "7.2.0",
2749 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2750 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2751 + "dependencies": {
2752 + "has-flag": "^4.0.0"
2753 + },
2754 + "engines": {
2755 + "node": ">=8"
2756 + }
2757 + },
2758 + "node_modules/@jest/types": {
2759 + "version": "27.4.2",
2760 + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz",
2761 + "integrity": "sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==",
2762 + "dependencies": {
2763 + "@types/istanbul-lib-coverage": "^2.0.0",
2764 + "@types/istanbul-reports": "^3.0.0",
2765 + "@types/node": "*",
2766 + "@types/yargs": "^16.0.0",
2767 + "chalk": "^4.0.0"
2768 + },
2769 + "engines": {
2770 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
2771 + }
2772 + },
2773 + "node_modules/@jest/types/node_modules/ansi-styles": {
2774 + "version": "4.3.0",
2775 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2776 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2777 + "dependencies": {
2778 + "color-convert": "^2.0.1"
2779 + },
2780 + "engines": {
2781 + "node": ">=8"
2782 + },
2783 + "funding": {
2784 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2785 + }
2786 + },
2787 + "node_modules/@jest/types/node_modules/chalk": {
2788 + "version": "4.1.2",
2789 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2790 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2791 + "dependencies": {
2792 + "ansi-styles": "^4.1.0",
2793 + "supports-color": "^7.1.0"
2794 + },
2795 + "engines": {
2796 + "node": ">=10"
2797 + },
2798 + "funding": {
2799 + "url": "https://github.com/chalk/chalk?sponsor=1"
2800 + }
2801 + },
2802 + "node_modules/@jest/types/node_modules/color-convert": {
2803 + "version": "2.0.1",
2804 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2805 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2806 + "dependencies": {
2807 + "color-name": "~1.1.4"
2808 + },
2809 + "engines": {
2810 + "node": ">=7.0.0"
2811 + }
2812 + },
2813 + "node_modules/@jest/types/node_modules/color-name": {
2814 + "version": "1.1.4",
2815 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2816 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2817 + },
2818 + "node_modules/@jest/types/node_modules/has-flag": {
2819 + "version": "4.0.0",
2820 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2821 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2822 + "engines": {
2823 + "node": ">=8"
2824 + }
2825 + },
2826 + "node_modules/@jest/types/node_modules/supports-color": {
2827 + "version": "7.2.0",
2828 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2829 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2830 + "dependencies": {
2831 + "has-flag": "^4.0.0"
2832 + },
2833 + "engines": {
2834 + "node": ">=8"
2835 + }
2836 + },
2837 + "node_modules/@mui/base": {
2838 + "version": "5.0.0-alpha.65",
2839 + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.65.tgz",
2840 + "integrity": "sha512-6LCTWVoSnEoQuWdxA+Z1qqmlNK4aZj7LvCuLJzq3RVS2PskRuo1O3caVFxAzRu7xrY3zsyL/sUsJI+rdcjhuXw==",
2841 + "dependencies": {
2842 + "@babel/runtime": "^7.16.7",
2843 + "@emotion/is-prop-valid": "^1.1.1",
2844 + "@mui/utils": "^5.3.0",
2845 + "@popperjs/core": "^2.4.4",
2846 + "clsx": "^1.1.1",
2847 + "prop-types": "^15.7.2",
2848 + "react-is": "^17.0.2"
2849 + },
2850 + "engines": {
2851 + "node": ">=12.0.0"
2852 + },
2853 + "funding": {
2854 + "type": "opencollective",
2855 + "url": "https://opencollective.com/mui"
2856 + },
2857 + "peerDependencies": {
2858 + "@types/react": "^16.8.6 || ^17.0.0",
2859 + "react": "^17.0.0",
2860 + "react-dom": "^17.0.0"
2861 + },
2862 + "peerDependenciesMeta": {
2863 + "@types/react": {
2864 + "optional": true
2865 + }
2866 + }
2867 + },
2868 + "node_modules/@mui/icons-material": {
2869 + "version": "5.3.0",
2870 + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.3.0.tgz",
2871 + "integrity": "sha512-1+dN2N8BgozmdMeHXQLrvSr1G/7Xc0NmAMLSvu8XA9RxhcTos/p66vrvpPASw2qvt14dkfeqyHwvbLRgAU9slw==",
2872 + "dependencies": {
2873 + "@babel/runtime": "^7.16.7"
2874 + },
2875 + "engines": {
2876 + "node": ">=12.0.0"
2877 + },
2878 + "funding": {
2879 + "type": "opencollective",
2880 + "url": "https://opencollective.com/mui"
2881 + },
2882 + "peerDependencies": {
2883 + "@mui/material": "^5.0.0",
2884 + "@types/react": "^16.8.6 || ^17.0.0",
2885 + "react": "^17.0.0"
2886 + },
2887 + "peerDependenciesMeta": {
2888 + "@types/react": {
2889 + "optional": true
2890 + }
2891 + }
2892 + },
2893 + "node_modules/@mui/lab": {
2894 + "version": "5.0.0-alpha.66",
2895 + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.66.tgz",
2896 + "integrity": "sha512-C/WB5vo+arkdbx3r1gRRKh4BcZJ763+ePcPHYj3pShDA1vG0jecp1RWO8MJ07SnsdfDHiKWtlUDJh+DpieR0Og==",
2897 + "dependencies": {
2898 + "@babel/runtime": "^7.16.7",
2899 + "@date-io/date-fns": "^2.11.0",
2900 + "@date-io/dayjs": "^2.11.0",
2901 + "@date-io/luxon": "^2.11.1",
2902 + "@date-io/moment": "^2.11.0",
2903 + "@mui/base": "5.0.0-alpha.66",
2904 + "@mui/system": "^5.3.0",
2905 + "@mui/utils": "^5.3.0",
2906 + "clsx": "^1.1.1",
2907 + "prop-types": "^15.7.2",
2908 + "react-is": "^17.0.2",
2909 + "react-transition-group": "^4.4.2",
2910 + "rifm": "^0.12.1"
2911 + },
2912 + "engines": {
2913 + "node": ">=12.0.0"
2914 + },
2915 + "funding": {
2916 + "type": "opencollective",
2917 + "url": "https://opencollective.com/mui"
2918 + },
2919 + "peerDependencies": {
2920 + "@mui/material": "^5.0.0",
2921 + "@types/react": "^16.8.6 || ^17.0.0",
2922 + "date-fns": "^2.25.0",
2923 + "dayjs": "^1.10.7",
2924 + "luxon": "^1.28.0 || ^2.0.0",
2925 + "moment": "^2.29.1",
2926 + "react": "^17.0.0",
2927 + "react-dom": "^17.0.0"
2928 + },
2929 + "peerDependenciesMeta": {
2930 + "@types/react": {
2931 + "optional": true
2932 + },
2933 + "date-fns": {
2934 + "optional": true
2935 + },
2936 + "dayjs": {
2937 + "optional": true
2938 + },
2939 + "luxon": {
2940 + "optional": true
2941 + },
2942 + "moment": {
2943 + "optional": true
2944 + }
2945 + }
2946 + },
2947 + "node_modules/@mui/lab/node_modules/@mui/base": {
2948 + "version": "5.0.0-alpha.66",
2949 + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.66.tgz",
2950 + "integrity": "sha512-LARfVx0HmGV5YwU2pdIqEApQwz/CtEnYtKkV856hlY0cgi5NQL2htzZ/9ujKz0j3LFUaMYiYuJ2AOwrNtGFGrw==",
2951 + "dependencies": {
2952 + "@babel/runtime": "^7.16.7",
2953 + "@emotion/is-prop-valid": "^1.1.1",
2954 + "@mui/utils": "^5.3.0",
2955 + "@popperjs/core": "^2.4.4",
2956 + "clsx": "^1.1.1",
2957 + "prop-types": "^15.7.2",
2958 + "react-is": "^17.0.2"
2959 + },
2960 + "engines": {
2961 + "node": ">=12.0.0"
2962 + },
2963 + "funding": {
2964 + "type": "opencollective",
2965 + "url": "https://opencollective.com/mui"
2966 + },
2967 + "peerDependencies": {
2968 + "@types/react": "^16.8.6 || ^17.0.0",
2969 + "react": "^17.0.0",
2970 + "react-dom": "^17.0.0"
2971 + },
2972 + "peerDependenciesMeta": {
2973 + "@types/react": {
2974 + "optional": true
2975 + }
2976 + }
2977 + },
2978 + "node_modules/@mui/material": {
2979 + "version": "5.3.0",
2980 + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.0.tgz",
2981 + "integrity": "sha512-zLdlweBHrKpOwHFoMXA6FFgKQOONuX4sQhODcj9dk5uPeScuMDE26svcsrPam5Y1PKXZX78YEGHB5Jr5PHGpTA==",
2982 + "dependencies": {
2983 + "@babel/runtime": "^7.16.7",
2984 + "@mui/base": "5.0.0-alpha.65",
2985 + "@mui/system": "^5.3.0",
2986 + "@mui/types": "^7.1.0",
2987 + "@mui/utils": "^5.3.0",
2988 + "@types/react-transition-group": "^4.4.4",
2989 + "clsx": "^1.1.1",
2990 + "csstype": "^3.0.10",
2991 + "hoist-non-react-statics": "^3.3.2",
2992 + "prop-types": "^15.7.2",
2993 + "react-is": "^17.0.2",
2994 + "react-transition-group": "^4.4.2"
2995 + },
2996 + "engines": {
2997 + "node": ">=12.0.0"
2998 + },
2999 + "funding": {
3000 + "type": "opencollective",
3001 + "url": "https://opencollective.com/mui"
3002 + },
3003 + "peerDependencies": {
3004 + "@emotion/react": "^11.5.0",
3005 + "@emotion/styled": "^11.3.0",
3006 + "@types/react": "^16.8.6 || ^17.0.0",
3007 + "react": "^17.0.0",
3008 + "react-dom": "^17.0.0"
3009 + },
3010 + "peerDependenciesMeta": {
3011 + "@emotion/react": {
3012 + "optional": true
3013 + },
3014 + "@emotion/styled": {
3015 + "optional": true
3016 + },
3017 + "@types/react": {
3018 + "optional": true
3019 + }
3020 + }
3021 + },
3022 + "node_modules/@mui/private-theming": {
3023 + "version": "5.3.0",
3024 + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.3.0.tgz",
3025 + "integrity": "sha512-EBobUEyM9fMnteKrVPp8pTMUh81xXakyfdpkoh7Y19q9JpD2eh7QGAQVJVj0JBFlcUJD60NIE4K8rdokrRmLwg==",
3026 + "dependencies": {
3027 + "@babel/runtime": "^7.16.7",
3028 + "@mui/utils": "^5.3.0",
3029 + "prop-types": "^15.7.2"
3030 + },
3031 + "engines": {
3032 + "node": ">=12.0.0"
3033 + },
3034 + "funding": {
3035 + "type": "opencollective",
3036 + "url": "https://opencollective.com/mui"
3037 + },
3038 + "peerDependencies": {
3039 + "@types/react": "^16.8.6 || ^17.0.0",
3040 + "react": "^17.0.0"
3041 + },
3042 + "peerDependenciesMeta": {
3043 + "@types/react": {
3044 + "optional": true
3045 + }
3046 + }
3047 + },
3048 + "node_modules/@mui/styled-engine": {
3049 + "version": "5.3.0",
3050 + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.3.0.tgz",
3051 + "integrity": "sha512-I4YemFy9WnCLUdZ5T+6egpzc8e7Jq/uh9AJ3QInZHbyNu/9I2SWvNn7vHjWOT/D8Y8LMzIOhu5WwZbzjez7YRw==",
3052 + "dependencies": {
3053 + "@babel/runtime": "^7.16.7",
3054 + "@emotion/cache": "^11.7.1",
3055 + "prop-types": "^15.7.2"
3056 + },
3057 + "engines": {
3058 + "node": ">=12.0.0"
3059 + },
3060 + "funding": {
3061 + "type": "opencollective",
3062 + "url": "https://opencollective.com/mui"
3063 + },
3064 + "peerDependencies": {
3065 + "@emotion/react": "^11.4.1",
3066 + "@emotion/styled": "^11.3.0",
3067 + "react": "^17.0.0"
3068 + },
3069 + "peerDependenciesMeta": {
3070 + "@emotion/react": {
3071 + "optional": true
3072 + },
3073 + "@emotion/styled": {
3074 + "optional": true
3075 + }
3076 + }
3077 + },
3078 + "node_modules/@mui/styles": {
3079 + "version": "5.3.0",
3080 + "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.3.0.tgz",
3081 + "integrity": "sha512-TPfK8c8Zpydpynl4deNv43c0puriXSjf44eadyYle7veVQt5dnT3vgyIqXjP8Ypia653kEVe++GpXTvXnylU7A==",
3082 + "dependencies": {
3083 + "@babel/runtime": "^7.16.7",
3084 + "@emotion/hash": "^0.8.0",
3085 + "@mui/private-theming": "^5.3.0",
3086 + "@mui/types": "^7.1.0",
3087 + "@mui/utils": "^5.3.0",
3088 + "clsx": "^1.1.1",
3089 + "csstype": "^3.0.10",
3090 + "hoist-non-react-statics": "^3.3.2",
3091 + "jss": "^10.8.2",
3092 + "jss-plugin-camel-case": "^10.8.2",
3093 + "jss-plugin-default-unit": "^10.8.2",
3094 + "jss-plugin-global": "^10.8.2",
3095 + "jss-plugin-nested": "^10.8.2",
3096 + "jss-plugin-props-sort": "^10.8.2",
3097 + "jss-plugin-rule-value-function": "^10.8.2",
3098 + "jss-plugin-vendor-prefixer": "^10.8.2",
3099 + "prop-types": "^15.7.2"
3100 + },
3101 + "engines": {
3102 + "node": ">=12.0.0"
3103 + },
3104 + "funding": {
3105 + "type": "opencollective",
3106 + "url": "https://opencollective.com/mui"
3107 + },
3108 + "peerDependencies": {
3109 + "@types/react": "^16.8.6 || ^17.0.0",
3110 + "react": "^17.0.0"
3111 + },
3112 + "peerDependenciesMeta": {
3113 + "@types/react": {
3114 + "optional": true
3115 + }
3116 + }
3117 + },
3118 + "node_modules/@mui/system": {
3119 + "version": "5.3.0",
3120 + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.3.0.tgz",
3121 + "integrity": "sha512-mblz3EObrhhIMPwSEe2Az7MbMaXOFgrvItPOzZwcY5O9qERB7Rr8KQgbU8VouWLUqyV2i8BaFpLrkKPA6eX2Aw==",
3122 + "dependencies": {
3123 + "@babel/runtime": "^7.16.7",
3124 + "@mui/private-theming": "^5.3.0",
3125 + "@mui/styled-engine": "^5.3.0",
3126 + "@mui/types": "^7.1.0",
3127 + "@mui/utils": "^5.3.0",
3128 + "clsx": "^1.1.1",
3129 + "csstype": "^3.0.10",
3130 + "prop-types": "^15.7.2"
3131 + },
3132 + "engines": {
3133 + "node": ">=12.0.0"
3134 + },
3135 + "funding": {
3136 + "type": "opencollective",
3137 + "url": "https://opencollective.com/mui"
3138 + },
3139 + "peerDependencies": {
3140 + "@emotion/react": "^11.5.0",
3141 + "@emotion/styled": "^11.3.0",
3142 + "@types/react": "^16.8.6 || ^17.0.0",
3143 + "react": "^17.0.0"
3144 + },
3145 + "peerDependenciesMeta": {
3146 + "@emotion/react": {
3147 + "optional": true
3148 + },
3149 + "@emotion/styled": {
3150 + "optional": true
3151 + },
3152 + "@types/react": {
3153 + "optional": true
3154 + }
3155 + }
3156 + },
3157 + "node_modules/@mui/types": {
3158 + "version": "7.1.0",
3159 + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz",
3160 + "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==",
3161 + "peerDependencies": {
3162 + "@types/react": "*"
3163 + },
3164 + "peerDependenciesMeta": {
3165 + "@types/react": {
3166 + "optional": true
3167 + }
3168 + }
3169 + },
3170 + "node_modules/@mui/utils": {
3171 + "version": "5.3.0",
3172 + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.3.0.tgz",
3173 + "integrity": "sha512-O/E9IQKPMg0OrN7+gkn7Ga5o5WA2iXQGdyqNBFPNrYzxOvwzsEtM5K7MtTCGGYKFe8mhTRM0ZOjh5OM0dglw+Q==",
3174 + "dependencies": {
3175 + "@babel/runtime": "^7.16.7",
3176 + "@types/prop-types": "^15.7.4",
3177 + "@types/react-is": "^16.7.1 || ^17.0.0",
3178 + "prop-types": "^15.7.2",
3179 + "react-is": "^17.0.2"
3180 + },
3181 + "engines": {
3182 + "node": ">=12.0.0"
3183 + },
3184 + "funding": {
3185 + "type": "opencollective",
3186 + "url": "https://opencollective.com/mui"
3187 + },
3188 + "peerDependencies": {
3189 + "react": "^17.0.0"
3190 + }
3191 + },
3192 + "node_modules/@mui/x-data-grid": {
3193 + "version": "5.3.0",
3194 + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-5.3.0.tgz",
3195 + "integrity": "sha512-TYo151g4U5BGyzfxcr1CsrY5/r7Tq+qfEQcNwsiz00xUZNhwspv0SmzKDvny33Q/qW8ey7o/CtjTkU/iBwOCGg==",
3196 + "dependencies": {
3197 + "@mui/utils": "^5.2.3",
3198 + "clsx": "^1.1.1",
3199 + "prop-types": "^15.8.1",
3200 + "reselect": "^4.1.5"
3201 + },
3202 + "engines": {
3203 + "node": ">=12.0.0"
3204 + },
3205 + "funding": {
3206 + "type": "opencollective",
3207 + "url": "https://opencollective.com/mui"
3208 + },
3209 + "peerDependencies": {
3210 + "@mui/material": "^5.2.8",
3211 + "@mui/system": "^5.2.8",
3212 + "react": "^17.0.2"
3213 + }
3214 + },
3215 + "node_modules/@nodelib/fs.scandir": {
3216 + "version": "2.1.5",
3217 + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
3218 + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
3219 + "dependencies": {
3220 + "@nodelib/fs.stat": "2.0.5",
3221 + "run-parallel": "^1.1.9"
3222 + },
3223 + "engines": {
3224 + "node": ">= 8"
3225 + }
3226 + },
3227 + "node_modules/@nodelib/fs.stat": {
3228 + "version": "2.0.5",
3229 + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
3230 + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
3231 + "engines": {
3232 + "node": ">= 8"
3233 + }
3234 + },
3235 + "node_modules/@nodelib/fs.walk": {
3236 + "version": "1.2.8",
3237 + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
3238 + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
3239 + "dependencies": {
3240 + "@nodelib/fs.scandir": "2.1.5",
3241 + "fastq": "^1.6.0"
3242 + },
3243 + "engines": {
3244 + "node": ">= 8"
3245 + }
3246 + },
3247 + "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
3248 + "version": "0.5.4",
3249 + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz",
3250 + "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==",
3251 + "dependencies": {
3252 + "ansi-html-community": "^0.0.8",
3253 + "common-path-prefix": "^3.0.0",
3254 + "core-js-pure": "^3.8.1",
3255 + "error-stack-parser": "^2.0.6",
3256 + "find-up": "^5.0.0",
3257 + "html-entities": "^2.1.0",
3258 + "loader-utils": "^2.0.0",
3259 + "schema-utils": "^3.0.0",
3260 + "source-map": "^0.7.3"
3261 + },
3262 + "engines": {
3263 + "node": ">= 10.13"
3264 + },
3265 + "peerDependencies": {
3266 + "@types/webpack": "4.x || 5.x",
3267 + "react-refresh": ">=0.10.0 <1.0.0",
3268 + "sockjs-client": "^1.4.0",
3269 + "type-fest": ">=0.17.0 <3.0.0",
3270 + "webpack": ">=4.43.0 <6.0.0",
3271 + "webpack-dev-server": "3.x || 4.x",
3272 + "webpack-hot-middleware": "2.x",
3273 + "webpack-plugin-serve": "0.x || 1.x"
3274 + },
3275 + "peerDependenciesMeta": {
3276 + "@types/webpack": {
3277 + "optional": true
3278 + },
3279 + "sockjs-client": {
3280 + "optional": true
3281 + },
3282 + "type-fest": {
3283 + "optional": true
3284 + },
3285 + "webpack-dev-server": {
3286 + "optional": true
3287 + },
3288 + "webpack-hot-middleware": {
3289 + "optional": true
3290 + },
3291 + "webpack-plugin-serve": {
3292 + "optional": true
3293 + }
3294 + }
3295 + },
3296 + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
3297 + "version": "0.7.3",
3298 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
3299 + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
3300 + "engines": {
3301 + "node": ">= 8"
3302 + }
3303 + },
3304 + "node_modules/@popperjs/core": {
3305 + "version": "2.11.2",
3306 + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz",
3307 + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==",
3308 + "funding": {
3309 + "type": "opencollective",
3310 + "url": "https://opencollective.com/popperjs"
3311 + }
3312 + },
3313 + "node_modules/@rollup/plugin-babel": {
3314 + "version": "5.3.0",
3315 + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
3316 + "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==",
3317 + "dependencies": {
3318 + "@babel/helper-module-imports": "^7.10.4",
3319 + "@rollup/pluginutils": "^3.1.0"
3320 + },
3321 + "engines": {
3322 + "node": ">= 10.0.0"
3323 + },
3324 + "peerDependencies": {
3325 + "@babel/core": "^7.0.0",
3326 + "@types/babel__core": "^7.1.9",
3327 + "rollup": "^1.20.0||^2.0.0"
3328 + },
3329 + "peerDependenciesMeta": {
3330 + "@types/babel__core": {
3331 + "optional": true
3332 + }
3333 + }
3334 + },
3335 + "node_modules/@rollup/plugin-node-resolve": {
3336 + "version": "11.2.1",
3337 + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
3338 + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
3339 + "dependencies": {
3340 + "@rollup/pluginutils": "^3.1.0",
3341 + "@types/resolve": "1.17.1",
3342 + "builtin-modules": "^3.1.0",
3343 + "deepmerge": "^4.2.2",
3344 + "is-module": "^1.0.0",
3345 + "resolve": "^1.19.0"
3346 + },
3347 + "engines": {
3348 + "node": ">= 10.0.0"
3349 + },
3350 + "peerDependencies": {
3351 + "rollup": "^1.20.0||^2.0.0"
3352 + }
3353 + },
3354 + "node_modules/@rollup/plugin-replace": {
3355 + "version": "2.4.2",
3356 + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
3357 + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
3358 + "dependencies": {
3359 + "@rollup/pluginutils": "^3.1.0",
3360 + "magic-string": "^0.25.7"
3361 + },
3362 + "peerDependencies": {
3363 + "rollup": "^1.20.0 || ^2.0.0"
3364 + }
3365 + },
3366 + "node_modules/@rollup/pluginutils": {
3367 + "version": "3.1.0",
3368 + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
3369 + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
3370 + "dependencies": {
3371 + "@types/estree": "0.0.39",
3372 + "estree-walker": "^1.0.1",
3373 + "picomatch": "^2.2.2"
3374 + },
3375 + "engines": {
3376 + "node": ">= 8.0.0"
3377 + },
3378 + "peerDependencies": {
3379 + "rollup": "^1.20.0||^2.0.0"
3380 + }
3381 + },
3382 + "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
3383 + "version": "0.0.39",
3384 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
3385 + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
3386 + },
3387 + "node_modules/@rushstack/eslint-patch": {
3388 + "version": "1.1.0",
3389 + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz",
3390 + "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A=="
3391 + },
3392 + "node_modules/@sinonjs/commons": {
3393 + "version": "1.8.3",
3394 + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
3395 + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
3396 + "dependencies": {
3397 + "type-detect": "4.0.8"
3398 + }
3399 + },
3400 + "node_modules/@sinonjs/fake-timers": {
3401 + "version": "8.1.0",
3402 + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
3403 + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
3404 + "dependencies": {
3405 + "@sinonjs/commons": "^1.7.0"
3406 + }
3407 + },
3408 + "node_modules/@surma/rollup-plugin-off-main-thread": {
3409 + "version": "2.2.3",
3410 + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
3411 + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
3412 + "dependencies": {
3413 + "ejs": "^3.1.6",
3414 + "json5": "^2.2.0",
3415 + "magic-string": "^0.25.0",
3416 + "string.prototype.matchall": "^4.0.6"
3417 + }
3418 + },
3419 + "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
3420 + "version": "5.4.0",
3421 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
3422 + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
3423 + "engines": {
3424 + "node": ">=10"
3425 + },
3426 + "funding": {
3427 + "type": "github",
3428 + "url": "https://github.com/sponsors/gregberge"
3429 + }
3430 + },
3431 + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
3432 + "version": "5.4.0",
3433 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
3434 + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
3435 + "engines": {
3436 + "node": ">=10"
3437 + },
3438 + "funding": {
3439 + "type": "github",
3440 + "url": "https://github.com/sponsors/gregberge"
3441 + }
3442 + },
3443 + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
3444 + "version": "5.0.1",
3445 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
3446 + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
3447 + "engines": {
3448 + "node": ">=10"
3449 + },
3450 + "funding": {
3451 + "type": "github",
3452 + "url": "https://github.com/sponsors/gregberge"
3453 + }
3454 + },
3455 + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
3456 + "version": "5.0.1",
3457 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
3458 + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
3459 + "engines": {
3460 + "node": ">=10"
3461 + },
3462 + "funding": {
3463 + "type": "github",
3464 + "url": "https://github.com/sponsors/gregberge"
3465 + }
3466 + },
3467 + "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
3468 + "version": "5.4.0",
3469 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
3470 + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
3471 + "engines": {
3472 + "node": ">=10"
3473 + },
3474 + "funding": {
3475 + "type": "github",
3476 + "url": "https://github.com/sponsors/gregberge"
3477 + }
3478 + },
3479 + "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
3480 + "version": "5.4.0",
3481 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
3482 + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
3483 + "engines": {
3484 + "node": ">=10"
3485 + },
3486 + "funding": {
3487 + "type": "github",
3488 + "url": "https://github.com/sponsors/gregberge"
3489 + }
3490 + },
3491 + "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
3492 + "version": "5.4.0",
3493 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
3494 + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
3495 + "engines": {
3496 + "node": ">=10"
3497 + },
3498 + "funding": {
3499 + "type": "github",
3500 + "url": "https://github.com/sponsors/gregberge"
3501 + }
3502 + },
3503 + "node_modules/@svgr/babel-plugin-transform-svg-component": {
3504 + "version": "5.5.0",
3505 + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
3506 + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
3507 + "engines": {
3508 + "node": ">=10"
3509 + },
3510 + "funding": {
3511 + "type": "github",
3512 + "url": "https://github.com/sponsors/gregberge"
3513 + }
3514 + },
3515 + "node_modules/@svgr/babel-preset": {
3516 + "version": "5.5.0",
3517 + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
3518 + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
3519 + "dependencies": {
3520 + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
3521 + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
3522 + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
3523 + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
3524 + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
3525 + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
3526 + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
3527 + "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
3528 + },
3529 + "engines": {
3530 + "node": ">=10"
3531 + },
3532 + "funding": {
3533 + "type": "github",
3534 + "url": "https://github.com/sponsors/gregberge"
3535 + }
3536 + },
3537 + "node_modules/@svgr/core": {
3538 + "version": "5.5.0",
3539 + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
3540 + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
3541 + "dependencies": {
3542 + "@svgr/plugin-jsx": "^5.5.0",
3543 + "camelcase": "^6.2.0",
3544 + "cosmiconfig": "^7.0.0"
3545 + },
3546 + "engines": {
3547 + "node": ">=10"
3548 + },
3549 + "funding": {
3550 + "type": "github",
3551 + "url": "https://github.com/sponsors/gregberge"
3552 + }
3553 + },
3554 + "node_modules/@svgr/hast-util-to-babel-ast": {
3555 + "version": "5.5.0",
3556 + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
3557 + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
3558 + "dependencies": {
3559 + "@babel/types": "^7.12.6"
3560 + },
3561 + "engines": {
3562 + "node": ">=10"
3563 + },
3564 + "funding": {
3565 + "type": "github",
3566 + "url": "https://github.com/sponsors/gregberge"
3567 + }
3568 + },
3569 + "node_modules/@svgr/plugin-jsx": {
3570 + "version": "5.5.0",
3571 + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
3572 + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
3573 + "dependencies": {
3574 + "@babel/core": "^7.12.3",
3575 + "@svgr/babel-preset": "^5.5.0",
3576 + "@svgr/hast-util-to-babel-ast": "^5.5.0",
3577 + "svg-parser": "^2.0.2"
3578 + },
3579 + "engines": {
3580 + "node": ">=10"
3581 + },
3582 + "funding": {
3583 + "type": "github",
3584 + "url": "https://github.com/sponsors/gregberge"
3585 + }
3586 + },
3587 + "node_modules/@svgr/plugin-svgo": {
3588 + "version": "5.5.0",
3589 + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
3590 + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
3591 + "dependencies": {
3592 + "cosmiconfig": "^7.0.0",
3593 + "deepmerge": "^4.2.2",
3594 + "svgo": "^1.2.2"
3595 + },
3596 + "engines": {
3597 + "node": ">=10"
3598 + },
3599 + "funding": {
3600 + "type": "github",
3601 + "url": "https://github.com/sponsors/gregberge"
3602 + }
3603 + },
3604 + "node_modules/@svgr/webpack": {
3605 + "version": "5.5.0",
3606 + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
3607 + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
3608 + "dependencies": {
3609 + "@babel/core": "^7.12.3",
3610 + "@babel/plugin-transform-react-constant-elements": "^7.12.1",
3611 + "@babel/preset-env": "^7.12.1",
3612 + "@babel/preset-react": "^7.12.5",
3613 + "@svgr/core": "^5.5.0",
3614 + "@svgr/plugin-jsx": "^5.5.0",
3615 + "@svgr/plugin-svgo": "^5.5.0",
3616 + "loader-utils": "^2.0.0"
3617 + },
3618 + "engines": {
3619 + "node": ">=10"
3620 + },
3621 + "funding": {
3622 + "type": "github",
3623 + "url": "https://github.com/sponsors/gregberge"
3624 + }
3625 + },
3626 + "node_modules/@testing-library/dom": {
3627 + "version": "8.11.2",
3628 + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.2.tgz",
3629 + "integrity": "sha512-idsS/cqbYudXcVWngc1PuWNmXs416oBy2g/7Q8QAUREt5Z3MUkAL2XJD7xazLJ6esDfqRDi/ZBxk+OPPXitHRw==",
3630 + "dependencies": {
3631 + "@babel/code-frame": "^7.10.4",
3632 + "@babel/runtime": "^7.12.5",
3633 + "@types/aria-query": "^4.2.0",
3634 + "aria-query": "^5.0.0",
3635 + "chalk": "^4.1.0",
3636 + "dom-accessibility-api": "^0.5.9",
3637 + "lz-string": "^1.4.4",
3638 + "pretty-format": "^27.0.2"
3639 + },
3640 + "engines": {
3641 + "node": ">=12"
3642 + }
3643 + },
3644 + "node_modules/@testing-library/dom/node_modules/ansi-styles": {
3645 + "version": "4.3.0",
3646 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3647 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3648 + "dependencies": {
3649 + "color-convert": "^2.0.1"
3650 + },
3651 + "engines": {
3652 + "node": ">=8"
3653 + },
3654 + "funding": {
3655 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3656 + }
3657 + },
3658 + "node_modules/@testing-library/dom/node_modules/aria-query": {
3659 + "version": "5.0.0",
3660 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz",
3661 + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==",
3662 + "engines": {
3663 + "node": ">=6.0"
3664 + }
3665 + },
3666 + "node_modules/@testing-library/dom/node_modules/chalk": {
3667 + "version": "4.1.2",
3668 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
3669 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
3670 + "dependencies": {
3671 + "ansi-styles": "^4.1.0",
3672 + "supports-color": "^7.1.0"
3673 + },
3674 + "engines": {
3675 + "node": ">=10"
3676 + },
3677 + "funding": {
3678 + "url": "https://github.com/chalk/chalk?sponsor=1"
3679 + }
3680 + },
3681 + "node_modules/@testing-library/dom/node_modules/color-convert": {
3682 + "version": "2.0.1",
3683 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3684 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3685 + "dependencies": {
3686 + "color-name": "~1.1.4"
3687 + },
3688 + "engines": {
3689 + "node": ">=7.0.0"
3690 + }
3691 + },
3692 + "node_modules/@testing-library/dom/node_modules/color-name": {
3693 + "version": "1.1.4",
3694 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3695 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
3696 + },
3697 + "node_modules/@testing-library/dom/node_modules/has-flag": {
3698 + "version": "4.0.0",
3699 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
3700 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
3701 + "engines": {
3702 + "node": ">=8"
3703 + }
3704 + },
3705 + "node_modules/@testing-library/dom/node_modules/supports-color": {
3706 + "version": "7.2.0",
3707 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
3708 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
3709 + "dependencies": {
3710 + "has-flag": "^4.0.0"
3711 + },
3712 + "engines": {
3713 + "node": ">=8"
3714 + }
3715 + },
3716 + "node_modules/@testing-library/jest-dom": {
3717 + "version": "5.16.1",
3718 + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.1.tgz",
3719 + "integrity": "sha512-ajUJdfDIuTCadB79ukO+0l8O+QwN0LiSxDaYUTI4LndbbUsGi6rWU1SCexXzBA2NSjlVB9/vbkasQIL3tmPBjw==",
3720 + "dependencies": {
3721 + "@babel/runtime": "^7.9.2",
3722 + "@types/testing-library__jest-dom": "^5.9.1",
3723 + "aria-query": "^5.0.0",
3724 + "chalk": "^3.0.0",
3725 + "css": "^3.0.0",
3726 + "css.escape": "^1.5.1",
3727 + "dom-accessibility-api": "^0.5.6",
3728 + "lodash": "^4.17.15",
3729 + "redent": "^3.0.0"
3730 + },
3731 + "engines": {
3732 + "node": ">=8",
3733 + "npm": ">=6",
3734 + "yarn": ">=1"
3735 + }
3736 + },
3737 + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": {
3738 + "version": "4.3.0",
3739 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3740 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3741 + "dependencies": {
3742 + "color-convert": "^2.0.1"
3743 + },
3744 + "engines": {
3745 + "node": ">=8"
3746 + },
3747 + "funding": {
3748 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3749 + }
3750 + },
3751 + "node_modules/@testing-library/jest-dom/node_modules/aria-query": {
3752 + "version": "5.0.0",
3753 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz",
3754 + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==",
3755 + "engines": {
3756 + "node": ">=6.0"
3757 + }
3758 + },
3759 + "node_modules/@testing-library/jest-dom/node_modules/chalk": {
3760 + "version": "3.0.0",
3761 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
3762 + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
3763 + "dependencies": {
3764 + "ansi-styles": "^4.1.0",
3765 + "supports-color": "^7.1.0"
3766 + },
3767 + "engines": {
3768 + "node": ">=8"
3769 + }
3770 + },
3771 + "node_modules/@testing-library/jest-dom/node_modules/color-convert": {
3772 + "version": "2.0.1",
3773 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3774 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3775 + "dependencies": {
3776 + "color-name": "~1.1.4"
3777 + },
3778 + "engines": {
3779 + "node": ">=7.0.0"
3780 + }
3781 + },
3782 + "node_modules/@testing-library/jest-dom/node_modules/color-name": {
3783 + "version": "1.1.4",
3784 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3785 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
3786 + },
3787 + "node_modules/@testing-library/jest-dom/node_modules/has-flag": {
3788 + "version": "4.0.0",
3789 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
3790 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
3791 + "engines": {
3792 + "node": ">=8"
3793 + }
3794 + },
3795 + "node_modules/@testing-library/jest-dom/node_modules/supports-color": {
3796 + "version": "7.2.0",
3797 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
3798 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
3799 + "dependencies": {
3800 + "has-flag": "^4.0.0"
3801 + },
3802 + "engines": {
3803 + "node": ">=8"
3804 + }
3805 + },
3806 + "node_modules/@testing-library/react": {
3807 + "version": "12.1.2",
3808 + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.2.tgz",
3809 + "integrity": "sha512-ihQiEOklNyHIpo2Y8FREkyD1QAea054U0MVbwH1m8N9TxeFz+KoJ9LkqoKqJlzx2JDm56DVwaJ1r36JYxZM05g==",
3810 + "dependencies": {
3811 + "@babel/runtime": "^7.12.5",
3812 + "@testing-library/dom": "^8.0.0"
3813 + },
3814 + "engines": {
3815 + "node": ">=12"
3816 + },
3817 + "peerDependencies": {
3818 + "react": "*",
3819 + "react-dom": "*"
3820 + }
3821 + },
3822 + "node_modules/@testing-library/user-event": {
3823 + "version": "13.5.0",
3824 + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz",
3825 + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==",
3826 + "dependencies": {
3827 + "@babel/runtime": "^7.12.5"
3828 + },
3829 + "engines": {
3830 + "node": ">=10",
3831 + "npm": ">=6"
3832 + },
3833 + "peerDependencies": {
3834 + "@testing-library/dom": ">=7.21.4"
3835 + }
3836 + },
3837 + "node_modules/@tootallnate/once": {
3838 + "version": "1.1.2",
3839 + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
3840 + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
3841 + "engines": {
3842 + "node": ">= 6"
3843 + }
3844 + },
3845 + "node_modules/@trysound/sax": {
3846 + "version": "0.2.0",
3847 + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
3848 + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
3849 + "engines": {
3850 + "node": ">=10.13.0"
3851 + }
3852 + },
3853 + "node_modules/@types/aria-query": {
3854 + "version": "4.2.2",
3855 + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
3856 + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig=="
3857 + },
3858 + "node_modules/@types/babel__core": {
3859 + "version": "7.1.18",
3860 + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz",
3861 + "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==",
3862 + "dependencies": {
3863 + "@babel/parser": "^7.1.0",
3864 + "@babel/types": "^7.0.0",
3865 + "@types/babel__generator": "*",
3866 + "@types/babel__template": "*",
3867 + "@types/babel__traverse": "*"
3868 + }
3869 + },
3870 + "node_modules/@types/babel__generator": {
3871 + "version": "7.6.4",
3872 + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
3873 + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
3874 + "dependencies": {
3875 + "@babel/types": "^7.0.0"
3876 + }
3877 + },
3878 + "node_modules/@types/babel__template": {
3879 + "version": "7.4.1",
3880 + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
3881 + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
3882 + "dependencies": {
3883 + "@babel/parser": "^7.1.0",
3884 + "@babel/types": "^7.0.0"
3885 + }
3886 + },
3887 + "node_modules/@types/babel__traverse": {
3888 + "version": "7.14.2",
3889 + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
3890 + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
3891 + "dependencies": {
3892 + "@babel/types": "^7.3.0"
3893 + }
3894 + },
3895 + "node_modules/@types/body-parser": {
3896 + "version": "1.19.2",
3897 + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
3898 + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
3899 + "dependencies": {
3900 + "@types/connect": "*",
3901 + "@types/node": "*"
3902 + }
3903 + },
3904 + "node_modules/@types/bonjour": {
3905 + "version": "3.5.10",
3906 + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
3907 + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
3908 + "dependencies": {
3909 + "@types/node": "*"
3910 + }
3911 + },
3912 + "node_modules/@types/connect": {
3913 + "version": "3.4.35",
3914 + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
3915 + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
3916 + "dependencies": {
3917 + "@types/node": "*"
3918 + }
3919 + },
3920 + "node_modules/@types/connect-history-api-fallback": {
3921 + "version": "1.3.5",
3922 + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
3923 + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
3924 + "dependencies": {
3925 + "@types/express-serve-static-core": "*",
3926 + "@types/node": "*"
3927 + }
3928 + },
3929 + "node_modules/@types/eslint": {
3930 + "version": "7.29.0",
3931 + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz",
3932 + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==",
3933 + "dependencies": {
3934 + "@types/estree": "*",
3935 + "@types/json-schema": "*"
3936 + }
3937 + },
3938 + "node_modules/@types/eslint-scope": {
3939 + "version": "3.7.3",
3940 + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
3941 + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
3942 + "dependencies": {
3943 + "@types/eslint": "*",
3944 + "@types/estree": "*"
3945 + }
3946 + },
3947 + "node_modules/@types/estree": {
3948 + "version": "0.0.50",
3949 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
3950 + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw=="
3951 + },
3952 + "node_modules/@types/express": {
3953 + "version": "4.17.13",
3954 + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
3955 + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
3956 + "dependencies": {
3957 + "@types/body-parser": "*",
3958 + "@types/express-serve-static-core": "^4.17.18",
3959 + "@types/qs": "*",
3960 + "@types/serve-static": "*"
3961 + }
3962 + },
3963 + "node_modules/@types/express-serve-static-core": {
3964 + "version": "4.17.28",
3965 + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
3966 + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
3967 + "dependencies": {
3968 + "@types/node": "*",
3969 + "@types/qs": "*",
3970 + "@types/range-parser": "*"
3971 + }
3972 + },
3973 + "node_modules/@types/graceful-fs": {
3974 + "version": "4.1.5",
3975 + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
3976 + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
3977 + "dependencies": {
3978 + "@types/node": "*"
3979 + }
3980 + },
3981 + "node_modules/@types/html-minifier-terser": {
3982 + "version": "6.1.0",
3983 + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
3984 + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="
3985 + },
3986 + "node_modules/@types/http-proxy": {
3987 + "version": "1.17.8",
3988 + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
3989 + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
3990 + "dependencies": {
3991 + "@types/node": "*"
3992 + }
3993 + },
3994 + "node_modules/@types/istanbul-lib-coverage": {
3995 + "version": "2.0.4",
3996 + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
3997 + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g=="
3998 + },
3999 + "node_modules/@types/istanbul-lib-report": {
4000 + "version": "3.0.0",
4001 + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
4002 + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
4003 + "dependencies": {
4004 + "@types/istanbul-lib-coverage": "*"
4005 + }
4006 + },
4007 + "node_modules/@types/istanbul-reports": {
4008 + "version": "3.0.1",
4009 + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
4010 + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
4011 + "dependencies": {
4012 + "@types/istanbul-lib-report": "*"
4013 + }
4014 + },
4015 + "node_modules/@types/jest": {
4016 + "version": "27.4.0",
4017 + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz",
4018 + "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==",
4019 + "dependencies": {
4020 + "jest-diff": "^27.0.0",
4021 + "pretty-format": "^27.0.0"
4022 + }
4023 + },
4024 + "node_modules/@types/json-schema": {
4025 + "version": "7.0.9",
4026 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
4027 + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ=="
4028 + },
4029 + "node_modules/@types/json5": {
4030 + "version": "0.0.29",
4031 + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
4032 + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4="
4033 + },
4034 + "node_modules/@types/mime": {
4035 + "version": "1.3.2",
4036 + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
4037 + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
4038 + },
4039 + "node_modules/@types/node": {
4040 + "version": "16.11.21",
4041 + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz",
4042 + "integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A=="
4043 + },
4044 + "node_modules/@types/parse-json": {
4045 + "version": "4.0.0",
4046 + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
4047 + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
4048 + },
4049 + "node_modules/@types/prettier": {
4050 + "version": "2.4.3",
4051 + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz",
4052 + "integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w=="
4053 + },
4054 + "node_modules/@types/prop-types": {
4055 + "version": "15.7.4",
4056 + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
4057 + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
4058 + },
4059 + "node_modules/@types/q": {
4060 + "version": "1.5.5",
4061 + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
4062 + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="
4063 + },
4064 + "node_modules/@types/qs": {
4065 + "version": "6.9.7",
4066 + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
4067 + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
4068 + },
4069 + "node_modules/@types/range-parser": {
4070 + "version": "1.2.4",
4071 + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
4072 + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
4073 + },
4074 + "node_modules/@types/react": {
4075 + "version": "17.0.38",
4076 + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz",
4077 + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==",
4078 + "dependencies": {
4079 + "@types/prop-types": "*",
4080 + "@types/scheduler": "*",
4081 + "csstype": "^3.0.2"
4082 + }
4083 + },
4084 + "node_modules/@types/react-dom": {
4085 + "version": "17.0.11",
4086 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
4087 + "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==",
4088 + "dependencies": {
4089 + "@types/react": "*"
4090 + }
4091 + },
4092 + "node_modules/@types/react-is": {
4093 + "version": "17.0.3",
4094 + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz",
4095 + "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==",
4096 + "dependencies": {
4097 + "@types/react": "*"
4098 + }
4099 + },
4100 + "node_modules/@types/react-transition-group": {
4101 + "version": "4.4.4",
4102 + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz",
4103 + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==",
4104 + "dependencies": {
4105 + "@types/react": "*"
4106 + }
4107 + },
4108 + "node_modules/@types/resolve": {
4109 + "version": "1.17.1",
4110 + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
4111 + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
4112 + "dependencies": {
4113 + "@types/node": "*"
4114 + }
4115 + },
4116 + "node_modules/@types/retry": {
4117 + "version": "0.12.1",
4118 + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
4119 + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g=="
4120 + },
4121 + "node_modules/@types/scheduler": {
4122 + "version": "0.16.2",
4123 + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
4124 + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
4125 + },
4126 + "node_modules/@types/serve-index": {
4127 + "version": "1.9.1",
4128 + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
4129 + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
4130 + "dependencies": {
4131 + "@types/express": "*"
4132 + }
4133 + },
4134 + "node_modules/@types/serve-static": {
4135 + "version": "1.13.10",
4136 + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
4137 + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
4138 + "dependencies": {
4139 + "@types/mime": "^1",
4140 + "@types/node": "*"
4141 + }
4142 + },
4143 + "node_modules/@types/sockjs": {
4144 + "version": "0.3.33",
4145 + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
4146 + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
4147 + "dependencies": {
4148 + "@types/node": "*"
4149 + }
4150 + },
4151 + "node_modules/@types/stack-utils": {
4152 + "version": "2.0.1",
4153 + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
4154 + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw=="
4155 + },
4156 + "node_modules/@types/testing-library__jest-dom": {
4157 + "version": "5.14.2",
4158 + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz",
4159 + "integrity": "sha512-vehbtyHUShPxIa9SioxDwCvgxukDMH//icJG90sXQBUm5lJOHLT5kNeU9tnivhnA/TkOFMzGIXN2cTc4hY8/kg==",
4160 + "dependencies": {
4161 + "@types/jest": "*"
4162 + }
4163 + },
4164 + "node_modules/@types/trusted-types": {
4165 + "version": "2.0.2",
4166 + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
4167 + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
4168 + },
4169 + "node_modules/@types/ws": {
4170 + "version": "8.2.2",
4171 + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
4172 + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
4173 + "dependencies": {
4174 + "@types/node": "*"
4175 + }
4176 + },
4177 + "node_modules/@types/yargs": {
4178 + "version": "16.0.4",
4179 + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
4180 + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
4181 + "dependencies": {
4182 + "@types/yargs-parser": "*"
4183 + }
4184 + },
4185 + "node_modules/@types/yargs-parser": {
4186 + "version": "20.2.1",
4187 + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
4188 + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
4189 + },
4190 + "node_modules/@typescript-eslint/eslint-plugin": {
4191 + "version": "5.10.0",
4192 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
4193 + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==",
4194 + "dependencies": {
4195 + "@typescript-eslint/scope-manager": "5.10.0",
4196 + "@typescript-eslint/type-utils": "5.10.0",
4197 + "@typescript-eslint/utils": "5.10.0",
4198 + "debug": "^4.3.2",
4199 + "functional-red-black-tree": "^1.0.1",
4200 + "ignore": "^5.1.8",
4201 + "regexpp": "^3.2.0",
4202 + "semver": "^7.3.5",
4203 + "tsutils": "^3.21.0"
4204 + },
4205 + "engines": {
4206 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4207 + },
4208 + "funding": {
4209 + "type": "opencollective",
4210 + "url": "https://opencollective.com/typescript-eslint"
4211 + },
4212 + "peerDependencies": {
4213 + "@typescript-eslint/parser": "^5.0.0",
4214 + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4215 + },
4216 + "peerDependenciesMeta": {
4217 + "typescript": {
4218 + "optional": true
4219 + }
4220 + }
4221 + },
4222 + "node_modules/@typescript-eslint/experimental-utils": {
4223 + "version": "5.10.0",
4224 + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz",
4225 + "integrity": "sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg==",
4226 + "dependencies": {
4227 + "@typescript-eslint/utils": "5.10.0"
4228 + },
4229 + "engines": {
4230 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4231 + },
4232 + "funding": {
4233 + "type": "opencollective",
4234 + "url": "https://opencollective.com/typescript-eslint"
4235 + },
4236 + "peerDependencies": {
4237 + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4238 + }
4239 + },
4240 + "node_modules/@typescript-eslint/parser": {
4241 + "version": "5.10.0",
4242 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz",
4243 + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==",
4244 + "dependencies": {
4245 + "@typescript-eslint/scope-manager": "5.10.0",
4246 + "@typescript-eslint/types": "5.10.0",
4247 + "@typescript-eslint/typescript-estree": "5.10.0",
4248 + "debug": "^4.3.2"
4249 + },
4250 + "engines": {
4251 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4252 + },
4253 + "funding": {
4254 + "type": "opencollective",
4255 + "url": "https://opencollective.com/typescript-eslint"
4256 + },
4257 + "peerDependencies": {
4258 + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4259 + },
4260 + "peerDependenciesMeta": {
4261 + "typescript": {
4262 + "optional": true
4263 + }
4264 + }
4265 + },
4266 + "node_modules/@typescript-eslint/scope-manager": {
4267 + "version": "5.10.0",
4268 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz",
4269 + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==",
4270 + "dependencies": {
4271 + "@typescript-eslint/types": "5.10.0",
4272 + "@typescript-eslint/visitor-keys": "5.10.0"
4273 + },
4274 + "engines": {
4275 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4276 + },
4277 + "funding": {
4278 + "type": "opencollective",
4279 + "url": "https://opencollective.com/typescript-eslint"
4280 + }
4281 + },
4282 + "node_modules/@typescript-eslint/type-utils": {
4283 + "version": "5.10.0",
4284 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz",
4285 + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==",
4286 + "dependencies": {
4287 + "@typescript-eslint/utils": "5.10.0",
4288 + "debug": "^4.3.2",
4289 + "tsutils": "^3.21.0"
4290 + },
4291 + "engines": {
4292 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4293 + },
4294 + "funding": {
4295 + "type": "opencollective",
4296 + "url": "https://opencollective.com/typescript-eslint"
4297 + },
4298 + "peerDependencies": {
4299 + "eslint": "*"
4300 + },
4301 + "peerDependenciesMeta": {
4302 + "typescript": {
4303 + "optional": true
4304 + }
4305 + }
4306 + },
4307 + "node_modules/@typescript-eslint/types": {
4308 + "version": "5.10.0",
4309 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz",
4310 + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==",
4311 + "engines": {
4312 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4313 + },
4314 + "funding": {
4315 + "type": "opencollective",
4316 + "url": "https://opencollective.com/typescript-eslint"
4317 + }
4318 + },
4319 + "node_modules/@typescript-eslint/typescript-estree": {
4320 + "version": "5.10.0",
4321 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz",
4322 + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==",
4323 + "dependencies": {
4324 + "@typescript-eslint/types": "5.10.0",
4325 + "@typescript-eslint/visitor-keys": "5.10.0",
4326 + "debug": "^4.3.2",
4327 + "globby": "^11.0.4",
4328 + "is-glob": "^4.0.3",
4329 + "semver": "^7.3.5",
4330 + "tsutils": "^3.21.0"
4331 + },
4332 + "engines": {
4333 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4334 + },
4335 + "funding": {
4336 + "type": "opencollective",
4337 + "url": "https://opencollective.com/typescript-eslint"
4338 + },
4339 + "peerDependenciesMeta": {
4340 + "typescript": {
4341 + "optional": true
4342 + }
4343 + }
4344 + },
4345 + "node_modules/@typescript-eslint/utils": {
4346 + "version": "5.10.0",
4347 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz",
4348 + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==",
4349 + "dependencies": {
4350 + "@types/json-schema": "^7.0.9",
4351 + "@typescript-eslint/scope-manager": "5.10.0",
4352 + "@typescript-eslint/types": "5.10.0",
4353 + "@typescript-eslint/typescript-estree": "5.10.0",
4354 + "eslint-scope": "^5.1.1",
4355 + "eslint-utils": "^3.0.0"
4356 + },
4357 + "engines": {
4358 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4359 + },
4360 + "funding": {
4361 + "type": "opencollective",
4362 + "url": "https://opencollective.com/typescript-eslint"
4363 + },
4364 + "peerDependencies": {
4365 + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
4366 + }
4367 + },
4368 + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
4369 + "version": "5.1.1",
4370 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
4371 + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
4372 + "dependencies": {
4373 + "esrecurse": "^4.3.0",
4374 + "estraverse": "^4.1.1"
4375 + },
4376 + "engines": {
4377 + "node": ">=8.0.0"
4378 + }
4379 + },
4380 + "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
4381 + "version": "4.3.0",
4382 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
4383 + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
4384 + "engines": {
4385 + "node": ">=4.0"
4386 + }
4387 + },
4388 + "node_modules/@typescript-eslint/visitor-keys": {
4389 + "version": "5.10.0",
4390 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz",
4391 + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==",
4392 + "dependencies": {
4393 + "@typescript-eslint/types": "5.10.0",
4394 + "eslint-visitor-keys": "^3.0.0"
4395 + },
4396 + "engines": {
4397 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
4398 + },
4399 + "funding": {
4400 + "type": "opencollective",
4401 + "url": "https://opencollective.com/typescript-eslint"
4402 + }
4403 + },
4404 + "node_modules/@webassemblyjs/ast": {
4405 + "version": "1.11.1",
4406 + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
4407 + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
4408 + "dependencies": {
4409 + "@webassemblyjs/helper-numbers": "1.11.1",
4410 + "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
4411 + }
4412 + },
4413 + "node_modules/@webassemblyjs/floating-point-hex-parser": {
4414 + "version": "1.11.1",
4415 + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
4416 + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
4417 + },
4418 + "node_modules/@webassemblyjs/helper-api-error": {
4419 + "version": "1.11.1",
4420 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
4421 + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
4422 + },
4423 + "node_modules/@webassemblyjs/helper-buffer": {
4424 + "version": "1.11.1",
4425 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
4426 + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
4427 + },
4428 + "node_modules/@webassemblyjs/helper-numbers": {
4429 + "version": "1.11.1",
4430 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
4431 + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
4432 + "dependencies": {
4433 + "@webassemblyjs/floating-point-hex-parser": "1.11.1",
4434 + "@webassemblyjs/helper-api-error": "1.11.1",
4435 + "@xtuc/long": "4.2.2"
4436 + }
4437 + },
4438 + "node_modules/@webassemblyjs/helper-wasm-bytecode": {
4439 + "version": "1.11.1",
4440 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
4441 + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
4442 + },
4443 + "node_modules/@webassemblyjs/helper-wasm-section": {
4444 + "version": "1.11.1",
4445 + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
4446 + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
4447 + "dependencies": {
4448 + "@webassemblyjs/ast": "1.11.1",
4449 + "@webassemblyjs/helper-buffer": "1.11.1",
4450 + "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4451 + "@webassemblyjs/wasm-gen": "1.11.1"
4452 + }
4453 + },
4454 + "node_modules/@webassemblyjs/ieee754": {
4455 + "version": "1.11.1",
4456 + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
4457 + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
4458 + "dependencies": {
4459 + "@xtuc/ieee754": "^1.2.0"
4460 + }
4461 + },
4462 + "node_modules/@webassemblyjs/leb128": {
4463 + "version": "1.11.1",
4464 + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
4465 + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
4466 + "dependencies": {
4467 + "@xtuc/long": "4.2.2"
4468 + }
4469 + },
4470 + "node_modules/@webassemblyjs/utf8": {
4471 + "version": "1.11.1",
4472 + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
4473 + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
4474 + },
4475 + "node_modules/@webassemblyjs/wasm-edit": {
4476 + "version": "1.11.1",
4477 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
4478 + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
4479 + "dependencies": {
4480 + "@webassemblyjs/ast": "1.11.1",
4481 + "@webassemblyjs/helper-buffer": "1.11.1",
4482 + "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4483 + "@webassemblyjs/helper-wasm-section": "1.11.1",
4484 + "@webassemblyjs/wasm-gen": "1.11.1",
4485 + "@webassemblyjs/wasm-opt": "1.11.1",
4486 + "@webassemblyjs/wasm-parser": "1.11.1",
4487 + "@webassemblyjs/wast-printer": "1.11.1"
4488 + }
4489 + },
4490 + "node_modules/@webassemblyjs/wasm-gen": {
4491 + "version": "1.11.1",
4492 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
4493 + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
4494 + "dependencies": {
4495 + "@webassemblyjs/ast": "1.11.1",
4496 + "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4497 + "@webassemblyjs/ieee754": "1.11.1",
4498 + "@webassemblyjs/leb128": "1.11.1",
4499 + "@webassemblyjs/utf8": "1.11.1"
4500 + }
4501 + },
4502 + "node_modules/@webassemblyjs/wasm-opt": {
4503 + "version": "1.11.1",
4504 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
4505 + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
4506 + "dependencies": {
4507 + "@webassemblyjs/ast": "1.11.1",
4508 + "@webassemblyjs/helper-buffer": "1.11.1",
4509 + "@webassemblyjs/wasm-gen": "1.11.1",
4510 + "@webassemblyjs/wasm-parser": "1.11.1"
4511 + }
4512 + },
4513 + "node_modules/@webassemblyjs/wasm-parser": {
4514 + "version": "1.11.1",
4515 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
4516 + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
4517 + "dependencies": {
4518 + "@webassemblyjs/ast": "1.11.1",
4519 + "@webassemblyjs/helper-api-error": "1.11.1",
4520 + "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
4521 + "@webassemblyjs/ieee754": "1.11.1",
4522 + "@webassemblyjs/leb128": "1.11.1",
4523 + "@webassemblyjs/utf8": "1.11.1"
4524 + }
4525 + },
4526 + "node_modules/@webassemblyjs/wast-printer": {
4527 + "version": "1.11.1",
4528 + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
4529 + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
4530 + "dependencies": {
4531 + "@webassemblyjs/ast": "1.11.1",
4532 + "@xtuc/long": "4.2.2"
4533 + }
4534 + },
4535 + "node_modules/@xtuc/ieee754": {
4536 + "version": "1.2.0",
4537 + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
4538 + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
4539 + },
4540 + "node_modules/@xtuc/long": {
4541 + "version": "4.2.2",
4542 + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
4543 + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
4544 + },
4545 + "node_modules/abab": {
4546 + "version": "2.0.5",
4547 + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
4548 + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q=="
4549 + },
4550 + "node_modules/accepts": {
4551 + "version": "1.3.7",
4552 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
4553 + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
4554 + "dependencies": {
4555 + "mime-types": "~2.1.24",
4556 + "negotiator": "0.6.2"
4557 + },
4558 + "engines": {
4559 + "node": ">= 0.6"
4560 + }
4561 + },
4562 + "node_modules/acorn": {
4563 + "version": "8.7.0",
4564 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
4565 + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
4566 + "bin": {
4567 + "acorn": "bin/acorn"
4568 + },
4569 + "engines": {
4570 + "node": ">=0.4.0"
4571 + }
4572 + },
4573 + "node_modules/acorn-globals": {
4574 + "version": "6.0.0",
4575 + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
4576 + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
4577 + "dependencies": {
4578 + "acorn": "^7.1.1",
4579 + "acorn-walk": "^7.1.1"
4580 + }
4581 + },
4582 + "node_modules/acorn-globals/node_modules/acorn": {
4583 + "version": "7.4.1",
4584 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
4585 + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
4586 + "bin": {
4587 + "acorn": "bin/acorn"
4588 + },
4589 + "engines": {
4590 + "node": ">=0.4.0"
4591 + }
4592 + },
4593 + "node_modules/acorn-import-assertions": {
4594 + "version": "1.8.0",
4595 + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
4596 + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
4597 + "peerDependencies": {
4598 + "acorn": "^8"
4599 + }
4600 + },
4601 + "node_modules/acorn-jsx": {
4602 + "version": "5.3.2",
4603 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
4604 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
4605 + "peerDependencies": {
4606 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
4607 + }
4608 + },
4609 + "node_modules/acorn-node": {
4610 + "version": "1.8.2",
4611 + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
4612 + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
4613 + "dependencies": {
4614 + "acorn": "^7.0.0",
4615 + "acorn-walk": "^7.0.0",
4616 + "xtend": "^4.0.2"
4617 + }
4618 + },
4619 + "node_modules/acorn-node/node_modules/acorn": {
4620 + "version": "7.4.1",
4621 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
4622 + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
4623 + "bin": {
4624 + "acorn": "bin/acorn"
4625 + },
4626 + "engines": {
4627 + "node": ">=0.4.0"
4628 + }
4629 + },
4630 + "node_modules/acorn-walk": {
4631 + "version": "7.2.0",
4632 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
4633 + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
4634 + "engines": {
4635 + "node": ">=0.4.0"
4636 + }
4637 + },
4638 + "node_modules/address": {
4639 + "version": "1.1.2",
4640 + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
4641 + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
4642 + "engines": {
4643 + "node": ">= 0.12.0"
4644 + }
4645 + },
4646 + "node_modules/adjust-sourcemap-loader": {
4647 + "version": "4.0.0",
4648 + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
4649 + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
4650 + "dependencies": {
4651 + "loader-utils": "^2.0.0",
4652 + "regex-parser": "^2.2.11"
4653 + },
4654 + "engines": {
4655 + "node": ">=8.9"
4656 + }
4657 + },
4658 + "node_modules/agent-base": {
4659 + "version": "6.0.2",
4660 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
4661 + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
4662 + "dependencies": {
4663 + "debug": "4"
4664 + },
4665 + "engines": {
4666 + "node": ">= 6.0.0"
4667 + }
4668 + },
4669 + "node_modules/aggregate-error": {
4670 + "version": "3.1.0",
4671 + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
4672 + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
4673 + "dependencies": {
4674 + "clean-stack": "^2.0.0",
4675 + "indent-string": "^4.0.0"
4676 + },
4677 + "engines": {
4678 + "node": ">=8"
4679 + }
4680 + },
4681 + "node_modules/ajv": {
4682 + "version": "6.12.6",
4683 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
4684 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
4685 + "dependencies": {
4686 + "fast-deep-equal": "^3.1.1",
4687 + "fast-json-stable-stringify": "^2.0.0",
4688 + "json-schema-traverse": "^0.4.1",
4689 + "uri-js": "^4.2.2"
4690 + },
4691 + "funding": {
4692 + "type": "github",
4693 + "url": "https://github.com/sponsors/epoberezkin"
4694 + }
4695 + },
4696 + "node_modules/ajv-formats": {
4697 + "version": "2.1.1",
4698 + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
4699 + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
4700 + "dependencies": {
4701 + "ajv": "^8.0.0"
4702 + },
4703 + "peerDependencies": {
4704 + "ajv": "^8.0.0"
4705 + },
4706 + "peerDependenciesMeta": {
4707 + "ajv": {
4708 + "optional": true
4709 + }
4710 + }
4711 + },
4712 + "node_modules/ajv-formats/node_modules/ajv": {
4713 + "version": "8.9.0",
4714 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
4715 + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
4716 + "dependencies": {
4717 + "fast-deep-equal": "^3.1.1",
4718 + "json-schema-traverse": "^1.0.0",
4719 + "require-from-string": "^2.0.2",
4720 + "uri-js": "^4.2.2"
4721 + },
4722 + "funding": {
4723 + "type": "github",
4724 + "url": "https://github.com/sponsors/epoberezkin"
4725 + }
4726 + },
4727 + "node_modules/ajv-formats/node_modules/json-schema-traverse": {
4728 + "version": "1.0.0",
4729 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
4730 + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
4731 + },
4732 + "node_modules/ajv-keywords": {
4733 + "version": "3.5.2",
4734 + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
4735 + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
4736 + "peerDependencies": {
4737 + "ajv": "^6.9.1"
4738 + }
4739 + },
4740 + "node_modules/ansi-escapes": {
4741 + "version": "4.3.2",
4742 + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
4743 + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
4744 + "dependencies": {
4745 + "type-fest": "^0.21.3"
4746 + },
4747 + "engines": {
4748 + "node": ">=8"
4749 + },
4750 + "funding": {
4751 + "url": "https://github.com/sponsors/sindresorhus"
4752 + }
4753 + },
4754 + "node_modules/ansi-html-community": {
4755 + "version": "0.0.8",
4756 + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
4757 + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
4758 + "engines": [
4759 + "node >= 0.8.0"
4760 + ],
4761 + "bin": {
4762 + "ansi-html": "bin/ansi-html"
4763 + }
4764 + },
4765 + "node_modules/ansi-regex": {
4766 + "version": "5.0.1",
4767 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
4768 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
4769 + "engines": {
4770 + "node": ">=8"
4771 + }
4772 + },
4773 + "node_modules/ansi-styles": {
4774 + "version": "3.2.1",
4775 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
4776 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
4777 + "dependencies": {
4778 + "color-convert": "^1.9.0"
4779 + },
4780 + "engines": {
4781 + "node": ">=4"
4782 + }
4783 + },
4784 + "node_modules/anymatch": {
4785 + "version": "3.1.2",
4786 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
4787 + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
4788 + "dependencies": {
4789 + "normalize-path": "^3.0.0",
4790 + "picomatch": "^2.0.4"
4791 + },
4792 + "engines": {
4793 + "node": ">= 8"
4794 + }
4795 + },
4796 + "node_modules/arg": {
4797 + "version": "5.0.1",
4798 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
4799 + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA=="
4800 + },
4801 + "node_modules/argparse": {
4802 + "version": "1.0.10",
4803 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
4804 + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
4805 + "dependencies": {
4806 + "sprintf-js": "~1.0.2"
4807 + }
4808 + },
4809 + "node_modules/aria-query": {
4810 + "version": "4.2.2",
4811 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
4812 + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
4813 + "dependencies": {
4814 + "@babel/runtime": "^7.10.2",
4815 + "@babel/runtime-corejs3": "^7.10.2"
4816 + },
4817 + "engines": {
4818 + "node": ">=6.0"
4819 + }
4820 + },
4821 + "node_modules/array-flatten": {
4822 + "version": "2.1.2",
4823 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
4824 + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
4825 + },
4826 + "node_modules/array-includes": {
4827 + "version": "3.1.4",
4828 + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
4829 + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
4830 + "dependencies": {
4831 + "call-bind": "^1.0.2",
4832 + "define-properties": "^1.1.3",
4833 + "es-abstract": "^1.19.1",
4834 + "get-intrinsic": "^1.1.1",
4835 + "is-string": "^1.0.7"
4836 + },
4837 + "engines": {
4838 + "node": ">= 0.4"
4839 + },
4840 + "funding": {
4841 + "url": "https://github.com/sponsors/ljharb"
4842 + }
4843 + },
4844 + "node_modules/array-union": {
4845 + "version": "2.1.0",
4846 + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
4847 + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
4848 + "engines": {
4849 + "node": ">=8"
4850 + }
4851 + },
4852 + "node_modules/array.prototype.flat": {
4853 + "version": "1.2.5",
4854 + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
4855 + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
4856 + "dependencies": {
4857 + "call-bind": "^1.0.2",
4858 + "define-properties": "^1.1.3",
4859 + "es-abstract": "^1.19.0"
4860 + },
4861 + "engines": {
4862 + "node": ">= 0.4"
4863 + },
4864 + "funding": {
4865 + "url": "https://github.com/sponsors/ljharb"
4866 + }
4867 + },
4868 + "node_modules/array.prototype.flatmap": {
4869 + "version": "1.2.5",
4870 + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
4871 + "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
4872 + "dependencies": {
4873 + "call-bind": "^1.0.0",
4874 + "define-properties": "^1.1.3",
4875 + "es-abstract": "^1.19.0"
4876 + },
4877 + "engines": {
4878 + "node": ">= 0.4"
4879 + },
4880 + "funding": {
4881 + "url": "https://github.com/sponsors/ljharb"
4882 + }
4883 + },
4884 + "node_modules/asap": {
4885 + "version": "2.0.6",
4886 + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
4887 + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
4888 + },
4889 + "node_modules/ast-types-flow": {
4890 + "version": "0.0.7",
4891 + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
4892 + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
4893 + },
4894 + "node_modules/async": {
4895 + "version": "2.6.3",
4896 + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
4897 + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
4898 + "dependencies": {
4899 + "lodash": "^4.17.14"
4900 + }
4901 + },
4902 + "node_modules/asynckit": {
4903 + "version": "0.4.0",
4904 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
4905 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
4906 + },
4907 + "node_modules/at-least-node": {
4908 + "version": "1.0.0",
4909 + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
4910 + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
4911 + "engines": {
4912 + "node": ">= 4.0.0"
4913 + }
4914 + },
4915 + "node_modules/atob": {
4916 + "version": "2.1.2",
4917 + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
4918 + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
4919 + "bin": {
4920 + "atob": "bin/atob.js"
4921 + },
4922 + "engines": {
4923 + "node": ">= 4.5.0"
4924 + }
4925 + },
4926 + "node_modules/autoprefixer": {
4927 + "version": "10.4.2",
4928 + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
4929 + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
4930 + "dependencies": {
4931 + "browserslist": "^4.19.1",
4932 + "caniuse-lite": "^1.0.30001297",
4933 + "fraction.js": "^4.1.2",
4934 + "normalize-range": "^0.1.2",
4935 + "picocolors": "^1.0.0",
4936 + "postcss-value-parser": "^4.2.0"
4937 + },
4938 + "bin": {
4939 + "autoprefixer": "bin/autoprefixer"
4940 + },
4941 + "engines": {
4942 + "node": "^10 || ^12 || >=14"
4943 + },
4944 + "funding": {
4945 + "type": "opencollective",
4946 + "url": "https://opencollective.com/postcss/"
4947 + },
4948 + "peerDependencies": {
4949 + "postcss": "^8.1.0"
4950 + }
4951 + },
4952 + "node_modules/axe-core": {
4953 + "version": "4.3.5",
4954 + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz",
4955 + "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==",
4956 + "engines": {
4957 + "node": ">=4"
4958 + }
4959 + },
4960 + "node_modules/axobject-query": {
4961 + "version": "2.2.0",
4962 + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
4963 + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA=="
4964 + },
4965 + "node_modules/babel-jest": {
4966 + "version": "27.4.6",
4967 + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz",
4968 + "integrity": "sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg==",
4969 + "dependencies": {
4970 + "@jest/transform": "^27.4.6",
4971 + "@jest/types": "^27.4.2",
4972 + "@types/babel__core": "^7.1.14",
4973 + "babel-plugin-istanbul": "^6.1.1",
4974 + "babel-preset-jest": "^27.4.0",
4975 + "chalk": "^4.0.0",
4976 + "graceful-fs": "^4.2.4",
4977 + "slash": "^3.0.0"
4978 + },
4979 + "engines": {
4980 + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
4981 + },
4982 + "peerDependencies": {
4983 + "@babel/core": "^7.8.0"
4984 + }
4985 + },
4986 + "node_modules/babel-jest/node_modules/ansi-styles": {
4987 + "version": "4.3.0",
4988 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
4989 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
4990 + "dependencies": {
4991 + "color-convert": "^2.0.1"
4992 + },
4993 + "engines": {
4994 + "node": ">=8"
4995 + },
4996 + "funding": {
4997 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
4998 + }
4999 + },

This file is too large to show in full.

admin/package.json new
+54
@@ -0,0 +1,54 @@
1 +{
2 + "name": "admin",
3 + "version": "0.9.0",
4 + "private": true,
5 + "proxy": "http://localhost:63636",
6 + "scripts": {
7 + "start": "react-scripts start",
8 + "build": "cross-env GENERATE_SOURCEMAP=false BUILD_PATH='../dist/admin' react-scripts build",
9 + "test": "react-scripts test",
10 + "test-dep": "npm audit --production",
11 + "eject": "react-scripts eject"
12 + },
13 + "dependencies": {
14 + "@emotion/react": "^11.7.1",
15 + "@emotion/styled": "^11.6.0",
16 + "@mui/icons-material": "^5.3.0",
17 + "@mui/lab": "^5.0.0-alpha.66",
18 + "@mui/material": "^5.3.0",
19 + "@mui/styles": "^5.3.0",
20 + "@mui/x-data-grid": "^5.3.0",
21 + "@testing-library/jest-dom": "^5.16.1",
22 + "@testing-library/react": "^12.1.2",
23 + "@testing-library/user-event": "^13.5.0",
24 + "@types/jest": "^27.4.0",
25 + "@types/node": "^16.11.21",
26 + "@types/react": "^17.0.38",
27 + "@types/react-dom": "^17.0.11",
28 + "react": "^17.0.2",
29 + "react-dom": "^17.0.2",
30 + "react-router-dom": "^6.2.1",
31 + "react-scripts": "5.0.0",
32 + "typescript": "^4.5.5",
33 + "valtio": "^1.2.9",
34 + "web-vitals": "^2.1.4"
35 + },
36 + "eslintConfig": {
37 + "extends": [
38 + "react-app",
39 + "react-app/jest"
40 + ]
41 + },
42 + "browserslist": {
43 + "production": [
44 + ">0.2%",
45 + "not dead",
46 + "not op_mini all"
47 + ],
48 + "development": [
49 + "last 1 chrome version",
50 + "last 1 firefox version",
51 + "last 1 safari version"
52 + ]
53 + }
54 +}
admin/public/favicon.ico
Binary files /dev/null and b/admin/public/favicon.ico differ
admin/public/index.html new
+20
@@ -0,0 +1,20 @@
1 +<!DOCTYPE html>
2 +<html lang="en">
3 + <head>
4 + <meta charset="utf-8" />
5 + <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1" />
7 + <meta name="theme-color" content="#000000" />
8 + <meta
9 + name="description"
10 + content="Web site created using create-react-app"
11 + />
12 + <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
13 + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" />
14 + <title>HFS Admin</title>
15 + </head>
16 + <body>
17 + <noscript>You need to enable JavaScript to run this app.</noscript>
18 + <div id="root"></div>
19 + </body>
20 +</html>
admin/public/manifest.json new
+15
@@ -0,0 +1,15 @@
1 +{
2 + "short_name": "React App",
3 + "name": "Create React App Sample",
4 + "icons": [
5 + {
6 + "src": "favicon.ico",
7 + "sizes": "64x64 32x32 24x24 16x16",
8 + "type": "image/x-icon"
9 + }
10 + ],
11 + "start_url": ".",
12 + "display": "standalone",
13 + "theme_color": "#000000",
14 + "background_color": "#ffffff"
15 +}
admin/public/robots.txt new
+3
@@ -0,0 +1,3 @@
1 +# https://www.robotstxt.org/robotstxt.html
2 +User-agent: *
3 +Disallow:
admin/src/AccountsPage.ts new
+11
@@ -0,0 +1,11 @@
1 +import { isValidElement, createElement as h } from "react"
2 +import { useApiComp } from './api'
3 +
4 +export default function AccountsPage() {
5 + const [res] = useApiComp('get_usernames')
6 + if (isValidElement(res))
7 + return res
8 + return h('ul', {},
9 + res.list.map((x: string) =>
10 + h('li', { key: x }, x)))
11 +}
admin/src/App.test.tsx new
+9
@@ -0,0 +1,9 @@
1 +import React from 'react';
2 +import { render, screen } from '@testing-library/react';
3 +import App from './App';
4 +
5 +test('renders learn react link', () => {
6 + render(<App />);
7 + const linkElement = screen.getByText(/learn react/i);
8 + expect(linkElement).toBeInTheDocument();
9 +});
admin/src/App.ts new
+39
@@ -0,0 +1,39 @@
1 +import { createElement as h } from 'react';
2 +import { BrowserRouter, Routes, Route, useLocation } from 'react-router-dom';
3 +import MainMenu, { getMenuLabel, mainMenu } from './MainMenu';
4 +import { Box, Typography } from '@mui/material'
5 +import { Dialogs } from './dialog'
6 +
7 +function App() {
8 + return h(BrowserRouter, {}, h(Routed))
9 +}
10 +
11 +function Routed() {
12 + const loc = useLocation().pathname.slice(1)
13 + const current = mainMenu.find(x => x.path === loc)
14 + const title = current && getMenuLabel(current)
15 + return h(Box, { display: 'flex' },
16 + h(MainMenu, { current }),
17 + h(Box, {
18 + component: 'main',
19 + sx: {
20 + flexGrow: 1,
21 + height: 'calc(100vh - 1em)',
22 + overflow: 'auto',
23 + px: 3,
24 + pb: '1em',
25 + }
26 + },
27 + title && h(Typography, { variant:'h1', mb:2 }, title),
28 + h(Routes, {},
29 + mainMenu.map((it,idx) => {
30 + const element = it.comp ? h(it.comp) : h('div', {}, 'to be done')
31 + return h(Route, { key: idx, path: it.path, element })
32 + })
33 + )
34 + ),
35 + h(Dialogs)
36 + )
37 +}
38 +
39 +export default App
admin/src/ConfigPage.ts new
+77
@@ -0,0 +1,77 @@
1 +import { Button } from '@mui/material';
2 +import { createElement as h, isValidElement } from 'react';
3 +import { apiCall, useApiComp } from './api'
4 +import { state, useSnapState } from './state'
5 +import { Refresh } from '@mui/icons-material'
6 +import { Dict } from './misc'
7 +import { subscribeKey } from 'valtio/utils'
8 +import { Form, ServerPort, BoolField, NumberField, StringField } from './Form';
9 +import StringStringField from './StringStringField'
10 +
11 +let loaded: Dict | undefined
12 +
13 +subscribeKey(state, 'config', () => {
14 + const changes: Dict = {}
15 + if (state.config)
16 + for (const [k, v] of Object.entries(state.config))
17 + if (JSON.stringify(v) !== JSON.stringify(loaded?.[k]))
18 + changes[k] = v
19 + state.changes = changes
20 + console.debug('changes', Object.keys(changes))
21 +})
22 +
23 +export default function ConfigPage() {
24 + const [res, reload] = useApiComp('get_config', {
25 + omit: ['vfs', 'accounts']
26 + })
27 + let snap = useSnapState()
28 + if (isValidElement(res))
29 + return res
30 + const { changes } = snap
31 + const config = (loaded !== res) ? (state.config = loaded = res) : snap.config
32 + return h(Form, {
33 + sx: { maxWidth:'80em' },
34 + values: config,
35 + set(v, { k }) {
36 + if (v || config[k])
37 + state.config[k] = v
38 + },
39 + sticky: true,
40 + save: {
41 + onClick: save,
42 + disabled: !Object.keys(changes).length,
43 + },
44 + addToBar: [h(Button, {
45 + onClick: reload,
46 + startIcon: h(Refresh),
47 + }, 'Reload')],
48 + defaults({ comp }) {
49 + const shortField = comp === NumberField || comp === BoolField
50 + return { md: shortField ? 3 : 6 }
51 + },
52 + fields: [
53 + { k: 'port', comp: ServerPort, label:'HTTP port' },
54 + { k: 'https_port', comp: ServerPort, label: 'HTTPS port' },
55 + { k: 'cert', comp: StringField, label: 'HTTPS certificate file' },
56 + { k: 'private_key', comp: StringField, label: 'HTTPS private key file' },
57 + { k: 'max_kbps', comp: NumberField, label: 'Max KB/s' },
58 + { k: 'max_kbps_per_ip', comp: NumberField, label: 'Max KB/s per-ip' },
59 + { k: 'log', comp: StringField, label: 'Main log file' },
60 + { k: 'error_log', comp: StringField, label: 'Error log file' },
61 + { k: 'accounts', comp: StringField, label: 'Accounts file' },
62 + { k: 'open_browser_at_start', comp: BoolField },
63 + { k: 'zip_calculate_size_for_seconds', comp: NumberField, label: 'Calculate ZIP size for seconds' },
64 + { k: 'mime', comp: StringStringField,
65 + keyLabel: 'Files', keyWidth: 7,
66 + valueLabel: 'Mime type', valueWidth: 4
67 + },
68 + ]
69 + })
70 +
71 + async function save() {
72 + await apiCall('set_config', { values: state.changes })
73 + Object.assign(state.config, state.changes)
74 + Object.assign(loaded, state.config)
75 + console.debug('saved')
76 + }
77 +}
admin/src/FileCard.ts new
+75
@@ -0,0 +1,75 @@
1 +import { state, useSnapState } from './state'
2 +import { createElement as h, useEffect, useState } from 'react'
3 +import { Card, CardContent, List, ListItem, ListItemText } from '@mui/material'
4 +import { BoolField, DisplayField, Form } from './Form'
5 +import _ from 'lodash'
6 +import { apiCall } from './api'
7 +import { formatBytes, objSameKeys } from './misc'
8 +import { reloadVfs } from './VfsPage'
9 +import { alertDialog } from './dialog'
10 +import PermField from './PermField'
11 +
12 +export default function FileCard() {
13 + const { selectedFiles: files } = useSnapState()
14 + const file = files[0]
15 + if (!file)
16 + return null
17 + return h(Card, {},
18 + h(CardContent, {},
19 + files.length === 1 ? h(FileForm, { file })
20 + : h(List, {},
21 + files.length + ' selected',
22 + files.map(f => h(ListItem, { key: f.name },
23 + h(ListItemText, { primary: f.name, secondary: f.source }) )))
24 + ))
25 +}
26 +
27 +function FileForm({ file }:any) {
28 + file = _.omit(file, ['parent', 'children'])
29 + useEffect(() => setValues(file), [JSON.stringify(file)]) //eslint-disable-line
30 + const [values, setValues] = useState(file)
31 + const realFolder = file.source && file.type === 'folder'
32 + return h(Form, {
33 + values,
34 + set(v, { k }) {
35 + setValues({ ...values, [k]: v })
36 + },
37 + save: {
38 + disabled: isEqualLax(values, file),
39 + async onClick() {
40 + if (!values.name)
41 + return alertDialog(`Name cannot be empty`, 'warning')
42 + const props = objSameKeys(values, (v,k) =>
43 + v === file[k] ? undefined : v)
44 + delete props.source
45 + await apiCall('set_vfs', {
46 + uri: values.id,
47 + props,
48 + })
49 + if (props.name) // when the name changes, the id of the selected file is changing too, and we have to update it in the state if we want it to be correctly re-selected after reload
50 + state.selectedFiles[0].id = file.id.slice(0, -file.name.length) + props.name
51 + reloadVfs()
52 + }
53 + },
54 + fields: [
55 + { k: 'name' },
56 + { k: 'source', comp: DisplayField },
57 + realFolder && { k: 'hide', xl: values.hide ? 12: 6, label: "Hide elements read from the source" },
58 + realFolder && { k: 'remove', xl: values.hide ? 12: 6, label: "Remove/skip elements read from the source" },
59 + { k: 'size', comp: DisplayField, map: formatBytes },
60 + { k: 'ctime', comp: DisplayField, md: 6, label: 'Created', map: (x:string) => x && new Date(x).toLocaleString() },
61 + { k: 'mtime', comp: DisplayField, md: 6, label: 'Modified', map: (x:string) => x && new Date(x).toLocaleString() },
62 + { k: 'hidden', comp: BoolField, md: 6 },
63 + { k: 'forbid', comp: BoolField, md: 6 },
64 + { k: 'perm', comp: PermField, label: values.perm ? 'Access restricted' : 'Access not restricted' },
65 + { k: 'mime', lg: 6, label:"MIME type" },
66 + realFolder && { k: 'default', lg: 6, label:"File to serve instead of file list" },
67 + ]
68 + })
69 +}
70 +
71 +function isEqualLax(a: any,b: any): boolean {
72 + return a == b //eslint-disable-line
73 + || (a && b && typeof a === 'object' && typeof b === 'object'
74 + && Object.entries(a).every(([k,v]) => isEqualLax(v, b[k])) )
75 +}
admin/src/FilePicker.ts new
+110
@@ -0,0 +1,110 @@
1 +import { createElement as h, useEffect, useMemo, useState } from 'react'
2 +import { useApi, useApiEvents } from './api'
3 +import _ from 'lodash'
4 +import {
5 + Alert,
6 + Box,
7 + Button,
8 + Checkbox,
9 + ListItemIcon,
10 + ListItemText,
11 + MenuItem,
12 + MenuList,
13 + TextField,
14 + Typography
15 +} from '@mui/material'
16 +import { enforceFinal, formatBytes, isWindowsDrive, spinner } from './misc'
17 +import { ArrowUpward, Home } from '@mui/icons-material'
18 +import { StringField } from './Form'
19 +import { FileIcon, FolderIcon } from './VfsTree'
20 +
21 +export interface DirEntry { n:string, s?:number, m?:string, c?:string, k?:'d' }
22 +
23 +export default function FilePicker({ onSelect }: { onSelect:(v:string[])=>void }) {
24 + const [cwd, setCwd] = useState('')
25 + const [ready, setReady] = useState(false)
26 + const [gotCwd] = useApi('get_cwd')
27 + useEffect(() => {
28 + if (gotCwd) {
29 + setCwd(gotCwd.path)
30 + setReady(true)
31 + }
32 + }, [gotCwd])
33 + const { list, error, loading } = useApiEvents<DirEntry>(ready && 'ls', { path: cwd })
34 + useEffect(() => {
35 + setSel([])
36 + setFilter('')
37 + }, [cwd])
38 +
39 + const [sel, setSel] = useState<string[]>([])
40 + const [filter, setFilter] = useState('')
41 + const setFilterBounced = useMemo(() => _.debounce((x:string) => setFilter(x)), [])
42 + const filterMatch = useMemo(() => {
43 + const re = new RegExp(_.escapeRegExp(filter), 'i')
44 + return (v:string) => re.test(v)
45 + }, [filter])
46 + if (loading)
47 + return spinner()
48 + const pathDelimiter = /[:\\]/.test(cwd) ? '\\' : '/'
49 + return h(Box, { display: 'flex', flexDirection: 'column', gap: 2 },
50 + h(Box, { display:'flex', gap: 1 },
51 + h(Button, {
52 + variant: 'contained',
53 + disabled: !sel.length,
54 + sx: { minWidth: 'max-content' },
55 + onClick() {
56 + const cwdPostfixed = enforceFinal(pathDelimiter, cwd)
57 + onSelect(sel.map(x => cwdPostfixed + x))
58 + }
59 + }, `Select (${sel.length})`),
60 + h(Button, {
61 + onClick() {
62 + setCwd( isWindowsDrive(cwd) ? '' : cwd.slice(0, cwd.lastIndexOf(pathDelimiter)) )
63 + }
64 + }, h(ArrowUpward)),
65 + h(Button, {
66 + onClick() {
67 + setCwd('')
68 + }
69 + }, h(Home)),
70 + h(TextField, {
71 + value: filter,
72 + label: 'Filter results',
73 + onChange(ev) {
74 + setFilterBounced(ev.target.value)
75 + },
76 + sx: { minWidth: '20em' },
77 + fullWidth: true,
78 + }),
79 + ),
80 + h(StringField, {
81 + label: 'Current path',
82 + value: cwd,
83 + onChange: setCwd
84 + }),
85 + error ? h(Alert, { severity:'error' }, String(error))
86 + : !list.length ? h(Typography, { p:1 }, 'No elements in this folder')
87 + : h(MenuList, { sx:{ maxHeight: 'calc(100vh - 24em)', overflow:'auto' } },
88 + list.map((it:DirEntry) =>
89 + h(MenuItem, {
90 + key: it.n,
91 + sx: { display: filterMatch(it.n) ? undefined : 'none' },
92 + onClick(){
93 + const id = it.n
94 + const removed = sel.filter(x => x !== id)
95 + setSel(removed.length < sel.length ? removed : [...sel, id])
96 + },
97 + onDoubleClick(){
98 + setCwd( enforceFinal(pathDelimiter, cwd) + it.n )
99 + }
100 + },
101 + h(Checkbox, { checked: sel.includes(it.n) }),
102 + h(ListItemIcon, {}, h(it.k ? FolderIcon : FileIcon)),
103 + h(ListItemText, {}, it.n),
104 + it.k !== 'd' && it.s !== undefined && h(Typography, { variant:'body2', color:'text.secondary', ml:4 }, formatBytes(it.s) )
105 + )
106 + )
107 + )
108 + )
109 +}
110 +
admin/src/Form.ts new
+167
@@ -0,0 +1,167 @@
1 +import { createElement as h, isValidElement, ReactElement, useEffect, useState } from 'react'
2 +import { Box, Button, FormControlLabel, Grid, MenuItem, Switch, TextField } from '@mui/material'
3 +import { Dict } from './misc'
4 +import { Save } from '@mui/icons-material'
5 +import _ from 'lodash'
6 +
7 +interface FieldDescriptor { k:string, comp?: any, label?: string, [extraProp:string]:any }
8 +
9 +interface FormProps {
10 + fields: (FieldDescriptor | ReactElement | null | undefined | false)[]
11 + defaults?: (f:FieldDescriptor) => Dict | void
12 + values: Dict
13 + set: (v: any, field: FieldDescriptor) => void
14 + save?: Dict
15 + sticky?: boolean
16 + addToBar?: ReactElement[]
17 + [rest:string]: any,
18 +}
19 +export function Form({ fields, values, set, defaults, save, sticky, addToBar=[], ...rest }: FormProps) {
20 + return h(Box, rest,
21 + save && h(Box, {
22 + display: 'flex',
23 + gap: 2,
24 + sx: Object.assign({ mb: 4 }, sticky && { zIndex: 2, backgroundColor: 'background.paper', position: 'sticky', top: 0 })
25 + },
26 + h(Button, {
27 + variant: 'contained',
28 + startIcon: h(Save),
29 + ...save,
30 + }, 'Save'),
31 + ...addToBar,
32 + ),
33 + h(Grid, { container:true, rowSpacing:3, columnSpacing:1 },
34 + fields.map(row => {
35 + if (!row || isValidElement(row))
36 + return row
37 + let field = row
38 + const { k } = field
39 + field = {
40 + value: values?.[k],
41 + onChange(v:any) { set(v, field) },
42 + ...field,
43 + }
44 + if (!field.label)
45 + field.label = _.capitalize(k.replaceAll('_', ' '))
46 + Object.assign(field, defaults?.(field))
47 + const { xs=12, sm, md, lg, xl, comp=StringField, ...rest } = field
48 + return h(Grid, { key: k, item: true, xs, sm, md, lg, xl },
49 + h(comp, rest) )
50 + })
51 + )
52 + )
53 +}
54 +
55 +export interface FieldProps<T> {
56 + label?: string
57 + value?: T
58 + onChange: (v: T, more: { was?: T, event: any, [rest: string]: any }) => void
59 + [rest: string]: any
60 +}
61 +
62 +export type Field<T> = (props:FieldProps<T>) => ReactElement
63 +
64 +export function StringField({ value, onChange, ...props }: FieldProps<string>) {
65 + const [state, setState] = useState(() => value ?? '')
66 + useEffect(() => setState(() => value ?? ''),
67 + [value])
68 + return h(TextField, {
69 + fullWidth: true,
70 + ...props,
71 + value: state,
72 + InputLabelProps: state ? { shrink: true } : undefined,
73 + onChange(event) {
74 + setState(event.target.value)
75 + },
76 + onKeyDown(ev) {
77 + if (ev.key === 'Enter')
78 + go(ev)
79 + },
80 + onBlur: go
81 + })
82 +
83 + function go(event: any) {
84 + if (state !== value)
85 + onChange(state, {
86 + was: value,
87 + event,
88 + cancel() {
89 + setState(value ?? '')
90 + }
91 + })
92 + }
93 +}
94 +
95 +export function DisplayField({ map, value, empty='-', ...props }: any) {
96 + if (map)
97 + value = map(value)
98 + if (empty !== undefined && value !== 0 && !value)
99 + value = empty
100 + return h(StringField, { ...props, value, disabled: true })
101 +}
102 +
103 +interface SelectPair<T> { label: string, value:T }
104 +export function SelectField<T>({ value, onChange, options, ...props }: FieldProps<T> & { options:SelectPair<T>[] }) {
105 + return h(TextField, { // using TextField because Select is not display label correctly
106 + ...props,
107 + select: true,
108 + fullWidth: true,
109 + value: value === undefined ? '' : JSON.stringify(value),
110 + children: options.map((o,i) => {
111 + const obj = o && typeof o === 'object'
112 + const value = obj && 'value' in o ? o.value : o
113 + const label = obj && 'label' in o ? o.label : o
114 + return h(MenuItem, { key: i, value: JSON.stringify(value), children: label })
115 + }),
116 + onChange(event) {
117 + try {
118 + onChange(JSON.parse(event.target.value as string) as T, { was: value, event })
119 + }
120 + catch {}
121 + }
122 + })
123 +}
124 +
125 +export function NumberField({ value, onChange, ...props }: FieldProps<number | null>) {
126 + // @ts-ignore
127 + return h(StringField, {
128 + type: 'number',
129 + value: typeof value === 'number' ? String(value) : '',
130 + onChange(v, { was, ...rest }) {
131 + onChange(v ? Number(v) : null, { ...rest, was:was ? Number(was) : null })
132 + },
133 + ...props,
134 + })
135 +}
136 +
137 +export function BoolField({ label, value, onChange, ...props }: FieldProps<boolean>) {
138 + const [state, setState] = useState(() => value ?? false)
139 + useEffect(() => setState(() => value ?? false),
140 + [value])
141 + const control = h(Switch, {
142 + checked: state,
143 + ...props,
144 + onChange(event) {
145 + onChange(event.target.checked, { event, was: value })
146 + }
147 + })
148 + return label ? h(FormControlLabel, { label, control, labelPlacement: 'top' })
149 + : control
150 +}
151 +
152 +export function ServerPort({ label, value, onChange }: FieldProps<number | null>) {
153 + return h(Box, { display:'flex' },
154 + h(SelectField as Field<number>, {
155 + sx: { flexGrow: 1 },
156 + label,
157 + value: Math.min(1, value || 0),
158 + options: [
159 + { label: 'off', value: -1 },
160 + { label: 'automatic port', value: 0 },
161 + { label: 'choose port', value: 1 },
162 + ],
163 + onChange,
164 + }),
165 + value! > 0 && h(NumberField, { fullWidth: false, value, onChange }),
166 + )
167 +}
admin/src/MainMenu.ts new
+38
@@ -0,0 +1,38 @@
1 +import { createElement as h, FunctionComponent } from 'react';
2 +import { List, ListItemButton, ListItemIcon, ListItemText, Typography } from '@mui/material'
3 +import { AccountTree, ManageAccounts, Monitor, Settings, SvgIconComponent } from '@mui/icons-material'
4 +import _ from 'lodash'
5 +import { Link } from 'react-router-dom'
6 +import MonitorPage from './MonitorPage'
7 +import ConfigPage from './ConfigPage';
8 +import VfsPage from './VfsPage';
9 +import AccountsPage from './AccountsPage';
10 +
11 +interface MenuEntry { path:string, icon:SvgIconComponent, label?: string, comp?: FunctionComponent }
12 +export const mainMenu: MenuEntry[] = [
13 + { path: 'monitor', icon: Monitor, comp: MonitorPage },
14 + { path: 'configuration', icon: Settings, comp: ConfigPage },
15 + { path: 'vfs', icon: AccountTree, label: 'File System', comp: VfsPage },
16 + { path: 'accounts', icon: ManageAccounts, comp: AccountsPage },
17 +]
18 +
19 +interface MenuProps { current?:MenuEntry }
20 +export default function Menu({ current }: MenuProps) {
21 + return h(List, { sx:{ pr:1, bgcolor: 'primary.main', color:'primary.contrastText' } },
22 + h(Typography, { variant:'h4', sx:{ p:2 } }, 'HFS'),
23 + mainMenu.map(it =>
24 + h(ListItemButton, {
25 + key: it.path,
26 + sx: current===it ? { textDecoration: 'underline' } : undefined,
27 + //@ts-ignore
28 + component: Link, to: it.path,
29 + },
30 + it.icon && h(ListItemIcon, { sx:{ color: 'primary.contrastText' } }, h(it.icon)),
31 + h(ListItemText, { primary: getMenuLabel(it) })
32 + ) )
33 + )
34 +}
35 +
36 +export function getMenuLabel(it: MenuEntry) {
37 + return it && (it.label ?? _.capitalize(it.path))
38 +}
admin/src/MonitorPage.ts new
+34
@@ -0,0 +1,34 @@
1 +import _ from "lodash"
2 +import { isValidElement, createElement as h } from "react"
3 +import { useApiComp } from "./api"
4 +import { Refresh } from '@mui/icons-material'
5 +import { Button } from '@mui/material'
6 +
7 +export default function MonitorPage() {
8 + const [res, reload] = useApiComp('get_status')
9 + if (isValidElement(res))
10 + return res
11 + return h('div', {},
12 + h(Button, { onClick: reload, startIcon:h(Refresh) }, 'Reload'),
13 + h('ul', {},
14 + pair('started'),
15 + pair('http', 'HTTP', v => v.active ? 'port '+v.port : 'off'),
16 + pair('https', 'HTTPS', v => v.active ? 'port '+v.port : 'off'),
17 + )
18 + )
19 +
20 + function pair(k: string, label: string='', render?:(v:any) => string) {
21 + let v = _.get(res, k)
22 + if (v === undefined)
23 + return null
24 + if (typeof v === 'string' && isoDateRe.test(v))
25 + v = new Date(v).toLocaleString()
26 + if (render)
27 + v = render(v)
28 + if (!label)
29 + label = _.capitalize(k.replaceAll('_', ' '))
30 + return h('li', {}, label + ': ' + v)
31 + }
32 +}
33 +
34 +const isoDateRe = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/
admin/src/PermField.ts new
+78
@@ -0,0 +1,78 @@
1 +import { Dict } from './misc'
2 +import { createElement as h, Fragment, isValidElement, useState } from 'react'
3 +import { Button, Grid } from '@mui/material'
4 +import { Field, FieldProps, SelectField } from './Form'
5 +import _ from 'lodash'
6 +import { useApiComp } from './api'
7 +
8 +export default function PermField({ label, value, onChange }: FieldProps<Dict<string> | null> & { keyLabel:string }) {
9 + const [temp, setTemp] = useState<string|undefined>()
10 + const [res] = useApiComp('get_usernames')
11 + const usernames = res.list
12 +
13 + const permOptions = [{ label:'read', value:'r' }, { label:'none', value:'' }]
14 + const usernamesLeft = _.difference(usernames, Object.keys(value||{}))
15 +
16 + return h(Grid, { container: true },
17 + label && h(Grid, { item: true, xs: 12, pl: 2, py: 1, display: 'flex', alignItems: 'center', justifyContent: 'space-between' },
18 + label,
19 + !isValidElement(res) && h(Button, {
20 + onClick(event){
21 + setTemp(undefined)
22 + onChange(null, { event, was: value })
23 + }
24 + }, 'Clear')),
25 + isValidElement(res) ? res : h(Fragment, {},
26 + // existing entries
27 + Object.entries(value||{}).map(([username, perm]) => [
28 + h(Grid, { key:'k', item: true, xs: 6 },
29 + h(SelectField as Field<string>, {
30 + label: 'Username',
31 + options: usernames,
32 + value: username,
33 + onChange(v, { was, ...rest }){
34 + const copy: any = { ...value, [v]: value![was!] }
35 + delete copy[was!]
36 + onChange(copy, { was:value, ...rest })
37 + }
38 + })),
39 + h(Grid, { key:'v', item: true, xs: 6 },
40 + h(SelectField as Field<string>, {
41 + label: 'Access',
42 + options: permOptions,
43 + value: perm,
44 + onChange(v, { was, ...rest }){
45 + const copy = { ...value }
46 + if (v)
47 + copy[username] = v
48 + else
49 + delete copy[username]
50 + onChange( _.isEmpty(copy) ? null : copy, { was:value, ...rest })
51 + }
52 + })),
53 + ]),
54 + // row for new entries
55 + !usernamesLeft.length && h(Grid, { item: true, xs: 12, py: 1, px: 2, color:'text.secondary' }, "No accounts left"),
56 + usernamesLeft.length>0 && h(Grid, { item: true, xs: 6 },
57 + h(SelectField as Field<string>, {
58 + label: value ? "Add access to" : "Restrict access to ",
59 + value: temp,
60 + options: usernamesLeft,
61 + onChange: setTemp
62 + })),
63 + usernamesLeft.length>0 && h(Grid, { item: true, xs: 6 },
64 + h(SelectField as Field<string>, {
65 + value: undefined,
66 + label: temp && "Select access type",
67 + disabled: !temp,
68 + options: permOptions,
69 + onChange(v, rest) {
70 + if (v)
71 + onChange({ ...value, [temp!]: v }, { ...rest, was: value })
72 + setTemp(undefined)
73 + }
74 + }))
75 + )
76 + )
77 +}
78 +
admin/src/StringStringField.ts new
+92
@@ -0,0 +1,92 @@
1 +import { makeStyles } from '@mui/styles'
2 +import { Dict } from './misc'
3 +import { createElement as h, useEffect, useRef } from 'react'
4 +import { Grid, IconButton, TextField } from '@mui/material'
5 +import { Add, Delete } from '@mui/icons-material'
6 +import { FieldProps, StringField } from './Form'
7 +
8 +const useStyles = makeStyles({
9 + tableHeader: {
10 + padding: '.5em 1em',
11 + fontWeight: 'bold',
12 + },
13 + actions: {
14 + display: 'flex',
15 + }
16 +})
17 +
18 +export default function StringStringField({ value, onChange, keyLabel='key', valueLabel='value', keyWidth=5, valueWidth=5, actionsWidth=1 }: FieldProps<Dict<string>> & { keyLabel:string }) {
19 + const refNew = useRef()
20 + const justEntered = useRef<any>()
21 + useEffect(() => justEntered.current?.focus?.(),
22 + [justEntered.current]) //eslint-disable-line
23 + const styles = useStyles()
24 + return h(Grid, { container: true },
25 + // header
26 + h(Grid, { item: true, xs:keyWidth, className: styles.tableHeader }, keyLabel),
27 + h(Grid, { item: true, xs:valueWidth, className: styles.tableHeader }, valueLabel),
28 + h(Grid, { item: true, xs:actionsWidth },
29 + h(IconButton, {
30 + onClick() { // @ts-ignore
31 + refNew.current.focus()
32 + }
33 + }, h(Add))),
34 + // existing entries
35 + Object.entries(value||{}).map(([id,v]) => [
36 + h(Grid, { key:'k', item: true, xs: keyWidth, },
37 + h(StringField, {
38 + value: id,
39 + onChange(v, { was, ...rest }){
40 + const copy = { ...value }
41 + if (v)
42 + copy[v] = was !== undefined ? copy[was] : ''
43 + if (was !== undefined)
44 + delete copy[was]
45 + onChange(copy, { was:value, ...rest })
46 + }
47 + })),
48 + h(Grid, { key:'v', item: true, xs: valueWidth, },
49 + h(StringField, {
50 + inputRef: justEntered.current === id ? justEntered : undefined,
51 + value: v,
52 + onChange(v, { was, ...rest }){
53 + const copy = { ...value }
54 + if (v)
55 + copy[id] = v
56 + else
57 + delete copy[id]
58 + onChange(copy, { was:value, ...rest })
59 + }
60 + })),
61 + h(Grid, { key:'actions', item: true, xs: actionsWidth, className: styles.actions },
62 + h(IconButton, {
63 + onClick(event){
64 + const copy = { ...value }
65 + delete copy[id]
66 + onChange(copy, { was:value, event })
67 + }
68 + }, h(Delete)))
69 + ]),
70 + // empty row for adding
71 + h(Grid, { item: true, xs: keyWidth, },
72 + h(StringField, {
73 + inputRef: refNew,
74 + value: '',
75 + onChange(v, more){
76 + if (!v) return
77 + more.cancel()
78 + if (value && v in value)
79 + return alert(keyLabel + " entry already present")
80 + justEntered.current = v
81 + onChange({ ...value, [v]:'' }, { ...more, was:value })
82 + }
83 + })),
84 + h(Grid, { item: true, xs: valueWidth, },
85 + h(TextField, {
86 + onFocus() { //@ts-ignore
87 + setTimeout(()=> refNew.current.focus()) // without setTimeout TextField component is in an inconsistent focus-state
88 + }
89 + })),
90 + )
91 +}
92 +
admin/src/VfsMenuBar.ts new
+46
@@ -0,0 +1,46 @@
1 +import { state, useSnapState } from './state'
2 +import { createElement as h } from 'react'
3 +import { Box, Button } from '@mui/material'
4 +import { Add, Delete, Refresh } from '@mui/icons-material'
5 +import { alertDialog, confirmDialog } from './dialog'
6 +import { apiCall } from './api'
7 +import { reloadVfs } from './VfsPage'
8 +import addFiles from './addFiles'
9 +
10 +export default function VfsMenuBar() {
11 + const { selectedFiles } = useSnapState()
12 + return h(Box, {
13 + display: 'flex',
14 + gap: 2,
15 + mb: 2,
16 + sx: {
17 + position: 'sticky',
18 + top: 0,
19 + zIndex: 2,
20 + backgroundColor: 'background.paper',
21 + },
22 + },
23 + h(Button, { variant:'contained', onClick: addFiles, startIcon: h(Add) }, 'Add'),
24 + h(Button, { onClick: removeFiles, disabled: !selectedFiles.length, startIcon: h(Delete) }, 'Remove'),
25 + h(Button, { onClick: reloadVfs, startIcon: h(Refresh) }, 'Reload'),
26 + )
27 +}
28 +
29 +async function removeFiles() {
30 + const f = state.selectedFiles
31 + if (!f.length) return
32 + if (await confirmDialog(`Remove ${f.length} item(s)?`)) {
33 + try {
34 + const uris = f.map(x => x.id)
35 + const { errors } = await apiCall('del_vfs', { uris })
36 + const urisThatFailed = uris.filter((uri, idx) => errors[idx])
37 + if (urisThatFailed.length)
38 + return alertDialog("Following elements couldn't be removed: " + urisThatFailed.join(', '), 'error')
39 + reloadVfs()
40 + }
41 + catch(e) {
42 + await alertDialog(e as Error)
43 + }
44 + }
45 +
46 +}
admin/src/VfsPage.ts new
+67
@@ -0,0 +1,67 @@
1 +import { createElement as h, isValidElement, useEffect, useMemo, useState } from 'react'
2 +import { useApiComp } from './api'
3 +import { Grid } from '@mui/material'
4 +import { state, useSnapState } from './state'
5 +import FileCard from './FileCard'
6 +import VfsMenuBar from './VfsMenuBar'
7 +import VfsTree from './VfsTree'
8 +
9 +export default function VfsPage() {
10 + const [id2node] = useState(() => new Map<string, Node>())
11 + const snap = useSnapState()
12 + const [res, reload] = useApiComp('get_vfs')
13 + useMemo(() => snap.vfs || reload(), [snap.vfs, reload])
14 + useEffect(() => {
15 + state.vfs = undefined
16 + if (!res) return
17 + // rebuild id2node
18 + id2node.clear()
19 + const { root } = res
20 + if (!root) return
21 + recur(root) // this must be done before state change that would cause Tree to render and expecting id2node
22 + state.vfs = root
23 + // refresh objects of selectedFiles
24 + const ids = state.selectedFiles.map(x => x.id)
25 + state.selectedFiles = ids.map(id =>
26 + id2node.get(id)).filter(Boolean) as Node[] // ts doesn't understand that filter(Boolean) removes undefined-s
27 +
28 + // calculate id and parent fields, and builds the map id2node
29 + function recur(node: Node, prefix='', parent: Node|undefined=undefined) {
30 + node.parent = parent
31 + node.id = prefix + node.name || '/' // root
32 + id2node.set(node.id, node)
33 + if (!node.children) return
34 + for (const n of node.children)
35 + recur(n, (prefix && node.id) + '/', node)
36 + }
37 +
38 + }, [res, id2node])
39 + if (isValidElement(res)) {
40 + id2node.clear()
41 + return res
42 + }
43 + return h(Grid, { container:true },
44 + h(Grid, { item:true, lg: 7 },
45 + h(VfsMenuBar),
46 + snap.vfs && h(VfsTree, { id2node })),
47 + h(Grid, { item:true, lg: 5 },
48 + h(FileCard)))
49 +}
50 +
51 +export function reloadVfs() {
52 + state.vfs = undefined
53 +}
54 +
55 +export type Node = {
56 + id: string
57 + name: string
58 + type?: 'folder'
59 + source?: string
60 + size?: number
61 + ctime?: string
62 + mtime?: string
63 + children?: Node[]
64 + parent?: Node
65 + hidden?: boolean
66 + perm?: any
67 +}
admin/src/VfsTree.ts new
+87
@@ -0,0 +1,87 @@
1 +import { makeStyles } from '@mui/styles'
2 +import { state, useSnapState } from './state'
3 +import { createElement as h, ReactElement, useState } from 'react'
4 +import { TreeItem, TreeView } from '@mui/lab'
5 +import {
6 + ChevronRight,
7 + ExpandMore,
8 + Folder,
9 + Home,
10 + InsertDriveFileOutlined,
11 + Lock,
12 + RemoveRedEye
13 +} from '@mui/icons-material'
14 +import { Node } from './VfsPage'
15 +import { isWindowsDrive } from './misc'
16 +
17 +export const FolderIcon = Folder
18 +export const FileIcon = InsertDriveFileOutlined
19 +
20 +const useStyles = makeStyles({
21 + label: {
22 + display: 'flex',
23 + gap: '.5em',
24 + lineHeight: '2em',
25 + alignItems: 'center',
26 + },
27 + path: {
28 + opacity: .4,
29 + }
30 +})
31 +
32 +export default function VfsTree({ id2node }:{ id2node: Map<string, Node> }) {
33 + const { vfs, selectedFiles } = useSnapState()
34 + const [selected, setSelected] = useState<string[]>(selectedFiles.map(x => x.id)) // try to restore selection after reload
35 + const [expanded, setExpanded] = useState(Array.from(id2node.keys()))
36 + const styles = useStyles()
37 + if (!vfs)
38 + return null
39 + return h(TreeView, {
40 + expanded,
41 + selected,
42 + multiSelect: true,
43 + onNodeSelect(ev, ids) {
44 + setSelected(ids)
45 + state.selectedFiles = ids.map(id => id2node.get(id)).filter(Boolean) as Node[] // ts doesn't understand that filter(Boolean) removes undefined-s
46 + }
47 + }, recur(vfs as Readonly<Node>))
48 +
49 + function recur(node: Readonly<Node>): ReactElement {
50 + let { id, name, source } = node
51 + if (!id)
52 + debugger
53 + const folder = node.type === 'folder'
54 + if (folder && !isWindowsDrive(source) && source === name) // we need a way to show that the name we are displaying is a source in this ambiguous case, so we add a redundant ./
55 + source = './' + source
56 + return h(TreeItem, {
57 + label: !name ? h(Home)
58 + : h('div', { className: styles.label },
59 + h(folder ? FolderIcon : FileIcon),
60 + node.hidden && h(RemoveRedEye),
61 + node.perm && h(Lock),
62 + !source?.endsWith(name) ? name
63 + : h('span', {},
64 + h('span', { className:styles.path }, source.slice(0,-name.length)),
65 + h('span', {}, source.slice(-name.length)),
66 + )
67 + ),
68 + key: name,
69 + collapseIcon: h(ExpandMore, {
70 + onClick(ev) {
71 + setExpanded( expanded.filter(x => x !== id) )
72 + ev.preventDefault()
73 + ev.stopPropagation()
74 + }
75 + }),
76 + expandIcon: h(ChevronRight, {
77 + onClick(ev) {
78 + setExpanded( [...expanded, id] )
79 + ev.preventDefault()
80 + ev.stopPropagation()
81 + }
82 + }),
83 + nodeId: id
84 + }, node.children?.map(recur))
85 + }
86 +
87 +}
admin/src/addFiles.ts new
+38
@@ -0,0 +1,38 @@
1 +import { alertDialog, newDialog } from './dialog'
2 +import { createElement as h } from 'react'
3 +import { Box } from '@mui/material'
4 +import { Node, reloadVfs } from './VfsPage'
5 +import { state } from './state'
6 +import { apiCall } from './api'
7 +import FilePicker from './FilePicker'
8 +
9 +export default function addFiles() {
10 + const close = newDialog({
11 + title: 'Add files or folders',
12 + dialogProps: { sx:{ minWidth:'min(90vw, 40em)', minHeight: '70vh' } },
13 + Content,
14 + })
15 +
16 + function Content() {
17 + let f: Node | undefined = state.selectedFiles[0]
18 + if (f && f.type !== 'folder')
19 + f = f.parent
20 + const under = f?.id
21 + return h('div', {},
22 + h(Box, { sx:{ typography: 'body1', px: 1, py: 2 } }, "Selected elements will be added to " + (under || '(home)')),
23 + h(FilePicker, {
24 + async onSelect(sel) {
25 + let failed = await Promise.all(sel.map(source =>
26 + apiCall('add_vfs', { under, source }).then(() => '', () => source) ))
27 + failed = failed.filter(Boolean)
28 + if (failed.length)
29 + await alertDialog('Some elements have been rejected: '+failed.join(', '), 'error')
30 + reloadVfs()
31 + close()
32 + }
33 + })
34 + )
35 + }
36 +
37 +}
38 +
admin/src/api.ts new
+124
@@ -0,0 +1,124 @@
1 +import { createElement as h, useEffect, useMemo, useState } from 'react'
2 +import { Dict, Falsy, getCookie, spinner } from './misc'
3 +import { Alert } from '@mui/material'
4 +
5 +export function useApiComp(...args: any[]): ReturnType<typeof useApi> {
6 + // @ts-ignore
7 + const [res, reload] = useApi(...args)
8 + return useMemo(() =>
9 + res === undefined ? [spinner(), reload]
10 + : res && res instanceof Error ? [h(Alert, { severity: 'error' }, String(res)), reload]
11 + : [res, reload],
12 + [res])
13 +}
14 +
15 +const PREFIX = '/~/api/'
16 +
17 +export function apiCall(cmd: string, params?: Dict) : Promise<any> {
18 + params = addCsrf(params)
19 + return fetch(PREFIX+cmd, {
20 + method: 'POST',
21 + headers: { 'content-type': 'application/json' },
22 + body: params && JSON.stringify(params),
23 + }).then(res => {
24 + if (res.ok)
25 + return res.json().then(json => {
26 + console.debug('API', cmd, params, '>>', json)
27 + return json
28 + })
29 + const msg = 'Failed API ' + cmd
30 + console.warn(msg + (params ? ' ' + JSON.stringify(params) : ''))
31 + throw new ApiError(res.status, msg)
32 + }, err => {
33 + throw err
34 + })
35 +}
36 +
37 +export class ApiError extends Error {
38 + constructor(readonly code:number, message: string) {
39 + super(message);
40 + }
41 +}
42 +
43 +export function useApi(cmd: string | Falsy, params?: object) : [any, ()=>void] {
44 + const [ret, setRet] = useState()
45 + const [forcer, setForcer] = useState(0)
46 + const [state] = useState({ loading: false })
47 + useEffect(()=>{
48 + setRet(undefined)
49 + if (!cmd) return
50 + state.loading = true
51 + apiCall(cmd, params)
52 + .then(setRet, setRet)
53 + .finally(()=> state.loading = false)
54 + }, [cmd, JSON.stringify(params), forcer]) //eslint-disable-line
55 + return [ret, ()=> state.loading || setForcer(v => v+1)]
56 +}
57 +
58 +type EventHandler = (type:string, data?:any) => void
59 +
60 +export function apiEvents(cmd: string, params: Dict, cb:EventHandler) {
61 + const processed: Record<string,string> = {}
62 + for (const k in params) {
63 + const v = params[k]
64 + if (v === undefined) continue
65 + processed[k] = v === true ? '1' : v
66 + }
67 + const source = new EventSource(PREFIX + cmd + '?' + new URLSearchParams(addCsrf(processed)))
68 + source.onopen = () => cb('connected')
69 + source.onerror = err => cb('error', err)
70 + source.onmessage = ({ data }) => {
71 + if (!data) {
72 + cb('closed')
73 + return source.close()
74 + }
75 + try { data = JSON.parse(data) }
76 + catch {
77 + return cb('string', data)
78 + }
79 + cb('msg', data)
80 + }
81 + return source
82 +}
83 +
84 +function addCsrf(params?: Dict) {
85 + return { csrf: getCookie('csrf'), ...params }
86 +}
87 +
88 +export function useApiEvents<Record>(cmd:string|Falsy, params: Dict={}) {
89 + const [list, setList] = useState<Record[]>([])
90 + const [error, setError] = useState<any>()
91 + const [loading, setLoading] = useState(false)
92 + useEffect(() => {
93 + if (!cmd) return
94 + const buffer: Record[] = []
95 + const flush = () => {
96 + const chunk = buffer.splice(0, Infinity)
97 + if (chunk.length)
98 + setList(list => [ ...list, ...chunk ])
99 + }
100 + setLoading(true)
101 + setList([])
102 + const timer = setInterval(flush, 1000)
103 + const src = apiEvents(cmd, params, (type, data) => {
104 + switch (type) {
105 + case 'error':
106 + setError(JSON.stringify(data))
107 + return stop()
108 + case 'closed':
109 + flush()
110 + return stop()
111 + case 'msg':
112 + if (src?.readyState === src?.CLOSED)
113 + return stop()
114 + buffer.push(data.entry)
115 + }
116 + })
117 +
118 + function stop() {
119 + setLoading(false)
120 + clearInterval(timer)
121 + }
122 + }, [cmd, JSON.stringify(params)])
123 + return { list, loading, error }
124 +}
admin/src/dialog.ts new
+116
@@ -0,0 +1,116 @@
1 +import { Button, Dialog as MuiDialog, DialogContent, DialogTitle } from '@mui/material'
2 +import { createElement as h, Fragment, FunctionComponent, ReactElement, ReactNode, useEffect, useRef } from 'react'
3 +import { proxy, useSnapshot } from 'valtio'
4 +
5 +interface DialogOptions {
6 + Content: FunctionComponent,
7 + closable?: boolean,
8 + onClose?: (v?:any)=> any,
9 + className?: string,
10 + icon?: string | FunctionComponent,
11 + closableContent?: string | ReactNode,
12 + reserveClosing?: true
13 + noFrame?: boolean
14 + title?: string
15 + padding?: boolean
16 + dialogProps?: Record<string, any>,
17 +}
18 +
19 +const dialogs = proxy<DialogOptions[]>([])
20 +
21 +export const dialogsDefaults = {
22 + closableContent: 'x',
23 + padding: true,
24 +}
25 +
26 +export function Dialogs() {
27 + const snap = useSnapshot(dialogs)
28 + return h(Fragment, {},
29 + snap.length > 0 && snap.map((d,i) =>
30 + h(Dialog, { key:i, ...d })))
31 +}
32 +
33 +function Dialog(d:DialogOptions) {
34 + useEffect(()=>{
35 + ref.current?.focus()
36 + }, [])
37 + const ref = useRef<HTMLElement>()
38 + d = { ...dialogsDefaults, ...d }
39 + const p = d.padding ? 2 : 0
40 + return h(MuiDialog, {
41 + open: true,
42 + maxWidth: 'lg',
43 + onClose: ()=> closeDialog(),
44 + },
45 + d.title && h(DialogTitle, {}, d.title),
46 + h(DialogContent, {
47 + ...d.dialogProps,
48 + sx:{ ...d.dialogProps?.sx, px: p, pb: p }
49 + }, h(d.Content) )
50 + )
51 +}
52 +
53 +export function newDialog(options: DialogOptions) {
54 + const $id = Math.random()
55 + ;(options as any).$id = $id // object identity is not working because of the proxy. This is a possible workaround
56 + dialogs.push(options)
57 + return (v?:any) => {
58 + const i = dialogs.findIndex(x => (x as any).$id === $id)
59 + if (i < 0) return
60 + dialogs.splice(i,1)
61 + options.onClose?.(v)
62 + }
63 +}
64 +
65 +export function closeDialog(v?:any) {
66 + let i = dialogs.length
67 + while (i--) {
68 + const d = dialogs[i]
69 + if (d.reserveClosing)
70 + continue
71 + dialogs.splice(i,1)
72 + d.onClose?.(v)
73 + }
74 +}
75 +
76 +type AlertType = 'error' | 'warning' | 'info'
77 +
78 +export async function alertDialog(msg: ReactElement | string | Error, type:AlertType='info') {
79 + if (msg instanceof Error) {
80 + msg = String(msg)
81 + type = 'error'
82 + }
83 + return new Promise(resolve => newDialog({
84 + className: 'dialog-alert-'+type,
85 + icon: '!',
86 + onClose: resolve,
87 + Content
88 + }))
89 +
90 + function Content(){
91 + if (typeof msg === 'string' || msg instanceof Error)
92 + msg = h('p', {}, String(msg))
93 + return msg
94 + }
95 +}
96 +
97 +interface ConfirmOptions { href?: string }
98 +export async function confirmDialog(msg: string, { href }: ConfirmOptions={}) : Promise<boolean> {
99 + return new Promise(resolve => newDialog({
100 + className: 'dialog-confirm',
101 + icon: '?',
102 + onClose: resolve,
103 + Content
104 + }) )
105 +
106 + function Content() {
107 + return h('div', {},
108 + h('p', {}, msg),
109 + h('a', {
110 + href,
111 + onClick: () => closeDialog(true),
112 + }, h(Button, {}, 'Confirm'))
113 + )
114 + }
115 +}
116 +
admin/src/index.css new
+13
@@ -0,0 +1,13 @@
1 +body {
2 + margin: 0;
3 + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 + sans-serif;
6 + -webkit-font-smoothing: antialiased;
7 + -moz-osx-font-smoothing: grayscale;
8 +}
9 +
10 +code {
11 + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 + monospace;
13 +}
admin/src/index.tsx new
+17
@@ -0,0 +1,17 @@
1 +import React from 'react';
2 +import ReactDOM from 'react-dom';
3 +import './index.css';
4 +import App from './App';
5 +import reportWebVitals from './reportWebVitals';
6 +
7 +ReactDOM.render(
8 + <React.StrictMode>
9 + <App />
10 + </React.StrictMode>,
11 + document.getElementById('root')
12 +);
13 +
14 +// If you want to start measuring performance in your app, pass a function
15 +// to log results (for example: reportWebVitals(console.log))
16 +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 +reportWebVitals();
admin/src/logo.svg new
+1
@@ -0,0 +1 @@
1 +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>
admin/src/misc.ts new
+66
@@ -0,0 +1,66 @@
1 +import { createElement as h, useRef } from 'react'
2 +import { CircularProgress } from '@mui/material'
3 +
4 +export type Dict<T = any> = Record<string, T>
5 +export type Falsy = false | null | undefined | '' | 0
6 +
7 +export function spinner() {
8 + return h(CircularProgress)
9 +}
10 +
11 +export function getCookie(name: string) {
12 + const pre = name + '='
13 + let decodedCookie = decodeURIComponent(document.cookie)
14 + let ca = decodedCookie.split(';')
15 + for (let c of ca) {
16 + c = c.trim()
17 + if (c.startsWith(pre))
18 + return c.substring(pre.length, c.length)
19 + }
20 + return ''
21 +}
22 +
23 +export function usePrevious(value: any) {
24 + const ref = useRef(value)
25 + const ret = ref.current
26 + ref.current = value
27 + return ret
28 +}
29 +
30 +export function getOrSet<T>(o:any, k:string, creator:()=>T): T {
31 + return k in o ? o[k]
32 + : (o[k] = creator())
33 +}
34 +
35 +export function formatBytes(n: number, post: string = 'B') {
36 + if (isNaN(Number(n)) || n < 0)
37 + return ''
38 + let x = ['', 'K', 'M', 'G', 'T']
39 + let prevMul = 1
40 + let mul = 1024
41 + let i = 0
42 + while (i < x.length && n > mul) {
43 + prevMul = mul
44 + mul *= 1024
45 + ++i
46 + }
47 + n /= prevMul
48 + return round(n, 1) + ' ' + (x[i]||'') + post
49 +} // formatBytes
50 +
51 +export function round(v: number, decimals: number = 0) {
52 + decimals = Math.pow(10, decimals)
53 + return Math.round(v * decimals) / decimals
54 +} // round
55 +
56 +export function objSameKeys<T,R>(src: Record<string,T>, newValue:(value:T,key:string)=>R) {
57 + return Object.fromEntries(Object.entries(src).map(([k,v]) => [k, newValue(v,k)]))
58 +}
59 +
60 +export function enforceFinal(sub:string, s:string) {
61 + return !s || s.endsWith(sub) ? s : s+sub
62 +}
63 +
64 +export function isWindowsDrive(s?: string) {
65 + return s && /^[a-zA-Z]:$/.test(s)
66 +}
admin/src/react-app-env.d.ts new
+1
@@ -0,0 +1 @@
1 +/// <reference types="react-scripts" />
admin/src/reportWebVitals.ts new
+15
@@ -0,0 +1,15 @@
1 +import { ReportHandler } from 'web-vitals';
2 +
3 +const reportWebVitals = (onPerfEntry?: ReportHandler) => {
4 + if (onPerfEntry && onPerfEntry instanceof Function) {
5 + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
6 + getCLS(onPerfEntry);
7 + getFID(onPerfEntry);
8 + getFCP(onPerfEntry);
9 + getLCP(onPerfEntry);
10 + getTTFB(onPerfEntry);
11 + });
12 + }
13 +};
14 +
15 +export default reportWebVitals;
admin/src/setupTests.ts new
+5
@@ -0,0 +1,5 @@
1 +// jest-dom adds custom jest matchers for asserting on DOM nodes.
2 +// allows you to do things like:
3 +// expect(element).toHaveTextContent(/react/i)
4 +// learn more: https://github.com/testing-library/jest-dom
5 +import '@testing-library/jest-dom';
admin/src/state.ts new
+21
@@ -0,0 +1,21 @@
1 +import { proxy, useSnapshot } from 'valtio'
2 +import { Dict } from './misc'
3 +import { Node } from './VfsPage'
4 +
5 +export const state = proxy<{
6 + title: string
7 + config: Dict
8 + changes: Dict
9 + vfs: Node | undefined
10 + selectedFiles: Node[]
11 +}>({
12 + title: '',
13 + config: {},
14 + changes: {},
15 + selectedFiles: [],
16 + vfs: undefined,
17 +})
18 +
19 +export function useSnapState() {
20 + return useSnapshot(state)
21 +}
admin/tsconfig.json new
+26
@@ -0,0 +1,26 @@
1 +{
2 + "compilerOptions": {
3 + "target": "es5",
4 + "lib": [
5 + "dom",
6 + "dom.iterable",
7 + "esnext"
8 + ],
9 + "allowJs": true,
10 + "skipLibCheck": true,
11 + "esModuleInterop": true,
12 + "allowSyntheticDefaultImports": true,
13 + "strict": true,
14 + "forceConsistentCasingInFileNames": true,
15 + "noFallthroughCasesInSwitch": true,
16 + "module": "esnext",
17 + "moduleResolution": "node",
18 + "resolveJsonModule": true,
19 + "isolatedModules": true,
20 + "noEmit": true,
21 + "jsx": "react-jsx"
22 + },
23 + "include": [
24 + "src"
25 + ]
26 +}
dev-guidelines.md
+8
@@ -1,3 +1,11 @@
1 - All objects that go in yaml should use snake_case.
2 - Reason: we want something that is both easy for the user and maps directly in our code.
3 Spaces and kebab-case don't play well with javascript and camel is less readable for the user.
4 +
5 +# Project design
6 +- At the moment the admin interface was designed to be completely separated from the normal frontend for the following reasons
7 + - heavy separation improves security, as it's more unlikely for a bug in the frontend to expose admin commands
8 + - people interested in building a new frontend won't have to deal with the complexity and features of the admin interface
9 + - it's easier to keep the frontend smaller for faster load
10 +
11 + Of course this comes with a price to pay on the programmer's side, more work to do.
package-lock.json
+2 -2
@@ -1,12 +1,12 @@
1 {
2 "name": "hfs",
3 - "version": "0.8.1",
3 + "version": "0.9.0",
4 "lockfileVersion": 2,
5 "requires": true,
6 "packages": {
7 "": {
8 "name": "hfs",
9 - "version": "0.8.1",
9 + "version": "0.9.0",
10 "license": "GPL-3.0",
11 "dependencies": {
12 "@koa/router": "^10.1.1",
package.json
+2 -1
@@ -1,6 +1,6 @@
1 {
2 "name": "hfs",
3 - "version": "0.8.2",
3 + "version": "0.9.0",
4 "description": "HTTP File Server",
5 "keywords": [
6 "file server",
@@ -12,6 +12,7 @@
12 "scripts": {
13 "watch-server": "nodemon --ignore tests/ --watch src -e ts,tsx --exec ts-node src/index.ts",
14 "start-frontend": "cd frontend && npm run start",
15 + "start-admin": "cd admin && npm run start",
16 "start": "node dist",
17 "build": "npm install && tsc --target es2018 && cp -v -r package*.json READ* plugins tests dist && cp config.yaml dist/config-example.yaml && cp accounts.yaml dist/accounts-example.yaml && cd dist && npm ci --production && cd .. && node afterbuild",
18 "build-all": "rm -rf dist && npm run build && cd frontend && npm install && npm run build && npm audit --production && echo COMPLETED",
src/adminApis.ts new
+47
@@ -0,0 +1,47 @@
1 +import { ApiHandlers } from './apis'
2 +import { getWholeConfig, setConfig } from './config'
3 +import { getStatus } from './listen'
4 +import { HFS_STARTED } from './index'
5 +import { Server } from 'http'
6 +import vfsApis from './api.vfs'
7 +import { getAccounts } from './perm'
8 +
9 +export const adminApis: ApiHandlers = {
10 +
11 + ...vfsApis,
12 +
13 + async set_config({ values }) {
14 + if (values)
15 + setConfig(values, true)
16 + return {}
17 + },
18 +
19 + get_config(params) {
20 + return getWholeConfig(params)
21 + },
22 +
23 + get_usernames() {
24 + return { list: Object.keys(getAccounts()) }
25 + },
26 +
27 + async get_status() {
28 + const st = getStatus()
29 + return {
30 + started: HFS_STARTED,
31 + http: serverStatus(st.httpSrv),
32 + https: serverStatus(st.httpsSrv),
33 + }
34 +
35 + function serverStatus(h: Server) {
36 + return {
37 + active: h.listening,
38 + port: getPort(h),
39 + }
40 + }
41 +
42 + function getPort(srv: Server) {
43 + return (srv.address() as any)?.port
44 + }
45 + },
46 +
47 +}
src/api.vfs.ts new
+161
@@ -0,0 +1,161 @@
1 +import { getNodeName, nodeIsDirectory, vfs, VfsNode, VfsNodeType } from './vfs'
2 +import _ from 'lodash'
3 +import { stat } from 'fs/promises'
4 +import { ApiError, ApiHandlers } from './apis'
5 +import { dirname } from 'path'
6 +import { saveConfigAsap } from './config'
7 +import createSSE from './sse'
8 +import glob from 'fast-glob'
9 +import { enforceFinal, isWindows } from './misc'
10 +import { exec } from 'child_process'
11 +import { promisify } from 'util'
12 +
13 +type VfsAdmin = { type?: string, size?: number, ctime?: Date, mtime?: Date, children?: VfsAdmin[] } & Omit<VfsNode,'type' | 'children'>
14 +
15 +function saveVfs() {
16 + saveConfigAsap()
17 +}
18 +
19 +const apis: ApiHandlers = {
20 +
21 + async get_vfs() {
22 + return { root:vfs.root && await recur(vfs.root) }
23 +
24 + async function recur(n: VfsNode): Promise<VfsAdmin> {
25 + const dir = await nodeIsDirectory(n)
26 + const stats: Pick<VfsAdmin, 'size' | 'ctime' | 'mtime'> = {}
27 + try {
28 + if (n.source && !dir)
29 + Object.assign(stats, _.pick(await stat(n.source), ['size', 'ctime', 'mtime']))
30 + }
31 + catch {
32 + stats.size = -1
33 + }
34 + if (stats && Number(stats.mtime) === Number(stats.ctime))
35 + delete stats.mtime
36 + return {
37 + ...stats,
38 + ...n,
39 + name: getNodeName(n),
40 + type: dir ? 'folder' : undefined,
41 + children: n.children && await Promise.all(n.children.map(recur)),
42 + }
43 + }
44 + },
45 +
46 + async set_vfs({ uri, props }) {
47 + const n = await vfs.urlToNode(uri)
48 + if (!n)
49 + return new ApiError(404, 'path not found')
50 + Object.assign(n, pickProps(props, ['name','source','hidden','forbid','perm','hide','remove']))
51 + if (getNodeName(_.omit(n, ['name'])) === n.name) // name only if necessary
52 + delete n.name
53 + saveVfs()
54 + return n
55 + },
56 +
57 + async add_vfs({ under, source, name }) {
58 + const n = under ? await vfs.urlToNode(under) : vfs.root
59 + if (!n)
60 + return new ApiError(404, 'invalid under')
61 + if (n.type === VfsNodeType.temp || !await nodeIsDirectory(n))
62 + return new ApiError(403, 'invalid under')
63 + const a = n.children || (n.children = [])
64 + a.unshift({ source, name })
65 + saveVfs()
66 + return {}
67 + },
68 +
69 + async del_vfs({ uris }) {
70 + if (!uris || !Array.isArray(uris))
71 + return new ApiError(400, 'invalid uris')
72 + return {
73 + errors: await Promise.all(uris.map(async uri => {
74 + if (typeof uri !== 'string')
75 + return 400
76 + const node = await vfs.urlToNode(uri)
77 + if (!node || node.type === VfsNodeType.temp)
78 + return 404
79 + const parent = dirname(uri)
80 + const parentNode = await vfs.urlToNode(parent)
81 + if (!parentNode)
82 + return 403
83 + const { children } = parentNode
84 + if (!children) // shouldn't happen
85 + return 500
86 + const idx = children.indexOf(node)
87 + children.splice(idx, 1)
88 + saveVfs()
89 + return 0 // error code 0 is OK
90 + }))
91 + }
92 + },
93 +
94 + async get_cwd() {
95 + return { path: process.cwd() }
96 + },
97 +
98 + async ls({ path }, ctx) {
99 + (async () => {
100 + const sseSrv = createSSE(ctx)
101 + try {
102 + if (!path && isWindows()) {
103 + try {
104 + const { stdout } = await promisify(exec)('wmic logicaldisk get name')
105 + for (const drive of stdout.split('\n').slice(1).map(x => x.trim()).filter(Boolean))
106 + sseSrv.send({ entry: { n: drive } })
107 + }
108 + catch(error) {
109 + console.debug(error)
110 + }
111 + return
112 + }
113 + const dirStream = glob.stream('*', {
114 + cwd: path,
115 + dot: true,
116 + onlyFiles: false,
117 + })
118 + const base = enforceFinal('/', path)
119 + for await (let path of dirStream) {
120 + if (ctx.req.aborted)
121 + return
122 + if (path instanceof Buffer)
123 + path = path.toString('utf8')
124 + try {
125 + const stats = await stat(base + path)
126 + const entry = {
127 + n: path,
128 + s: stats.size,
129 + c: stats.ctime,
130 + m: stats.mtime,
131 + k: stats.isDirectory() ? 'd' : undefined,
132 + }
133 + sseSrv.send({ entry })
134 + }
135 + catch {
136 + console.debug('ls: failed stat for ', path)
137 + }
138 + }
139 + } catch (e) {
140 + if ((e as any).code !== 'ENOTDIR')
141 + throw e
142 + } finally {
143 + sseSrv.close()
144 + }
145 + })().then()
146 + return false
147 + }
148 +
149 +}
150 +
151 +export default apis
152 +
153 +// pick only selected props, and consider null and empty string as undefined
154 +function pickProps(o: any, keys: string[]) {
155 + const ret: any = {}
156 + if (o && typeof o === 'object')
157 + for (const k of keys)
158 + if (k in o)
159 + ret[k] = o[k] === null && o[k] === '' ? undefined : o[k]
160 + return ret
161 +}
src/config.ts
+19 -2
@@ -1,12 +1,15 @@
1 import EventEmitter from 'events'
2 import { argv } from './const'
3 import { watchLoad } from './watchLoad'
4 +import fs from 'fs/promises'
5 +import yaml from 'yaml'
6 +import _ from 'lodash'
7
8 export const CFG_ALLOW_CLEAR_TEXT_LOGIN = 'allow clear text login'
9
10 const PATH = 'config.yaml'
11
9 -let started = false
12 +let started = false // this will tell the difference for subscribeConfig()s that are called before or after config is loaded
13 let state:Record<string,any> = {}
14 const emitter = new EventEmitter()
15 emitter.setMaxListeners(10_000)
@@ -53,11 +56,20 @@ export function getConfig(k:string) {
56 return k in state ? state[k] : configProps[k]?.defaultValue
57 }
58
56 -export function setConfig(newCfg: Record<string,any>) {
59 +export function getWholeConfig({ omit=[], only=[] }: { omit:string[], only:string[] }) {
60 + let copy = _.omit(state, omit)
61 + if (only.length)
62 + copy = _.pick(copy, only)
63 + return _.cloneDeep(copy)
64 +}
65 +
66 +export function setConfig(newCfg: Record<string,any>, partial=false) {
67 for (const k in newCfg)
68 check(k)
69 const oldKeys = Object.keys(state)
70 oldKeys.push(...Object.keys(configProps))
71 + if (partial)
72 + return saveConfigAsap()
73 for (const k of oldKeys)
74 if (!newCfg.hasOwnProperty(k))
75 check(k)
@@ -74,3 +86,8 @@ export function setConfig(newCfg: Record<string,any>) {
86 emitter.emit('new.'+k, v, oldV)
87 }
88 }
89 +
90 +export const saveConfigAsap = _.debounce(async () => {
91 + fs.writeFile(path, yaml.stringify(state))
92 + .catch(err => console.error('Failed at saving config file, please ensure it is writable.', String(err)))
93 +})
src/const.ts
+2 -2
@@ -5,8 +5,8 @@ export const DEV = process.env.DEV ? 'DEV' : ''
5 if (DEV)
6 console.clear()
7
8 -const SPECIAL_URI = '/~/'
9 -export const FRONTEND_URI = SPECIAL_URI + 'front/'
8 +export const SPECIAL_URI = '/~/'
9 +export const FRONTEND_URI = SPECIAL_URI + 'frontend/'
10 export const API_URI = SPECIAL_URI + 'api/'
11 export const PLUGINS_PUB_URI = SPECIAL_URI + 'plugins/'
12
src/frontEndApis.ts
-13
@@ -1,21 +1,8 @@
1 import { ApiHandlers } from './apis'
2 import * as api_file_list from './api.file_list'
3 import * as api_auth from './api.auth'
4 -import { setConfig } from './config'
4
5 export const frontEndApis: ApiHandlers = {
7 -
6 ...api_file_list,
9 -
7 ...api_auth,
11 -
12 - async config({ values }, ctx) {
13 - if (isLocalhost(ctx.ip))
14 - setConfig(values)
15 - },
16 -
17 -}
18 -
19 -function isLocalhost(ip: string) {
20 - return ip === '127.0.0.1' || ip === '::1'
8 }
src/index.ts
+13 -2
@@ -9,14 +9,25 @@ import { throttler } from './throttler'
9 import { getAccount, getCurrentUsername, getCurrentUsernameExpanded } from './perm'
10 import { headRequests, gzipper, sessions, frontendAndSharedFiles } from './middlewares'
11 import './listen'
12 +import { serveAdminFiles } from './serveFrontend'
13 +import { adminApis } from './adminApis'
14
15 export const BUILD_TIMESTAMP = "-"
16 export const SESSION_DURATION = 30*60_000
17 +export const HFS_STARTED = new Date()
18
16 -console.log('started', new Date().toLocaleString(), 'build', BUILD_TIMESTAMP, DEV)
19 +console.log('started', HFS_STARTED.toLocaleString(), 'build', BUILD_TIMESTAMP, DEV)
20 console.debug('cwd', process.cwd())
18 -export const app = new Koa({ keys: ['hfs-keys-test'] })
21
22 +const ADMIN_PORT = 63636
23 +new Koa()
24 + .use(mount(API_URI, apiMiddleware(adminApis)))
25 + .use(serveAdminFiles)
26 + .on('error', errorHandler)
27 + .listen(ADMIN_PORT, '127.0.0.1', () =>
28 + console.log('admin interface on http://localhost:'+ADMIN_PORT))
29 +
30 +export const app = new Koa({ keys: ['hfs-keys-test'] })
31 app.use(sessions(app))
32 app.use(async (ctx, next) => {
33 ctx.state.usernames = getCurrentUsernameExpanded(ctx) // accounts chained via .belongs for permissions check
src/listen.ts
+7
@@ -118,3 +118,10 @@ function stopServer(srv: http.Server) {
118 })
119 })
120 }
121 +
122 +export function getStatus() {
123 + return {
124 + httpSrv,
125 + httpsSrv,
126 + }
127 +}
src/middlewares.ts
+13 -1
@@ -8,7 +8,7 @@ import { vfs } from './vfs'
8 import { isDirectory } from './misc'
9 import { zipStreamFromFolder } from './zip'
10 import { serveFileNode } from './serveFile'
11 -import { serveFrontend } from './serveFrontend'
11 +import { serveAdminFiles, serveFrontend } from './serveFrontend'
12 import mount from 'koa-mount'
13 import { Readable } from 'stream'
14
@@ -45,6 +45,7 @@ export const sessions = (app: Application) => session({
45
46 // serve shared files and front-end files
47 const serveFrontendPrefixed = mount(FRONTEND_URI.slice(0,-1), serveFrontend)
48 +
49 export const frontendAndSharedFiles: Koa.Middleware = async (ctx, next) => {
50 const { path } = ctx
51 if (path.includes('..'))
@@ -78,3 +79,14 @@ export const frontendAndSharedFiles: Koa.Middleware = async (ctx, next) => {
79 return serveFileNode(node)(ctx,next)
80 return next()
81 }
82 +
83 +export const admin: Koa.Middleware = async (ctx, next) => {
84 + const { path } = ctx
85 + if (path.includes('..'))
86 + ctx.throw(500)
87 + if (ctx.body)
88 + return next()
89 + if (path === '/')
90 + serveAdminFiles(ctx, next)
91 + return next()
92 +}
src/perm.ts
+4
@@ -23,6 +23,10 @@ interface Accounts { [username:string]: Account }
23
24 let accounts: Accounts = {}
25
26 +export function getAccounts() {
27 + return accounts as Readonly<typeof accounts>
28 +}
29 +
30 export function getCurrentUsername(ctx: Koa.Context): string {
31 return ctx.session?.username || ''
32 }
src/serveFrontend.ts
+47 -30
@@ -6,14 +6,13 @@ import { mapPlugins } from './plugins'
6 import { refresh_session } from './api.auth'
7 import { ApiError } from './apis'
8
9 -const proxyPort = process.env.FRONTEND_PROXY
10 -export const serveFrontend = proxyPort ? serveProxyFrontend() : serveStaticFrontend()
11 -
12 -function serveProxyFrontend() { // used for development
9 +function serveProxyFrontend(port?: string) { // used for development
10 + if (!port)
11 + return
12 console.debug('fronted: proxied')
13 let proxy: Koa.Middleware
14 import('koa-better-http-proxy').then(lib =>
16 - proxy = lib.default('localhost:'+proxyPort, {
15 + proxy = lib.default('localhost:'+port, {
16 filter: ctx => ctx.method === 'GET' || (ctx.status = METHOD_NOT_ALLOWED) && false,
17 proxyReqPathResolver: (ctx) => ctx.path.endsWith('/') ? '/' : ctx.path,
18 userResDecorator(res, data, ctx) {
@@ -27,40 +26,52 @@ function serveProxyFrontend() { // used for development
26 }
27 }
28
30 -function serveStaticFrontend() : Koa.Middleware {
29 +const serveStaticFrontend : Koa.Middleware = async (ctx, next) => {
30 const BASE = 'frontend/'
32 - return async (ctx, next) => {
33 - let { path, method } = ctx
34 - if (method === 'OPTIONS') {
35 - ctx.status = NO_CONTENT
36 - ctx.set({ Allow: 'OPTIONS, GET' })
37 - return
38 - }
39 - if (method !== 'GET')
40 - return ctx.status = METHOD_NOT_ALLOWED
41 - if (path.endsWith('/')) { // we don't cache the index as it's small and may prevent plugins change to apply
42 - ctx.body = await treatIndex(ctx, String(await fs.readFile(BASE + 'index.html')))
43 - ctx.type = 'html'
44 - ctx.set('Cache-Control', 'no-store, no-cache, must-revalidate')
45 - } else {
46 - const fullPath = BASE + path.slice(1)
47 - const modifier = path.includes('static/js') ? // webpack
48 - (s:string) => s.replace(/(return")(static\/)/g, '$1' + FRONTEND_URI.substring(1) + '$2')
49 - : undefined
50 - return serveFile(fullPath, 'auto', modifier)(ctx, next)
51 - }
52 - await next()
31 + let { path, method } = ctx
32 + if (method === 'OPTIONS') {
33 + ctx.status = NO_CONTENT
34 + ctx.set({ Allow: 'OPTIONS, GET' })
35 + return
36 + }
37 + if (method !== 'GET')
38 + return ctx.status = METHOD_NOT_ALLOWED
39 + if (path.endsWith('/')) { // we don't cache the index as it's small and may prevent plugins change to apply
40 + ctx.body = await treatIndex(ctx, String(await fs.readFile(BASE + 'index.html')))
41 + ctx.type = 'html'
42 + ctx.set('Cache-Control', 'no-store, no-cache, must-revalidate')
43 + } else {
44 + const fullPath = BASE + path.slice(1)
45 + const modifier = path.includes('static/js') ? // webpack
46 + (s:string) => s.replace(/(return")(static\/)/g, '$1' + FRONTEND_URI.substring(1) + '$2')
47 + : undefined
48 + return serveFile(fullPath, 'auto', modifier)(ctx, next)
49 }
50 + await next()
51 }
52
56 -function replaceFrontEndRes(body: string) {
57 - return body.replace(/((?:src|href) *= *['"])\/?(?![a-z]+:\/\/)/g, '$1'+FRONTEND_URI)
53 +function serveAdminProxy(port?: string) { // used for development
54 + if (!port)
55 + return
56 + console.debug('admin: proxied')
57 + let proxy: Koa.Middleware
58 + import('koa-better-http-proxy').then(lib =>
59 + proxy = lib.default('localhost:'+port, {}) )
60 + return function() { //@ts-ignore
61 + return proxy.apply(this,arguments)
62 + }
63 +}
64 +
65 +const serveAdminStatic : Koa.Middleware = async (ctx, next) => {
66 + const fullPath = 'admin' + (ctx.path.includes('.') ? ctx.path : 'index.html');
67 + return serveFile(fullPath, 'auto')(ctx, next)
68 }
69
70 async function treatIndex(ctx: Koa.Context, body: string) {
71 const session = await refresh_session({}, ctx)
72 ctx.set('etag', '')
63 - return replaceFrontEndRes(body)
73 + return body
74 + .replace(/((?:src|href) *= *['"])\/?(?![a-z]+:\/\/)/g, '$1' + FRONTEND_URI)
75 .replace('_HFS_SESSION_', session instanceof ApiError ? 'null' : JSON.stringify(session))
76 // replacing this text allow us to avoid injecting in frontends that don't support plugins. Don't use a <--comment--> or it will be removed by webpack
77 .replace('_HFS_PLUGINS_', pluginsInjection)
@@ -74,3 +85,9 @@ function pluginsInjection() {
85 return css.map(uri => `\n<link rel='stylesheet' type='text/css' href='${uri}'/>`).join('')
86 + js.map(uri => `\n<script defer src='${uri}'></script>`).join('')
87 }
88 +
89 +export const serveAdminFiles = serveAdminProxy(process.env.ADMIN_PROXY)
90 + || serveAdminStatic
91 +
92 +export const serveFrontend = serveProxyFrontend(process.env.FRONTEND_PROXY)
93 + || serveStaticFrontend
tsconfig.json
+1 -1
@@ -1,5 +1,5 @@
1 {
2 - "exclude": ["frontend","tests"],
2 + "exclude": ["frontend","admin","tests"],
3 "compilerOptions": {
4 /* Visit https://aka.ms/tsconfig.json to read more about this file */
5