diff --git a/.gitignore b/.gitignore index dcaa358..8e175db 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,10 @@ Desktop.ini /*.code-workspace +# Downloadable & installable modules & components +# +/node_modules/ + # Environmental files # .env diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..aa30e11 --- /dev/null +++ b/bun.lock @@ -0,0 +1,491 @@ +{ + "lockfileVersion": 1, + "configVersion": 0, + "workspaces": { + "": { + "name": "@byloth/cmangos-docker", + }, + "docs": { + "name": "@byloth/cmangos-docker-docs", + "devDependencies": { + "vitepress": "^1.6.4", + "vue": "^3.5.26", + }, + }, + }, + "packages": { + "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.17.7", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" } }, "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q=="], + + "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A=="], + + "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA=="], + + "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.7", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg=="], + + "@algolia/client-abtesting": ["@algolia/client-abtesting@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-oGMaBCIpvz3n+4rCz/73ldo/Dw95YFx6+MAQkNiCfsgolB2tduaiZvNOvdkm86eKqSKDDBGBo54GQXZ5YX6Bjg=="], + + "@algolia/client-analytics": ["@algolia/client-analytics@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-G+TTdNnuwUSy8evolyNE3I74uSIXPU4LLDnJmB4d6TkLvvzMAjwsMBuHHjwYpw37+c4tH0dT4u+39cyxrZNojg=="], + + "@algolia/client-common": ["@algolia/client-common@5.28.0", "", {}, "sha512-lqa0Km1/YWfPplNB8jX9kstaCl2LO6ziQAJEBtHxw2sJp/mlxJIAuudBUbEhoUrKQvI7N4erNYawl6ejic7gfw=="], + + "@algolia/client-insights": ["@algolia/client-insights@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-pGsDrlnt0UMXDjQuIpKQSfl7PVx+KcqcwVgkgITwQ45akckTwmbpaV4rZF2k3wgIbOECFZGnpArWF5cSrE4T3g=="], + + "@algolia/client-personalization": ["@algolia/client-personalization@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-d/Uot/LH8YJeFyqpAmTN/LxueqV5mLD5K4aAKTDVP4CBNNubX4Z+0sveRcxWQZiORVLrs5zR1G5Buxmab2Xb9w=="], + + "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-XygCxyxJ5IwqsTrzpsAG2O/lr8GsnMA3ih7wzbXtot+ZyAhzDUFwlQSjCCmjACNbrBEaIvtiGbjX/z+HZd902Q=="], + + "@algolia/client-search": ["@algolia/client-search@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-zLEddu9TEwFT/YUJkA3oUwqQYHeGEj64fi0WyVRq+siJVfxt4AYkFfcMBcSr2iR1Wo9Mk10IPOhk3DUr0TSncg=="], + + "@algolia/ingestion": ["@algolia/ingestion@1.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-dmkoSQ+bzC5ryDu2J4MTRDxuh5rZg6sHNawgBfSC/iNttEzeogCyvdxg+uWMErJuSlZk9oENykhETMkSFurwpQ=="], + + "@algolia/monitoring": ["@algolia/monitoring@1.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-XwVpkxc2my2rNUWbHo4Dk1Mx/JOrq6CLOAC3dmIrMt2Le2bIPMIDA6Iyjz4F4kXvp7H8q1R26cRMlYmhL31Jlg=="], + + "@algolia/recommend": ["@algolia/recommend@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-MVqY7zIw0TdQUExefGthydLXccbe5CHH/uOxIG8/QiSD0ZmAmg95UwfmJiJBfuXGGi/cmCrW3JQiDbAM9vx6PA=="], + + "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0" } }, "sha512-RfxbCinf+coQgxRkDKmRiB/ovOt3Fz0md84LmogsQIabrJVKoQrFON4Vc9YdK2bTTn6iBHtnezm0puNTk+n3SA=="], + + "@algolia/requester-fetch": ["@algolia/requester-fetch@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0" } }, "sha512-85ZBqPTQ5tjiZ925V89ttE/vUJXpJjy2cCF7PAWq9v32JGGF+v+mDm8NiEBRk9AS7+4klb/uR80KBdcg5bO7cA=="], + + "@algolia/requester-node-http": ["@algolia/requester-node-http@5.28.0", "", { "dependencies": { "@algolia/client-common": "5.28.0" } }, "sha512-U3F4WeExiKx1Ig6OxO9dDzzk04HKgtEn47TwjgKmGSDPFM7WZ5KyP1EAZEbfd3/nw6hp0z9RKdTfMql6Sd1/2Q=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], + + "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], + + "@byloth/cmangos-docker-docs": ["@byloth/cmangos-docker-docs@workspace:docs"], + + "@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="], + + "@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="], + + "@docsearch/react": ["@docsearch/react@3.8.2", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.39", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-XlhW73c4dHvUrwWckVY76HDjnaZ2fWKD6hNZtd5kuv23GC0g3Lu0MXnYscpkIYOeiXO+Gtlw8FM53J7C84mCtA=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.44.0", "", { "os": "android", "cpu": "arm" }, "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.44.0", "", { "os": "android", "cpu": "arm64" }, "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.44.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.44.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.44.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.44.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.44.0", "", { "os": "linux", "cpu": "arm" }, "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.44.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.44.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.44.0", "", { "os": "linux", "cpu": "none" }, "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.44.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.44.0", "", { "os": "linux", "cpu": "x64" }, "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.44.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.44.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.44.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ=="], + + "@shikijs/core": ["@shikijs/core@2.5.0", "", { "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw=="], + + "@shikijs/langs": ["@shikijs/langs@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w=="], + + "@shikijs/themes": ["@shikijs/themes@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw=="], + + "@shikijs/transformers": ["@shikijs/transformers@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" } }, "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg=="], + + "@shikijs/types": ["@shikijs/types@2.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], + + "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="], + + "@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], + + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.26", "", { "dependencies": { "@vue/compiler-core": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A=="], + + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", "@vue/compiler-dom": "3.5.26", "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA=="], + + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], + + "@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="], + + "@vue/devtools-kit": ["@vue/devtools-kit@7.7.7", "", { "dependencies": { "@vue/devtools-shared": "^7.7.7", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA=="], + + "@vue/devtools-shared": ["@vue/devtools-shared@7.7.7", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw=="], + + "@vue/reactivity": ["@vue/reactivity@3.5.26", "", { "dependencies": { "@vue/shared": "3.5.26" } }, "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ=="], + + "@vue/runtime-core": ["@vue/runtime-core@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q=="], + + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/runtime-core": "3.5.26", "@vue/shared": "3.5.26", "csstype": "^3.2.3" } }, "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ=="], + + "@vue/server-renderer": ["@vue/server-renderer@3.5.26", "", { "dependencies": { "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "vue": "3.5.26" } }, "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA=="], + + "@vue/shared": ["@vue/shared@3.5.26", "", {}, "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A=="], + + "@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="], + + "@vueuse/integrations": ["@vueuse/integrations@12.8.2", "", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g=="], + + "@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="], + + "@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="], + + "algoliasearch": ["algoliasearch@5.28.0", "", { "dependencies": { "@algolia/client-abtesting": "5.28.0", "@algolia/client-analytics": "5.28.0", "@algolia/client-common": "5.28.0", "@algolia/client-insights": "5.28.0", "@algolia/client-personalization": "5.28.0", "@algolia/client-query-suggestions": "5.28.0", "@algolia/client-search": "5.28.0", "@algolia/ingestion": "1.28.0", "@algolia/monitoring": "1.28.0", "@algolia/recommend": "5.28.0", "@algolia/requester-browser-xhr": "5.28.0", "@algolia/requester-fetch": "5.28.0", "@algolia/requester-node-http": "5.28.0" } }, "sha512-FCRzwW+/TJFQIfo+DxObo2gfn4+0aGa7sVQgCN1/ojKqrhb/7Scnuyi4FBS0zvNCgOZBMms+Ci2hyQwsgAqIzg=="], + + "birpc": ["birpc@2.4.0", "", {}, "sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], + + "entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], + + "esbuild": ["esbuild@0.21.5", "", { "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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "focus-trap": ["focus-trap@7.6.5", "", { "dependencies": { "tabbable": "^6.2.0" } }, "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "minisearch": ["minisearch@7.1.2", "", {}, "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA=="], + + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="], + + "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "preact": ["preact@10.26.9", "", {}, "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="], + + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rollup": ["rollup@4.44.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.44.0", "@rollup/rollup-android-arm64": "4.44.0", "@rollup/rollup-darwin-arm64": "4.44.0", "@rollup/rollup-darwin-x64": "4.44.0", "@rollup/rollup-freebsd-arm64": "4.44.0", "@rollup/rollup-freebsd-x64": "4.44.0", "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", "@rollup/rollup-linux-arm-musleabihf": "4.44.0", "@rollup/rollup-linux-arm64-gnu": "4.44.0", "@rollup/rollup-linux-arm64-musl": "4.44.0", "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-gnu": "4.44.0", "@rollup/rollup-linux-riscv64-musl": "4.44.0", "@rollup/rollup-linux-s390x-gnu": "4.44.0", "@rollup/rollup-linux-x64-gnu": "4.44.0", "@rollup/rollup-linux-x64-musl": "4.44.0", "@rollup/rollup-win32-arm64-msvc": "4.44.0", "@rollup/rollup-win32-ia32-msvc": "4.44.0", "@rollup/rollup-win32-x64-msvc": "4.44.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA=="], + + "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], + + "shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "speakingurl": ["speakingurl@14.0.1", "", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="], + + "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="], + + "vitepress": ["vitepress@1.6.4", "", { "dependencies": { "@docsearch/css": "3.8.2", "@docsearch/js": "3.8.2", "@iconify-json/simple-icons": "^1.2.21", "@shikijs/core": "^2.1.0", "@shikijs/transformers": "^2.1.0", "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", "@vueuse/core": "^12.4.0", "@vueuse/integrations": "^12.4.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", "shiki": "^2.1.0", "vite": "^5.4.14", "vue": "^3.5.13" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg=="], + + "vue": ["vue@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", "@vue/runtime-dom": "3.5.26", "@vue/server-renderer": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@vueuse/core/vue": ["vue@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/compiler-sfc": "3.5.17", "@vue/runtime-dom": "3.5.17", "@vue/server-renderer": "3.5.17", "@vue/shared": "3.5.17" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g=="], + + "@vueuse/integrations/vue": ["vue@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/compiler-sfc": "3.5.17", "@vue/runtime-dom": "3.5.17", "@vue/server-renderer": "3.5.17", "@vue/shared": "3.5.17" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g=="], + + "@vueuse/shared/vue": ["vue@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/compiler-sfc": "3.5.17", "@vue/runtime-dom": "3.5.17", "@vue/server-renderer": "3.5.17", "@vue/shared": "3.5.17" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g=="], + + "@vueuse/core/vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.17", "", { "dependencies": { "@vue/compiler-core": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ=="], + + "@vueuse/core/vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/compiler-core": "3.5.17", "@vue/compiler-dom": "3.5.17", "@vue/compiler-ssr": "3.5.17", "@vue/shared": "3.5.17", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww=="], + + "@vueuse/core/vue/@vue/runtime-dom": ["@vue/runtime-dom@3.5.17", "", { "dependencies": { "@vue/reactivity": "3.5.17", "@vue/runtime-core": "3.5.17", "@vue/shared": "3.5.17", "csstype": "^3.1.3" } }, "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g=="], + + "@vueuse/core/vue/@vue/server-renderer": ["@vue/server-renderer@3.5.17", "", { "dependencies": { "@vue/compiler-ssr": "3.5.17", "@vue/shared": "3.5.17" }, "peerDependencies": { "vue": "3.5.17" } }, "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA=="], + + "@vueuse/core/vue/@vue/shared": ["@vue/shared@3.5.17", "", {}, "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg=="], + + "@vueuse/integrations/vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.17", "", { "dependencies": { "@vue/compiler-core": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/compiler-core": "3.5.17", "@vue/compiler-dom": "3.5.17", "@vue/compiler-ssr": "3.5.17", "@vue/shared": "3.5.17", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww=="], + + "@vueuse/integrations/vue/@vue/runtime-dom": ["@vue/runtime-dom@3.5.17", "", { "dependencies": { "@vue/reactivity": "3.5.17", "@vue/runtime-core": "3.5.17", "@vue/shared": "3.5.17", "csstype": "^3.1.3" } }, "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g=="], + + "@vueuse/integrations/vue/@vue/server-renderer": ["@vue/server-renderer@3.5.17", "", { "dependencies": { "@vue/compiler-ssr": "3.5.17", "@vue/shared": "3.5.17" }, "peerDependencies": { "vue": "3.5.17" } }, "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA=="], + + "@vueuse/integrations/vue/@vue/shared": ["@vue/shared@3.5.17", "", {}, "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg=="], + + "@vueuse/shared/vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.17", "", { "dependencies": { "@vue/compiler-core": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ=="], + + "@vueuse/shared/vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/compiler-core": "3.5.17", "@vue/compiler-dom": "3.5.17", "@vue/compiler-ssr": "3.5.17", "@vue/shared": "3.5.17", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww=="], + + "@vueuse/shared/vue/@vue/runtime-dom": ["@vue/runtime-dom@3.5.17", "", { "dependencies": { "@vue/reactivity": "3.5.17", "@vue/runtime-core": "3.5.17", "@vue/shared": "3.5.17", "csstype": "^3.1.3" } }, "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g=="], + + "@vueuse/shared/vue/@vue/server-renderer": ["@vue/server-renderer@3.5.17", "", { "dependencies": { "@vue/compiler-ssr": "3.5.17", "@vue/shared": "3.5.17" }, "peerDependencies": { "vue": "3.5.17" } }, "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA=="], + + "@vueuse/shared/vue/@vue/shared": ["@vue/shared@3.5.17", "", {}, "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg=="], + + "@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA=="], + + "@vueuse/core/vue/@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@vueuse/core/vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA=="], + + "@vueuse/core/vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ=="], + + "@vueuse/core/vue/@vue/compiler-sfc/magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "@vueuse/core/vue/@vue/runtime-dom/@vue/reactivity": ["@vue/reactivity@3.5.17", "", { "dependencies": { "@vue/shared": "3.5.17" } }, "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw=="], + + "@vueuse/core/vue/@vue/runtime-dom/@vue/runtime-core": ["@vue/runtime-core@3.5.17", "", { "dependencies": { "@vue/reactivity": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q=="], + + "@vueuse/core/vue/@vue/runtime-dom/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "@vueuse/core/vue/@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ=="], + + "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "@vueuse/integrations/vue/@vue/runtime-dom/@vue/reactivity": ["@vue/reactivity@3.5.17", "", { "dependencies": { "@vue/shared": "3.5.17" } }, "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw=="], + + "@vueuse/integrations/vue/@vue/runtime-dom/@vue/runtime-core": ["@vue/runtime-core@3.5.17", "", { "dependencies": { "@vue/reactivity": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q=="], + + "@vueuse/integrations/vue/@vue/runtime-dom/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "@vueuse/integrations/vue/@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ=="], + + "@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.17", "", { "dependencies": { "@babel/parser": "^7.27.5", "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "@vueuse/shared/vue/@vue/runtime-dom/@vue/reactivity": ["@vue/reactivity@3.5.17", "", { "dependencies": { "@vue/shared": "3.5.17" } }, "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw=="], + + "@vueuse/shared/vue/@vue/runtime-dom/@vue/runtime-core": ["@vue/runtime-core@3.5.17", "", { "dependencies": { "@vue/reactivity": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q=="], + + "@vueuse/shared/vue/@vue/runtime-dom/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "@vueuse/shared/vue/@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.17", "", { "dependencies": { "@vue/compiler-dom": "3.5.17", "@vue/shared": "3.5.17" } }, "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ=="], + + "@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "@vueuse/core/vue/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@vueuse/core/vue/@vue/compiler-sfc/@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "@vueuse/core/vue/@vue/compiler-sfc/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": "./bin/babel-parser.js" }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/@vue/compiler-core/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@vueuse/core/vue/@vue/compiler-sfc/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@vueuse/integrations/vue/@vue/compiler-sfc/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@vueuse/shared/vue/@vue/compiler-sfc/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + } +} diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..46a9b3c --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,4 @@ +# Generated & compiled files +# +/.vitepress/cache/ +/.vitepress/dist/ diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..e88f98a --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,108 @@ +import { fileURLToPath, URL } from "node:url"; +import { defineConfig } from 'vitepress' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + lang: "en-US", + title: "CMaNGOS on Docker", + description: "A collection of ready-to-use Docker images to host your WoW emulated private server wherever you want.", + head: [ + // All browsers + ["link", { rel: "icon", href: "/favicons/logo-16x16.png", sizes: "16x16", type: "image.png" }], + ["link", { rel: "icon", href: "/favicons/logo-32x32.png", sizes: "32x32", type: "image.png" }], + + // Google & Android + ["link", { rel: "icon", href: "/favicons/logo-48x48.png", sizes: "48x48", type: "image.png" }], + ["link", { rel: "icon", href: "/favicons/logo-192x192.png", sizes: "192x192", type: "image.png" }], + + // iPad + ["link", { rel: "apple-touch-icon", href: "/favicons/logo-167x167.png", sizes: "167x167", type: "image.png" }], + + // iPhone + ["link", { rel: "apple-touch-icon", href: "/favicons/logo-180x180.png", sizes: "180x180", type: "image.png" }], + + ["script", { + "src": "https://cloud.umami.is/script.js", + "data-website-id": "46e2a043-e364-4c30-8561-45e4e4797398", + "defer": "" + }] + ], + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + logo: "/logo.png", + nav: [ + { text: 'Home', link: '/' }, + { text: 'Guide', link: '/guide/introduction' } + ], + + sidebar: [ + { + text: 'Getting Started', + items: [ + { text: 'Introduction', link: '/guide/introduction' }, + { text: 'Requirements', link: '/guide/requirements' }, + { text: 'Getting Started', link: '/guide/getting-started' } + ] + }, + { + text: 'Server Management', + items: [ + { text: 'Server Administration', link: '/guide/server-administration' }, + { text: 'Server Configuration', link: '/guide/server-configuration' }, + { text: 'Database Management', link: '/guide/database-management' } + ] + }, + { + text: 'Maintenance', + items: [ + { text: 'Installing Updates', link: '/guide/install-updates' } + ] + }, + { + text: 'Advanced', + items: [ + { text: 'Customization', link: '/guide/customization' }, + { text: 'Use in Production', link: '/guide/use-in-production' } + ] + } + ], + + socialLinks: [ + { icon: 'github', link: 'https://github.com/Byloth/cmangos-docker' } + ], + footer: { + message: `Released under the + + CC BY-SA 4.0 License.`, + copyright: `Copyright © 2014-${new Date().getFullYear()} + + Matteo Bilotta.` + }, + + editLink: { + pattern: 'https://github.com/Byloth/cmangos-docker/edit/master/docs/:path', + text: 'Edit this page on GitHub' + }, + + search: { + provider: 'local' + }, + + lastUpdated: { + text: 'Last updated', + formatOptions: { + dateStyle: 'medium' + } + } + }, + vite: { + resolve: { + alias: { "@": fileURLToPath(new URL("../src", import.meta.url)) } + } + }, + lastUpdated: true, + ignoreDeadLinks: [ + // Ignore localhost links (they're examples for the user) + /^http:\/\/localhost/ + ] +}) diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..def4cfc --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,17 @@ +// https://vitepress.dev/guide/custom-theme +import { h } from 'vue' +import type { Theme } from 'vitepress' +import DefaultTheme from 'vitepress/theme' +import './style.css' + +export default { + extends: DefaultTheme, + Layout: () => { + return h(DefaultTheme.Layout, null, { + // https://vitepress.dev/guide/extending-default-theme#layout-slots + }) + }, + enhanceApp({ app, router, siteData }) { + // ... + } +} satisfies Theme diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css new file mode 100644 index 0000000..638c25c --- /dev/null +++ b/docs/.vitepress/theme/style.css @@ -0,0 +1,150 @@ +/** + * Customize default theme styling by overriding CSS variables: + * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css + */ + +/** + * Colors + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * + * - `XXX-2`: The color used mainly for hover state of the button. + * + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create a accent, such as when having inline code block inside + * custom containers. + * + * - `default`: The color used purely for subtle indication without any + * special meanings attached to it such as bg color for menu hover state. + * + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + * -------------------------------------------------------------------------- */ + +:root +{ + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--vp-c-indigo-1); + --vp-c-brand-2: var(--vp-c-indigo-2); + --vp-c-brand-3: var(--vp-c-indigo-3); + --vp-c-brand-soft: var(--vp-c-indigo-soft); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root +{ + --vp-button-brand-border: transparent; + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: var(--vp-c-brand-3); + --vp-button-brand-hover-border: transparent; + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: var(--vp-c-brand-2); + --vp-button-brand-active-border: transparent; + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: var(--vp-c-brand-1); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root +{ + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient( + -60deg, #f47731, #f5594e, #ea3f68, #d53080, #b63294, #8e3aa1, #5d41a5, #0c449f + ); + + --vp-home-hero-image-background-image: linear-gradient(-45deg, #f47731 33.333%, #c5318a, #0c449f 66.666%); + + --vp-home-hero-image-filter: blur(44px); +} +.dark +{ + --vp-home-hero-name-background: -webkit-linear-gradient( + -60deg, #fc952f, #ff7b5e, #ff6a8c, #fb6ab6, #d676d7, #a484e8, #678ee8, #1093d7 + ); + + --vp-home-hero-image-background-image: linear-gradient(-45deg, #fc952f 33.333%, #e970c6, #1093d7 66.666%); +} + +@media (min-width: 640px) +{ + :root + { + --vp-home-hero-image-filter: blur(56px); + } +} + +@media (min-width: 960px) +{ + :root + { + --vp-home-hero-image-filter: blur(68px); + } +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root +{ + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); +} + +/** + * Component: Algolia + * -------------------------------------------------------------------------- */ + +.DocSearch +{ + --docsearch-primary-color: var(--vp-c-brand-1) !important; +} diff --git a/docs/guide/customization.md b/docs/guide/customization.md new file mode 100644 index 0000000..71a6da0 --- /dev/null +++ b/docs/guide/customization.md @@ -0,0 +1,49 @@ +# Customization + +::: warning Coming Soon +This page is a placeholder. +Content will be added in a future update. +::: + +This section will cover advanced customization options for your CMaNGOS Docker server, including: + +## Planned topics + +### Custom game rates + +- Experience rates (killing, quests, exploration) +- Drop rates (items, gold) +- Reputation gains +- Skill leveling speed + +### Server rules + +- PvP settings and rules +- Rest experience configuration +- Auction house settings +- Guild and group options + +### World modifications + +- Adding custom NPCs +- Modifying loot tables +- Creating custom quests +- Event scheduling + +### Visual customizations + +- Custom loading screens +- Modified game assets +- Client-side patches + +### Modules and extensions + +- PlayerBots module +- Auction House Bot +- Other community modules + +--- + +::: tip Contribute +If you'd like to help write this documentation, feel free to [open a pull request](https://github.com/Byloth/cmangos-docker/pulls) or [suggest content](https://github.com/Byloth/cmangos-docker/issues/new/choose). +::: diff --git a/docs/guide/database-management.md b/docs/guide/database-management.md new file mode 100644 index 0000000..da736c5 --- /dev/null +++ b/docs/guide/database-management.md @@ -0,0 +1,150 @@ +# Database Management + +::: warning Work in Progress +This page is currently under construction and may be incomplete. +::: + +CMaNGOS uses a MariaDB database to store all game data, player characters, and server logs. +This guide covers common database operations like backups, restores, and running queries. + +## Prerequisites + +Before performing any database operations, make sure the database server is running: + +```sh +docker compose up mariadb -d +``` + +The `-d` flag runs the container in detached mode (background). + +## Backups + +Regular backups are essential for protecting your server data. +CMaNGOS Docker provides built-in tools for creating and restoring backups. + +### Creating a backup + +From within your project directory, run: + +::: code-group + +```sh [All databases] +./builder/run.sh backup-db --all > backups/cmangos_$(date +"%Y-%m-%d_%H-%M-%S").tar.gz +``` + +```sh [World database only] +./builder/run.sh backup-db --world > backups/world_$(date +"%Y-%m-%d").tar.gz +``` + +```sh [Characters database only] +./builder/run.sh backup-db --characters > backups/characters_$(date +"%Y-%m-%d").tar.gz +``` + +::: + +::: tip Backup options +The `backup-db` command supports these flags: +- `--all` — Backup all databases +- `--world` — World data (NPCs, items, quests, etc.) +- `--characters` — Player characters and progression +- `--logs` — Server activity logs +- `--realmd` — Realm and account data +::: + +### Restoring a backup + +To restore from a backup file: + +```sh +./builder/run.sh restore-db < backups/cmangos_2024-01-15_12-30-00.tar.gz +``` + +::: danger Destructive operation +Restoring a backup will **overwrite** the current database contents. +Make sure you have a recent backup of your current data before proceeding. +::: + +## Querying databases + +To execute queries and perform various operations on the databases, CMaNGOS Docker provides both a graphical interface through **[phpMyAdmin](https://www.phpmyadmin.net/)** and the CLI `mysql` command within the `builder` Docker container. + +Choose the one that best suits your needs. + +### Using phpMyAdmin + +phpMyAdmin is included in CMaNGOS Docker but is disabled by default. +To run it, you can either start it manually or use the `debug` profile. + +::: code-group + +```sh [Start manually] +docker compose up phpmyadmin +``` + +```sh [Use debug profile] +docker compose --profile debug up +``` + +::: + +After running one of these commands, visit [`http://localhost:8080`](http://localhost:8080) to access phpMyAdmin's graphical interface. + +::: info Default credentials +Use the database credentials from your `.env` file to log in. +The root user is `root` with the password you set in `MYSQL_SUPERPASS`. +::: + +### Using the MySQL CLI + +For command-line access, you can use the `builder` container to run MySQL commands directly. + +::: code-group + +```sh [Linux / Unix / macOS] +# Execute a single inline query +./builder/run.sh mysql -u root -p {database} -e "SELECT * FROM realmlist;" + +# Execute queries from a file +./builder/run.sh mysql -u root -p {database} < path/to/queries.sql +``` + +```bat [Windows Command Prompt] +:: Execute a single inline query +docker run -it --rm ^ + --network "cmangos_default" ^ + ^ + ghcr.io/byloth/cmangos/{version}/builder:latest mysql -u root -p {database} -e "SELECT * FROM realmlist;" +``` + +```powershell [Windows PowerShell] +# Execute a single inline query +docker run -it --rm ` + --network "cmangos_default" ` + ` + ghcr.io/byloth/cmangos/{version}/builder:latest mysql -u root -p {database} -e "SELECT * FROM realmlist;" +``` + +::: + +::: warning Placeholders +Replace `{database}` with the name of the database you want to query: +- `classicmangos`, `tbcmangos`, or `wotlkmangos` — World data +- `classiccharacters`, `tbccharacters`, or `wotlkcharacters` — Character data +- `classiclogs`, `tbclogs`, or `wotlklogs` — Log data +- `classicrealmd`, `tbcrealmd`, or `wotlkrealmd` — Realm data + +For Windows users, also replace `{version}` with your expansion keyword. +::: + +## Database structure + +CMaNGOS uses four separate databases for each expansion: + +| Database | Purpose | +|----------|---------| +| `{expansion}mangos` | World data (NPCs, items, quests, spells, loot tables, etc.) | +| `{expansion}characters` | Player data (characters, inventories, skills, achievements, etc.) | +| `{expansion}logs` | Server logs (chat, trades, GM commands, etc.) | +| `{expansion}realmd` | Account and realm data (login credentials, realm list, bans, etc.) | + +Where `{expansion}` is one of: `classic`, `tbc`, or `wotlk`. diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md new file mode 100644 index 0000000..3960c68 --- /dev/null +++ b/docs/guide/getting-started.md @@ -0,0 +1,238 @@ +# Getting Started + +One of the main goals of the **CMaNGOS Docker** project is **optimization**. +To achieve this, **two different types** of Docker images have been developed: one used for **maintenance** (larger) and one used for **execution** (smaller and optimized). + +With this principle in mind, we can now begin! + +::: warning Not production-ready +This procedure doesn't describe a _production-ready_ deployment and doesn't delve into security best practices. It's just a simple practical example of a basic CMaNGOS Docker configuration; be careful when using it directly in a production environment. + +If you're looking for more specific guidance, see the [Use in Production](/guide/use-in-production) page. +::: + +## Choose your expansion + +First of all, you have to decide which client version you want your server to support. +Both CMaNGOS and CMaNGOS Docker use **three keywords** to identify it. + +Select the one you need and **keep it in mind** for the next steps: + +| Game name | Game version | Keyword | +|-----------|--------------|---------| +| World of Warcraft | **v1.12.x** | `classic` | +| World of Warcraft: The Burning Crusade | **v2.4.3** | `tbc` | +| World of Warcraft: Wrath of the Lich King | **v3.3.5a** | `wotlk` | + +## Download the project + +Create a new directory on your computer to store everything related to your WoW server. +It's best **NOT** to use the same directory as the game client — keep them separate from each other. + +Download the [`cmangos-docker.zip`](https://github.com/Byloth/cmangos-docker/archive/refs/heads/master.zip) archive, open it, and extract its contents into the newly created directory. + +::: tip Using Git +If you're familiar with [Git](https://git-scm.com/), you can clone the repository directly instead of downloading the archive: + +```sh +git clone https://github.com/Byloth/cmangos-docker.git +``` +::: + +::: info Keeping files up to date +This archive may be updated over time. +Make sure to check it periodically and follow the [update procedure](/guide/install-updates) when needed. +::: + +## Locate the game client + +To play World of Warcraft, you'll need a legally owned copy of the game installed on your computer. + +Locate the installation directory. On Windows, the default location is typically `C:\Program Files\World of Warcraft`. +Once you find it, copy the full path — we'll need it in the next step. + +## Configure the environment + +The `.env` file is a configuration file that customizes your WoW server setup. + +Since it contains sensitive information (like passwords), it cannot be included pre-configured. To create it, copy the `.env.example` file and rename it to `.env`, then edit it with any text editor. + +### Environment variables + +| Variable | Description | Example | +|----------|-------------|---------| +| `MYSQL_SUPERPASS` | Password for the MySQL `root` administrator account | `root00` | +| `MANGOS_DBUSER` | Username for the application's database connection | `mangos` | +| `MANGOS_DBPASS` | Password for the application's database connection | `mangos00` | +| `WOW_CLIENT_DIR` | Full path to your WoW game installation | `D:\Games\WoW` | +| `WOW_TIMEZONE` | Server timezone ([tz database format](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) | `Europe/Rome` | +| `WOW_VERSION` | Expansion keyword from the table above | `tbc` | + +::: danger Security notice +Choose strong, unique passwords for `MYSQL_SUPERPASS` and `MANGOS_DBPASS`. +The example values (`root00`, `mangos00`) are **not secure** and should only be used for local testing. +::: + +Once you're done, save the file and close your text editor. + +## Extract game data + +Due to legal reasons and copyright policies, CMaNGOS cannot be distributed in a fully _ready-to-run_ state. It requires **additional data files** that are copyrighted by Blizzard Entertainment. + +These files are present within the WoW game client. +If you legally own the game, you can extract them using the CMaNGOS extraction tool. + +::: code-group + +```sh [Linux / Unix / macOS] +./builder/run.sh extract +``` + +```bat [Windows Command Prompt] +docker run -it --rm ^ + --volume "cmangos_mangosd_data:/home/mangos/data" ^ + --volume "{path}:/home/mangos/wow-client" ^ + ^ + ghcr.io/byloth/cmangos/{version}/builder:latest extract +``` + +```powershell [Windows PowerShell] +docker run -it --rm ` + --volume "cmangos_mangosd_data:/home/mangos/data" ` + --volume "{path}:/home/mangos/wow-client" ` + ` + ghcr.io/byloth/cmangos/{version}/builder:latest extract +``` + +::: + +::: warning Placeholders +For Windows users: replace `{path}` with your WoW installation directory path and `{version}` with your chosen expansion keyword (`classic`, `tbc`, or `wotlk`). +::: + +::: info Extraction time +This process extracts maps, textures, and other game data. +Depending on your hardware, it may take **30 minutes to several hours** to complete. +::: + +## Initialize the database + +The database stores all game world information: NPCs, items, quests, spells, and much more. This step creates the required databases and populates them with initial data. + +Open a terminal in your project directory and start the database server: + +```sh +docker compose up mariadb +``` + +This terminal will display log output. Leave it running and open a **second terminal** in the same directory. + +In the second terminal, initialize the databases: + +::: code-group + +```sh [Linux / Unix / macOS] +./builder/run.sh init-db +``` + +```bat [Windows Command Prompt] +docker run -it --rm ^ + --env MYSQL_SUPERUSER="root" ^ + --env MYSQL_SUPERPASS="root00" ^ + --env MANGOS_DBHOST="mariadb" ^ + --env MANGOS_DBUSER="mangos" ^ + --env MANGOS_DBPASS="mangos00" ^ + --network "cmangos_default" ^ + --volume "cmangos_mangosd_data:/home/mangos/data" ^ + ^ + ghcr.io/byloth/cmangos/{version}/builder:latest init-db +``` + +```powershell [Windows PowerShell] +docker run -it --rm ` + --env MYSQL_SUPERUSER="root" ` + --env MYSQL_SUPERPASS="root00" ` + --env MANGOS_DBHOST="mariadb" ` + --env MANGOS_DBUSER="mangos" ` + --env MANGOS_DBPASS="mangos00" ` + --network "cmangos_default" ` + --volume "cmangos_mangosd_data:/home/mangos/data" ` + ` + ghcr.io/byloth/cmangos/{version}/builder:latest init-db +``` + +::: + +::: warning Placeholders +For Windows users: replace `{version}` with the correct expansion keyword and update the environment variable values to match your `.env` file. +::: + +Once initialization completes, return to the first terminal and press `Ctrl+C` to stop the database server. + +## Start the server + +You're now ready to run your WoW server for the first time! + +From your project directory, run: + +```sh +docker compose up +``` + +The terminal will display server logs. As long as messages are being printed, your server is running. + +::: tip Running in background +To run the server in the background (detached mode), add the `-d` flag: + +```sh +docker compose up -d +``` + +You can then view logs with `docker compose logs -f` and stop with `docker compose down`. +::: + +## Connect to your server + +To play on your server, you need to configure the WoW client to connect to it. + +### Edit realmlist.wtf + +Locate the `realmlist.wtf` file inside your WoW client's `Data` directory and open it with a text editor. + +Replace its contents with: + +``` +set realmlist 127.0.0.1 +``` + +::: info Remote connections +If you're connecting from a different computer on your network, replace `127.0.0.1` with the server machine's IP address. +For internet connections, you'll need to configure port forwarding on your router. +::: + +### Create an account + +Before you can log in, you need to create a game account. +See the [Server Administration](/guide/server-administration) guide for instructions on creating accounts and managing users. + +## Stop the server + +To stop the server gracefully, press `Ctrl+C` in the terminal where it's running. +This may take a few seconds as the server saves data and disconnects players. + +::: tip Clean shutdown +To ensure everything is properly stopped: + +```sh +docker compose down +``` +::: + +## Next steps + +Now that your server is running, you may want to: + +- [Create user accounts](/guide/server-administration#creating-accounts) to log into the game +- [Configure server settings](/guide/server-configuration) like experience rates or PvP rules +- [Set up the realm list](/guide/server-configuration#realm-configuration) for proper client connections +- [Learn about backups](/guide/database-management#backups) to protect your data diff --git a/docs/guide/install-updates.md b/docs/guide/install-updates.md new file mode 100644 index 0000000..fd25f1c --- /dev/null +++ b/docs/guide/install-updates.md @@ -0,0 +1,102 @@ +# Installing Updates + +::: warning Work in Progress +This page is currently under construction and may be incomplete. +::: + +CMaNGOS Docker images are built and published nightly, incorporating the latest changes from the CMaNGOS project. +This guide explains how to update your server to the latest version. + +::: danger Always backup first! +Before installing any updates, **always** create a [backup](/guide/database-management#creating-a-backup) of your databases. +Updates can occasionally cause issues, and having a recent backup ensures you can recover your data. +::: + +## Update process + +Updating your CMaNGOS Docker installation involves three steps: + +1. Update your local project files (if needed) +2. Pull the latest Docker images +3. Update the database schema + +### Step 1: Update project files + +If there have been changes to the `docker-compose.yml` file or other configuration files, you'll need to update your local copy. + +If you cloned the repository with Git: + +```sh +git pull origin master +``` + +If you downloaded the ZIP archive, download the latest version and carefully merge any changes with your existing files, being careful not to overwrite your customizations. + +::: tip Check the changelog +Before updating, check the [releases page](https://github.com/Byloth/cmangos-docker/releases) or commit history for any breaking changes that might require additional steps. +::: + +### Step 2: Pull latest Docker images + +Download the latest Docker images: + +```sh +docker compose pull +``` + +This command will download any updated images for all services defined in your `docker-compose.yml`. + +### Step 3: Update the database + +After pulling new images, you may need to apply database schema updates: + +```sh +./builder/run.sh update-db +``` + +This command applies any pending database migrations without destroying your existing data. + +::: warning World database updates +Some updates may require a full world database reload. If prompted, or if you experience issues after updating, you can perform a full world database update: + +```sh +./builder/run.sh update-db --world +``` + +**Note:** This will reset world data to defaults but preserves character data. +::: + +## Restarting after updates + +After completing all update steps, restart your server: + +```sh +docker compose down +docker compose up -d +``` + +## Checking versions + +To see which version of CMaNGOS your images were built from, you can inspect the image labels: + +```sh +docker inspect ghcr.io/byloth/cmangos/{version}:latest --format='{{.Config.Labels}}' +``` + +Replace `{version}` with your expansion keyword (`classic`, `tbc`, or `wotlk`). + +## Rollback + +If an update causes problems, you can roll back to a previous version: + +1. Restore your database backup +2. Pull a specific dated image tag: + +```sh +docker pull ghcr.io/byloth/cmangos/{version}:2024-01-14 +``` + +Replace `{version}` with your expansion keyword (`classic`, `tbc`, or `wotlk`). + +3. Update your `docker-compose.yml` to use the specific tag instead of `latest` +4. Restart the server diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md new file mode 100644 index 0000000..cb01b27 --- /dev/null +++ b/docs/guide/introduction.md @@ -0,0 +1,41 @@ +# Introduction + +## What is CMaNGOS Docker? + +**CMaNGOS Docker** is a project that aims to provide the **best possible experience** to anyone interested in running their own [**CMaNGOS**](https://cmangos.net/) server. + +It doesn't matter if you're a **non-technical newcomer** who just wants to play with friends, a **skilled developer** who wants to experiment with the game world, or an **enterprise** looking to deploy multiple realms on a distributed server cluster... CMaNGOS Docker will **make things easy** for all of you! + +## How does it work? + +**CMaNGOS Docker** — as you can tell from the name — is based on [**Docker container**](https://www.docker.com/resources/what-container/) technology, which allows you to run _pre-built_ and _ready-to-use_ applications by simply typing a command into a terminal (among other incredible things). + +The main task for the CMaNGOS Docker project is to **maintain** and **provide** these artifacts (called **Docker images**), while yours is simply to run them. + +--- + +Once you've got [Docker installed](/guide/requirements#installation) on your machine, you're done and ready to go! + +If it's the first time running the server, you may need some [initial configuration](/guide/getting-started#preliminary-configuration) to tell CMaNGOS how you want it to run... +But even this step is simple and straightforward. + +## Why use Docker? + +There are several advantages to using Docker containers over the traditional technology stack. +While I won't cover them all (since that isn't the focus of this document), here are the ones that interest us the most: + +- **No further installations required:** + You won't need to install any additional software, compilers, or libraries. + +- **No wasted disk space:** + Docker executables take up around **500–600 MB**, while a typical CMaNGOS Docker image is less than **200 MB**. + +- **No wasted time:** + You won't have to wait for any compilation steps — just download and run immediately. + +- **No differences between operating systems:** + It doesn't matter what OS you're using: Docker works **everywhere**. + +--- + +_That's it. Simple as that._ diff --git a/docs/guide/requirements.md b/docs/guide/requirements.md new file mode 100644 index 0000000..71986f0 --- /dev/null +++ b/docs/guide/requirements.md @@ -0,0 +1,61 @@ +# Requirements + +::: warning Prerequisites +All the contents of this guide assume a basic knowledge of your **operating system**, its **terminal**, and how to use its **command line interface**. + +These topics won't be covered in this documentation; however, any other software or tools used will be described within the limited scope of their specific implementation. +::: + +## Docker + +[**Docker**](https://www.docker.com/) is the only software required to run this project. + +### Installation + +To install Docker, visit the official [**download page**](https://docs.docker.com/get-docker/) and select your operating system. +The installer will begin downloading; once complete, run it and follow the prompts. + +### Verifying the installation + +To check whether the installation was successful, open a terminal or command prompt and type: + +```sh +docker run --rm hello-world +``` + +You should see output similar to the following: + +``` +Unable to find image 'hello-world:latest' locally +latest: Pulling from library/hello-world +2db29710123e: Pull complete +Digest: sha256:aa0cc8055b82dc2509bed2e19b275c8f463506616377219d9642221ab53cf9fe +Status: Downloaded newer image for hello-world:latest + +Hello from Docker! +This message shows that your installation appears to be working correctly. + +To generate this message, Docker took the following steps: + 1. The Docker client contacted the Docker daemon. + 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. + (amd64) + 3. The Docker daemon created a new container from that image which runs the + executable that produces the output you are currently reading. + 4. The Docker daemon streamed that output to the Docker client, which sent it + to your terminal. + +To try something more ambitious, you can run an Ubuntu container with: + $ docker run -it ubuntu bash + +Share images, automate workflows, and more with a free Docker ID: + https://hub.docker.com/ + +For more examples and ideas, visit: + https://docs.docker.com/get-started/ +``` + +::: tip Linux users +If you're using a Linux-based operating system, you'll probably need to prepend `sudo` to each `docker` command you run. Due to the way Docker works in a Linux environment, it requires superuser privileges. + +[Learn how to run Docker without sudo →](https://docs.docker.com/engine/install/linux-postinstall/) +::: diff --git a/docs/guide/server-administration.md b/docs/guide/server-administration.md new file mode 100644 index 0000000..812940b --- /dev/null +++ b/docs/guide/server-administration.md @@ -0,0 +1,275 @@ +# Server Administration + +This guide covers day-to-day server administration tasks: managing user accounts, assigning permissions, and using the server console. + +## The CMaNGOS console + +The CMaNGOS server (`mangosd`) provides an interactive command-line interface for real-time server management. +Through this console, you can create accounts, modify player data, broadcast messages, and perform various administrative tasks. + +### Accessing the console + +While your server is running, open a new terminal and attach to the server container: + +```sh +docker attach cmangos-mangosd-1 +``` + +You'll now see a command prompt where you can type CMaNGOS commands. + +::: danger Detaching safely +**DO NOT** press `Ctrl+C` to exit the console — this will **stop the entire server** and disconnect all players. + +To safely detach from the console without stopping the server: +1. Press `Ctrl+P` +2. Then press `Ctrl+Q` + +This key sequence detaches your terminal while leaving the server running. +::: + +### Console commands overview + +The console supports hundreds of commands for server management. Here are the most commonly used categories: + +| Category | Example commands | Description | +|----------|------------------|-------------| +| Account | `account create`, `account set` | User account management | +| Server | `server info`, `server shutdown` | Server status and control | +| Player | `character rename`, `kick` | Player management | +| GM | `announce`, `notify` | Game Master tools | +| Debug | `debug`, `log` | Troubleshooting | + +::: tip Getting help +Type `.help` in the console to see all available commands, or `.help ` for details about a specific command. +::: + +## Creating accounts + +Before players can log into your server, they need a game account. + +### Create a new account + +In the CMaNGOS console, type: + +``` +account create {username} {password} +``` + +Replace `{username}` and `{password}` with the desired credentials. + +**Example:** +``` +account create john secretpass123 +``` + +::: warning Password requirements +- Passwords are case-sensitive +- Avoid special characters that might cause issues with the client +- Players can change their password later using the `account set password` command +::: + +### Account information + +To view information about an existing account: + +``` +account {username} +``` + +This displays the account ID, expansion level, GM level, and other details. + +## Expansion access + +Even if your server supports a specific expansion (like WotLK), you can control which expansion content each account can access. +This mimics official servers where players must purchase expansions separately. + +### Expansion levels + +| Level | Access to | Max character level | +|-------|-----------|---------------------| +| `0` | Classic (Vanilla) only | 60 | +| `1` | Classic + The Burning Crusade | 70 | +| `2` | Classic + TBC + Wrath of the Lich King | 80 | + +::: info Cumulative access +Higher levels include all previous content. Setting level `2` grants access to Classic, TBC, and WotLK content. +::: + +### Set expansion level + +``` +account set addon {username} {level} +``` + +**Examples:** +``` +account set addon john 0 # Classic only +account set addon john 1 # Up to TBC +account set addon john 2 # Up to WotLK +``` + +## Game Master levels + +Game Masters (GMs) are privileged users who can perform administrative actions in-game, such as teleporting players, spawning items, or banning cheaters. + +### GM permission levels + +| Level | Role | Capabilities | +|-------|------|--------------| +| `0` | Player | Normal gameplay, no special permissions | +| `1` | Moderator | Can kick players, mute chat, view reports | +| `2` | Game Master | Can teleport, spawn NPCs/items, modify characters | +| `3` | Administrator | Full access to all commands, server management | + +### Assign GM level + +``` +account set gmlevel {username} {level} +``` + +**Examples:** +``` +account set gmlevel john 1 # Promote to Moderator +account set gmlevel john 3 # Promote to Administrator +account set gmlevel john 0 # Remove GM privileges +``` + +::: warning Security consideration +Only grant GM privileges to trusted individuals. Higher GM levels can significantly impact the game world and player experience. Consider starting new staff at level 1 and promoting gradually. +::: + +## Common administrative tasks + +### Broadcasting messages + +Send a message to all online players: + +``` +announce Your message here +``` + +The message appears in the center of every player's screen. + +For a less intrusive notification (chat window only): + +``` +notify Your message here +``` + +### Kicking players + +Disconnect a player from the server: + +``` +kick {playername} +``` + +### Banning accounts + +Temporarily ban an account: + +``` +ban account {username} {duration} {reason} +``` + +Duration format: `#d` for days, `#h` for hours, `#m` for minutes. + +**Examples:** +``` +ban account cheater 7d Using exploits +ban account spammer 24h Chat spam +``` + +To permanently ban: + +``` +ban account {username} 0 {reason} +``` + +To unban: + +``` +unban account {username} +``` + +### Server shutdown + +Schedule a server shutdown (with warning to players): + +``` +server shutdown {seconds} +``` + +**Example:** +``` +server shutdown 300 # Shutdown in 5 minutes +``` + +Players receive countdown warnings. To cancel a scheduled shutdown: + +``` +server shutdown cancel +``` + +For immediate shutdown (no warning): + +``` +server exit +``` + +## Managing accounts via database + +For bulk operations or automated account management, you can directly modify the `realmd` database. + +### Account table structure + +The main account information is stored in the `account` table: + +| Column | Description | +|--------|-------------| +| `id` | Unique account identifier | +| `username` | Login username | +| `gmlevel` | GM permission level (0-3) | +| `expansion` | Maximum expansion access (0-2) | +| `locked` | Whether account is locked | + +### Example queries + +**List all accounts:** +```sql +SELECT id, username, gmlevel, expansion FROM account; +``` + +**Find accounts by username pattern:** +```sql +SELECT * FROM account WHERE username LIKE 'john%'; +``` + +**Bulk update expansion level:** +```sql +UPDATE account SET expansion = 2 WHERE expansion < 2; +``` + +::: tip Database access +See the [Database Management](/guide/database-management#querying-databases) guide for instructions on running SQL queries. +::: + +## Troubleshooting + +### "Account already exists" + +The username is taken. Choose a different username or check if you're recreating an existing account. + +### Player can't see certain content + +Check the account's expansion level. If a player can't access Outland, their account might be set to expansion level 0 (Classic only). + +### GM commands not working in-game + +1. Verify the account has GM privileges: `account {username}` +2. Make sure the character is logged in with the correct account +3. Some commands require specific GM levels — check with `.help {command}` + +### Players stuck in "realm selection" loop + +This usually indicates a realmlist configuration issue. See [Realm Configuration](/guide/server-configuration#realm-configuration) for troubleshooting steps. diff --git a/docs/guide/server-configuration.md b/docs/guide/server-configuration.md new file mode 100644 index 0000000..c070bb6 --- /dev/null +++ b/docs/guide/server-configuration.md @@ -0,0 +1,286 @@ +# Server Configuration + +This guide covers how to configure your CMaNGOS server, from basic settings like experience rates to advanced realm configuration. + +## How configuration works + +CMaNGOS Docker uses a **configuration override** system. The container includes default configuration files, and you only need to specify the values you want to change. + +Your custom settings go in files located in the `runner/config/` directory: + +| File | Purpose | +|------|---------| +| `mangosd.conf` | World server settings (gameplay, rates, features) | +| `realmd.conf` | Login server settings (authentication, security) | + +::: tip Override principle +You don't need to copy the entire default configuration. Just add the specific properties you want to change. All other settings use CMaNGOS defaults. +::: + +## World server configuration + +Edit `runner/config/mangosd.conf` to customize gameplay settings. + +### Basic syntax + +Each setting is a key-value pair: + +```ini +PropertyName = value +``` + +**Example:** +```ini +GameType = 1 +Rate.XP.Kill = 2 +Motd = "Welcome to my server!" +``` + +### Common settings + +#### Server type + +| Property | Default | Description | +|----------|---------|-------------| +| `GameType` | `0` | Server type displayed in realm list | +| `RealmZone` | `1` | Timezone/region for the realm | + +**GameType values:** +- `0` — Normal (PvE) +- `1` — PvP +- `4` — Normal (with contested zones) +- `6` — RP (Roleplay) +- `8` — RP-PvP + +#### Experience and progression + +| Property | Default | Description | +|----------|---------|-------------| +| `Rate.XP.Kill` | `1` | XP multiplier for killing mobs | +| `Rate.XP.Quest` | `1` | XP multiplier for quests | +| `Rate.XP.Explore` | `1` | XP multiplier for exploration | +| `Rate.Rest.InGame` | `1` | Rest XP accumulation rate | +| `MaxPlayerLevel` | `60/70/80` | Maximum character level | +| `StartPlayerLevel` | `1` | Starting level for new characters | + +**Example — 3x XP server:** +```ini +Rate.XP.Kill = 3 +Rate.XP.Quest = 3 +Rate.XP.Explore = 3 +``` + +#### Loot and economy + +| Property | Default | Description | +|----------|---------|-------------| +| `Rate.Drop.Item.Normal` | `1` | Drop rate for regular items | +| `Rate.Drop.Item.Uncommon` | `1` | Drop rate for uncommon (green) items | +| `Rate.Drop.Item.Rare` | `1` | Drop rate for rare (blue) items | +| `Rate.Drop.Item.Epic` | `1` | Drop rate for epic (purple) items | +| `Rate.Drop.Money` | `1` | Gold drop rate | +| `StartPlayerMoney` | `0` | Starting gold (in copper) | + +::: info Currency conversion +WoW currency is stored in copper. 1 gold = 100 silver = 10,000 copper. + +To give new characters 10 gold: `StartPlayerMoney = 100000` +::: + +#### Quality of life + +| Property | Default | Description | +|----------|---------|-------------| +| `AllFlightPaths` | `0` | `1` = All flight paths unlocked | +| `InstantFlightPaths` | `0` | `1` = Instant travel (no flight animation) | +| `InstantLogout` | `0` | `1` = Instant logout anywhere | +| `AlwaysMaxSkillForLevel` | `0` | `1` = Auto-max weapon skills | + +#### Server messages + +| Property | Default | Description | +|----------|---------|-------------| +| `Motd` | (empty) | Message of the Day shown on login | + +**Example:** +```ini +Motd = "Welcome to Azeroth! Type .help for commands." +``` + +::: tip Complete reference +For all available settings, see the official CMaNGOS configuration files: + +- [Classic mangosd.conf.dist](https://github.com/cmangos/mangos-classic/blob/master/src/mangosd/mangosd.conf.dist.in) +- [TBC mangosd.conf.dist](https://github.com/cmangos/mangos-tbc/blob/master/src/mangosd/mangosd.conf.dist.in) +- [WotLK mangosd.conf.dist](https://github.com/cmangos/mangos-wotlk/blob/master/src/mangosd/mangosd.conf.dist.in) +::: + +## Login server configuration + +Edit `runner/config/realmd.conf` to customize authentication and security settings. + +### Security settings + +| Property | Default | Description | +|----------|---------|-------------| +| `WrongPass.MaxCount` | `0` | Max failed login attempts (`0` = unlimited) | +| `WrongPass.BanTime` | `600` | Ban duration in seconds after max failures | +| `WrongPass.BanType` | `0` | `0` = Ban IP, `1` = Ban account | +| `MaxPingTime` | `30` | Disconnect after this many minutes of inactivity | + +**Example — Ban IP for 1 hour after 5 failed attempts:** +```ini +WrongPass.MaxCount = 5 +WrongPass.BanTime = 3600 +WrongPass.BanType = 0 +``` + +## Realm configuration + +The realm configuration tells the game client where to connect and what type of server it is. +This information is stored in the `realmlist` table of the `realmd` database. + +### Default configuration + +CMaNGOS creates a default realm entry that works for local (same-machine) connections: + +| Field | Default value | +|-------|---------------| +| name | MaNGOS | +| address | 127.0.0.1 | +| port | 8085 | + +### When to modify + +You need to modify the realm configuration if: + +- Players connect from **other computers** on your network +- Players connect **over the internet** +- You want to **customize the realm name** +- The client gets stuck in a **realm selection loop** + +### Updating realm settings + +First, ensure the database is running: + +```sh +docker compose up mariadb -d +``` + +Then run these SQL queries to update the realm: + +```sql +-- Remove the default entry +DELETE FROM realmlist WHERE id = 1; + +-- Insert your custom configuration +INSERT INTO realmlist (id, name, address, port, icon, realmflags, timezone, allowedSecurityLevel) +VALUES (1, 'My Server', '192.168.1.100', 8085, 1, 0, 1, 0); +``` + +::: tip Running queries +See [Database Management — Querying databases](/guide/database-management#querying-databases) for instructions. +::: + +### Realm table fields + +| Field | Description | Common values | +|-------|-------------|---------------| +| `id` | Unique realm identifier | Usually `1` for single-realm setups | +| `name` | Realm name shown in client | Any string | +| `address` | Server IP address | `127.0.0.1` (local), LAN IP, or public IP | +| `port` | World server port | `8085` (default) | +| `icon` | Realm type icon | `0`=Normal, `1`=PvP, `4`=Normal, `6`=RP, `8`=RP-PvP | +| `realmflags` | Status flags | `0`=Online, `2`=Offline | +| `timezone` | Timezone category | `1`=US, `2`=Korea, `8`=English, etc. | +| `allowedSecurityLevel` | Minimum GM level to connect | `0`=Everyone, `1`+=Staff only | + +### Common scenarios + +#### Local play only + +For playing on the same computer: + +```sql +INSERT INTO realmlist (id, name, address, port, icon, realmflags, timezone, allowedSecurityLevel) +VALUES (1, 'Local Server', '127.0.0.1', 8085, 1, 0, 1, 0); +``` + +#### LAN play + +For playing with others on your local network, use your computer's LAN IP: + +```sql +INSERT INTO realmlist (id, name, address, port, icon, realmflags, timezone, allowedSecurityLevel) +VALUES (1, 'LAN Server', '192.168.1.100', 8085, 1, 0, 1, 0); +``` + +::: tip Finding your LAN IP +- **Windows:** Run `ipconfig` in Command Prompt +- **macOS/Linux:** Run `ip addr` or `ifconfig` in Terminal + +Look for an address like `192.168.x.x` or `10.0.x.x`. +::: + +#### Internet play + +For public internet access, use your public IP or domain name: + +```sql +INSERT INTO realmlist (id, name, address, port, icon, realmflags, timezone, allowedSecurityLevel) +VALUES (1, 'My Public Server', 'wow.example.com', 8085, 1, 0, 1, 0); +``` + +::: warning Port forwarding required +For internet play, you must configure your router to forward these ports: +- **3724** — Login server (realmd) +- **8085** — World server (mangosd) + +The setup process varies by router. Search for "port forwarding" + your router model. +::: + +### Troubleshooting realm issues + +#### Client stuck in realm selection loop + +This is the most common realm configuration issue. The client connects to the login server, sees the realm, but can't connect to the world server. + +**Causes and solutions:** + +1. **Wrong address in realmlist table** + - Check that the `address` field matches where players connect from + - For LAN play, use the server's LAN IP, not `127.0.0.1` + +2. **World server not running** + - Check that both `realmd` and `mangosd` containers are running + - Run `docker compose ps` to verify + +3. **Firewall blocking connections** + - Ensure ports 3724 and 8085 are open + - Temporarily disable firewall to test + +#### "Unable to connect" + +- Verify the realm `address` is reachable from the client +- Check that the correct ports are open/forwarded +- Ensure `realmlist.wtf` in the client points to the correct login server + +## Applying configuration changes + +After modifying configuration files: + +1. **Stop the server:** + ```sh + docker compose down + ``` + +2. **Start the server:** + ```sh + docker compose up + ``` + +Configuration files are read at startup, so a restart is required for changes to take effect. + +::: tip Database changes +Changes to the `realmlist` table take effect immediately — no server restart needed. Players may need to re-login to see updated realm information. +::: diff --git a/docs/guide/use-in-production.md b/docs/guide/use-in-production.md new file mode 100644 index 0000000..781621f --- /dev/null +++ b/docs/guide/use-in-production.md @@ -0,0 +1,65 @@ +# Use in Production + +::: warning Coming Soon +This page is a placeholder. Content will be added in a future update. +::: + +This section will cover best practices and recommendations for deploying CMaNGOS Docker in a production environment. + +## Planned topics + +### Security hardening + +- Secure database passwords +- Network isolation +- Firewall configuration +- SSL/TLS for connections +- Protecting sensitive files + +### Performance optimization + +- Hardware recommendations +- Docker resource limits +- Database tuning +- Connection pooling + +### High availability + +- Database replication +- Load balancing multiple realms +- Backup strategies and automation +- Disaster recovery planning + +### Monitoring and logging + +- Log aggregation +- Performance metrics +- Health checks +- Alerting systems + +### Deployment strategies + +- Using Docker Swarm +- Kubernetes deployment +- Cloud provider considerations (AWS, GCP, Azure) +- Cost optimization + +### Server administration + +- Managing multiple realms +- Player support tools +- Automated maintenance tasks +- Update rollout strategies + +### Legal considerations + +- Terms of service +- Privacy policies +- GDPR compliance +- Blizzard's policies on private servers + +--- + +::: tip Contribute +If you have experience running CMaNGOS in production and would like to share your knowledge, feel free to [open a pull request](https://github.com/Byloth/cmangos-docker/pulls) or [start a discussion](https://github.com/Byloth/cmangos-docker/issues/new/choose). +::: diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..f224128 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,38 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "CMaNGOS on Docker" + text: "Classic WoW Server,
Your very own way!" + tagline: "From Zero to Play within Minutes." + image: + src: /logo.png + alt: CMaNGOS on Docker + + actions: + - theme: brand + text: Getting Started + link: /guide/getting-started + - theme: alt + text: What's this? + link: /guide/introduction + - theme: alt + text: GitHub + link: https://github.com/Byloth/cmangos-docker + +features: + - icon: 🛠️ + title: No more Installations + details: You don't need to install any weird (and heavy) software, compilers or libraries. + - icon: 📦 + title: No wasted Space + details: Docker executables take up around 500~600MB, while an our typical image is less than 200MB. + - icon: ⏱️ + title: No wasted Time + details: No compilation steps needed — just download and run with ease. Batteries included! + - icon: 🌍 + title: No OS differences + details: Windows user? Mac? It doesn't matter what OS you're using — Docker works everywhere! +--- + diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..55b4330 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,13 @@ +{ + "name": "@byloth/cmangos-docker-docs", + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.6.4", + "vue": "^3.5.26" + }, + "private": true +} \ No newline at end of file diff --git a/docs/public/favicons/logo-167x167.png b/docs/public/favicons/logo-167x167.png new file mode 100644 index 0000000..db47b06 Binary files /dev/null and b/docs/public/favicons/logo-167x167.png differ diff --git a/docs/public/favicons/logo-16x16.png b/docs/public/favicons/logo-16x16.png new file mode 100644 index 0000000..714679e Binary files /dev/null and b/docs/public/favicons/logo-16x16.png differ diff --git a/docs/public/favicons/logo-180x180.png b/docs/public/favicons/logo-180x180.png new file mode 100644 index 0000000..43f8537 Binary files /dev/null and b/docs/public/favicons/logo-180x180.png differ diff --git a/docs/public/favicons/logo-192x192.png b/docs/public/favicons/logo-192x192.png new file mode 100644 index 0000000..65f32cb Binary files /dev/null and b/docs/public/favicons/logo-192x192.png differ diff --git a/docs/public/favicons/logo-32x32.png b/docs/public/favicons/logo-32x32.png new file mode 100644 index 0000000..0ae200f Binary files /dev/null and b/docs/public/favicons/logo-32x32.png differ diff --git a/docs/public/favicons/logo-48x48.png b/docs/public/favicons/logo-48x48.png new file mode 100644 index 0000000..932230d Binary files /dev/null and b/docs/public/favicons/logo-48x48.png differ diff --git a/docs/public/logo.png b/docs/public/logo.png new file mode 100644 index 0000000..f77ef6c Binary files /dev/null and b/docs/public/logo.png differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..e7164a4 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "@byloth/cmangos-docker", + "workspaces": ["docs"], + "private": true +}