From 719342f43e32526caf51af1d60602844360bd40c Mon Sep 17 00:00:00 2001 From: Nil Date: Fri, 12 Jul 2024 22:40:44 +0200 Subject: [PATCH] initial commit chore: update SecListPath in build_tables.go script chore: Refactor build_tables.go script to read and print file contents chore: Update build_tables.go script to create rainbow tables from SecList chore: Refactor build_tables.go script to use filepath.Join for file paths chore: Update README.md to remove unused wordlist link initial commit frontend chore: Add PassInput component to Home page chore: Update build_tables.go script to create rainbow tables from multiple sources lolazo bailemos chore: Remove unused files and code from frontend/passcheck chore: Update file paths in frontend configuration files chore: Add RequestBody and ResponseBody structs to backend chore: Remove unused files and code from frontend/passcheck chore: Add logging middleware and implement request processing in main.go chore: Refactor main.go to search for hash in multiple files chore: Improve search performance by implementing concurrent file scanning chore: Implement concurrent file scanning for improved search performance chore: Update go.mod and go.sum with indirect dependency on github.com/google/re2 chore: Update main.go to use GET method for hash validation chore: Remove unused RequestBody struct from backend chore: Add API tests for hash validation endpoint clean cache for pycache test: Add API tests for hash validation and improve file scanning performance chore: Remove tables from repo and update file scanning performance chore: Remove lfs chore: Add script to clone SecLists repository chore: Update README with WIP notice and pending improvements chore: Update get_repos.sh script to build tables and check for minimum number of .txt files in tables folder drop svelt for vue chore: Add CORS middleware to backend and update frontend dependencies now's vuetifyjs chore: Update password field label in HelloWorld.vue component chore: Update password field label in HelloWorld.vue component chore: Update password field label in HelloWorld.vue component chore: Update page title and logo chore: Add password checker description in HelloWorld.vue component ip chore: Update npm dependencies for password checker feature chore: Update npm dependencies for password checker feature feat: Add password hashing and API call in HelloWorld.vue component format refactor: Update HelloWorld.vue component to display list of files checked feat: Add Vue Router components to GlobalComponents in components.d.ts refactor: Update server.js to serve static files and handle SPA routing refactor: Update server.js to serve static files and handle SPA routing wip copy tables folder wip wip wip wip move scripts, sources and tables to backend folder Move get_repos.sh to backend folder and update references refactor: Move get_repos.sh, scripts, sources, and tables to backend folder Move get_repos.sh to backend folder and update references Move get_repos.sh to backend folder and update references wip wip wip Move get_repos.sh, scripts, sources, and tables to backend folder Move get_repos.sh, scripts, sources, and tables to backend folder Move get_repos.sh, scripts, sources, and tables to backend folder refactor: Move get_repos.sh, scripts, sources, and tables to backend folder refactor: Move get_repos.sh, scripts, sources, and tables to backend folder wip add nohup to go run --- .github/workflows/build_backend.yml | 38 + .github/workflows/build_front.yml | 0 .gitignore | 6 + .prettierrc | 4 + README.md | 14 + backend/cors.go | 19 + backend/get_repos.sh | 15 + backend/go.mod | 35 + backend/go.sum | 81 + backend/main.go | 103 + backend/response_body.go | 5 + backend/scripts/build_tables.go | 91 + backend/scripts/go.mod | 7 + backend/scripts/go.sum | 4 + backend/sources/_sources.json | 6 + backend/tables/_sort.sh | 14 + frontend/.browserslistrc | 4 + frontend/.editorconfig | 5 + frontend/.gitignore | 22 + frontend/README.md | 81 + frontend/components.d.ts | 14 + frontend/index.html | 16 + frontend/package-lock.json | 2771 ++++++++++++++++++++++++ frontend/package.json | 33 + frontend/public/favicon.ico | Bin 0 -> 173842 bytes frontend/server.js | 14 + frontend/src/App.vue | 11 + frontend/src/assets/logo.svg | 2 + frontend/src/components/HelloWorld.vue | 91 + frontend/src/components/README.md | 35 + frontend/src/main.ts | 11 + frontend/src/plugins/README.md | 3 + frontend/src/plugins/index.ts | 15 + frontend/src/plugins/vuetify.ts | 19 + frontend/src/vite-env.d.ts | 7 + frontend/tsconfig.json | 33 + frontend/tsconfig.node.json | 9 + frontend/vite.config.mts | 47 + test/.gitignore | 1 + test/api_test.py | 36 + test/run.sh | 1 + 41 files changed, 3723 insertions(+) create mode 100644 .github/workflows/build_backend.yml create mode 100644 .github/workflows/build_front.yml create mode 100644 .prettierrc create mode 100644 backend/cors.go create mode 100644 backend/get_repos.sh create mode 100644 backend/go.mod create mode 100644 backend/go.sum create mode 100644 backend/main.go create mode 100644 backend/response_body.go create mode 100644 backend/scripts/build_tables.go create mode 100644 backend/scripts/go.mod create mode 100644 backend/scripts/go.sum create mode 100644 backend/sources/_sources.json create mode 100644 backend/tables/_sort.sh create mode 100644 frontend/.browserslistrc create mode 100644 frontend/.editorconfig create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/components.d.ts create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/server.js create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/assets/logo.svg create mode 100644 frontend/src/components/HelloWorld.vue create mode 100644 frontend/src/components/README.md create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/plugins/README.md create mode 100644 frontend/src/plugins/index.ts create mode 100644 frontend/src/plugins/vuetify.ts create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.mts create mode 100644 test/.gitignore create mode 100644 test/api_test.py create mode 100644 test/run.sh diff --git a/.github/workflows/build_backend.yml b/.github/workflows/build_backend.yml new file mode 100644 index 0000000..03456d6 --- /dev/null +++ b/.github/workflows/build_backend.yml @@ -0,0 +1,38 @@ +name: Build Backend + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Upload Backend + run: | + sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no $USERNAME@$SERVER_IP "sudo rm -rf /home/pop-pc/*" + sshpass -p $PASSWORD sftp -o StrictHostKeyChecking=no $USERNAME@$SERVER_IP < [!IMPORTANT] +> This repo is WIP. + # PassCheck + Check if your password is present in any popular wordlist + +### Wordlist in use: + +[SecList, all Common-Credentials](https://github.com/danielmiessler/SecLists/tree/master/Passwords/Common-Credentials) + +### Pending Improvements: + +1. Dynamically download the wordlist, now the download is hardcoded at `get_repos.sh` diff --git a/backend/cors.go b/backend/cors.go new file mode 100644 index 0000000..3abc5d7 --- /dev/null +++ b/backend/cors.go @@ -0,0 +1,19 @@ +package main + +import "github.com/gin-gonic/gin" + +func CORSMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") + c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") + c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT") + + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(204) + return + } + + c.Next() + } +} diff --git a/backend/get_repos.sh b/backend/get_repos.sh new file mode 100644 index 0000000..f0089e7 --- /dev/null +++ b/backend/get_repos.sh @@ -0,0 +1,15 @@ +#! /bin/bash + +cd ./backend/sources +git clone --depth 1 https://github.com/danielmiessler/SecLists.git +cd ../scripts + +go clean +go run build_tables.go + +if [ $(ls ../tables/*.txt | wc -l) -lt 10 ]; then + echo "Error: less than 10 .txt files in tables folder" + exit 1 +fi + +export GIN_MODE=release \ No newline at end of file diff --git a/backend/go.mod b/backend/go.mod new file mode 100644 index 0000000..8fe9021 --- /dev/null +++ b/backend/go.mod @@ -0,0 +1,35 @@ +module example/web-service-gin + +go 1.22.4 + +require github.com/gin-gonic/gin v1.10.0 + +require ( + github.com/bytedance/sonic v1.11.6 // indirect + github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/google/re2 v0.0.0-20240621200418-6144b62bece5 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/backend/go.sum b/backend/go.sum new file mode 100644 index 0000000..bb9b1b9 --- /dev/null +++ b/backend/go.sum @@ -0,0 +1,81 @@ +github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/re2 v0.0.0-20240621200418-6144b62bece5 h1:L8wTPkAu21Qy/4O7dNgmFDRD76YMnrv7wsbJN6NJD1w= +github.com/google/re2 v0.0.0-20240621200418-6144b62bece5/go.mod h1:ZlBvb65OZwjnLV/l4B1HGCxZXoW40tN1siMMczg4kog= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/backend/main.go b/backend/main.go new file mode 100644 index 0000000..005d71d --- /dev/null +++ b/backend/main.go @@ -0,0 +1,103 @@ +package main + +import ( + "bufio" + "fmt" + "net/http" + "os" + "path/filepath" + "strings" + "sync" + + "regexp" + + "github.com/gin-gonic/gin" +) + +type RequestBody struct { + Data string `json:"hash" binding:"required"` +} + +func main() { + const Sha3Regex = `^([0-9a-fA-F]{128})$` + router := gin.Default() + //router.Use(CORSMiddleware()) + + router.Use(gin.Logger()) + + router.GET("/", func(c *gin.Context) { + + hash := c.Query("hash") + if ok, _ := regexp.MatchString(Sha3Regex, hash); !ok { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid hash format"}) + return + } + + c.JSON(http.StatusOK, gin.H{"data": processRequest(RequestBody{Data: hash})}) + + }) + + router.Run(":8080") +} + +func processRequest(requestBody RequestBody) string { + + result := searchHash(requestBody.Data) + if len(result) == 0 { + return "No matches found" + } + + return strings.Join(searchHash(requestBody.Data), ", ") +} + +func searchHash(hash string) []string { + const tablesPath = "../tables" + files, err := os.ReadDir(tablesPath) + if err != nil { + fmt.Printf("Error reading directory: %v\n", err) + return nil + } + + var wg sync.WaitGroup + resultsChan := make(chan string, len(files)) + results := []string{} + + for _, file := range files { + if !file.IsDir() { + wg.Add(1) + go func(file os.DirEntry) { + defer wg.Done() + filePath := filepath.Join(tablesPath, file.Name()) + f, err := os.Open(filePath) + if err != nil { + fmt.Printf("Error opening file %s: %v\n", file.Name(), err) + return + } + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + if strings.Contains(line, hash) { + resultsChan <- file.Name() + break + } + } + if err := scanner.Err(); err != nil { + fmt.Printf("Error reading file %s: %v\n", file.Name(), err) + } + }(file) + } + } + + go func() { + wg.Wait() + close(resultsChan) + }() + + for fileName := range resultsChan { + results = append(results, fileName) + } + + return results +} diff --git a/backend/response_body.go b/backend/response_body.go new file mode 100644 index 0000000..5bc1897 --- /dev/null +++ b/backend/response_body.go @@ -0,0 +1,5 @@ +package main + +type ResponseBody struct { + Matches []string +} diff --git a/backend/scripts/build_tables.go b/backend/scripts/build_tables.go new file mode 100644 index 0000000..46ce5c0 --- /dev/null +++ b/backend/scripts/build_tables.go @@ -0,0 +1,91 @@ +package main + +import ( + "bufio" + "encoding/json" + "fmt" + "os" + "path/filepath" + + "golang.org/x/crypto/sha3" +) + +func main() { + const sourcesFile = "../sources/_sources.json" + const tablesPath = "../tables" + var sources []Source + + sourcesFileReader, err := os.Open(sourcesFile) + if err != nil { + fmt.Printf("Error opening file %s: %v\n", sourcesFile, err) + return + } + defer sourcesFileReader.Close() + + jsonParser := json.NewDecoder(sourcesFileReader) + if err = jsonParser.Decode(&sources); err != nil { + fmt.Printf("Error parsing file %s: %v\n", sourcesFile, err) + return + } + + //iterate over sources + for _, source := range sources { + realPath := filepath.Join("../sources/", source.Path) + files, err := os.ReadDir(realPath) + if err != nil { + fmt.Printf("Error reading directory: %v\n", err) + return + } + fmt.Printf("Hello! Let's build the rainbow tables from %s!\n", source.Repo) + //iterate over files in source + for _, file := range files { + processFile(realPath, tablesPath, file.Name()) + } + + } + +} + +func processFile(basePath, outputPath, fileName string) { + inputFilePath := filepath.Join(basePath, fileName) + inputFile, err := os.Open(inputFilePath) + if err != nil { + fmt.Printf("Error opening file %s: %v\n", inputFilePath, err) + return + } + defer inputFile.Close() + + outputFilePath := filepath.Join(outputPath, fileName) + outputFile, err := os.Create(outputFilePath) + if err != nil { + fmt.Printf("Error creating file %s: %v\n", outputFilePath, err) + return + } + defer outputFile.Close() + + writer := bufio.NewWriter(outputFile) + defer writer.Flush() + + fmt.Printf("Processing file: %s\n", fileName) + + scanner := bufio.NewScanner(inputFile) + hasher := sha3.New512() + for scanner.Scan() { + hasher.Reset() + hasher.Write([]byte(scanner.Text())) + hash := hasher.Sum(nil) + _, err := writer.WriteString(fmt.Sprintf("%x\n", hash)) + if err != nil { + fmt.Printf("Error writing hash to file %s: %v\n", outputFilePath, err) + return + } + } + if err := scanner.Err(); err != nil { + fmt.Printf("Error scanning file %s: %v\n", inputFilePath, err) + } +} + +type Source struct { + Repo string `json:"repo"` + Path string `json:"path"` +} diff --git a/backend/scripts/go.mod b/backend/scripts/go.mod new file mode 100644 index 0000000..2779a48 --- /dev/null +++ b/backend/scripts/go.mod @@ -0,0 +1,7 @@ +module scripts + +go 1.22.4 + +require golang.org/x/crypto v0.24.0 + +require golang.org/x/sys v0.21.0 // indirect diff --git a/backend/scripts/go.sum b/backend/scripts/go.sum new file mode 100644 index 0000000..3983382 --- /dev/null +++ b/backend/scripts/go.sum @@ -0,0 +1,4 @@ +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/backend/sources/_sources.json b/backend/sources/_sources.json new file mode 100644 index 0000000..e7f0f6b --- /dev/null +++ b/backend/sources/_sources.json @@ -0,0 +1,6 @@ +[ + { + "repo": "https://github.com/danielmiessler/SecLists.git", + "path": "./SecLists/Passwords/Common-Credentials/" + } +] diff --git a/backend/tables/_sort.sh b/backend/tables/_sort.sh new file mode 100644 index 0000000..c374092 --- /dev/null +++ b/backend/tables/_sort.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Check if the directory exists +DIR="." + +# Iterate over all files in the directory +for file in "$DIR"/*.txt; do + # Check if it's a file (and not a directory) + if [ -f "$file" ]; then + # Sort the file and save the output to a temporary file + sort "$file" -o "$file" + echo "Sorted lines in file: $file" + fi +done diff --git a/frontend/.browserslistrc b/frontend/.browserslistrc new file mode 100644 index 0000000..dc3bc09 --- /dev/null +++ b/frontend/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +not dead +not ie 11 diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 0000000..7053c49 --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..11f5d71 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..0519646 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,81 @@ +# Vuetify (Default) + +This is the official scaffolding tool for Vuetify, designed to give you a head start in building your new Vuetify application. It sets up a base template with all the necessary configurations and standard directory structure, enabling you to begin development without the hassle of setting up the project from scratch. + +## ❗️ Important Links + +- 📄 [Docs](https://vuetifyjs.com/) +- 🚨 [Issues](https://issues.vuetifyjs.com/) +- 🏬 [Store](https://store.vuetifyjs.com/) +- 🎮 [Playground](https://play.vuetifyjs.com/) +- 💬 [Discord](https://community.vuetifyjs.com) + +## 💿 Install + +Set up your project using your preferred package manager. Use the corresponding command to install the dependencies: + +| Package Manager | Command | +|---------------------------------------------------------------|----------------| +| [yarn](https://yarnpkg.com/getting-started) | `yarn install` | +| [npm](https://docs.npmjs.com/cli/v7/commands/npm-install) | `npm install` | +| [pnpm](https://pnpm.io/installation) | `pnpm install` | +| [bun](https://bun.sh/#getting-started) | `bun install` | + +After completing the installation, your environment is ready for Vuetify development. + +## ✨ Features + +- 🖼️ **Optimized Front-End Stack**: Leverage the latest Vue 3 and Vuetify 3 for a modern, reactive UI development experience. [Vue 3](https://v3.vuejs.org/) | [Vuetify 3](https://vuetifyjs.com/en/) +- 🗃️ **State Management**: Integrated with [Pinia](https://pinia.vuejs.org/), the intuitive, modular state management solution for Vue. +- 🚦 **Routing and Layouts**: Utilizes Vue Router for SPA navigation and vite-plugin-vue-layouts for organizing Vue file layouts. [Vue Router](https://router.vuejs.org/) | [vite-plugin-vue-layouts](https://github.com/JohnCampionJr/vite-plugin-vue-layouts) +- 💻 **Enhanced Development Experience**: Benefit from TypeScript's static type checking and the ESLint plugin suite for Vue, ensuring code quality and consistency. [TypeScript](https://www.typescriptlang.org/) | [ESLint Plugin Vue](https://eslint.vuejs.org/) +- ⚡ **Next-Gen Tooling**: Powered by Vite, experience fast cold starts and instant HMR (Hot Module Replacement). [Vite](https://vitejs.dev/) +- 🧩 **Automated Component Importing**: Streamline your workflow with unplugin-vue-components, automatically importing components as you use them. [unplugin-vue-components](https://github.com/antfu/unplugin-vue-components) +- 🛠️ **Strongly-Typed Vue**: Use vue-tsc for type-checking your Vue components, and enjoy a robust development experience. [vue-tsc](https://github.com/johnsoncodehk/volar/tree/master/packages/vue-tsc) + +These features are curated to provide a seamless development experience from setup to deployment, ensuring that your Vuetify application is both powerful and maintainable. + +## 💡 Usage + +This section covers how to start the development server and build your project for production. + +### Starting the Development Server + +To start the development server with hot-reload, run the following command. The server will be accessible at [http://localhost:3000](http://localhost:3000): + +```bash +yarn dev +``` + +(Repeat for npm, pnpm, and bun with respective commands.) + +> Add NODE_OPTIONS='--no-warnings' to suppress the JSON import warnings that happen as part of the Vuetify import mapping. If you are on Node [v21.3.0](https://nodejs.org/en/blog/release/v21.3.0) or higher, you can change this to NODE_OPTIONS='--disable-warning=5401'. If you don't mind the warning, you can remove this from your package.json dev script. + +### Building for Production + +To build your project for production, use: + +```bash +yarn build +``` + +(Repeat for npm, pnpm, and bun with respective commands.) + +Once the build process is completed, your application will be ready for deployment in a production environment. + +## 💪 Support Vuetify Development + +This project is built with [Vuetify](https://vuetifyjs.com/en/), a UI Library with a comprehensive collection of Vue components. Vuetify is an MIT licensed Open Source project that has been made possible due to the generous contributions by our [sponsors and backers](https://vuetifyjs.com/introduction/sponsors-and-backers/). If you are interested in supporting this project, please consider: + +- [Requesting Enterprise Support](https://support.vuetifyjs.com/) +- [Sponsoring John on Github](https://github.com/users/johnleider/sponsorship) +- [Sponsoring Kael on Github](https://github.com/users/kaelwd/sponsorship) +- [Supporting the team on Open Collective](https://opencollective.com/vuetify) +- [Becoming a sponsor on Patreon](https://www.patreon.com/vuetify) +- [Becoming a subscriber on Tidelift](https://tidelift.com/subscription/npm/vuetify) +- [Making a one-time donation with Paypal](https://paypal.me/vuetify) + +## 📑 License +[MIT](http://opensource.org/licenses/MIT) + +Copyright (c) 2016-present Vuetify, LLC diff --git a/frontend/components.d.ts b/frontend/components.d.ts new file mode 100644 index 0000000..f8bd205 --- /dev/null +++ b/frontend/components.d.ts @@ -0,0 +1,14 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +declare module 'vue' { + export interface GlobalComponents { + HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + } +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..088b32d --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,16 @@ + + + + + + + + 🐙.☕️ - Password Checker + + + +
+ + + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..d1926da --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2771 @@ +{ + "name": "passcheck", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "passcheck", + "version": "0.0.0", + "dependencies": { + "@mdi/font": "6.2.95", + "crypto-js": "^4.2.0", + "express": "^4.19.2", + "js-sha3": "^0.9.3", + "roboto-fontface": "*", + "vue": "^3.4.21", + "vuetify": "^3.5.8" + }, + "devDependencies": { + "@babel/types": "^7.24.0", + "@types/crypto-js": "^4.2.2", + "@types/node": "^20.11.25", + "@vitejs/plugin-vue": "^5.0.4", + "sass": "^1.71.1", + "typescript": "^5.4.2", + "unplugin-fonts": "^1.1.1", + "unplugin-vue-components": "^0.26.0", + "unplugin-vue-router": "^0.10.0", + "vite": "^5.1.5", + "vite-plugin-vue-layouts": "^0.11.0", + "vite-plugin-vuetify": "^2.0.3", + "vue-tsc": "^2.0.6" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.8.tgz", + "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@mdi/font": { + "version": "6.2.95", + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-6.2.95.tgz", + "integrity": "sha512-0RKkhabkFZP3ALwKqrjhdKdhydQpoydIjX6cvjIwLyjADCsE0pG68YkGY+S3qnfdErmhS4m8adwvgrAFXp2AYQ==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "devOptional": true + }, + "node_modules/@types/node": { + "version": "20.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", + "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "devOptional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.4.tgz", + "integrity": "sha512-wXBhY11qG6pCDAqDnbBRFIDSIwbqkWI7no+lj5+L7IlA7HRIjRP7YQLGzT0LF4lS6eHkMSsclXqy9DwYJasZTQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.3.4" + } + }, + "node_modules/@volar/source-map": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.4.tgz", + "integrity": "sha512-C+t63nwcblqLIVTYXaVi/+gC8NukDaDIQI72J3R7aXGvtgaVB16c+J8Iz7/VfOy7kjYv7lf5GhBny6ACw9fTGQ==", + "dev": true + }, + "node_modules/@volar/typescript": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.4.tgz", + "integrity": "sha512-acCvt7dZECyKcvO5geNybmrqOsu9u8n5XP1rfiYsOLYGPxvHRav9BVmEdRyZ3vvY6mNyQ1wLL5Hday4IShe17w==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.3.4", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.10.4.tgz", + "integrity": "sha512-akO6Bd6U4jP0+ZKbHq6mbYkw1coOrJpLeVmkuMlUsT5wZRi11BjauGcZHusBSzUjgCBsa1kZTyipxrxrWB54Hw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5", + "@rollup/pluginutils": "^5.1.0", + "@vue/compiler-sfc": "^3.4.27", + "ast-kit": "^0.12.1", + "local-pkg": "^0.5.0", + "magic-string-ast": "^0.6.0" + }, + "engines": { + "node": ">=16.14.0" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue-macros/common/node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.30.tgz", + "integrity": "sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.30", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.30.tgz", + "integrity": "sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==", + "dependencies": { + "@vue/compiler-core": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.30.tgz", + "integrity": "sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.30", + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.30.tgz", + "integrity": "sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==", + "dependencies": { + "@vue/compiler-dom": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==", + "dev": true, + "peer": true + }, + "node_modules/@vue/language-core": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.22.tgz", + "integrity": "sha512-dNTAAtEOuMiz7N1s5tKpypnVVCtawxVSF5BukD0ELcYSw+DSbrSlYYSw8GuwvurodCeYFSHsmslE+c2sYDNoiA==", + "dev": true, + "dependencies": { + "@volar/language-core": "~2.3.1", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.30.tgz", + "integrity": "sha512-bVJurnCe3LS0JII8PPoAA63Zd2MBzcKrEzwdQl92eHCcxtIbxD2fhNwJpa+KkM3Y/A4T5FUnmdhgKwOf6BfbcA==", + "dependencies": { + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.30.tgz", + "integrity": "sha512-qaFEbnNpGz+tlnkaualomogzN8vBLkgzK55uuWjYXbYn039eOBZrWxyXWq/7qh9Bz2FPifZqGjVDl/FXiq9L2g==", + "dependencies": { + "@vue/reactivity": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.30.tgz", + "integrity": "sha512-tV6B4YiZRj5QsaJgw2THCy5C1H+2UeywO9tqgWEc21tn85qHEERndHN/CxlyXvSBFrpmlexCIdnqPuR9RM9thw==", + "dependencies": { + "@vue/reactivity": "3.4.30", + "@vue/runtime-core": "3.4.30", + "@vue/shared": "3.4.30", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.30.tgz", + "integrity": "sha512-TBD3eqR1DeDc0cMrXS/vEs/PWzq1uXxnvjoqQuDGFIEHFIwuDTX/KWAQKIBjyMWLFHEeTDGYVsYci85z2UbTDg==", + "dependencies": { + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30" + }, + "peerDependencies": { + "vue": "3.4.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.30.tgz", + "integrity": "sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==" + }, + "node_modules/@vuetify/loader-shared": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.0.3.tgz", + "integrity": "sha512-Ss3GC7eJYkp2SF6xVzsT7FAruEmdihmn4OCk2+UocREerlXKWgOKKzTN5PN3ZVN5q05jHHrsNhTuWbhN61Bpdg==", + "devOptional": true, + "dependencies": { + "upath": "^2.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0", + "vuetify": "^3.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "devOptional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/ast-kit": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-0.12.2.tgz", + "integrity": "sha512-es1zHFsnZ4Y4efz412nnrU3KvVAhgqy90a7Yt9Wpi5vQ3l4aYMOX0Qx4FD0elKr5ITEhiUGCSFcgGYf4YTuACg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.6", + "pathe": "^1.1.2" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.6.1.tgz", + "integrity": "sha512-0ZdQEsSfH3mX4BFbRCc3xOBjx5bDbm73+aAdQOHerPQNf8K0XFMAv79ucd2BpnSc4UMyvBDixiroT8yjm2Y6bw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.0", + "ast-kit": "^0.12.1" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "devOptional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "devOptional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "devOptional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "devOptional": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "devOptional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "devOptional": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/js-sha3": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.3.tgz", + "integrity": "sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/magic-string-ast": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.6.2.tgz", + "integrity": "sha512-oN3Bcd7ZVt+0VGEs7402qR/tjgjbM7kPlH/z7ufJnzTLVBzXJITRHOJiwMmmYMgZfdoWQsfQcY+iKlxiBppnMA==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.10" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/roboto-fontface": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz", + "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "devOptional": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "devOptional": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "devOptional": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", + "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "chokidar": "^3.6.0", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/unplugin-fonts": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unplugin-fonts/-/unplugin-fonts-1.1.1.tgz", + "integrity": "sha512-/Aw/rL9D2aslGGM0vi+2R2aG508RSwawLnnBuo+JDSqYc4cHJO1R1phllhN6GysEhBp/6a4B6+vSFPVapWyAAw==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.12", + "unplugin": "^1.3.1" + }, + "peerDependencies": { + "@nuxt/kit": "^3.0.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", + "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.6", + "@rollup/pluginutils": "^5.0.4", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.3", + "minimatch": "^9.0.3", + "resolve": "^1.22.4", + "unplugin": "^1.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-router": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.10.0.tgz", + "integrity": "sha512-t9cwRvNONcrh7CZLUYrd4kGOH4xZRhsHeT+exaAuYFn7z87pkTHiHh3wBnGerfKGs22SnmJIIjcKyEa62CO+4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@rollup/pluginutils": "^5.1.0", + "@vue-macros/common": "^1.10.4", + "ast-walker-scope": "^0.6.1", + "chokidar": "^3.6.0", + "fast-glob": "^3.3.2", + "json5": "^2.2.3", + "local-pkg": "^0.5.0", + "mlly": "^1.7.1", + "pathe": "^1.1.2", + "scule": "^1.3.0", + "unplugin": "^1.10.1", + "yaml": "^2.4.5" + }, + "peerDependencies": { + "vue-router": "^4.4.0" + }, + "peerDependenciesMeta": { + "vue-router": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-router/node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "devOptional": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", + "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "devOptional": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-layouts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-layouts/-/vite-plugin-vue-layouts-0.11.0.tgz", + "integrity": "sha512-uh6NW7lt+aOXujK4eHfiNbeo55K9OTuB7fnv+5RVc4OBn/cZull6ThXdYH03JzKanUfgt6QZ37NbbtJ0og59qw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "fast-glob": "^3.3.2" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.4", + "vue-router": "^4.0.11" + } + }, + "node_modules/vite-plugin-vuetify": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.0.3.tgz", + "integrity": "sha512-HbYajgGgb/noaVKNRhnnXIiQZrNXfNIeanUGAwXgOxL6h/KULS40Uf51Kyz8hNmdegF+DwjgXXI/8J1PNS83xw==", + "devOptional": true, + "dependencies": { + "@vuetify/loader-shared": "^2.0.3", + "debug": "^4.3.3", + "upath": "^2.0.1" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": ">=5", + "vue": "^3.0.0", + "vuetify": "^3.0.0" + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.30.tgz", + "integrity": "sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==", + "dependencies": { + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-sfc": "3.4.30", + "@vue/runtime-dom": "3.4.30", + "@vue/server-renderer": "3.4.30", + "@vue/shared": "3.4.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.0.tgz", + "integrity": "sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==", + "dev": true, + "peer": true, + "dependencies": { + "@vue/devtools-api": "^6.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.22.tgz", + "integrity": "sha512-lMBIwPBO0sxCcmvu45yt1b035AaQ8/XSXQDk8m75y4j0jSXY/y/XzfEtssQ9JMS47lDaR10O3/926oCs8OeGUw==", + "dev": true, + "dependencies": { + "@volar/typescript": "~2.3.1", + "@vue/language-core": "2.0.22", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vuetify": { + "version": "3.6.10", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.6.10.tgz", + "integrity": "sha512-Myd9+EFq4Gmu61yKPNVS0QdGQkcZ9cHom27wuvRw7jgDxM+X4MT9BwQRk/Dt1q3G3JlK8oh+ZYyq5Ps/Z73cMg==", + "engines": { + "node": "^12.20 || >=14.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" + }, + "peerDependencies": { + "typescript": ">=4.7", + "vite-plugin-vuetify": ">=1.0.0", + "vue": "^3.3.0", + "vue-i18n": "^9.0.0", + "webpack-plugin-vuetify": ">=2.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vite-plugin-vuetify": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "webpack-plugin-vuetify": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..10f034f --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,33 @@ +{ + "name": "passcheck", + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@mdi/font": "6.2.95", + "crypto-js": "^4.2.0", + "express": "^4.19.2", + "js-sha3": "^0.9.3", + "roboto-fontface": "*", + "vue": "^3.4.21", + "vuetify": "^3.5.8" + }, + "devDependencies": { + "@babel/types": "^7.24.0", + "@types/crypto-js": "^4.2.2", + "@types/node": "^20.11.25", + "@vitejs/plugin-vue": "^5.0.4", + "sass": "^1.71.1", + "typescript": "^5.4.2", + "unplugin-fonts": "^1.1.1", + "unplugin-vue-components": "^0.26.0", + "unplugin-vue-router": "^0.10.0", + "vite": "^5.1.5", + "vite-plugin-vue-layouts": "^0.11.0", + "vite-plugin-vuetify": "^2.0.3", + "vue-tsc": "^2.0.6" + } +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..466d091de1ce63940a0f76b7451b7fe71c8a7b3a GIT binary patch literal 173842 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 by#N0PuhYd1M{Ddt00000NkvXXu0mjf4WJ-( literal 0 HcmV?d00001 diff --git a/frontend/server.js b/frontend/server.js new file mode 100644 index 0000000..45dcd8e --- /dev/null +++ b/frontend/server.js @@ -0,0 +1,14 @@ +const express = require("express"); +const path = require("path"); +const app = express(); +const PORT = process.env.PORT || 3000; + +app.use(express.static(path.join(__dirname, "dist"))); + +app.get("*", (req, res) => { + res.sendFile(path.resolve(__dirname, "dist", "index.html")); +}); + +app.listen(PORT, () => { + console.log(`Server is running on http://localhost:${PORT}`); +}); diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..6f5c110 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/frontend/src/assets/logo.svg b/frontend/src/assets/logo.svg new file mode 100644 index 0000000..0415a8a --- /dev/null +++ b/frontend/src/assets/logo.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue new file mode 100644 index 0000000..4454b46 --- /dev/null +++ b/frontend/src/components/HelloWorld.vue @@ -0,0 +1,91 @@ + + + + + + diff --git a/frontend/src/components/README.md b/frontend/src/components/README.md new file mode 100644 index 0000000..d1dc92f --- /dev/null +++ b/frontend/src/components/README.md @@ -0,0 +1,35 @@ +# Components + +Vue template files in this folder are automatically imported. + +## 🚀 Usage + +Importing is handled by [unplugin-vue-components](https://github.com/unplugin/unplugin-vue-components). This plugin automatically imports `.vue` files created in the `src/components` directory, and registers them as global components. This means that you can use any component in your application without having to manually import it. + +The following example assumes a component located at `src/components/MyComponent.vue`: + +```vue + + + +``` + +When your template is rendered, the component's import will automatically be inlined, which renders to this: + +```vue + + + +``` diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..6b73a35 --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,11 @@ +import { registerPlugins } from "@/plugins"; + +import App from "./App.vue"; + +import { createApp } from "vue"; + +const app = createApp(App); + +registerPlugins(app); + +app.mount("#app"); diff --git a/frontend/src/plugins/README.md b/frontend/src/plugins/README.md new file mode 100644 index 0000000..62201c7 --- /dev/null +++ b/frontend/src/plugins/README.md @@ -0,0 +1,3 @@ +# Plugins + +Plugins are a way to extend the functionality of your Vue application. Use this folder for registering plugins that you want to use globally. diff --git a/frontend/src/plugins/index.ts b/frontend/src/plugins/index.ts new file mode 100644 index 0000000..818042a --- /dev/null +++ b/frontend/src/plugins/index.ts @@ -0,0 +1,15 @@ +/** + * plugins/index.ts + * + * Automatically included in `./src/main.ts` + */ + +// Plugins +import vuetify from './vuetify' + +// Types +import type { App } from 'vue' + +export function registerPlugins (app: App) { + app.use(vuetify) +} diff --git a/frontend/src/plugins/vuetify.ts b/frontend/src/plugins/vuetify.ts new file mode 100644 index 0000000..7652788 --- /dev/null +++ b/frontend/src/plugins/vuetify.ts @@ -0,0 +1,19 @@ +/** + * plugins/vuetify.ts + * + * Framework documentation: https://vuetifyjs.com` + */ + +// Styles +import '@mdi/font/css/materialdesignicons.css' +import 'vuetify/styles' + +// Composables +import { createVuetify } from 'vuetify' + +// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides +export default createVuetify({ + theme: { + defaultTheme: 'dark', + }, +}) diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 0000000..323c78a --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..02e7ef4 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "ESNext", + "jsx": "preserve", + "lib": ["DOM", "ESNext"], + "baseUrl": ".", + "module": "ESNext", + "moduleResolution": "bundler", + "paths": { + "@/*": ["src/*"] + }, + "resolveJsonModule": true, + "types": [ + "vite/client", + "vite-plugin-vue-layouts/client", + "unplugin-vue-router/client" + ], + "allowJs": true, + "strict": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "skipLibCheck": true + }, + "include": [ + "src/**/*", + "src/**/*.vue" + ], + "exclude": ["dist", "node_modules", "cypress"], + "references": [{ "path": "./tsconfig.node.json" }], +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..348f346 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.mts"] +} diff --git a/frontend/vite.config.mts b/frontend/vite.config.mts new file mode 100644 index 0000000..b8d760e --- /dev/null +++ b/frontend/vite.config.mts @@ -0,0 +1,47 @@ +// Plugins +import Components from 'unplugin-vue-components/vite' +import Vue from '@vitejs/plugin-vue' +import Vuetify, { transformAssetUrls } from 'vite-plugin-vuetify' +import ViteFonts from 'unplugin-fonts/vite' + +// Utilities +import { defineConfig } from 'vite' +import { fileURLToPath, URL } from 'node:url' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + Vue({ + template: { transformAssetUrls }, + }), + // https://github.com/vuetifyjs/vuetify-loader/tree/master/packages/vite-plugin#readme + Vuetify(), + Components(), + ViteFonts({ + google: { + families: [{ + name: 'Roboto', + styles: 'wght@100;300;400;500;700;900', + }], + }, + }), + ], + define: { 'process.env': {} }, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + extensions: [ + '.js', + '.json', + '.jsx', + '.mjs', + '.ts', + '.tsx', + '.vue', + ], + }, + server: { + port: 3000, + }, +}) diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..1d7901e --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +/__pycache__ \ No newline at end of file diff --git a/test/api_test.py b/test/api_test.py new file mode 100644 index 0000000..1f2d7c8 --- /dev/null +++ b/test/api_test.py @@ -0,0 +1,36 @@ +import requests + +def test_check_hash_nohit(): + no_results = requests.get('http://localhost:8080?hash=0654804158fd3078157c3dce72f60424e275bd300ce1d1f8433124ec8dd8cbe1125ce8a1d5efd585b0546707adf171a8f98c014ba8b4f5a09518c6b063d3f057') + assert no_results.status_code == 200 + assert no_results.json() == {'data': 'No matches found'} + + +def test_check_hash_hit(): + results = requests.get('http://localhost:8080?hash=0430c0ebb2398fda098d1acc0372de9b4c73a0e52bad59385a691cf61520f7dcb808fd75789d7094dbf4b452c3b1c9bc8f741cd2cbde2ec354b34a22e22be745') + assert results.status_code == 200 + + file_list = results.json()['data'].split(", ") + + # file_list must contain: "500-worst-passwords.txt, best1050.txt, 10-million-password-list-top-1000.txt, 10k-most-common.txt, 10-million-password-list-top-500.txt, 10-million-password-list-top-10000.txt, 100k-most-used-passwords-NCSC.txt, 10-million-password-list-top-100000.txt, 10-million-password-list-top-1000000.txt" + + expected_files = [ + "10-million-password-list-top-500.txt", + "10-million-password-list-top-1000.txt", + "10-million-password-list-top-10000.txt", + "10-million-password-list-top-100000.txt", + "10-million-password-list-top-1000000.txt", + "500-worst-passwords.txt", + "best1050.txt", + "10k-most-common.txt", + "100k-most-used-passwords-NCSC.txt" + ] + + for file in expected_files: + assert file in file_list + + +def test_single_hit(): + results = requests.get('http://localhost:8080?hash=002e136b5760c542271a09cf623a62fd990a23694cf99a5c9306e09c46d8ad6b14100606dd56bf2053626e1a94ccbca54a0b534d695abc0348a396a379677b61') + assert results.status_code == 200 + assert results.json() == {'data': '1900-2020.txt'} \ No newline at end of file diff --git a/test/run.sh b/test/run.sh new file mode 100644 index 0000000..e91487a --- /dev/null +++ b/test/run.sh @@ -0,0 +1 @@ +pytest ./*.py \ No newline at end of file