summary refs log tree commit diff
diff options
context:
space:
mode:
authorMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2022-10-28 15:25:58 +1100
committerMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2022-10-28 15:25:58 +1100
commit8d93693a38f55c442372cac8f76211f27a752d0b (patch)
tree7ea113bbef57508919cf3f31bbac6ef7a171ecfc
parentfix bad user validation (diff)
downloadserver-8d93693a38f55c442372cac8f76211f27a752d0b.tar.xz
Move src-slowcord to own repo https://github.com/MaddyUnderStars/slowcord-services
-rw-r--r--src-slowcord/README.md1
-rw-r--r--src-slowcord/bot/.vscode/launch.json12
-rw-r--r--src-slowcord/bot/.vscode/tasks.json13
-rw-r--r--src-slowcord/bot/package-lock.json781
-rw-r--r--src-slowcord/bot/package.json18
-rw-r--r--src-slowcord/bot/src/Bot.ts50
-rw-r--r--src-slowcord/bot/src/commands/index.ts36
-rw-r--r--src-slowcord/bot/src/commands/instance.ts56
-rw-r--r--src-slowcord/bot/src/index.ts24
-rw-r--r--src-slowcord/bot/tsconfig.json103
-rw-r--r--src-slowcord/login/.env.template5
-rw-r--r--src-slowcord/login/package-lock.json3339
-rw-r--r--src-slowcord/login/package.json35
-rw-r--r--src-slowcord/login/public/css/index.css113
-rw-r--r--src-slowcord/login/public/js/handler.js40
-rw-r--r--src-slowcord/login/public/login.html127
-rw-r--r--src-slowcord/login/public/register.html88
-rw-r--r--src-slowcord/login/src/index.ts171
-rw-r--r--src-slowcord/login/tsconfig.json99
-rw-r--r--src-slowcord/nginx/fosscord54
-rw-r--r--src-slowcord/nginx/voice35
-rw-r--r--src-slowcord/rules.md22
-rw-r--r--src-slowcord/status/.env.template6
-rw-r--r--src-slowcord/status/package-lock.json891
-rw-r--r--src-slowcord/status/package.json31
-rw-r--r--src-slowcord/status/src/gateway.ts99
-rw-r--r--src-slowcord/status/src/index.ts159
-rw-r--r--src-slowcord/status/tsconfig.json99
-rw-r--r--src/api/middlewares/Authentication.ts2
-rw-r--r--src/api/routes/oauth2/callback.ts38
-rw-r--r--src/api/routes/policies/instance/stats.ts21
-rw-r--r--src/api/util/handlers/Oauth.ts83
-rw-r--r--src/api/util/index.ts3
-rw-r--r--src/util/entities/Config.ts12
-rw-r--r--src/util/interfaces/Event.ts49
35 files changed, 185 insertions, 6530 deletions
diff --git a/src-slowcord/README.md b/src-slowcord/README.md
deleted file mode 100644
index ac42117a..00000000
--- a/src-slowcord/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Additional resources/services for [Slowcord](https://slowcord.maddy.k.vu/login)
diff --git a/src-slowcord/bot/.vscode/launch.json b/src-slowcord/bot/.vscode/launch.json
deleted file mode 100644
index c1c765a8..00000000
--- a/src-slowcord/bot/.vscode/launch.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-	"configurations": [
-		{
-			"name": "Slowcord Bot",
-			"program": "${workspaceFolder}/build/index.js",
-			"request": "launch",
-			"skipFiles": ["<node_internals>/**"],
-			"type": "node",
-			"preLaunchTask": "npm: build"
-		}
-	]
-}
diff --git a/src-slowcord/bot/.vscode/tasks.json b/src-slowcord/bot/.vscode/tasks.json
deleted file mode 100644
index be345ecd..00000000
--- a/src-slowcord/bot/.vscode/tasks.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-	"version": "2.0.0",
-	"tasks": [
-		{
-			"type": "npm",
-			"script": "build",
-			"group": "build",
-			"problemMatcher": [],
-			"label": "npm: build",
-			"detail": "tsc -b"
-		}
-	]
-}
diff --git a/src-slowcord/bot/package-lock.json b/src-slowcord/bot/package-lock.json
deleted file mode 100644
index 7d1c59ed..00000000
--- a/src-slowcord/bot/package-lock.json
+++ /dev/null
@@ -1,781 +0,0 @@
-{
-	"name": "bot",
-	"version": "1.0.0",
-	"lockfileVersion": 2,
-	"requires": true,
-	"packages": {
-		"": {
-			"name": "bot",
-			"version": "1.0.0",
-			"license": "ISC",
-			"dependencies": {
-				"fosscord-gopnik": "^1.0.0",
-				"fosscord-server": "file:../..",
-				"mysql": "^2.18.1",
-				"typescript": "^4.7.4"
-			}
-		},
-		"../..": {
-			"version": "1.0.0",
-			"hasInstallScript": true,
-			"license": "AGPL-3.0-only",
-			"dependencies": {
-				"ajv": "^8.6.2",
-				"ajv-formats": "^2.1.1",
-				"bcrypt": "^5.0.1",
-				"cheerio": "^1.0.0-rc.12",
-				"cookie-parser": "^1.4.6",
-				"dotenv": "^16.0.2",
-				"exif-be-gone": "^1.3.1",
-				"fast-zlib": "^2.0.1",
-				"file-type": "16.5",
-				"form-data": "^4.0.0",
-				"i18next": "^21.9.2",
-				"i18next-http-middleware": "^3.2.1",
-				"i18next-node-fs-backend": "^2.1.3",
-				"image-size": "^1.0.2",
-				"json-bigint": "^1.0.0",
-				"jsonwebtoken": "^8.5.1",
-				"lambert-server": "^1.2.12",
-				"module-alias": "^2.2.2",
-				"morgan": "^1.10.0",
-				"multer": "^1.4.5-lts.1",
-				"node-2fa": "^2.0.3",
-				"node-fetch": "^2.6.7",
-				"node-os-utils": "^1.3.7",
-				"picocolors": "^1.0.0",
-				"proxy-agent": "^5.0.0",
-				"sharp": "^0.31.0",
-				"sqlite3": "^5.1.1",
-				"typeorm": "^0.3.10",
-				"typescript-json-schema": "^0.50.1",
-				"ws": "^8.9.0"
-			},
-			"devDependencies": {
-				"@types/amqplib": "^0.8.2",
-				"@types/bcrypt": "^5.0.0",
-				"@types/cookie-parser": "^1.4.3",
-				"@types/i18next-node-fs-backend": "^2.1.1",
-				"@types/json-bigint": "^1.0.1",
-				"@types/jsonwebtoken": "^8.5.9",
-				"@types/morgan": "^1.9.3",
-				"@types/multer": "^1.4.7",
-				"@types/node": "^18.7.20",
-				"@types/node-fetch": "^2.6.2",
-				"@types/node-os-utils": "^1.3.0",
-				"@types/sharp": "^0.31.0",
-				"@types/ws": "^8.5.3",
-				"express": "^4.18.1",
-				"typescript": "^4.8.3"
-			},
-			"optionalDependencies": {
-				"@aws-sdk/client-s3": "^3.178.0",
-				"@sentry/node": "^7.13.0",
-				"@sentry/tracing": "^7.13.0",
-				"@yukikaze-bot/erlpack": "^1.0.1",
-				"amqplib": "^0.10.3"
-			}
-		},
-		"../../util": {
-			"name": "@fosscord/util",
-			"version": "1.0.0",
-			"extraneous": true,
-			"hasInstallScript": true,
-			"license": "AGPL-3.0-only",
-			"dependencies": {
-				"amqplib": "^0.8.0",
-				"form-data": "^4.0.0",
-				"jsonwebtoken": "^8.5.1",
-				"lambert-server": "^1.2.12",
-				"missing-native-js-functions": "^1.2.18",
-				"multer": "^1.4.3",
-				"node-fetch": "^2.6.2",
-				"patch-package": "^6.4.7",
-				"pg": "^8.7.1",
-				"picocolors": "^1.0.0",
-				"proxy-agent": "^5.0.0",
-				"reflect-metadata": "^0.1.13",
-				"typeorm": "^0.2.37",
-				"typescript": "^4.4.2",
-				"typescript-json-schema": "^0.50.1"
-			},
-			"devDependencies": {
-				"@types/amqplib": "^0.8.1",
-				"@types/jsonwebtoken": "^8.5.0",
-				"@types/multer": "^1.4.7",
-				"@types/node": "^14.17.9",
-				"@types/node-fetch": "^2.5.12",
-				"jest": "^27.0.6",
-				"ts-node": "^10.2.1"
-			}
-		},
-		"node_modules/@discordjs/builders": {
-			"version": "0.14.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz",
-			"integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==",
-			"dependencies": {
-				"@sapphire/shapeshift": "^3.1.0",
-				"@sindresorhus/is": "^4.6.0",
-				"discord-api-types": "^0.33.3",
-				"fast-deep-equal": "^3.1.3",
-				"ts-mixer": "^6.0.1",
-				"tslib": "^2.4.0"
-			},
-			"engines": {
-				"node": ">=16.9.0"
-			}
-		},
-		"node_modules/@discordjs/collection": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz",
-			"integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==",
-			"engines": {
-				"node": ">=16.9.0"
-			}
-		},
-		"node_modules/@sapphire/async-queue": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",
-			"integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==",
-			"engines": {
-				"node": ">=v14.0.0",
-				"npm": ">=7.0.0"
-			}
-		},
-		"node_modules/@sapphire/shapeshift": {
-			"version": "3.4.0",
-			"resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.4.0.tgz",
-			"integrity": "sha512-uV+vErdfbxCgnjgcwkPDADlyS40I20L57YPy254LKbRNfLCg4/ymy510aNSGhLhq/dpNU0s1fQnTbI2YAetzsA==",
-			"engines": {
-				"node": ">=v14.0.0",
-				"npm": ">=7.0.0"
-			}
-		},
-		"node_modules/@sindresorhus/is": {
-			"version": "4.6.0",
-			"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
-			"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sindresorhus/is?sponsor=1"
-			}
-		},
-		"node_modules/@types/node": {
-			"version": "18.0.1",
-			"resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz",
-			"integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg=="
-		},
-		"node_modules/@types/node-fetch": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
-			"integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
-			"dependencies": {
-				"@types/node": "*",
-				"form-data": "^3.0.0"
-			}
-		},
-		"node_modules/@types/node-fetch/node_modules/form-data": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-			"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-			"dependencies": {
-				"asynckit": "^0.4.0",
-				"combined-stream": "^1.0.8",
-				"mime-types": "^2.1.12"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/@types/ws": {
-			"version": "8.5.3",
-			"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
-			"integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
-			"dependencies": {
-				"@types/node": "*"
-			}
-		},
-		"node_modules/asynckit": {
-			"version": "0.4.0",
-			"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-			"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-		},
-		"node_modules/bignumber.js": {
-			"version": "9.0.0",
-			"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
-			"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
-			"engines": {
-				"node": "*"
-			}
-		},
-		"node_modules/combined-stream": {
-			"version": "1.0.8",
-			"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-			"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-			"dependencies": {
-				"delayed-stream": "~1.0.0"
-			},
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/core-util-is": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-			"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
-		},
-		"node_modules/delayed-stream": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-			"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-			"engines": {
-				"node": ">=0.4.0"
-			}
-		},
-		"node_modules/discord-api-types": {
-			"version": "0.33.5",
-			"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz",
-			"integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg=="
-		},
-		"node_modules/discord.js": {
-			"version": "13.8.1",
-			"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz",
-			"integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==",
-			"dependencies": {
-				"@discordjs/builders": "^0.14.0",
-				"@discordjs/collection": "^0.7.0",
-				"@sapphire/async-queue": "^1.3.1",
-				"@types/node-fetch": "^2.6.1",
-				"@types/ws": "^8.5.3",
-				"discord-api-types": "^0.33.3",
-				"form-data": "^4.0.0",
-				"node-fetch": "^2.6.1",
-				"ws": "^8.7.0"
-			},
-			"engines": {
-				"node": ">=16.6.0",
-				"npm": ">=7.0.0"
-			}
-		},
-		"node_modules/fast-deep-equal": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-		},
-		"node_modules/form-data": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-			"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-			"dependencies": {
-				"asynckit": "^0.4.0",
-				"combined-stream": "^1.0.8",
-				"mime-types": "^2.1.12"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/fosscord-gopnik": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/fosscord-gopnik/-/fosscord-gopnik-1.0.0.tgz",
-			"integrity": "sha512-cCJhXTVOEDEhhSOwceYsptU3f97GOVOAVNJ4UFMiQESp4wnYE0GKnlYYYs6gMkZounxPEv0t22kSHdajx6Ed/w==",
-			"dependencies": {
-				"discord.js": "^13.5.1"
-			}
-		},
-		"node_modules/fosscord-server": {
-			"resolved": "../..",
-			"link": true
-		},
-		"node_modules/inherits": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-		},
-		"node_modules/isarray": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-			"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
-		},
-		"node_modules/mime-db": {
-			"version": "1.52.0",
-			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-			"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/mime-types": {
-			"version": "2.1.35",
-			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-			"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-			"dependencies": {
-				"mime-db": "1.52.0"
-			},
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/mysql": {
-			"version": "2.18.1",
-			"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
-			"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
-			"dependencies": {
-				"bignumber.js": "9.0.0",
-				"readable-stream": "2.3.7",
-				"safe-buffer": "5.1.2",
-				"sqlstring": "2.3.1"
-			},
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/node-fetch": {
-			"version": "2.6.7",
-			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-			"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-			"dependencies": {
-				"whatwg-url": "^5.0.0"
-			},
-			"engines": {
-				"node": "4.x || >=6.0.0"
-			},
-			"peerDependencies": {
-				"encoding": "^0.1.0"
-			},
-			"peerDependenciesMeta": {
-				"encoding": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/process-nextick-args": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-		},
-		"node_modules/readable-stream": {
-			"version": "2.3.7",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-			"dependencies": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.3",
-				"isarray": "~1.0.0",
-				"process-nextick-args": "~2.0.0",
-				"safe-buffer": "~5.1.1",
-				"string_decoder": "~1.1.1",
-				"util-deprecate": "~1.0.1"
-			}
-		},
-		"node_modules/safe-buffer": {
-			"version": "5.1.2",
-			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-		},
-		"node_modules/sqlstring": {
-			"version": "2.3.1",
-			"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
-			"integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/string_decoder": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-			"dependencies": {
-				"safe-buffer": "~5.1.0"
-			}
-		},
-		"node_modules/tr46": {
-			"version": "0.0.3",
-			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-		},
-		"node_modules/ts-mixer": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz",
-			"integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg=="
-		},
-		"node_modules/tslib": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
-			"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
-		},
-		"node_modules/typescript": {
-			"version": "4.7.4",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz",
-			"integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==",
-			"bin": {
-				"tsc": "bin/tsc",
-				"tsserver": "bin/tsserver"
-			},
-			"engines": {
-				"node": ">=4.2.0"
-			}
-		},
-		"node_modules/util-deprecate": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-			"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
-		},
-		"node_modules/webidl-conversions": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-		},
-		"node_modules/whatwg-url": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-			"dependencies": {
-				"tr46": "~0.0.3",
-				"webidl-conversions": "^3.0.0"
-			}
-		},
-		"node_modules/ws": {
-			"version": "8.8.0",
-			"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
-			"integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
-			"engines": {
-				"node": ">=10.0.0"
-			},
-			"peerDependencies": {
-				"bufferutil": "^4.0.1",
-				"utf-8-validate": "^5.0.2"
-			},
-			"peerDependenciesMeta": {
-				"bufferutil": {
-					"optional": true
-				},
-				"utf-8-validate": {
-					"optional": true
-				}
-			}
-		}
-	},
-	"dependencies": {
-		"@discordjs/builders": {
-			"version": "0.14.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz",
-			"integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==",
-			"requires": {
-				"@sapphire/shapeshift": "^3.1.0",
-				"@sindresorhus/is": "^4.6.0",
-				"discord-api-types": "^0.33.3",
-				"fast-deep-equal": "^3.1.3",
-				"ts-mixer": "^6.0.1",
-				"tslib": "^2.4.0"
-			}
-		},
-		"@discordjs/collection": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz",
-			"integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA=="
-		},
-		"@sapphire/async-queue": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",
-			"integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g=="
-		},
-		"@sapphire/shapeshift": {
-			"version": "3.4.0",
-			"resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.4.0.tgz",
-			"integrity": "sha512-uV+vErdfbxCgnjgcwkPDADlyS40I20L57YPy254LKbRNfLCg4/ymy510aNSGhLhq/dpNU0s1fQnTbI2YAetzsA=="
-		},
-		"@sindresorhus/is": {
-			"version": "4.6.0",
-			"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
-			"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="
-		},
-		"@types/node": {
-			"version": "18.0.1",
-			"resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz",
-			"integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg=="
-		},
-		"@types/node-fetch": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
-			"integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
-			"requires": {
-				"@types/node": "*",
-				"form-data": "^3.0.0"
-			},
-			"dependencies": {
-				"form-data": {
-					"version": "3.0.1",
-					"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-					"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-					"requires": {
-						"asynckit": "^0.4.0",
-						"combined-stream": "^1.0.8",
-						"mime-types": "^2.1.12"
-					}
-				}
-			}
-		},
-		"@types/ws": {
-			"version": "8.5.3",
-			"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
-			"integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
-			"requires": {
-				"@types/node": "*"
-			}
-		},
-		"asynckit": {
-			"version": "0.4.0",
-			"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-			"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-		},
-		"bignumber.js": {
-			"version": "9.0.0",
-			"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
-			"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
-		},
-		"combined-stream": {
-			"version": "1.0.8",
-			"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-			"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-			"requires": {
-				"delayed-stream": "~1.0.0"
-			}
-		},
-		"core-util-is": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-			"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
-		},
-		"delayed-stream": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-			"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
-		},
-		"discord-api-types": {
-			"version": "0.33.5",
-			"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz",
-			"integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg=="
-		},
-		"discord.js": {
-			"version": "13.8.1",
-			"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz",
-			"integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==",
-			"requires": {
-				"@discordjs/builders": "^0.14.0",
-				"@discordjs/collection": "^0.7.0",
-				"@sapphire/async-queue": "^1.3.1",
-				"@types/node-fetch": "^2.6.1",
-				"@types/ws": "^8.5.3",
-				"discord-api-types": "^0.33.3",
-				"form-data": "^4.0.0",
-				"node-fetch": "^2.6.1",
-				"ws": "^8.7.0"
-			}
-		},
-		"fast-deep-equal": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-		},
-		"form-data": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-			"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-			"requires": {
-				"asynckit": "^0.4.0",
-				"combined-stream": "^1.0.8",
-				"mime-types": "^2.1.12"
-			}
-		},
-		"fosscord-gopnik": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/fosscord-gopnik/-/fosscord-gopnik-1.0.0.tgz",
-			"integrity": "sha512-cCJhXTVOEDEhhSOwceYsptU3f97GOVOAVNJ4UFMiQESp4wnYE0GKnlYYYs6gMkZounxPEv0t22kSHdajx6Ed/w==",
-			"requires": {
-				"discord.js": "^13.5.1"
-			}
-		},
-		"fosscord-server": {
-			"version": "file:../..",
-			"requires": {
-				"@aws-sdk/client-s3": "^3.178.0",
-				"@sentry/node": "^7.13.0",
-				"@sentry/tracing": "^7.13.0",
-				"@types/amqplib": "^0.8.2",
-				"@types/bcrypt": "^5.0.0",
-				"@types/cookie-parser": "^1.4.3",
-				"@types/i18next-node-fs-backend": "^2.1.1",
-				"@types/json-bigint": "^1.0.1",
-				"@types/jsonwebtoken": "^8.5.9",
-				"@types/morgan": "^1.9.3",
-				"@types/multer": "^1.4.7",
-				"@types/node": "^18.7.20",
-				"@types/node-fetch": "^2.6.2",
-				"@types/node-os-utils": "^1.3.0",
-				"@types/sharp": "^0.31.0",
-				"@types/ws": "^8.5.3",
-				"@yukikaze-bot/erlpack": "^1.0.1",
-				"ajv": "^8.6.2",
-				"ajv-formats": "^2.1.1",
-				"amqplib": "^0.10.3",
-				"bcrypt": "^5.0.1",
-				"cheerio": "^1.0.0-rc.12",
-				"cookie-parser": "^1.4.6",
-				"dotenv": "^16.0.2",
-				"exif-be-gone": "^1.3.1",
-				"express": "^4.18.1",
-				"fast-zlib": "^2.0.1",
-				"file-type": "16.5",
-				"form-data": "^4.0.0",
-				"i18next": "^21.9.2",
-				"i18next-http-middleware": "^3.2.1",
-				"i18next-node-fs-backend": "^2.1.3",
-				"image-size": "^1.0.2",
-				"json-bigint": "^1.0.0",
-				"jsonwebtoken": "^8.5.1",
-				"lambert-server": "^1.2.12",
-				"module-alias": "^2.2.2",
-				"morgan": "^1.10.0",
-				"multer": "^1.4.5-lts.1",
-				"node-2fa": "^2.0.3",
-				"node-fetch": "^2.6.7",
-				"node-os-utils": "^1.3.7",
-				"picocolors": "^1.0.0",
-				"proxy-agent": "^5.0.0",
-				"sharp": "^0.31.0",
-				"sqlite3": "^5.1.1",
-				"typeorm": "^0.3.10",
-				"typescript": "^4.8.3",
-				"typescript-json-schema": "^0.50.1",
-				"ws": "^8.9.0"
-			}
-		},
-		"inherits": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-			"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-		},
-		"isarray": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-			"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
-		},
-		"mime-db": {
-			"version": "1.52.0",
-			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-			"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
-		},
-		"mime-types": {
-			"version": "2.1.35",
-			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-			"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-			"requires": {
-				"mime-db": "1.52.0"
-			}
-		},
-		"mysql": {
-			"version": "2.18.1",
-			"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
-			"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
-			"requires": {
-				"bignumber.js": "9.0.0",
-				"readable-stream": "2.3.7",
-				"safe-buffer": "5.1.2",
-				"sqlstring": "2.3.1"
-			}
-		},
-		"node-fetch": {
-			"version": "2.6.7",
-			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-			"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-			"requires": {
-				"whatwg-url": "^5.0.0"
-			}
-		},
-		"process-nextick-args": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-			"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-		},
-		"readable-stream": {
-			"version": "2.3.7",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-			"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-			"requires": {
-				"core-util-is": "~1.0.0",
-				"inherits": "~2.0.3",
-				"isarray": "~1.0.0",
-				"process-nextick-args": "~2.0.0",
-				"safe-buffer": "~5.1.1",
-				"string_decoder": "~1.1.1",
-				"util-deprecate": "~1.0.1"
-			}
-		},
-		"safe-buffer": {
-			"version": "5.1.2",
-			"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-		},
-		"sqlstring": {
-			"version": "2.3.1",
-			"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
-			"integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ=="
-		},
-		"string_decoder": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-			"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-			"requires": {
-				"safe-buffer": "~5.1.0"
-			}
-		},
-		"tr46": {
-			"version": "0.0.3",
-			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-		},
-		"ts-mixer": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz",
-			"integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg=="
-		},
-		"tslib": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
-			"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
-		},
-		"typescript": {
-			"version": "4.7.4",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz",
-			"integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ=="
-		},
-		"util-deprecate": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-			"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
-		},
-		"webidl-conversions": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-		},
-		"whatwg-url": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-			"requires": {
-				"tr46": "~0.0.3",
-				"webidl-conversions": "^3.0.0"
-			}
-		},
-		"ws": {
-			"version": "8.8.0",
-			"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
-			"integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
-			"requires": {}
-		}
-	}
-}
diff --git a/src-slowcord/bot/package.json b/src-slowcord/bot/package.json
deleted file mode 100644
index 454f84cb..00000000
--- a/src-slowcord/bot/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-	"name": "bot",
-	"version": "1.0.0",
-	"description": "",
-	"main": "index.js",
-	"scripts": {
-		"build": "tsc -b",
-		"start": "node build/index.js"
-	},
-	"author": "",
-	"license": "ISC",
-	"dependencies": {
-		"fosscord-server": "file:../..",
-		"fosscord-gopnik": "^1.0.0",
-		"mysql": "^2.18.1",
-		"typescript": "^4.7.4"
-	}
-}
diff --git a/src-slowcord/bot/src/Bot.ts b/src-slowcord/bot/src/Bot.ts
deleted file mode 100644
index cf3ff09f..00000000
--- a/src-slowcord/bot/src/Bot.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Message } from "discord.js";
-import { Client } from "fosscord-gopnik/build/lib"; // huh? oh well. some bugs in my lib Ig
-
-import { Command, getCommands } from "./commands/index.js";
-
-export default class Bot {
-	client: Client;
-	commands: { [key: string]: Command } = {};
-
-	constructor(client: Client) {
-		this.client = client;
-	}
-
-	onReady = async () => {
-		this.commands = await getCommands();
-
-		console.log(`Logged in as ${this.client.user!.tag}`);
-
-		this.client.user!.setPresence({
-			activities: [
-				{
-					name: "EVERYTHING",
-					type: "WATCHING",
-				},
-			],
-		});
-	};
-
-	onMessageCreate = async (msg: Message) => {
-		const prefix = process.env.PREFIX as string;
-		if (msg.author.bot) return;
-		if (!msg.content || msg.content.indexOf(prefix) === -1) return;
-
-		const content = msg.content.slice(prefix.length).split(" ");
-		const cmd = content.shift();
-		if (!cmd) return;
-		const args = content;
-
-		const command = this.commands[cmd];
-		if (!command) return;
-
-		await command.exec({
-			user: msg.author,
-			member: msg.member,
-			guild: msg.guild,
-			message: msg,
-			args: args,
-		});
-	};
-}
diff --git a/src-slowcord/bot/src/commands/index.ts b/src-slowcord/bot/src/commands/index.ts
deleted file mode 100644
index 0130b2bc..00000000
--- a/src-slowcord/bot/src/commands/index.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Message, GuildMember, Guild, User } from "discord.js";
-import fs from "fs";
-
-export type CommandContext = {
-	user: User;
-	guild: Guild | null;
-	member: GuildMember | null;
-	message: Message;
-	args: string[];
-};
-
-export type Command = {
-	name: string;
-	exec: (ctx: CommandContext) => any;
-};
-
-const walk = async (path: string) => {
-	const files = fs.readdirSync(path);
-	const out = [];
-	for (var file of files) {
-		if (fs.statSync(`${path}/${file}`).isDirectory()) continue;
-		if (file.indexOf("index") !== -1) continue;
-		if (file.indexOf(".js") !== file.length - 3) continue;
-		var imported = (await import(`./${file}`)).default;
-		out.push(imported);
-	}
-	return out;
-};
-
-export const getCommands = async () => {
-	const map: { [key: string]: Command } = {};
-	for (var cmd of await walk("./build/commands")) {
-		map[cmd.name] = cmd;
-	}
-	return map;
-};
diff --git a/src-slowcord/bot/src/commands/instance.ts b/src-slowcord/bot/src/commands/instance.ts
deleted file mode 100644
index 170d8f76..00000000
--- a/src-slowcord/bot/src/commands/instance.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Command } from "./index.js";
-import { User, Guild, Message } from "@fosscord/util";
-
-const cache: { [key: string]: number } = {
-	users: 0,
-	guilds: 0,
-	messages: 0,
-	lastChecked: 0,
-};
-
-export default {
-	name: "instance",
-	exec: async ({ message }) => {
-		if (
-			Date.now() >
-			cache.lastChecked + parseInt(process.env.CACHE_TTL as string)
-		) {
-			cache.users = await User.count();
-			cache.guilds = await Guild.count();
-			cache.messages = await Message.count();
-			cache.lastChecked = Date.now();
-		}
-
-		return message.reply({
-			embeds: [
-				{
-					title: "Instance Stats",
-					description:
-						"For more indepth information, check out https://grafana.understars.dev",
-					footer: {
-						text: `Last checked: ${Math.floor(
-							(Date.now() - cache.lastChecked) / (1000 * 60),
-						)} minutes ago`,
-					},
-					fields: [
-						{
-							inline: true,
-							name: "Total Users",
-							value: cache.users.toString(),
-						},
-						{
-							inline: true,
-							name: "Total Guilds",
-							value: cache.guilds.toString(),
-						},
-						{
-							inline: true,
-							name: "Total Messages",
-							value: cache.messages.toString(),
-						},
-					],
-				},
-			],
-		});
-	},
-} as Command;
diff --git a/src-slowcord/bot/src/index.ts b/src-slowcord/bot/src/index.ts
deleted file mode 100644
index fa97313f..00000000
--- a/src-slowcord/bot/src/index.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import "dotenv/config";
-import Fosscord from "fosscord-gopnik";
-import Bot from "./Bot.js"; // huh?
-import { initDatabase } from "fosscord-server/src/util";
-
-const client = new Fosscord.Client({
-	intents: ["GUILD_MESSAGES"],
-
-	http: {
-		api: process.env.ENDPOINT_API,
-		cdn: process.env.ENDPOINT_CDN,
-		invite: process.env.ENDPOINT_INV,
-	},
-});
-
-const bot = new Bot(client);
-
-client.on("ready", bot.onReady);
-client.on("messageCreate", bot.onMessageCreate);
-
-(async () => {
-	await initDatabase();
-	await client.login(process.env.TOKEN);
-})();
diff --git a/src-slowcord/bot/tsconfig.json b/src-slowcord/bot/tsconfig.json
deleted file mode 100644
index f055681a..00000000
--- a/src-slowcord/bot/tsconfig.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
-	"compilerOptions": {
-		/* Visit https://aka.ms/tsconfig.json to read more about this file */
-
-		/* Projects */
-		// "incremental": true,                              /* Enable incremental compilation */
-		// "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */
-		// "tsBuildInfoFile": "./",                          /* Specify the folder for .tsbuildinfo incremental compilation files. */
-		// "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects */
-		// "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
-		// "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */
-
-		/* Language and Environment */
-		"target": "ES6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
-		"lib": [
-			"ES2021"
-		] /* Specify a set of bundled library declaration files that describe the target runtime environment. */,
-		// "jsx": "preserve",                                /* Specify what JSX code is generated. */
-		"experimentalDecorators": true /* Enable experimental support for TC39 stage 2 draft decorators. */,
-		// "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
-		// "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
-		// "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
-		// "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
-		// "reactNamespace": "",                             /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
-		// "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
-		// "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */
-
-		/* Modules */
-		"module": "CommonJS" /* Specify what module code is generated. */,
-		// "rootDir": "./",                                  /* Specify the root folder within your source files. */
-		"moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
-		// "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
-		// "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */
-		// "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
-		// "typeRoots": [],                                  /* Specify multiple folders that act like `./node_modules/@types`. */
-		// "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */
-		// "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
-		// "resolveJsonModule": true,                        /* Enable importing .json files */
-		// "noResolve": true,                                /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
-
-		/* JavaScript Support */
-		// "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
-		// "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
-		// "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
-
-		/* Emit */
-		// "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
-		// "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
-		// "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
-		"sourceMap": true /* Create source map files for emitted JavaScript files. */,
-		// "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
-		"outDir": "./build" /* Specify an output folder for all emitted files. */,
-		// "removeComments": true,                           /* Disable emitting comments. */
-		// "noEmit": true,                                   /* Disable emitting files from a compilation. */
-		// "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
-		// "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types */
-		// "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
-		// "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
-		// "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
-		// "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
-		// "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
-		// "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
-		// "newLine": "crlf",                                /* Set the newline character for emitting files. */
-		// "stripInternal": true,                            /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
-		// "noEmitHelpers": true,                            /* Disable generating custom helper functions like `__extends` in compiled output. */
-		// "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
-		// "preserveConstEnums": true,                       /* Disable erasing `const enum` declarations in generated code. */
-		// "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */
-		// "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
-
-		/* Interop Constraints */
-		// "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
-		// "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
-		"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
-		// "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
-		"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
-
-		/* Type Checking */
-		"strict": true /* Enable all strict type-checking options. */,
-		// "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied `any` type.. */
-		// "strictNullChecks": true,                         /* When type checking, take into account `null` and `undefined`. */
-		// "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
-		// "strictBindCallApply": true,                      /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
-		"strictPropertyInitialization": false /* Check for class properties that are declared but not set in the constructor. */,
-		// "noImplicitThis": true,                           /* Enable error reporting when `this` is given the type `any`. */
-		// "useUnknownInCatchVariables": true,               /* Type catch clause variables as 'unknown' instead of 'any'. */
-		// "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
-		// "noUnusedLocals": true,                           /* Enable error reporting when a local variables aren't read. */
-		// "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read */
-		// "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
-		// "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
-		// "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
-		// "noUncheckedIndexedAccess": true,                 /* Include 'undefined' in index signature results */
-		// "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
-		// "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type */
-		// "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
-		// "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */
-
-		/* Completeness */
-		// "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
-		"skipLibCheck": true /* Skip type checking all .d.ts files. */
-	}
-}
diff --git a/src-slowcord/login/.env.template b/src-slowcord/login/.env.template
deleted file mode 100644
index 34f6abeb..00000000
--- a/src-slowcord/login/.env.template
+++ /dev/null
@@ -1,5 +0,0 @@
-DATABASE=../bundle/database.db
-PORT=3010
-DISCORD_CLIENT_ID=
-DISCORD_SECRET=
-DISCORD_REDIRECT=
\ No newline at end of file
diff --git a/src-slowcord/login/package-lock.json b/src-slowcord/login/package-lock.json
deleted file mode 100644
index 72c8c257..00000000
--- a/src-slowcord/login/package-lock.json
+++ /dev/null
@@ -1,3339 +0,0 @@
-{
-	"name": "slowcord-login",
-	"version": "1.0.0",
-	"lockfileVersion": 2,
-	"requires": true,
-	"packages": {
-		"": {
-			"name": "slowcord-login",
-			"version": "1.0.0",
-			"license": "AGPL-3.0-only",
-			"dependencies": {
-				"cookie-parser": "^1.4.6",
-				"dotenv": "^16.0.1",
-				"express": "^4.18.1",
-				"fosscord-server": "file:../../",
-				"node-fetch": "^3.2.6",
-				"sqlite3": "^5.0.8"
-			},
-			"devDependencies": {
-				"@types/cookie-parser": "^1.4.3",
-				"@types/express": "^4.17.13",
-				"@types/node": "^18.0.0"
-			}
-		},
-		"../..": {
-			"version": "1.0.0",
-			"hasInstallScript": true,
-			"license": "AGPL-3.0-only",
-			"dependencies": {
-				"ajv": "^8.6.2",
-				"ajv-formats": "^2.1.1",
-				"bcrypt": "^5.0.1",
-				"cheerio": "^1.0.0-rc.12",
-				"cookie-parser": "^1.4.6",
-				"dotenv": "^16.0.2",
-				"exif-be-gone": "^1.3.1",
-				"fast-zlib": "^2.0.1",
-				"file-type": "16.5",
-				"form-data": "^4.0.0",
-				"i18next": "^21.9.2",
-				"i18next-http-middleware": "^3.2.1",
-				"i18next-node-fs-backend": "^2.1.3",
-				"image-size": "^1.0.2",
-				"json-bigint": "^1.0.0",
-				"jsonwebtoken": "^8.5.1",
-				"lambert-server": "^1.2.12",
-				"module-alias": "^2.2.2",
-				"morgan": "^1.10.0",
-				"multer": "^1.4.5-lts.1",
-				"node-2fa": "^2.0.3",
-				"node-fetch": "^2.6.7",
-				"node-os-utils": "^1.3.7",
-				"picocolors": "^1.0.0",
-				"proxy-agent": "^5.0.0",
-				"sharp": "^0.31.0",
-				"sqlite3": "^5.1.1",
-				"typeorm": "^0.3.10",
-				"typescript-json-schema": "^0.50.1",
-				"ws": "^8.9.0"
-			},
-			"devDependencies": {
-				"@types/amqplib": "^0.8.2",
-				"@types/bcrypt": "^5.0.0",
-				"@types/cookie-parser": "^1.4.3",
-				"@types/i18next-node-fs-backend": "^2.1.1",
-				"@types/json-bigint": "^1.0.1",
-				"@types/jsonwebtoken": "^8.5.9",
-				"@types/morgan": "^1.9.3",
-				"@types/multer": "^1.4.7",
-				"@types/node": "^18.7.20",
-				"@types/node-fetch": "^2.6.2",
-				"@types/node-os-utils": "^1.3.0",
-				"@types/sharp": "^0.31.0",
-				"@types/ws": "^8.5.3",
-				"express": "^4.18.1",
-				"typescript": "^4.8.3"
-			},
-			"optionalDependencies": {
-				"@aws-sdk/client-s3": "^3.178.0",
-				"@sentry/node": "^7.13.0",
-				"@sentry/tracing": "^7.13.0",
-				"@yukikaze-bot/erlpack": "^1.0.1",
-				"amqplib": "^0.10.3"
-			}
-		},
-		"../../util": {
-			"name": "@fosscord/util",
-			"version": "1.0.0",
-			"extraneous": true,
-			"hasInstallScript": true,
-			"license": "AGPL-3.0-only",
-			"dependencies": {
-				"amqplib": "^0.8.0",
-				"form-data": "^4.0.0",
-				"jsonwebtoken": "^8.5.1",
-				"lambert-server": "^1.2.12",
-				"missing-native-js-functions": "^1.2.18",
-				"multer": "^1.4.3",
-				"node-fetch": "^2.6.2",
-				"patch-package": "^6.4.7",
-				"pg": "^8.7.1",
-				"picocolors": "^1.0.0",
-				"proxy-agent": "^5.0.0",
-				"reflect-metadata": "^0.1.13",
-				"typeorm": "^0.2.37",
-				"typescript": "^4.4.2",
-				"typescript-json-schema": "^0.50.1"
-			},
-			"devDependencies": {
-				"@types/amqplib": "^0.8.1",
-				"@types/jsonwebtoken": "^8.5.0",
-				"@types/multer": "^1.4.7",
-				"@types/node": "^14.17.9",
-				"@types/node-fetch": "^2.5.12",
-				"jest": "^27.0.6",
-				"ts-node": "^10.2.1"
-			}
-		},
-		"node_modules/@gar/promisify": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
-			"integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
-			"optional": true
-		},
-		"node_modules/@mapbox/node-pre-gyp": {
-			"version": "1.0.9",
-			"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
-			"integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==",
-			"dependencies": {
-				"detect-libc": "^2.0.0",
-				"https-proxy-agent": "^5.0.0",
-				"make-dir": "^3.1.0",
-				"node-fetch": "^2.6.7",
-				"nopt": "^5.0.0",
-				"npmlog": "^5.0.1",
-				"rimraf": "^3.0.2",
-				"semver": "^7.3.5",
-				"tar": "^6.1.11"
-			},
-			"bin": {
-				"node-pre-gyp": "bin/node-pre-gyp"
-			}
-		},
-		"node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
-			"version": "2.6.7",
-			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-			"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-			"dependencies": {
-				"whatwg-url": "^5.0.0"
-			},
-			"engines": {
-				"node": "4.x || >=6.0.0"
-			},
-			"peerDependencies": {
-				"encoding": "^0.1.0"
-			},
-			"peerDependenciesMeta": {
-				"encoding": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@npmcli/fs": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
-			"integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
-			"optional": true,
-			"dependencies": {
-				"@gar/promisify": "^1.0.1",
-				"semver": "^7.3.5"
-			}
-		},
-		"node_modules/@npmcli/move-file": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
-			"integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
-			"optional": true,
-			"dependencies": {
-				"mkdirp": "^1.0.4",
-				"rimraf": "^3.0.2"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/@tootallnate/once": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-			"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-			"optional": true,
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/@types/body-parser": {
-			"version": "1.19.2",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/connect": "*",
-				"@types/node": "*"
-			}
-		},
-		"node_modules/@types/connect": {
-			"version": "3.4.35",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/node": "*"
-			}
-		},
-		"node_modules/@types/cookie-parser": {
-			"version": "1.4.3",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/express": "*"
-			}
-		},
-		"node_modules/@types/express": {
-			"version": "4.17.13",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/body-parser": "*",
-				"@types/express-serve-static-core": "^4.17.18",
-				"@types/qs": "*",
-				"@types/serve-static": "*"
-			}
-		},
-		"node_modules/@types/express-serve-static-core": {
-			"version": "4.17.29",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/node": "*",
-				"@types/qs": "*",
-				"@types/range-parser": "*"
-			}
-		},
-		"node_modules/@types/mime": {
-			"version": "1.3.2",
-			"dev": true,
-			"license": "MIT"
-		},
-		"node_modules/@types/node": {
-			"version": "18.0.0",
-			"dev": true,
-			"license": "MIT"
-		},
-		"node_modules/@types/qs": {
-			"version": "6.9.7",
-			"dev": true,
-			"license": "MIT"
-		},
-		"node_modules/@types/range-parser": {
-			"version": "1.2.4",
-			"dev": true,
-			"license": "MIT"
-		},
-		"node_modules/@types/serve-static": {
-			"version": "1.13.10",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"@types/mime": "^1",
-				"@types/node": "*"
-			}
-		},
-		"node_modules/abbrev": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-			"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
-		},
-		"node_modules/accepts": {
-			"version": "1.3.8",
-			"license": "MIT",
-			"dependencies": {
-				"mime-types": "~2.1.34",
-				"negotiator": "0.6.3"
-			},
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/agent-base": {
-			"version": "6.0.2",
-			"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-			"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-			"dependencies": {
-				"debug": "4"
-			},
-			"engines": {
-				"node": ">= 6.0.0"
-			}
-		},
-		"node_modules/agent-base/node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-			"dependencies": {
-				"ms": "2.1.2"
-			},
-			"engines": {
-				"node": ">=6.0"
-			},
-			"peerDependenciesMeta": {
-				"supports-color": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/agent-base/node_modules/ms": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-		},
-		"node_modules/agentkeepalive": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
-			"integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
-			"optional": true,
-			"dependencies": {
-				"debug": "^4.1.0",
-				"depd": "^1.1.2",
-				"humanize-ms": "^1.2.1"
-			},
-			"engines": {
-				"node": ">= 8.0.0"
-			}
-		},
-		"node_modules/agentkeepalive/node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-			"optional": true,
-			"dependencies": {
-				"ms": "2.1.2"
-			},
-			"engines": {
-				"node": ">=6.0"
-			},
-			"peerDependenciesMeta": {
-				"supports-color": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/agentkeepalive/node_modules/depd": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-			"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-			"optional": true,
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/agentkeepalive/node_modules/ms": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-			"optional": true
-		},
-		"node_modules/aggregate-error": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-			"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-			"optional": true,
-			"dependencies": {
-				"clean-stack": "^2.0.0",
-				"indent-string": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/ansi-regex": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/aproba": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
-			"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
-		},
-		"node_modules/are-we-there-yet": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
-			"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
-			"dependencies": {
-				"delegates": "^1.0.0",
-				"readable-stream": "^3.6.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/array-flatten": {
-			"version": "1.1.1",
-			"license": "MIT"
-		},
-		"node_modules/balanced-match": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-			"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-		},
-		"node_modules/body-parser": {
-			"version": "1.20.0",
-			"license": "MIT",
-			"dependencies": {
-				"bytes": "3.1.2",
-				"content-type": "~1.0.4",
-				"debug": "2.6.9",
-				"depd": "2.0.0",
-				"destroy": "1.2.0",
-				"http-errors": "2.0.0",
-				"iconv-lite": "0.4.24",
-				"on-finished": "2.4.1",
-				"qs": "6.10.3",
-				"raw-body": "2.5.1",
-				"type-is": "~1.6.18",
-				"unpipe": "1.0.0"
-			},
-			"engines": {
-				"node": ">= 0.8",
-				"npm": "1.2.8000 || >= 1.4.16"
-			}
-		},
-		"node_modules/brace-expansion": {
-			"version": "1.1.11",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-			"dependencies": {
-				"balanced-match": "^1.0.0",
-				"concat-map": "0.0.1"
-			}
-		},
-		"node_modules/bytes": {
-			"version": "3.1.2",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/cacache": {
-			"version": "15.3.0",
-			"resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
-			"integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
-			"optional": true,
-			"dependencies": {
-				"@npmcli/fs": "^1.0.0",
-				"@npmcli/move-file": "^1.0.1",
-				"chownr": "^2.0.0",
-				"fs-minipass": "^2.0.0",
-				"glob": "^7.1.4",
-				"infer-owner": "^1.0.4",
-				"lru-cache": "^6.0.0",
-				"minipass": "^3.1.1",
-				"minipass-collect": "^1.0.2",
-				"minipass-flush": "^1.0.5",
-				"minipass-pipeline": "^1.2.2",
-				"mkdirp": "^1.0.3",
-				"p-map": "^4.0.0",
-				"promise-inflight": "^1.0.1",
-				"rimraf": "^3.0.2",
-				"ssri": "^8.0.1",
-				"tar": "^6.0.2",
-				"unique-filename": "^1.1.1"
-			},
-			"engines": {
-				"node": ">= 10"
-			}
-		},
-		"node_modules/call-bind": {
-			"version": "1.0.2",
-			"license": "MIT",
-			"dependencies": {
-				"function-bind": "^1.1.1",
-				"get-intrinsic": "^1.0.2"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/ljharb"
-			}
-		},
-		"node_modules/chownr": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-			"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/clean-stack": {
-			"version": "2.2.0",
-			"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-			"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-			"optional": true,
-			"engines": {
-				"node": ">=6"
-			}
-		},
-		"node_modules/color-support": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-			"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-			"bin": {
-				"color-support": "bin.js"
-			}
-		},
-		"node_modules/concat-map": {
-			"version": "0.0.1",
-			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
-		},
-		"node_modules/console-control-strings": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-			"integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
-		},
-		"node_modules/content-disposition": {
-			"version": "0.5.4",
-			"license": "MIT",
-			"dependencies": {
-				"safe-buffer": "5.2.1"
-			},
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/content-type": {
-			"version": "1.0.4",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/cookie": {
-			"version": "0.5.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/cookie-parser": {
-			"version": "1.4.6",
-			"license": "MIT",
-			"dependencies": {
-				"cookie": "0.4.1",
-				"cookie-signature": "1.0.6"
-			},
-			"engines": {
-				"node": ">= 0.8.0"
-			}
-		},
-		"node_modules/cookie-parser/node_modules/cookie": {
-			"version": "0.4.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/cookie-signature": {
-			"version": "1.0.6",
-			"license": "MIT"
-		},
-		"node_modules/data-uri-to-buffer": {
-			"version": "4.0.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 12"
-			}
-		},
-		"node_modules/debug": {
-			"version": "2.6.9",
-			"license": "MIT",
-			"dependencies": {
-				"ms": "2.0.0"
-			}
-		},
-		"node_modules/delegates": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-			"integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
-		},
-		"node_modules/depd": {
-			"version": "2.0.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/destroy": {
-			"version": "1.2.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8",
-				"npm": "1.2.8000 || >= 1.4.16"
-			}
-		},
-		"node_modules/detect-libc": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
-			"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/dotenv": {
-			"version": "16.0.1",
-			"license": "BSD-2-Clause",
-			"engines": {
-				"node": ">=12"
-			}
-		},
-		"node_modules/ee-first": {
-			"version": "1.1.1",
-			"license": "MIT"
-		},
-		"node_modules/emoji-regex": {
-			"version": "8.0.0",
-			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-		},
-		"node_modules/encodeurl": {
-			"version": "1.0.2",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/encoding": {
-			"version": "0.1.13",
-			"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-			"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-			"optional": true,
-			"dependencies": {
-				"iconv-lite": "^0.6.2"
-			}
-		},
-		"node_modules/encoding/node_modules/iconv-lite": {
-			"version": "0.6.3",
-			"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-			"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-			"optional": true,
-			"dependencies": {
-				"safer-buffer": ">= 2.1.2 < 3.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/env-paths": {
-			"version": "2.2.1",
-			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
-			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
-			"optional": true,
-			"engines": {
-				"node": ">=6"
-			}
-		},
-		"node_modules/err-code": {
-			"version": "2.0.3",
-			"resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
-			"integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
-			"optional": true
-		},
-		"node_modules/escape-html": {
-			"version": "1.0.3",
-			"license": "MIT"
-		},
-		"node_modules/etag": {
-			"version": "1.8.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/express": {
-			"version": "4.18.1",
-			"license": "MIT",
-			"dependencies": {
-				"accepts": "~1.3.8",
-				"array-flatten": "1.1.1",
-				"body-parser": "1.20.0",
-				"content-disposition": "0.5.4",
-				"content-type": "~1.0.4",
-				"cookie": "0.5.0",
-				"cookie-signature": "1.0.6",
-				"debug": "2.6.9",
-				"depd": "2.0.0",
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"etag": "~1.8.1",
-				"finalhandler": "1.2.0",
-				"fresh": "0.5.2",
-				"http-errors": "2.0.0",
-				"merge-descriptors": "1.0.1",
-				"methods": "~1.1.2",
-				"on-finished": "2.4.1",
-				"parseurl": "~1.3.3",
-				"path-to-regexp": "0.1.7",
-				"proxy-addr": "~2.0.7",
-				"qs": "6.10.3",
-				"range-parser": "~1.2.1",
-				"safe-buffer": "5.2.1",
-				"send": "0.18.0",
-				"serve-static": "1.15.0",
-				"setprototypeof": "1.2.0",
-				"statuses": "2.0.1",
-				"type-is": "~1.6.18",
-				"utils-merge": "1.0.1",
-				"vary": "~1.1.2"
-			},
-			"engines": {
-				"node": ">= 0.10.0"
-			}
-		},
-		"node_modules/fetch-blob": {
-			"version": "3.1.5",
-			"funding": [
-				{
-					"type": "github",
-					"url": "https://github.com/sponsors/jimmywarting"
-				},
-				{
-					"type": "paypal",
-					"url": "https://paypal.me/jimmywarting"
-				}
-			],
-			"license": "MIT",
-			"dependencies": {
-				"node-domexception": "^1.0.0",
-				"web-streams-polyfill": "^3.0.3"
-			},
-			"engines": {
-				"node": "^12.20 || >= 14.13"
-			}
-		},
-		"node_modules/finalhandler": {
-			"version": "1.2.0",
-			"license": "MIT",
-			"dependencies": {
-				"debug": "2.6.9",
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"on-finished": "2.4.1",
-				"parseurl": "~1.3.3",
-				"statuses": "2.0.1",
-				"unpipe": "~1.0.0"
-			},
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/formdata-polyfill": {
-			"version": "4.0.10",
-			"license": "MIT",
-			"dependencies": {
-				"fetch-blob": "^3.1.2"
-			},
-			"engines": {
-				"node": ">=12.20.0"
-			}
-		},
-		"node_modules/forwarded": {
-			"version": "0.2.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/fosscord-server": {
-			"resolved": "../..",
-			"link": true
-		},
-		"node_modules/fresh": {
-			"version": "0.5.2",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/fs-minipass": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-			"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-			"dependencies": {
-				"minipass": "^3.0.0"
-			},
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/fs.realpath": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-			"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
-		},
-		"node_modules/function-bind": {
-			"version": "1.1.1",
-			"license": "MIT"
-		},
-		"node_modules/gauge": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
-			"integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
-			"dependencies": {
-				"aproba": "^1.0.3 || ^2.0.0",
-				"color-support": "^1.1.2",
-				"console-control-strings": "^1.0.0",
-				"has-unicode": "^2.0.1",
-				"object-assign": "^4.1.1",
-				"signal-exit": "^3.0.0",
-				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"wide-align": "^1.1.2"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/get-intrinsic": {
-			"version": "1.1.2",
-			"license": "MIT",
-			"dependencies": {
-				"function-bind": "^1.1.1",
-				"has": "^1.0.3",
-				"has-symbols": "^1.0.3"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/ljharb"
-			}
-		},
-		"node_modules/glob": {
-			"version": "7.2.3",
-			"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-			"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-			"dependencies": {
-				"fs.realpath": "^1.0.0",
-				"inflight": "^1.0.4",
-				"inherits": "2",
-				"minimatch": "^3.1.1",
-				"once": "^1.3.0",
-				"path-is-absolute": "^1.0.0"
-			},
-			"engines": {
-				"node": "*"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
-			}
-		},
-		"node_modules/graceful-fs": {
-			"version": "4.2.10",
-			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-			"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-			"optional": true
-		},
-		"node_modules/has": {
-			"version": "1.0.3",
-			"license": "MIT",
-			"dependencies": {
-				"function-bind": "^1.1.1"
-			},
-			"engines": {
-				"node": ">= 0.4.0"
-			}
-		},
-		"node_modules/has-symbols": {
-			"version": "1.0.3",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.4"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/ljharb"
-			}
-		},
-		"node_modules/has-unicode": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-			"integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
-		},
-		"node_modules/http-cache-semantics": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-			"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-			"optional": true
-		},
-		"node_modules/http-errors": {
-			"version": "2.0.0",
-			"license": "MIT",
-			"dependencies": {
-				"depd": "2.0.0",
-				"inherits": "2.0.4",
-				"setprototypeof": "1.2.0",
-				"statuses": "2.0.1",
-				"toidentifier": "1.0.1"
-			},
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/http-proxy-agent": {
-			"version": "4.0.1",
-			"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-			"integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-			"optional": true,
-			"dependencies": {
-				"@tootallnate/once": "1",
-				"agent-base": "6",
-				"debug": "4"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/http-proxy-agent/node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-			"optional": true,
-			"dependencies": {
-				"ms": "2.1.2"
-			},
-			"engines": {
-				"node": ">=6.0"
-			},
-			"peerDependenciesMeta": {
-				"supports-color": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/http-proxy-agent/node_modules/ms": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-			"optional": true
-		},
-		"node_modules/https-proxy-agent": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-			"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
-			"dependencies": {
-				"agent-base": "6",
-				"debug": "4"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/https-proxy-agent/node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-			"dependencies": {
-				"ms": "2.1.2"
-			},
-			"engines": {
-				"node": ">=6.0"
-			},
-			"peerDependenciesMeta": {
-				"supports-color": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/https-proxy-agent/node_modules/ms": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-		},
-		"node_modules/humanize-ms": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
-			"integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
-			"optional": true,
-			"dependencies": {
-				"ms": "^2.0.0"
-			}
-		},
-		"node_modules/iconv-lite": {
-			"version": "0.4.24",
-			"license": "MIT",
-			"dependencies": {
-				"safer-buffer": ">= 2.1.2 < 3"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/imurmurhash": {
-			"version": "0.1.4",
-			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-			"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-			"optional": true,
-			"engines": {
-				"node": ">=0.8.19"
-			}
-		},
-		"node_modules/indent-string": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-			"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-			"optional": true,
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/infer-owner": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-			"integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-			"optional": true
-		},
-		"node_modules/inflight": {
-			"version": "1.0.6",
-			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-			"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-			"dependencies": {
-				"once": "^1.3.0",
-				"wrappy": "1"
-			}
-		},
-		"node_modules/inherits": {
-			"version": "2.0.4",
-			"license": "ISC"
-		},
-		"node_modules/ip": {
-			"version": "1.1.8",
-			"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
-			"integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
-			"optional": true
-		},
-		"node_modules/ipaddr.js": {
-			"version": "1.9.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.10"
-			}
-		},
-		"node_modules/is-fullwidth-code-point": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/is-lambda": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
-			"integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
-			"optional": true
-		},
-		"node_modules/isexe": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-			"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-			"optional": true
-		},
-		"node_modules/lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"dependencies": {
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/make-dir": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-			"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-			"dependencies": {
-				"semver": "^6.0.0"
-			},
-			"engines": {
-				"node": ">=8"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/make-dir/node_modules/semver": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-			"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-			"bin": {
-				"semver": "bin/semver.js"
-			}
-		},
-		"node_modules/make-fetch-happen": {
-			"version": "9.1.0",
-			"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
-			"integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
-			"optional": true,
-			"dependencies": {
-				"agentkeepalive": "^4.1.3",
-				"cacache": "^15.2.0",
-				"http-cache-semantics": "^4.1.0",
-				"http-proxy-agent": "^4.0.1",
-				"https-proxy-agent": "^5.0.0",
-				"is-lambda": "^1.0.1",
-				"lru-cache": "^6.0.0",
-				"minipass": "^3.1.3",
-				"minipass-collect": "^1.0.2",
-				"minipass-fetch": "^1.3.2",
-				"minipass-flush": "^1.0.5",
-				"minipass-pipeline": "^1.2.4",
-				"negotiator": "^0.6.2",
-				"promise-retry": "^2.0.1",
-				"socks-proxy-agent": "^6.0.0",
-				"ssri": "^8.0.0"
-			},
-			"engines": {
-				"node": ">= 10"
-			}
-		},
-		"node_modules/media-typer": {
-			"version": "0.3.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/merge-descriptors": {
-			"version": "1.0.1",
-			"license": "MIT"
-		},
-		"node_modules/methods": {
-			"version": "1.1.2",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/mime": {
-			"version": "1.6.0",
-			"license": "MIT",
-			"bin": {
-				"mime": "cli.js"
-			},
-			"engines": {
-				"node": ">=4"
-			}
-		},
-		"node_modules/mime-db": {
-			"version": "1.52.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/mime-types": {
-			"version": "2.1.35",
-			"license": "MIT",
-			"dependencies": {
-				"mime-db": "1.52.0"
-			},
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/minimatch": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-			"dependencies": {
-				"brace-expansion": "^1.1.7"
-			},
-			"engines": {
-				"node": "*"
-			}
-		},
-		"node_modules/minipass": {
-			"version": "3.3.4",
-			"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-			"integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
-			"dependencies": {
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/minipass-collect": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-			"integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-			"optional": true,
-			"dependencies": {
-				"minipass": "^3.0.0"
-			},
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/minipass-fetch": {
-			"version": "1.4.1",
-			"resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
-			"integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
-			"optional": true,
-			"dependencies": {
-				"minipass": "^3.1.0",
-				"minipass-sized": "^1.0.3",
-				"minizlib": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=8"
-			},
-			"optionalDependencies": {
-				"encoding": "^0.1.12"
-			}
-		},
-		"node_modules/minipass-flush": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-			"integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-			"optional": true,
-			"dependencies": {
-				"minipass": "^3.0.0"
-			},
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/minipass-pipeline": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-			"integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-			"optional": true,
-			"dependencies": {
-				"minipass": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/minipass-sized": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
-			"integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
-			"optional": true,
-			"dependencies": {
-				"minipass": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/minizlib": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-			"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-			"dependencies": {
-				"minipass": "^3.0.0",
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/mkdirp": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-			"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-			"bin": {
-				"mkdirp": "bin/cmd.js"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/ms": {
-			"version": "2.0.0",
-			"license": "MIT"
-		},
-		"node_modules/negotiator": {
-			"version": "0.6.3",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/node-addon-api": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
-			"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
-		},
-		"node_modules/node-domexception": {
-			"version": "1.0.0",
-			"funding": [
-				{
-					"type": "github",
-					"url": "https://github.com/sponsors/jimmywarting"
-				},
-				{
-					"type": "github",
-					"url": "https://paypal.me/jimmywarting"
-				}
-			],
-			"license": "MIT",
-			"engines": {
-				"node": ">=10.5.0"
-			}
-		},
-		"node_modules/node-fetch": {
-			"version": "3.2.6",
-			"license": "MIT",
-			"dependencies": {
-				"data-uri-to-buffer": "^4.0.0",
-				"fetch-blob": "^3.1.4",
-				"formdata-polyfill": "^4.0.10"
-			},
-			"engines": {
-				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/node-fetch"
-			}
-		},
-		"node_modules/node-gyp": {
-			"version": "8.4.1",
-			"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
-			"integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
-			"optional": true,
-			"dependencies": {
-				"env-paths": "^2.2.0",
-				"glob": "^7.1.4",
-				"graceful-fs": "^4.2.6",
-				"make-fetch-happen": "^9.1.0",
-				"nopt": "^5.0.0",
-				"npmlog": "^6.0.0",
-				"rimraf": "^3.0.2",
-				"semver": "^7.3.5",
-				"tar": "^6.1.2",
-				"which": "^2.0.2"
-			},
-			"bin": {
-				"node-gyp": "bin/node-gyp.js"
-			},
-			"engines": {
-				"node": ">= 10.12.0"
-			}
-		},
-		"node_modules/node-gyp/node_modules/are-we-there-yet": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz",
-			"integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==",
-			"optional": true,
-			"dependencies": {
-				"delegates": "^1.0.0",
-				"readable-stream": "^3.6.0"
-			},
-			"engines": {
-				"node": "^12.13.0 || ^14.15.0 || >=16"
-			}
-		},
-		"node_modules/node-gyp/node_modules/gauge": {
-			"version": "4.0.4",
-			"resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
-			"integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
-			"optional": true,
-			"dependencies": {
-				"aproba": "^1.0.3 || ^2.0.0",
-				"color-support": "^1.1.3",
-				"console-control-strings": "^1.1.0",
-				"has-unicode": "^2.0.1",
-				"signal-exit": "^3.0.7",
-				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"wide-align": "^1.1.5"
-			},
-			"engines": {
-				"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-			}
-		},
-		"node_modules/node-gyp/node_modules/npmlog": {
-			"version": "6.0.2",
-			"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
-			"integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
-			"optional": true,
-			"dependencies": {
-				"are-we-there-yet": "^3.0.0",
-				"console-control-strings": "^1.1.0",
-				"gauge": "^4.0.3",
-				"set-blocking": "^2.0.0"
-			},
-			"engines": {
-				"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-			}
-		},
-		"node_modules/nopt": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-			"integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
-			"dependencies": {
-				"abbrev": "1"
-			},
-			"bin": {
-				"nopt": "bin/nopt.js"
-			},
-			"engines": {
-				"node": ">=6"
-			}
-		},
-		"node_modules/npmlog": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
-			"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
-			"dependencies": {
-				"are-we-there-yet": "^2.0.0",
-				"console-control-strings": "^1.1.0",
-				"gauge": "^3.0.0",
-				"set-blocking": "^2.0.0"
-			}
-		},
-		"node_modules/object-assign": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-			"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/object-inspect": {
-			"version": "1.12.2",
-			"license": "MIT",
-			"funding": {
-				"url": "https://github.com/sponsors/ljharb"
-			}
-		},
-		"node_modules/on-finished": {
-			"version": "2.4.1",
-			"license": "MIT",
-			"dependencies": {
-				"ee-first": "1.1.1"
-			},
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/once": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-			"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-			"dependencies": {
-				"wrappy": "1"
-			}
-		},
-		"node_modules/p-map": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-			"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-			"optional": true,
-			"dependencies": {
-				"aggregate-error": "^3.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
-			}
-		},
-		"node_modules/parseurl": {
-			"version": "1.3.3",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/path-is-absolute": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-			"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/path-to-regexp": {
-			"version": "0.1.7",
-			"license": "MIT"
-		},
-		"node_modules/promise-inflight": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-			"integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
-			"optional": true
-		},
-		"node_modules/promise-retry": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
-			"integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
-			"optional": true,
-			"dependencies": {
-				"err-code": "^2.0.2",
-				"retry": "^0.12.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/proxy-addr": {
-			"version": "2.0.7",
-			"license": "MIT",
-			"dependencies": {
-				"forwarded": "0.2.0",
-				"ipaddr.js": "1.9.1"
-			},
-			"engines": {
-				"node": ">= 0.10"
-			}
-		},
-		"node_modules/qs": {
-			"version": "6.10.3",
-			"license": "BSD-3-Clause",
-			"dependencies": {
-				"side-channel": "^1.0.4"
-			},
-			"engines": {
-				"node": ">=0.6"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/ljharb"
-			}
-		},
-		"node_modules/range-parser": {
-			"version": "1.2.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/raw-body": {
-			"version": "2.5.1",
-			"license": "MIT",
-			"dependencies": {
-				"bytes": "3.1.2",
-				"http-errors": "2.0.0",
-				"iconv-lite": "0.4.24",
-				"unpipe": "1.0.0"
-			},
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/readable-stream": {
-			"version": "3.6.0",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-			"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-			"dependencies": {
-				"inherits": "^2.0.3",
-				"string_decoder": "^1.1.1",
-				"util-deprecate": "^1.0.1"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/retry": {
-			"version": "0.12.0",
-			"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-			"integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
-			"optional": true,
-			"engines": {
-				"node": ">= 4"
-			}
-		},
-		"node_modules/rimraf": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-			"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-			"dependencies": {
-				"glob": "^7.1.3"
-			},
-			"bin": {
-				"rimraf": "bin.js"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/isaacs"
-			}
-		},
-		"node_modules/safe-buffer": {
-			"version": "5.2.1",
-			"funding": [
-				{
-					"type": "github",
-					"url": "https://github.com/sponsors/feross"
-				},
-				{
-					"type": "patreon",
-					"url": "https://www.patreon.com/feross"
-				},
-				{
-					"type": "consulting",
-					"url": "https://feross.org/support"
-				}
-			],
-			"license": "MIT"
-		},
-		"node_modules/safer-buffer": {
-			"version": "2.1.2",
-			"license": "MIT"
-		},
-		"node_modules/semver": {
-			"version": "7.3.7",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-			"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-			"dependencies": {
-				"lru-cache": "^6.0.0"
-			},
-			"bin": {
-				"semver": "bin/semver.js"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/send": {
-			"version": "0.18.0",
-			"license": "MIT",
-			"dependencies": {
-				"debug": "2.6.9",
-				"depd": "2.0.0",
-				"destroy": "1.2.0",
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"etag": "~1.8.1",
-				"fresh": "0.5.2",
-				"http-errors": "2.0.0",
-				"mime": "1.6.0",
-				"ms": "2.1.3",
-				"on-finished": "2.4.1",
-				"range-parser": "~1.2.1",
-				"statuses": "2.0.1"
-			},
-			"engines": {
-				"node": ">= 0.8.0"
-			}
-		},
-		"node_modules/send/node_modules/ms": {
-			"version": "2.1.3",
-			"license": "MIT"
-		},
-		"node_modules/serve-static": {
-			"version": "1.15.0",
-			"license": "MIT",
-			"dependencies": {
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"parseurl": "~1.3.3",
-				"send": "0.18.0"
-			},
-			"engines": {
-				"node": ">= 0.8.0"
-			}
-		},
-		"node_modules/set-blocking": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-			"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
-		},
-		"node_modules/setprototypeof": {
-			"version": "1.2.0",
-			"license": "ISC"
-		},
-		"node_modules/side-channel": {
-			"version": "1.0.4",
-			"license": "MIT",
-			"dependencies": {
-				"call-bind": "^1.0.0",
-				"get-intrinsic": "^1.0.2",
-				"object-inspect": "^1.9.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/ljharb"
-			}
-		},
-		"node_modules/signal-exit": {
-			"version": "3.0.7",
-			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-			"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
-		},
-		"node_modules/smart-buffer": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
-			"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
-			"optional": true,
-			"engines": {
-				"node": ">= 6.0.0",
-				"npm": ">= 3.0.0"
-			}
-		},
-		"node_modules/socks": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
-			"integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
-			"optional": true,
-			"dependencies": {
-				"ip": "^1.1.5",
-				"smart-buffer": "^4.2.0"
-			},
-			"engines": {
-				"node": ">= 10.13.0",
-				"npm": ">= 3.0.0"
-			}
-		},
-		"node_modules/socks-proxy-agent": {
-			"version": "6.2.1",
-			"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
-			"integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
-			"optional": true,
-			"dependencies": {
-				"agent-base": "^6.0.2",
-				"debug": "^4.3.3",
-				"socks": "^2.6.2"
-			},
-			"engines": {
-				"node": ">= 10"
-			}
-		},
-		"node_modules/socks-proxy-agent/node_modules/debug": {
-			"version": "4.3.4",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-			"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-			"optional": true,
-			"dependencies": {
-				"ms": "2.1.2"
-			},
-			"engines": {
-				"node": ">=6.0"
-			},
-			"peerDependenciesMeta": {
-				"supports-color": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/socks-proxy-agent/node_modules/ms": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-			"optional": true
-		},
-		"node_modules/sqlite3": {
-			"version": "5.0.8",
-			"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.8.tgz",
-			"integrity": "sha512-f2ACsbSyb2D1qFFcqIXPfFscLtPVOWJr5GmUzYxf4W+0qelu5MWrR+FAQE1d5IUArEltBrzSDxDORG8P/IkqyQ==",
-			"hasInstallScript": true,
-			"dependencies": {
-				"@mapbox/node-pre-gyp": "^1.0.0",
-				"node-addon-api": "^4.2.0",
-				"tar": "^6.1.11"
-			},
-			"optionalDependencies": {
-				"node-gyp": "8.x"
-			},
-			"peerDependencies": {
-				"node-gyp": "8.x"
-			},
-			"peerDependenciesMeta": {
-				"node-gyp": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/ssri": {
-			"version": "8.0.1",
-			"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
-			"integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
-			"optional": true,
-			"dependencies": {
-				"minipass": "^3.1.1"
-			},
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/statuses": {
-			"version": "2.0.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/string_decoder": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-			"dependencies": {
-				"safe-buffer": "~5.2.0"
-			}
-		},
-		"node_modules/string-width": {
-			"version": "4.2.3",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-			"dependencies": {
-				"emoji-regex": "^8.0.0",
-				"is-fullwidth-code-point": "^3.0.0",
-				"strip-ansi": "^6.0.1"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/strip-ansi": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-			"dependencies": {
-				"ansi-regex": "^5.0.1"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/tar": {
-			"version": "6.1.11",
-			"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-			"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
-			"dependencies": {
-				"chownr": "^2.0.0",
-				"fs-minipass": "^2.0.0",
-				"minipass": "^3.0.0",
-				"minizlib": "^2.1.1",
-				"mkdirp": "^1.0.3",
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">= 10"
-			}
-		},
-		"node_modules/toidentifier": {
-			"version": "1.0.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.6"
-			}
-		},
-		"node_modules/tr46": {
-			"version": "0.0.3",
-			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-		},
-		"node_modules/type-is": {
-			"version": "1.6.18",
-			"license": "MIT",
-			"dependencies": {
-				"media-typer": "0.3.0",
-				"mime-types": "~2.1.24"
-			},
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/unique-filename": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-			"integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
-			"optional": true,
-			"dependencies": {
-				"unique-slug": "^2.0.0"
-			}
-		},
-		"node_modules/unique-slug": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
-			"integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
-			"optional": true,
-			"dependencies": {
-				"imurmurhash": "^0.1.4"
-			}
-		},
-		"node_modules/unpipe": {
-			"version": "1.0.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/util-deprecate": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-			"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
-		},
-		"node_modules/utils-merge": {
-			"version": "1.0.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.4.0"
-			}
-		},
-		"node_modules/vary": {
-			"version": "1.1.2",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/web-streams-polyfill": {
-			"version": "3.2.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/webidl-conversions": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-		},
-		"node_modules/whatwg-url": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-			"dependencies": {
-				"tr46": "~0.0.3",
-				"webidl-conversions": "^3.0.0"
-			}
-		},
-		"node_modules/which": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-			"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-			"optional": true,
-			"dependencies": {
-				"isexe": "^2.0.0"
-			},
-			"bin": {
-				"node-which": "bin/node-which"
-			},
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/wide-align": {
-			"version": "1.1.5",
-			"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
-			"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-			"dependencies": {
-				"string-width": "^1.0.2 || 2 || 3 || 4"
-			}
-		},
-		"node_modules/wrappy": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-			"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
-		},
-		"node_modules/yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-		}
-	},
-	"dependencies": {
-		"@gar/promisify": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
-			"integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
-			"optional": true
-		},
-		"@mapbox/node-pre-gyp": {
-			"version": "1.0.9",
-			"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
-			"integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==",
-			"requires": {
-				"detect-libc": "^2.0.0",
-				"https-proxy-agent": "^5.0.0",
-				"make-dir": "^3.1.0",
-				"node-fetch": "^2.6.7",
-				"nopt": "^5.0.0",
-				"npmlog": "^5.0.1",
-				"rimraf": "^3.0.2",
-				"semver": "^7.3.5",
-				"tar": "^6.1.11"
-			},
-			"dependencies": {
-				"node-fetch": {
-					"version": "2.6.7",
-					"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-					"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-					"requires": {
-						"whatwg-url": "^5.0.0"
-					}
-				}
-			}
-		},
-		"@npmcli/fs": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
-			"integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
-			"optional": true,
-			"requires": {
-				"@gar/promisify": "^1.0.1",
-				"semver": "^7.3.5"
-			}
-		},
-		"@npmcli/move-file": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
-			"integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
-			"optional": true,
-			"requires": {
-				"mkdirp": "^1.0.4",
-				"rimraf": "^3.0.2"
-			}
-		},
-		"@tootallnate/once": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-			"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-			"optional": true
-		},
-		"@types/body-parser": {
-			"version": "1.19.2",
-			"dev": true,
-			"requires": {
-				"@types/connect": "*",
-				"@types/node": "*"
-			}
-		},
-		"@types/connect": {
-			"version": "3.4.35",
-			"dev": true,
-			"requires": {
-				"@types/node": "*"
-			}
-		},
-		"@types/cookie-parser": {
-			"version": "1.4.3",
-			"dev": true,
-			"requires": {
-				"@types/express": "*"
-			}
-		},
-		"@types/express": {
-			"version": "4.17.13",
-			"dev": true,
-			"requires": {
-				"@types/body-parser": "*",
-				"@types/express-serve-static-core": "^4.17.18",
-				"@types/qs": "*",
-				"@types/serve-static": "*"
-			}
-		},
-		"@types/express-serve-static-core": {
-			"version": "4.17.29",
-			"dev": true,
-			"requires": {
-				"@types/node": "*",
-				"@types/qs": "*",
-				"@types/range-parser": "*"
-			}
-		},
-		"@types/mime": {
-			"version": "1.3.2",
-			"dev": true
-		},
-		"@types/node": {
-			"version": "18.0.0",
-			"dev": true
-		},
-		"@types/qs": {
-			"version": "6.9.7",
-			"dev": true
-		},
-		"@types/range-parser": {
-			"version": "1.2.4",
-			"dev": true
-		},
-		"@types/serve-static": {
-			"version": "1.13.10",
-			"dev": true,
-			"requires": {
-				"@types/mime": "^1",
-				"@types/node": "*"
-			}
-		},
-		"abbrev": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-			"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
-		},
-		"accepts": {
-			"version": "1.3.8",
-			"requires": {
-				"mime-types": "~2.1.34",
-				"negotiator": "0.6.3"
-			}
-		},
-		"agent-base": {
-			"version": "6.0.2",
-			"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-			"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-			"requires": {
-				"debug": "4"
-			},
-			"dependencies": {
-				"debug": {
-					"version": "4.3.4",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-					"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-					"requires": {
-						"ms": "2.1.2"
-					}
-				},
-				"ms": {
-					"version": "2.1.2",
-					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-				}
-			}
-		},
-		"agentkeepalive": {
-			"version": "4.2.1",
-			"resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
-			"integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
-			"optional": true,
-			"requires": {
-				"debug": "^4.1.0",
-				"depd": "^1.1.2",
-				"humanize-ms": "^1.2.1"
-			},
-			"dependencies": {
-				"debug": {
-					"version": "4.3.4",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-					"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-					"optional": true,
-					"requires": {
-						"ms": "2.1.2"
-					}
-				},
-				"depd": {
-					"version": "1.1.2",
-					"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-					"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-					"optional": true
-				},
-				"ms": {
-					"version": "2.1.2",
-					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-					"optional": true
-				}
-			}
-		},
-		"aggregate-error": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-			"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-			"optional": true,
-			"requires": {
-				"clean-stack": "^2.0.0",
-				"indent-string": "^4.0.0"
-			}
-		},
-		"ansi-regex": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
-		},
-		"aproba": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
-			"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
-		},
-		"are-we-there-yet": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
-			"integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
-			"requires": {
-				"delegates": "^1.0.0",
-				"readable-stream": "^3.6.0"
-			}
-		},
-		"array-flatten": {
-			"version": "1.1.1"
-		},
-		"balanced-match": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-			"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-		},
-		"body-parser": {
-			"version": "1.20.0",
-			"requires": {
-				"bytes": "3.1.2",
-				"content-type": "~1.0.4",
-				"debug": "2.6.9",
-				"depd": "2.0.0",
-				"destroy": "1.2.0",
-				"http-errors": "2.0.0",
-				"iconv-lite": "0.4.24",
-				"on-finished": "2.4.1",
-				"qs": "6.10.3",
-				"raw-body": "2.5.1",
-				"type-is": "~1.6.18",
-				"unpipe": "1.0.0"
-			}
-		},
-		"brace-expansion": {
-			"version": "1.1.11",
-			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-			"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-			"requires": {
-				"balanced-match": "^1.0.0",
-				"concat-map": "0.0.1"
-			}
-		},
-		"bytes": {
-			"version": "3.1.2"
-		},
-		"cacache": {
-			"version": "15.3.0",
-			"resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
-			"integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
-			"optional": true,
-			"requires": {
-				"@npmcli/fs": "^1.0.0",
-				"@npmcli/move-file": "^1.0.1",
-				"chownr": "^2.0.0",
-				"fs-minipass": "^2.0.0",
-				"glob": "^7.1.4",
-				"infer-owner": "^1.0.4",
-				"lru-cache": "^6.0.0",
-				"minipass": "^3.1.1",
-				"minipass-collect": "^1.0.2",
-				"minipass-flush": "^1.0.5",
-				"minipass-pipeline": "^1.2.2",
-				"mkdirp": "^1.0.3",
-				"p-map": "^4.0.0",
-				"promise-inflight": "^1.0.1",
-				"rimraf": "^3.0.2",
-				"ssri": "^8.0.1",
-				"tar": "^6.0.2",
-				"unique-filename": "^1.1.1"
-			}
-		},
-		"call-bind": {
-			"version": "1.0.2",
-			"requires": {
-				"function-bind": "^1.1.1",
-				"get-intrinsic": "^1.0.2"
-			}
-		},
-		"chownr": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-			"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
-		},
-		"clean-stack": {
-			"version": "2.2.0",
-			"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-			"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-			"optional": true
-		},
-		"color-support": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-			"integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
-		},
-		"concat-map": {
-			"version": "0.0.1",
-			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
-		},
-		"console-control-strings": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-			"integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
-		},
-		"content-disposition": {
-			"version": "0.5.4",
-			"requires": {
-				"safe-buffer": "5.2.1"
-			}
-		},
-		"content-type": {
-			"version": "1.0.4"
-		},
-		"cookie": {
-			"version": "0.5.0"
-		},
-		"cookie-parser": {
-			"version": "1.4.6",
-			"requires": {
-				"cookie": "0.4.1",
-				"cookie-signature": "1.0.6"
-			},
-			"dependencies": {
-				"cookie": {
-					"version": "0.4.1"
-				}
-			}
-		},
-		"cookie-signature": {
-			"version": "1.0.6"
-		},
-		"data-uri-to-buffer": {
-			"version": "4.0.0"
-		},
-		"debug": {
-			"version": "2.6.9",
-			"requires": {
-				"ms": "2.0.0"
-			}
-		},
-		"delegates": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-			"integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
-		},
-		"depd": {
-			"version": "2.0.0"
-		},
-		"destroy": {
-			"version": "1.2.0"
-		},
-		"detect-libc": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
-			"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w=="
-		},
-		"dotenv": {
-			"version": "16.0.1"
-		},
-		"ee-first": {
-			"version": "1.1.1"
-		},
-		"emoji-regex": {
-			"version": "8.0.0",
-			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-			"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-		},
-		"encodeurl": {
-			"version": "1.0.2"
-		},
-		"encoding": {
-			"version": "0.1.13",
-			"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-			"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-			"optional": true,
-			"requires": {
-				"iconv-lite": "^0.6.2"
-			},
-			"dependencies": {
-				"iconv-lite": {
-					"version": "0.6.3",
-					"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-					"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-					"optional": true,
-					"requires": {
-						"safer-buffer": ">= 2.1.2 < 3.0.0"
-					}
-				}
-			}
-		},
-		"env-paths": {
-			"version": "2.2.1",
-			"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
-			"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
-			"optional": true
-		},
-		"err-code": {
-			"version": "2.0.3",
-			"resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
-			"integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
-			"optional": true
-		},
-		"escape-html": {
-			"version": "1.0.3"
-		},
-		"etag": {
-			"version": "1.8.1"
-		},
-		"express": {
-			"version": "4.18.1",
-			"requires": {
-				"accepts": "~1.3.8",
-				"array-flatten": "1.1.1",
-				"body-parser": "1.20.0",
-				"content-disposition": "0.5.4",
-				"content-type": "~1.0.4",
-				"cookie": "0.5.0",
-				"cookie-signature": "1.0.6",
-				"debug": "2.6.9",
-				"depd": "2.0.0",
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"etag": "~1.8.1",
-				"finalhandler": "1.2.0",
-				"fresh": "0.5.2",
-				"http-errors": "2.0.0",
-				"merge-descriptors": "1.0.1",
-				"methods": "~1.1.2",
-				"on-finished": "2.4.1",
-				"parseurl": "~1.3.3",
-				"path-to-regexp": "0.1.7",
-				"proxy-addr": "~2.0.7",
-				"qs": "6.10.3",
-				"range-parser": "~1.2.1",
-				"safe-buffer": "5.2.1",
-				"send": "0.18.0",
-				"serve-static": "1.15.0",
-				"setprototypeof": "1.2.0",
-				"statuses": "2.0.1",
-				"type-is": "~1.6.18",
-				"utils-merge": "1.0.1",
-				"vary": "~1.1.2"
-			}
-		},
-		"fetch-blob": {
-			"version": "3.1.5",
-			"requires": {
-				"node-domexception": "^1.0.0",
-				"web-streams-polyfill": "^3.0.3"
-			}
-		},
-		"finalhandler": {
-			"version": "1.2.0",
-			"requires": {
-				"debug": "2.6.9",
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"on-finished": "2.4.1",
-				"parseurl": "~1.3.3",
-				"statuses": "2.0.1",
-				"unpipe": "~1.0.0"
-			}
-		},
-		"formdata-polyfill": {
-			"version": "4.0.10",
-			"requires": {
-				"fetch-blob": "^3.1.2"
-			}
-		},
-		"forwarded": {
-			"version": "0.2.0"
-		},
-		"fosscord-server": {
-			"version": "file:../..",
-			"requires": {
-				"@aws-sdk/client-s3": "^3.178.0",
-				"@sentry/node": "^7.13.0",
-				"@sentry/tracing": "^7.13.0",
-				"@types/amqplib": "^0.8.2",
-				"@types/bcrypt": "^5.0.0",
-				"@types/cookie-parser": "^1.4.3",
-				"@types/i18next-node-fs-backend": "^2.1.1",
-				"@types/json-bigint": "^1.0.1",
-				"@types/jsonwebtoken": "^8.5.9",
-				"@types/morgan": "^1.9.3",
-				"@types/multer": "^1.4.7",
-				"@types/node": "^18.7.20",
-				"@types/node-fetch": "^2.6.2",
-				"@types/node-os-utils": "^1.3.0",
-				"@types/sharp": "^0.31.0",
-				"@types/ws": "^8.5.3",
-				"@yukikaze-bot/erlpack": "^1.0.1",
-				"ajv": "^8.6.2",
-				"ajv-formats": "^2.1.1",
-				"amqplib": "^0.10.3",
-				"bcrypt": "^5.0.1",
-				"cheerio": "^1.0.0-rc.12",
-				"cookie-parser": "^1.4.6",
-				"dotenv": "^16.0.2",
-				"exif-be-gone": "^1.3.1",
-				"express": "^4.18.1",
-				"fast-zlib": "^2.0.1",
-				"file-type": "16.5",
-				"form-data": "^4.0.0",
-				"i18next": "^21.9.2",
-				"i18next-http-middleware": "^3.2.1",
-				"i18next-node-fs-backend": "^2.1.3",
-				"image-size": "^1.0.2",
-				"json-bigint": "^1.0.0",
-				"jsonwebtoken": "^8.5.1",
-				"lambert-server": "^1.2.12",
-				"module-alias": "^2.2.2",
-				"morgan": "^1.10.0",
-				"multer": "^1.4.5-lts.1",
-				"node-2fa": "^2.0.3",
-				"node-fetch": "^2.6.7",
-				"node-os-utils": "^1.3.7",
-				"picocolors": "^1.0.0",
-				"proxy-agent": "^5.0.0",
-				"sharp": "^0.31.0",
-				"sqlite3": "^5.1.1",
-				"typeorm": "^0.3.10",
-				"typescript": "^4.8.3",
-				"typescript-json-schema": "^0.50.1",
-				"ws": "^8.9.0"
-			}
-		},
-		"fresh": {
-			"version": "0.5.2"
-		},
-		"fs-minipass": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-			"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"fs.realpath": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-			"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
-		},
-		"function-bind": {
-			"version": "1.1.1"
-		},
-		"gauge": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
-			"integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
-			"requires": {
-				"aproba": "^1.0.3 || ^2.0.0",
-				"color-support": "^1.1.2",
-				"console-control-strings": "^1.0.0",
-				"has-unicode": "^2.0.1",
-				"object-assign": "^4.1.1",
-				"signal-exit": "^3.0.0",
-				"string-width": "^4.2.3",
-				"strip-ansi": "^6.0.1",
-				"wide-align": "^1.1.2"
-			}
-		},
-		"get-intrinsic": {
-			"version": "1.1.2",
-			"requires": {
-				"function-bind": "^1.1.1",
-				"has": "^1.0.3",
-				"has-symbols": "^1.0.3"
-			}
-		},
-		"glob": {
-			"version": "7.2.3",
-			"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-			"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-			"requires": {
-				"fs.realpath": "^1.0.0",
-				"inflight": "^1.0.4",
-				"inherits": "2",
-				"minimatch": "^3.1.1",
-				"once": "^1.3.0",
-				"path-is-absolute": "^1.0.0"
-			}
-		},
-		"graceful-fs": {
-			"version": "4.2.10",
-			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-			"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-			"optional": true
-		},
-		"has": {
-			"version": "1.0.3",
-			"requires": {
-				"function-bind": "^1.1.1"
-			}
-		},
-		"has-symbols": {
-			"version": "1.0.3"
-		},
-		"has-unicode": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-			"integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
-		},
-		"http-cache-semantics": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-			"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
-			"optional": true
-		},
-		"http-errors": {
-			"version": "2.0.0",
-			"requires": {
-				"depd": "2.0.0",
-				"inherits": "2.0.4",
-				"setprototypeof": "1.2.0",
-				"statuses": "2.0.1",
-				"toidentifier": "1.0.1"
-			}
-		},
-		"http-proxy-agent": {
-			"version": "4.0.1",
-			"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-			"integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-			"optional": true,
-			"requires": {
-				"@tootallnate/once": "1",
-				"agent-base": "6",
-				"debug": "4"
-			},
-			"dependencies": {
-				"debug": {
-					"version": "4.3.4",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-					"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-					"optional": true,
-					"requires": {
-						"ms": "2.1.2"
-					}
-				},
-				"ms": {
-					"version": "2.1.2",
-					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-					"optional": true
-				}
-			}
-		},
-		"https-proxy-agent": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-			"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
-			"requires": {
-				"agent-base": "6",
-				"debug": "4"
-			},
-			"dependencies": {
-				"debug": {
-					"version": "4.3.4",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-					"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-					"requires": {
-						"ms": "2.1.2"
-					}
-				},
-				"ms": {
-					"version": "2.1.2",
-					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-				}
-			}
-		},
-		"humanize-ms": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
-			"integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
-			"optional": true,
-			"requires": {
-				"ms": "^2.0.0"
-			}
-		},
-		"iconv-lite": {
-			"version": "0.4.24",
-			"requires": {
-				"safer-buffer": ">= 2.1.2 < 3"
-			}
-		},
-		"imurmurhash": {
-			"version": "0.1.4",
-			"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-			"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-			"optional": true
-		},
-		"indent-string": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-			"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-			"optional": true
-		},
-		"infer-owner": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
-			"integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
-			"optional": true
-		},
-		"inflight": {
-			"version": "1.0.6",
-			"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-			"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-			"requires": {
-				"once": "^1.3.0",
-				"wrappy": "1"
-			}
-		},
-		"inherits": {
-			"version": "2.0.4"
-		},
-		"ip": {
-			"version": "1.1.8",
-			"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
-			"integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
-			"optional": true
-		},
-		"ipaddr.js": {
-			"version": "1.9.1"
-		},
-		"is-fullwidth-code-point": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
-		},
-		"is-lambda": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
-			"integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
-			"optional": true
-		},
-		"isexe": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-			"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-			"optional": true
-		},
-		"lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"requires": {
-				"yallist": "^4.0.0"
-			}
-		},
-		"make-dir": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-			"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-			"requires": {
-				"semver": "^6.0.0"
-			},
-			"dependencies": {
-				"semver": {
-					"version": "6.3.0",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
-				}
-			}
-		},
-		"make-fetch-happen": {
-			"version": "9.1.0",
-			"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
-			"integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
-			"optional": true,
-			"requires": {
-				"agentkeepalive": "^4.1.3",
-				"cacache": "^15.2.0",
-				"http-cache-semantics": "^4.1.0",
-				"http-proxy-agent": "^4.0.1",
-				"https-proxy-agent": "^5.0.0",
-				"is-lambda": "^1.0.1",
-				"lru-cache": "^6.0.0",
-				"minipass": "^3.1.3",
-				"minipass-collect": "^1.0.2",
-				"minipass-fetch": "^1.3.2",
-				"minipass-flush": "^1.0.5",
-				"minipass-pipeline": "^1.2.4",
-				"negotiator": "^0.6.2",
-				"promise-retry": "^2.0.1",
-				"socks-proxy-agent": "^6.0.0",
-				"ssri": "^8.0.0"
-			}
-		},
-		"media-typer": {
-			"version": "0.3.0"
-		},
-		"merge-descriptors": {
-			"version": "1.0.1"
-		},
-		"methods": {
-			"version": "1.1.2"
-		},
-		"mime": {
-			"version": "1.6.0"
-		},
-		"mime-db": {
-			"version": "1.52.0"
-		},
-		"mime-types": {
-			"version": "2.1.35",
-			"requires": {
-				"mime-db": "1.52.0"
-			}
-		},
-		"minimatch": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-			"requires": {
-				"brace-expansion": "^1.1.7"
-			}
-		},
-		"minipass": {
-			"version": "3.3.4",
-			"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
-			"integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
-			"requires": {
-				"yallist": "^4.0.0"
-			}
-		},
-		"minipass-collect": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-			"integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-			"optional": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"minipass-fetch": {
-			"version": "1.4.1",
-			"resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
-			"integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
-			"optional": true,
-			"requires": {
-				"encoding": "^0.1.12",
-				"minipass": "^3.1.0",
-				"minipass-sized": "^1.0.3",
-				"minizlib": "^2.0.0"
-			}
-		},
-		"minipass-flush": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-			"integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-			"optional": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"minipass-pipeline": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-			"integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-			"optional": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"minipass-sized": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
-			"integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
-			"optional": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"minizlib": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-			"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-			"requires": {
-				"minipass": "^3.0.0",
-				"yallist": "^4.0.0"
-			}
-		},
-		"mkdirp": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-			"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
-		},
-		"ms": {
-			"version": "2.0.0"
-		},
-		"negotiator": {
-			"version": "0.6.3"
-		},
-		"node-addon-api": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
-			"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
-		},
-		"node-domexception": {
-			"version": "1.0.0"
-		},
-		"node-fetch": {
-			"version": "3.2.6",
-			"requires": {
-				"data-uri-to-buffer": "^4.0.0",
-				"fetch-blob": "^3.1.4",
-				"formdata-polyfill": "^4.0.10"
-			}
-		},
-		"node-gyp": {
-			"version": "8.4.1",
-			"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
-			"integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
-			"optional": true,
-			"requires": {
-				"env-paths": "^2.2.0",
-				"glob": "^7.1.4",
-				"graceful-fs": "^4.2.6",
-				"make-fetch-happen": "^9.1.0",
-				"nopt": "^5.0.0",
-				"npmlog": "^6.0.0",
-				"rimraf": "^3.0.2",
-				"semver": "^7.3.5",
-				"tar": "^6.1.2",
-				"which": "^2.0.2"
-			},
-			"dependencies": {
-				"are-we-there-yet": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz",
-					"integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==",
-					"optional": true,
-					"requires": {
-						"delegates": "^1.0.0",
-						"readable-stream": "^3.6.0"
-					}
-				},
-				"gauge": {
-					"version": "4.0.4",
-					"resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
-					"integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
-					"optional": true,
-					"requires": {
-						"aproba": "^1.0.3 || ^2.0.0",
-						"color-support": "^1.1.3",
-						"console-control-strings": "^1.1.0",
-						"has-unicode": "^2.0.1",
-						"signal-exit": "^3.0.7",
-						"string-width": "^4.2.3",
-						"strip-ansi": "^6.0.1",
-						"wide-align": "^1.1.5"
-					}
-				},
-				"npmlog": {
-					"version": "6.0.2",
-					"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
-					"integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
-					"optional": true,
-					"requires": {
-						"are-we-there-yet": "^3.0.0",
-						"console-control-strings": "^1.1.0",
-						"gauge": "^4.0.3",
-						"set-blocking": "^2.0.0"
-					}
-				}
-			}
-		},
-		"nopt": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-			"integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
-			"requires": {
-				"abbrev": "1"
-			}
-		},
-		"npmlog": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
-			"integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
-			"requires": {
-				"are-we-there-yet": "^2.0.0",
-				"console-control-strings": "^1.1.0",
-				"gauge": "^3.0.0",
-				"set-blocking": "^2.0.0"
-			}
-		},
-		"object-assign": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-			"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
-		},
-		"object-inspect": {
-			"version": "1.12.2"
-		},
-		"on-finished": {
-			"version": "2.4.1",
-			"requires": {
-				"ee-first": "1.1.1"
-			}
-		},
-		"once": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-			"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-			"requires": {
-				"wrappy": "1"
-			}
-		},
-		"p-map": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-			"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
-			"optional": true,
-			"requires": {
-				"aggregate-error": "^3.0.0"
-			}
-		},
-		"parseurl": {
-			"version": "1.3.3"
-		},
-		"path-is-absolute": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-			"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
-		},
-		"path-to-regexp": {
-			"version": "0.1.7"
-		},
-		"promise-inflight": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-			"integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
-			"optional": true
-		},
-		"promise-retry": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
-			"integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
-			"optional": true,
-			"requires": {
-				"err-code": "^2.0.2",
-				"retry": "^0.12.0"
-			}
-		},
-		"proxy-addr": {
-			"version": "2.0.7",
-			"requires": {
-				"forwarded": "0.2.0",
-				"ipaddr.js": "1.9.1"
-			}
-		},
-		"qs": {
-			"version": "6.10.3",
-			"requires": {
-				"side-channel": "^1.0.4"
-			}
-		},
-		"range-parser": {
-			"version": "1.2.1"
-		},
-		"raw-body": {
-			"version": "2.5.1",
-			"requires": {
-				"bytes": "3.1.2",
-				"http-errors": "2.0.0",
-				"iconv-lite": "0.4.24",
-				"unpipe": "1.0.0"
-			}
-		},
-		"readable-stream": {
-			"version": "3.6.0",
-			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-			"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-			"requires": {
-				"inherits": "^2.0.3",
-				"string_decoder": "^1.1.1",
-				"util-deprecate": "^1.0.1"
-			}
-		},
-		"retry": {
-			"version": "0.12.0",
-			"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-			"integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
-			"optional": true
-		},
-		"rimraf": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-			"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-			"requires": {
-				"glob": "^7.1.3"
-			}
-		},
-		"safe-buffer": {
-			"version": "5.2.1"
-		},
-		"safer-buffer": {
-			"version": "2.1.2"
-		},
-		"semver": {
-			"version": "7.3.7",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-			"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
-			"requires": {
-				"lru-cache": "^6.0.0"
-			}
-		},
-		"send": {
-			"version": "0.18.0",
-			"requires": {
-				"debug": "2.6.9",
-				"depd": "2.0.0",
-				"destroy": "1.2.0",
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"etag": "~1.8.1",
-				"fresh": "0.5.2",
-				"http-errors": "2.0.0",
-				"mime": "1.6.0",
-				"ms": "2.1.3",
-				"on-finished": "2.4.1",
-				"range-parser": "~1.2.1",
-				"statuses": "2.0.1"
-			},
-			"dependencies": {
-				"ms": {
-					"version": "2.1.3"
-				}
-			}
-		},
-		"serve-static": {
-			"version": "1.15.0",
-			"requires": {
-				"encodeurl": "~1.0.2",
-				"escape-html": "~1.0.3",
-				"parseurl": "~1.3.3",
-				"send": "0.18.0"
-			}
-		},
-		"set-blocking": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-			"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
-		},
-		"setprototypeof": {
-			"version": "1.2.0"
-		},
-		"side-channel": {
-			"version": "1.0.4",
-			"requires": {
-				"call-bind": "^1.0.0",
-				"get-intrinsic": "^1.0.2",
-				"object-inspect": "^1.9.0"
-			}
-		},
-		"signal-exit": {
-			"version": "3.0.7",
-			"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-			"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
-		},
-		"smart-buffer": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
-			"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
-			"optional": true
-		},
-		"socks": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
-			"integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
-			"optional": true,
-			"requires": {
-				"ip": "^1.1.5",
-				"smart-buffer": "^4.2.0"
-			}
-		},
-		"socks-proxy-agent": {
-			"version": "6.2.1",
-			"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
-			"integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
-			"optional": true,
-			"requires": {
-				"agent-base": "^6.0.2",
-				"debug": "^4.3.3",
-				"socks": "^2.6.2"
-			},
-			"dependencies": {
-				"debug": {
-					"version": "4.3.4",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-					"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-					"optional": true,
-					"requires": {
-						"ms": "2.1.2"
-					}
-				},
-				"ms": {
-					"version": "2.1.2",
-					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-					"optional": true
-				}
-			}
-		},
-		"sqlite3": {
-			"version": "5.0.8",
-			"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.8.tgz",
-			"integrity": "sha512-f2ACsbSyb2D1qFFcqIXPfFscLtPVOWJr5GmUzYxf4W+0qelu5MWrR+FAQE1d5IUArEltBrzSDxDORG8P/IkqyQ==",
-			"requires": {
-				"@mapbox/node-pre-gyp": "^1.0.0",
-				"node-addon-api": "^4.2.0",
-				"node-gyp": "8.x",
-				"tar": "^6.1.11"
-			}
-		},
-		"ssri": {
-			"version": "8.0.1",
-			"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
-			"integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
-			"optional": true,
-			"requires": {
-				"minipass": "^3.1.1"
-			}
-		},
-		"statuses": {
-			"version": "2.0.1"
-		},
-		"string_decoder": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-			"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-			"requires": {
-				"safe-buffer": "~5.2.0"
-			}
-		},
-		"string-width": {
-			"version": "4.2.3",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-			"requires": {
-				"emoji-regex": "^8.0.0",
-				"is-fullwidth-code-point": "^3.0.0",
-				"strip-ansi": "^6.0.1"
-			}
-		},
-		"strip-ansi": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-			"requires": {
-				"ansi-regex": "^5.0.1"
-			}
-		},
-		"tar": {
-			"version": "6.1.11",
-			"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-			"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
-			"requires": {
-				"chownr": "^2.0.0",
-				"fs-minipass": "^2.0.0",
-				"minipass": "^3.0.0",
-				"minizlib": "^2.1.1",
-				"mkdirp": "^1.0.3",
-				"yallist": "^4.0.0"
-			}
-		},
-		"toidentifier": {
-			"version": "1.0.1"
-		},
-		"tr46": {
-			"version": "0.0.3",
-			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-		},
-		"type-is": {
-			"version": "1.6.18",
-			"requires": {
-				"media-typer": "0.3.0",
-				"mime-types": "~2.1.24"
-			}
-		},
-		"unique-filename": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
-			"integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
-			"optional": true,
-			"requires": {
-				"unique-slug": "^2.0.0"
-			}
-		},
-		"unique-slug": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
-			"integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
-			"optional": true,
-			"requires": {
-				"imurmurhash": "^0.1.4"
-			}
-		},
-		"unpipe": {
-			"version": "1.0.0"
-		},
-		"util-deprecate": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-			"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
-		},
-		"utils-merge": {
-			"version": "1.0.1"
-		},
-		"vary": {
-			"version": "1.1.2"
-		},
-		"web-streams-polyfill": {
-			"version": "3.2.1"
-		},
-		"webidl-conversions": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-		},
-		"whatwg-url": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-			"requires": {
-				"tr46": "~0.0.3",
-				"webidl-conversions": "^3.0.0"
-			}
-		},
-		"which": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-			"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-			"optional": true,
-			"requires": {
-				"isexe": "^2.0.0"
-			}
-		},
-		"wide-align": {
-			"version": "1.1.5",
-			"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
-			"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-			"requires": {
-				"string-width": "^1.0.2 || 2 || 3 || 4"
-			}
-		},
-		"wrappy": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-			"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
-		},
-		"yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-		}
-	}
-}
diff --git a/src-slowcord/login/package.json b/src-slowcord/login/package.json
deleted file mode 100644
index cc10ff7f..00000000
--- a/src-slowcord/login/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-	"name": "slowcord-login",
-	"version": "1.0.0",
-	"description": "Slowcord login service",
-	"main": "build/index.js",
-	"types": "src/index.ts",
-	"scripts": {
-		"build": "tsc -b",
-		"start": "node build/index.js"
-	},
-	"repository": {
-		"type": "git",
-		"url": "git+https://github.com/maddyunderstars/fosscord-server.git"
-	},
-	"author": "MaddyUnderStars",
-	"license": "AGPL-3.0-only",
-	"bugs": {
-		"url": "https://github.com/maddyunderstars/fosscord-server/issues"
-	},
-	"homepage": "https://github.com/maddyunderstars/fosscord-server#readme",
-	"dependencies": {
-		"fosscord-server": "file:../../",
-		"cookie-parser": "^1.4.6",
-		"dotenv": "^16.0.1",
-		"express": "^4.18.1",
-		"node-fetch": "^3.2.6",
-		"sqlite3": "^5.0.8"
-	},
-	"devDependencies": {
-		"@types/cookie-parser": "^1.4.3",
-		"@types/express": "^4.17.13",
-		"@types/node": "^18.0.0"
-	},
-	"type": "module"
-}
diff --git a/src-slowcord/login/public/css/index.css b/src-slowcord/login/public/css/index.css
deleted file mode 100644
index cf294ccb..00000000
--- a/src-slowcord/login/public/css/index.css
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Can you tell I like flexbox? */
-
-html {
-	--background-primary: rgb(22, 23, 25);
-	--background-secondary: rgb(15, 16, 18);
-	--foreground-primary: rgb(200, 200, 200);
-	--background-login-discord: #5865f2;
-
-	background: url("https://slowcord.maddy.k.vu/assets/background.png");
-	background-size: 100% 100%;
-	background-repeat: no-repeat;
-
-	font-family: "Montserrat", sans-serif;
-
-	color: var(--foreground-primary);
-}
-
-* {
-	margin: 0;
-	padding: 0;
-}
-
-.content {
-	display: flex;
-	width: 100vw;
-	height: 100vh;
-	justify-content: flex-start;
-	align-items: center;
-}
-
-.login {
-	height: 100%;
-	width: 25%;
-	min-width: 400px;
-	display: flex;
-	flex-direction: column;
-	justify-content: center;
-	align-items: center;
-
-	background-color: var(--background-primary);
-
-	padding: 0 50px 0 50px;
-}
-
-.header {
-	margin: 40px;
-	width: 100%;
-	text-align: center;
-	display: flex;
-	flex-direction: column;
-	justify-content: center;
-}
-
-.header-subtext {
-	text-align: center;
-}
-
-.header-subtext a,
-.header-subtext p {
-	display: inline-block;
-	margin: 0 10px 0 10px;
-}
-
-a {
-	color: var(--foreground-primary);
-}
-
-form {
-	display: flex;
-	flex-direction: column;
-	justify-content: center;
-	width: 100%;
-	min-height: 50%;
-}
-
-input,
-form a {
-	background-color: var(--background-secondary);
-	padding: 10px;
-	margin: 5px 0 5px 0;
-	outline: none;
-	border: 1px solid grey;
-	color: var(--foreground-primary);
-	text-decoration: none;
-	cursor: pointer;
-}
-
-form a {
-	text-align: center;
-}
-
-label {
-	text-transform: uppercase;
-	font-size: 0.75rem;
-	font-weight: bold;
-}
-
-#loginDiscord {
-	background-color: var(--background-login-discord);
-}
-
-#failure {
-	width: 100%;
-	margin-top: 10px;
-	color: rgb(200, 20, 20);
-	display: none;
-}
-
-.h-captcha {
-	display: flex;
-	justify-content: center;
-	margin-top: 10px;
-}
diff --git a/src-slowcord/login/public/js/handler.js b/src-slowcord/login/public/js/handler.js
deleted file mode 100644
index 2d7b164b..00000000
--- a/src-slowcord/login/public/js/handler.js
+++ /dev/null
@@ -1,40 +0,0 @@
-const handleSubmit = async (path, body) => {
-	const failureMessage = document.getElementById("failure");
-
-	var response = await fetch(path, {
-		method: "POST",
-		headers: {
-			"Content-Type": "application/json",
-		},
-		body: JSON.stringify(body),
-	});
-
-	const json = await response.json();
-	if (json.token) {
-		window.localStorage.setItem("token", `"${json.token}"`);
-		window.location.href = "/app";
-		return;
-	}
-
-	if (json.ticket) {
-		// my terrible solution to 2fa
-		const twoFactorForm = document.forms["2fa"];
-		const loginForm = document.forms["login"];
-
-		twoFactorForm.style.display = "flex";
-		loginForm.style.display = "none";
-
-		twoFactorForm.ticket.value = json.ticket;
-		return;
-	}
-
-	// Very fun error message here lol
-	const error = json.errors
-		? Object.values(json.errors)[0]._errors[0].message
-		: json.captcha_key
-		? "Captcha required"
-		: json.message;
-
-	failureMessage.innerHTML = error;
-	failureMessage.style.display = "block";
-};
diff --git a/src-slowcord/login/public/login.html b/src-slowcord/login/public/login.html
deleted file mode 100644
index fa367b70..00000000
--- a/src-slowcord/login/public/login.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<html lang="en">
-	<head>
-		<meta charset="UTF-8" />
-		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
-		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
-		<title>Slowcord</title>
-
-		<link rel="preconnect" href="https://fonts.googleapis.com" />
-		<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
-		<link
-			href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap"
-			rel="stylesheet"
-		/>
-
-		<link rel="stylesheet" href="./css/index.css" />
-		<script src="js/handler.js"></script>
-	</head>
-
-	<body>
-		<div class="content">
-			<div class="login">
-				<div class="header">
-					<h1>Welcome to Slowcord</h1>
-					<div class="header-subtext">
-						<p>Glad to see you &lt;3</p>
-						<a href="/register">Wait, I'm new!</a>
-					</div>
-
-					<p id="failure">Login failed</p>
-				</div>
-
-				<form action="javascript:void(0);" name="login">
-					<label for="email">Email</label>
-					<input type="email" name="email" />
-
-					<label for="password">Password</label>
-					<input type="password" name="password" />
-
-					<input type="submit" value="Login" />
-
-					<a
-						id="loginDiscord"
-						class="oauth"
-						href="https://discord.com/api/oauth2/authorize?client_id=991688571415175198&redirect_uri=https%3A%2F%2Fslowcord.maddy.k.vu%2Foauth%2Fdiscord&response_type=code&scope=identify%20email"
-					>
-						Login with Discord
-					</a>
-
-					<div
-						class="h-captcha"
-						data-sitekey="fa3163ea-79a7-4b7b-b752-b58c545906c8"
-						data-theme="dark"
-					></div>
-					<script
-						src="https://js.hcaptcha.com/1/api.js"
-						async
-						defer
-					></script>
-				</form>
-
-				<form
-					action="javascript:void(0);"
-					name="2fa"
-					style="display: none"
-				>
-					<label for="code">2FA Code</label>
-					<input type="number" name="code" />
-
-					<input type="hidden" name="ticket" />
-
-					<input type="submit" value="Login" />
-				</form>
-			</div>
-		</div>
-
-		<script>
-			/* https://stackoverflow.com/questions/5639346/what-is-the-shortest-function-for-reading-a-cookie-by-name-in-javascript */
-			const getCookieValue = (name) =>
-				document.cookie
-					.match("(^|;)\\s*" + name + "\\s*=\\s*([^;]+)")
-					?.pop() || "";
-
-			let token = getCookieValue("token");
-			if (token.trim().length) {
-				/* https://stackoverflow.com/a/27374365 */
-				// why is clearing cookies so weird? wtf
-				document.cookie.split(";").forEach(function (c) {
-					document.cookie = c
-						.replace(/^ +/, "")
-						.replace(
-							/=.*/,
-							"=;expires=" + new Date().toUTCString() + ";path=/",
-						);
-				});
-				window.localStorage.setItem("token", `"${token}"`);
-				window.location.href = "/app";
-			}
-
-			token = window.localStorage.getItem("token");
-			if (token) window.location.href = "/app";
-
-			document.forms["login"].addEventListener("submit", async (e) => {
-				const data = new FormData(e.target);
-				const email = data.get("email");
-				const password = data.get("password");
-				const hcaptcha = data.get("h-captcha-response");
-
-				await handleSubmit("/api/v9/auth/login", {
-					login: email,
-					password: password,
-					captcha_key: hcaptcha,
-				});
-			});
-
-			document.forms["2fa"].addEventListener("submit", async (e) => {
-				const data = new FormData(e.target);
-				const code = data.get("code");
-				const ticket = data.get("ticket");
-
-				await handleSubmit("/api/v9/auth/mfa/totp", {
-					code: code,
-					ticket: ticket,
-				});
-			});
-		</script>
-	</body>
-</html>
diff --git a/src-slowcord/login/public/register.html b/src-slowcord/login/public/register.html
deleted file mode 100644
index 30b560a4..00000000
--- a/src-slowcord/login/public/register.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<html lang="en">
-	<head>
-		<meta charset="UTF-8" />
-		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
-		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
-		<title>Slowcord</title>
-
-		<link rel="preconnect" href="https://fonts.googleapis.com" />
-		<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
-		<link
-			href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap"
-			rel="stylesheet"
-		/>
-
-		<link rel="stylesheet" href="./css/index.css" />
-		<script src="js/handler.js"></script>
-	</head>
-
-	<body>
-		<div class="content">
-			<div class="login">
-				<div class="header">
-					<h1>Welcome to Slowcord</h1>
-					<div class="header-subtext">
-						<p>You're new?</p>
-						<a href="/login">Actually, I'm not!</a>
-					</div>
-
-					<p id="failure">Register failed</p>
-				</div>
-
-				<form action="javascript:void(0);">
-					<label for="email">Email</label>
-					<input type="email" name="email" />
-
-					<label for="username">Username</label>
-					<input type="username" name="username" />
-
-					<label for="password">Password</label>
-					<input type="password" name="password" />
-
-					<label for="dob">Date of Birth</label>
-					<input type="date" name="dob" />
-
-					<input type="submit" value="Register" />
-
-					<a
-						id="loginDiscord"
-						class="oauth"
-						href="https://discord.com/api/oauth2/authorize?client_id=991688571415175198&redirect_uri=https%3A%2F%2Fslowcord.maddy.k.vu%2Foauth%2Fdiscord&response_type=code&scope=identify%20email"
-					>
-						Login with Discord
-					</a>
-
-					<div
-						class="h-captcha"
-						data-sitekey="fa3163ea-79a7-4b7b-b752-b58c545906c8"
-					></div>
-					<script
-						src="https://js.hcaptcha.com/1/api.js"
-						async
-						defer
-					></script>
-				</form>
-			</div>
-		</div>
-
-		<script>
-			document.forms[0].addEventListener("submit", async (e) => {
-				const data = new FormData(e.target);
-				const email = data.get("email");
-				const username = data.get("username");
-				const password = data.get("password");
-				const dob = data.get("dob");
-				const hcaptcha = data.get("h-captcha-response");
-
-				await handleSubmit("/api/v9/auth/register", {
-					consent: true,
-					email: email,
-					username: username,
-					password: password,
-					date_of_birth: dob,
-					captcha_key: hcaptcha,
-				});
-			});
-		</script>
-	</body>
-</html>
diff --git a/src-slowcord/login/src/index.ts b/src-slowcord/login/src/index.ts
deleted file mode 100644
index ced35dcf..00000000
--- a/src-slowcord/login/src/index.ts
+++ /dev/null
@@ -1,171 +0,0 @@
-import "dotenv/config";
-import express, { Request, Response } from "express";
-import cookieParser from "cookie-parser";
-import {
-	initDatabase,
-	generateToken,
-	User,
-	Config,
-	handleFile,
-} from "fosscord-server/src/util";
-import path from "path";
-import fetch from "node-fetch";
-
-// apparently dirname doesn't exist in modules, nice
-/* https://stackoverflow.com/a/62892482 */
-import { fileURLToPath } from "url";
-const __filename = fileURLToPath(import.meta.url);
-const __dirname = path.dirname(__filename);
-
-const app = express();
-app.use(cookieParser());
-const port = process.env.PORT;
-
-// ip -> unix epoch that requests will be accepted again
-const rateLimits: { [ip: string]: number } = {};
-const allowRequestsEveryMs = 0.5 * 1000; // every half second
-
-const allowedRequestsPerSecond = 50;
-let requestsThisSecond = 0;
-setInterval(() => {
-	requestsThisSecond = 0;
-}, 1000);
-
-const toDataURL = async (url: string) => {
-	const response = await fetch(url);
-	const blob = await response.blob();
-	const buffer = Buffer.from(await blob.text());
-	return `data:${blob.type};base64,${buffer.toString("base64")}`;
-};
-
-class Discord {
-	static getAccessToken = async (req: Request, res: Response) => {
-		const { code } = req.query;
-
-		const body = new URLSearchParams(
-			Object.entries({
-				client_id: process.env.DISCORD_CLIENT_ID as string,
-				client_secret: process.env.DISCORD_SECRET as string,
-				redirect_uri: process.env.DISCORD_REDIRECT as string,
-				code: code as string,
-				grant_type: "authorization_code",
-			}),
-		).toString();
-
-		const resp = await fetch("https://discord.com/api/oauth2/token", {
-			method: "POST",
-			headers: {
-				"Content-Type": "application/x-www-form-urlencoded",
-			},
-			body: body,
-		});
-
-		const json = (await resp.json()) as any;
-		if (json.error) return null;
-
-		return {
-			access_token: json.access_token,
-			token_type: json.token_type,
-			expires_in: json.expires_in,
-			refresh_token: json.refresh_token,
-			scope: json.scope,
-		};
-	};
-
-	static getUserDetails = async (token: string) => {
-		const resp = await fetch("https://discord.com/api/users/@me", {
-			headers: {
-				Authorization: `Bearer ${token}`,
-			},
-		});
-
-		const json = (await resp.json()) as any;
-		if (!json.username || !json.email) return null; // eh, deal with bad code later
-
-		return {
-			id: json.id,
-			email: json.email,
-			username: json.username,
-			avatar_url: json.avatar
-				? `https://cdn.discordapp.com/avatars/${json.id}/${json.avatar}?size=2048`
-				: null,
-		};
-	};
-}
-
-const handlers: { [key: string]: any } = {
-	discord: Discord,
-};
-
-app.get("/oauth/:type", async (req, res) => {
-	requestsThisSecond++;
-	if (requestsThisSecond > allowedRequestsPerSecond)
-		return res.sendStatus(429);
-
-	const ip =
-		(req.headers["x-forwarded-for"] as string) ||
-		(req.socket.remoteAddress as string);
-	console.log(`${ip}`);
-	if (!rateLimits[ip]) {
-		rateLimits[ip] = Date.now() + allowRequestsEveryMs;
-	} else if (rateLimits[ip] > Date.now()) {
-		rateLimits[ip] += allowRequestsEveryMs;
-		console.log(
-			`${new Date()} : user ${ip} was timed out for ${
-				(rateLimits[ip] - Date.now()) / 1000
-			}s`,
-		);
-		return res.sendStatus(429);
-	} else {
-		delete rateLimits[ip];
-	}
-
-	const { type } = req.params;
-	const handler = handlers[type];
-	if (!type || !handler) return res.sendStatus(400);
-
-	const data = await handler.getAccessToken(req, res);
-	if (!data) return res.sendStatus(500);
-
-	const details = await handler.getUserDetails(data.access_token);
-	if (!details) return res.sendStatus(500);
-
-	let user = await User.findOne({ where: { email: details.email } });
-	if (!user) {
-		user = await User.register({
-			email: details.email,
-			username: details.username,
-			req,
-		});
-
-		if (details.avatar_url) {
-			try {
-				const avatar = await handleFile(
-					`/avatars/${user.id}`,
-					(await toDataURL(details.avatar_url)) as string,
-				);
-				user.avatar = avatar;
-				await user.save();
-			} catch (e) {
-				console.error(e);
-			}
-		}
-	}
-
-	const token = await generateToken(user.id);
-
-	res.cookie("token", token);
-
-	res.sendFile(path.join(__dirname, "../public/login.html"));
-});
-
-app.use(express.static("public", { extensions: ["html"] }));
-
-(async () => {
-	await initDatabase();
-	await Config.init();
-
-	app.listen(port, () => {
-		console.log(`Listening on port ${port}`);
-	});
-})();
diff --git a/src-slowcord/login/tsconfig.json b/src-slowcord/login/tsconfig.json
deleted file mode 100644
index 4d96714c..00000000
--- a/src-slowcord/login/tsconfig.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
-	"exclude": ["node_modules"],
-	"include": ["src/**/*.ts"],
-	"compilerOptions": {
-		/* Visit https://aka.ms/tsconfig.json to read more about this file */
-		/* Projects */
-		// "incremental": true,                              /* Enable incremental compilation */
-		// "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */
-		// "tsBuildInfoFile": "./",                          /* Specify the folder for .tsbuildinfo incremental compilation files. */
-		// "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects */
-		// "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
-		// "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */
-		/* Language and Environment */
-		"target": "ES6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
-		"lib": [
-			"ES2021"
-		] /* Specify a set of bundled library declaration files that describe the target runtime environment. */,
-		// "jsx": "preserve",                                /* Specify what JSX code is generated. */
-		"experimentalDecorators": true /* Enable experimental support for TC39 stage 2 draft decorators. */,
-		// "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
-		// "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
-		// "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
-		// "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
-		// "reactNamespace": "",                             /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
-		// "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
-		// "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */
-		/* Modules */
-		"module": "ES2020" /* Specify what module code is generated. */,
-		// "rootDir": "./",                                  /* Specify the root folder within your source files. */
-		"moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
-		// "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
-		// "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */
-		// "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
-		// "typeRoots": [],                                  /* Specify multiple folders that act like `./node_modules/@types`. */
-		"types": [
-			"node"
-		] /* Specify type package names to be included without being referenced in a source file. */,
-		// "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
-		// "resolveJsonModule": true,                        /* Enable importing .json files */
-		// "noResolve": true,                                /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
-		/* JavaScript Support */
-		// "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
-		// "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
-		// "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
-		/* Emit */
-		// "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
-		// "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
-		// "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
-		"sourceMap": true /* Create source map files for emitted JavaScript files. */,
-		// "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
-		"outDir": "./build" /* Specify an output folder for all emitted files. */,
-		// "removeComments": true,                           /* Disable emitting comments. */
-		// "noEmit": true,                                   /* Disable emitting files from a compilation. */
-		// "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
-		// "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types */
-		// "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
-		// "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
-		// "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
-		// "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
-		// "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
-		// "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
-		// "newLine": "crlf",                                /* Set the newline character for emitting files. */
-		// "stripInternal": true,                            /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
-		// "noEmitHelpers": true,                            /* Disable generating custom helper functions like `__extends` in compiled output. */
-		// "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
-		// "preserveConstEnums": true,                       /* Disable erasing `const enum` declarations in generated code. */
-		// "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */
-		// "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
-		/* Interop Constraints */
-		// "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
-		// "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
-		"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
-		// "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
-		"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
-		/* Type Checking */
-		"strict": true /* Enable all strict type-checking options. */,
-		// "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied `any` type.. */
-		// "strictNullChecks": true,                         /* When type checking, take into account `null` and `undefined`. */
-		// "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
-		// "strictBindCallApply": true,                      /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
-		"strictPropertyInitialization": false /* Check for class properties that are declared but not set in the constructor. */,
-		// "noImplicitThis": true,                           /* Enable error reporting when `this` is given the type `any`. */
-		// "useUnknownInCatchVariables": true,               /* Type catch clause variables as 'unknown' instead of 'any'. */
-		// "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
-		// "noUnusedLocals": true,                           /* Enable error reporting when a local variables aren't read. */
-		// "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read */
-		// "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
-		// "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
-		// "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
-		// "noUncheckedIndexedAccess": true,                 /* Include 'undefined' in index signature results */
-		// "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
-		// "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type */
-		// "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
-		// "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */
-		/* Completeness */
-		// "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
-		"skipLibCheck": true /* Skip type checking all .d.ts files. */
-	}
-}
diff --git a/src-slowcord/nginx/fosscord b/src-slowcord/nginx/fosscord
deleted file mode 100644
index f1d53de1..00000000
--- a/src-slowcord/nginx/fosscord
+++ /dev/null
@@ -1,54 +0,0 @@
-server {
-	server_name slowcord.understars.dev;
-
-	client_max_body_size 150M;
-
-	add_header Last-Modified $date_gmt;
-	proxy_set_header Host $host;
-	proxy_pass_request_headers on;
-	proxy_set_header X-Real-IP $remote_addr;
-	proxy_set_header X-Forwarded-Proto https;
-	proxy_set_header X-Forwarded-For $remote_addr;
-	proxy_set_header X-Forwarded-Host $remote_addr;
-	proxy_set_header Upgrade $http_upgrade;
-	proxy_set_header Connection "upgrade";
-
-	location / {
-		proxy_pass http://127.0.0.1:3001;
-	}
-
-	location /api {
-		proxy_pass http://127.0.0.1:3001;
-		add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
-
-		# TODO: This is a bad solution. Why does proxy_pass not forward all upstream errors to client?
-		# Or is it just that the server is not actually responding?
-		proxy_no_cache 1;
-		proxy_cache_bypass 1;
-		proxy_connect_timeout 1;
-		proxy_send_timeout 1;
-		proxy_read_timeout 1;
-		send_timeout 1;
-	}
-
-	# TODO: Make the login service not suck
-	location ~ ^/(login|register|oauth/discord|css/index.css|js/handler.js) {
-		proxy_pass http://127.0.0.1:3010;
-	}
-
-	listen 443 ssl;
-	ssl_certificate /etc/letsencrypt/live/slowcord.understars.dev/fullchain.pem;
-	ssl_certificate_key /etc/letsencrypt/live/slowcord.understars.dev/privkey.pem;
-	include /etc/letsencrypt/options-ssl-nginx.conf;
-	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
-}
-
-server {
-	if ($host = slowcord.understars.dev) {
-		return 301 https://$host$request_uri;
-	}
-
-	listen 80;
-	server_name slowcord.understars.dev;
-	return 404;
-}
\ No newline at end of file
diff --git a/src-slowcord/nginx/voice b/src-slowcord/nginx/voice
deleted file mode 100644
index b2b18c40..00000000
--- a/src-slowcord/nginx/voice
+++ /dev/null
@@ -1,35 +0,0 @@
-server {
-	server_name voice.slowcord.understars.dev;
-
-	client_max_body_size 50M;
-
-	add_header Last-Modified $date_gmt;
-	proxy_set_header Host $host;
-	proxy_pass_request_headers on;
-	proxy_set_header X-Real-IP $remote_addr;
-	proxy_set_header X-Forwarded-Proto https;
-	proxy_set_header X-Forwarded-For $remote_addr;
-	proxy_set_header X-Forwarded-Host $remote_addr;
-	proxy_set_header Upgrade $http_upgrade;
-	proxy_set_header Connection "upgrade";
-
-	location / {
-		proxy_pass http://127.0.0.1:3004;
-	}
-
-	listen 443 ssl;
-	ssl_certificate /etc/letsencrypt/live/voice.slowcord.understars.dev/fullchain.pem;
-	ssl_certificate_key /etc/letsencrypt/live/voice.slowcord.understars.dev/privkey.pem;
-	include /etc/letsencrypt/options-ssl-nginx.conf;
-	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
-}
-
-server {
-	if ($host = voice.slowcord.understars.dev) {
-		return 301 https://$host$request_uri;
-	}
-
-	listen 80;
-	server_name voice.slowcord.understars.dev;
-	return 404;
-}
\ No newline at end of file
diff --git a/src-slowcord/rules.md b/src-slowcord/rules.md
deleted file mode 100644
index 1097060a..00000000
--- a/src-slowcord/rules.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Hi, welcome to Slowcord!
-
-Slowcord is a heavily modded Fosscord instance. You can browse it's source here: https://github.com/MaddyUnderStars/fosscord-server/tree/slowcord
-
-## Here are some general instance-wide rules:
-
--   **Harassment, homophobia, transphobia, etc, violence, and hate speech are forbidden.**
--   Behaviour that harms the service - be it malicious/intentional or not - is strictly forbidden. This may include API abuse/spam, exploits, etc.
--   -   If you do discover an exploit/bug, it would be greatly appreciated if you could create an issue in the above repo, or DM @MaddyUnderStars#0000.
--   Any content that would be considered illegal in Australia is also forbidden. Additionally, if it is illegal in your own country, it shouldn't be here.
--   Bots/selfbots are allowed. If you would like an account to be given bot status, DM @MaddyUnderStars#0000.
-
-These rules are non-exhaustive, but should give a good idea of what will be enforced.
-
-Permanent Slowcord guild invite: https://slowcord.understars.dev/invite/slowcord
-
-### If a message or user breaks these rules, you can report it here: https://forms.gle/sd6RkdM7gRgJLV368
-
-#### Lastly ( and not rules ):
-
--   If you use BetterDiscord or Powercord, and want an easier time accessing Slowcord and other Fosscord instances, check out https://github.com/maddyunderstars/fosscord-bd!
--   Also, if you're on Android, you can download the mobile client at https://slowcord.understars.dev/assets/slowcord.apk
diff --git a/src-slowcord/status/.env.template b/src-slowcord/status/.env.template
deleted file mode 100644
index e15dc56a..00000000
--- a/src-slowcord/status/.env.template
+++ /dev/null
@@ -1,6 +0,0 @@
-DATABASE=
-INSTANCE_API=
-INSTANCE_CDN=
-INSTANCE_TOKEN=
-MEASURE_INTERVAL=1000
-RETENTION_DAYS=30
\ No newline at end of file
diff --git a/src-slowcord/status/package-lock.json b/src-slowcord/status/package-lock.json
deleted file mode 100644
index a4f449ab..00000000
--- a/src-slowcord/status/package-lock.json
+++ /dev/null
@@ -1,891 +0,0 @@
-{
-	"name": "slowcord-status",
-	"version": "1.0.0",
-	"lockfileVersion": 2,
-	"requires": true,
-	"packages": {
-		"": {
-			"name": "slowcord-status",
-			"version": "1.0.0",
-			"license": "AGPL-3.0-only",
-			"dependencies": {
-				"dotenv": "^16.0.1",
-				"fosscord-gopnik": "^1.0.0",
-				"mysql2": "^2.3.3",
-				"node-fetch": "^3.2.9"
-			},
-			"devDependencies": {
-				"@types/node": "^18.0.6"
-			}
-		},
-		"../../util": {
-			"name": "@fosscord/util",
-			"version": "1.0.0",
-			"extraneous": true,
-			"hasInstallScript": true,
-			"license": "AGPL-3.0-only",
-			"dependencies": {
-				"amqplib": "^0.8.0",
-				"form-data": "^4.0.0",
-				"jsonwebtoken": "^8.5.1",
-				"lambert-server": "^1.2.12",
-				"missing-native-js-functions": "^1.2.18",
-				"multer": "^1.4.3",
-				"node-fetch": "^2.6.2",
-				"patch-package": "^6.4.7",
-				"pg": "^8.7.1",
-				"picocolors": "^1.0.0",
-				"proxy-agent": "^5.0.0",
-				"reflect-metadata": "^0.1.13",
-				"typeorm": "^0.2.37",
-				"typescript": "^4.4.2",
-				"typescript-json-schema": "^0.50.1"
-			},
-			"devDependencies": {
-				"@types/amqplib": "^0.8.1",
-				"@types/jsonwebtoken": "^8.5.0",
-				"@types/multer": "^1.4.7",
-				"@types/node": "^14.17.9",
-				"@types/node-fetch": "^2.5.12",
-				"jest": "^27.0.6",
-				"ts-node": "^10.2.1"
-			}
-		},
-		"node_modules/@discordjs/builders": {
-			"version": "0.16.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz",
-			"integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==",
-			"deprecated": "no longer supported",
-			"dependencies": {
-				"@sapphire/shapeshift": "^3.5.1",
-				"discord-api-types": "^0.36.2",
-				"fast-deep-equal": "^3.1.3",
-				"ts-mixer": "^6.0.1",
-				"tslib": "^2.4.0"
-			},
-			"engines": {
-				"node": ">=16.9.0"
-			}
-		},
-		"node_modules/@discordjs/builders/node_modules/discord-api-types": {
-			"version": "0.36.2",
-			"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.2.tgz",
-			"integrity": "sha512-TunPAvzwneK/m5fr4hxH3bMsrtI22nr9yjfHyo5NBGMjpsAauGNiGCmwoFf0oO3jSd2mZiKUvZwCKDaB166u2Q=="
-		},
-		"node_modules/@discordjs/collection": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz",
-			"integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==",
-			"deprecated": "no longer supported",
-			"engines": {
-				"node": ">=16.9.0"
-			}
-		},
-		"node_modules/@sapphire/async-queue": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",
-			"integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==",
-			"engines": {
-				"node": ">=v14.0.0",
-				"npm": ">=7.0.0"
-			}
-		},
-		"node_modules/@sapphire/shapeshift": {
-			"version": "3.5.1",
-			"resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.5.1.tgz",
-			"integrity": "sha512-7JFsW5IglyOIUQI1eE0g6h06D/Far6HqpcowRScgCiLSqTf3hhkPWCWotVTtVycnDCMYIwPeaw6IEPBomKC8pA==",
-			"dependencies": {
-				"fast-deep-equal": "^3.1.3",
-				"lodash.uniqwith": "^4.5.0"
-			},
-			"engines": {
-				"node": ">=v14.0.0",
-				"npm": ">=7.0.0"
-			}
-		},
-		"node_modules/@types/node": {
-			"version": "18.0.6",
-			"resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
-			"integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
-		},
-		"node_modules/@types/node-fetch": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
-			"integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
-			"dependencies": {
-				"@types/node": "*",
-				"form-data": "^3.0.0"
-			}
-		},
-		"node_modules/@types/node-fetch/node_modules/form-data": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-			"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-			"dependencies": {
-				"asynckit": "^0.4.0",
-				"combined-stream": "^1.0.8",
-				"mime-types": "^2.1.12"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/@types/ws": {
-			"version": "8.5.3",
-			"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
-			"integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
-			"dependencies": {
-				"@types/node": "*"
-			}
-		},
-		"node_modules/asynckit": {
-			"version": "0.4.0",
-			"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-			"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-		},
-		"node_modules/combined-stream": {
-			"version": "1.0.8",
-			"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-			"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-			"dependencies": {
-				"delayed-stream": "~1.0.0"
-			},
-			"engines": {
-				"node": ">= 0.8"
-			}
-		},
-		"node_modules/data-uri-to-buffer": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
-			"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
-			"engines": {
-				"node": ">= 12"
-			}
-		},
-		"node_modules/delayed-stream": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-			"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-			"engines": {
-				"node": ">=0.4.0"
-			}
-		},
-		"node_modules/denque": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
-			"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
-			"engines": {
-				"node": ">=0.10"
-			}
-		},
-		"node_modules/discord-api-types": {
-			"version": "0.33.5",
-			"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz",
-			"integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg=="
-		},
-		"node_modules/discord.js": {
-			"version": "13.9.0",
-			"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.9.0.tgz",
-			"integrity": "sha512-QNscX8lQ2FwHuAd/NptQYc43oMUVijugir/vRbsTSgySidg8pcGQVqtRg8urqY3cbCOCZfNAMD/lR+SM7uijsA==",
-			"dependencies": {
-				"@discordjs/builders": "^0.16.0",
-				"@discordjs/collection": "^0.7.0",
-				"@sapphire/async-queue": "^1.3.1",
-				"@types/node-fetch": "^2.6.2",
-				"@types/ws": "^8.5.3",
-				"discord-api-types": "^0.33.3",
-				"form-data": "^4.0.0",
-				"node-fetch": "^2.6.7",
-				"ws": "^8.8.1"
-			},
-			"engines": {
-				"node": ">=16.6.0",
-				"npm": ">=7.0.0"
-			}
-		},
-		"node_modules/discord.js/node_modules/node-fetch": {
-			"version": "2.6.7",
-			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-			"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-			"dependencies": {
-				"whatwg-url": "^5.0.0"
-			},
-			"engines": {
-				"node": "4.x || >=6.0.0"
-			},
-			"peerDependencies": {
-				"encoding": "^0.1.0"
-			},
-			"peerDependenciesMeta": {
-				"encoding": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/dotenv": {
-			"version": "16.0.1",
-			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
-			"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==",
-			"engines": {
-				"node": ">=12"
-			}
-		},
-		"node_modules/encoding": {
-			"version": "0.1.13",
-			"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-			"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-			"optional": true,
-			"peer": true,
-			"dependencies": {
-				"iconv-lite": "^0.6.2"
-			}
-		},
-		"node_modules/fast-deep-equal": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-		},
-		"node_modules/fetch-blob": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
-			"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
-			"funding": [
-				{
-					"type": "github",
-					"url": "https://github.com/sponsors/jimmywarting"
-				},
-				{
-					"type": "paypal",
-					"url": "https://paypal.me/jimmywarting"
-				}
-			],
-			"dependencies": {
-				"node-domexception": "^1.0.0",
-				"web-streams-polyfill": "^3.0.3"
-			},
-			"engines": {
-				"node": "^12.20 || >= 14.13"
-			}
-		},
-		"node_modules/form-data": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-			"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-			"dependencies": {
-				"asynckit": "^0.4.0",
-				"combined-stream": "^1.0.8",
-				"mime-types": "^2.1.12"
-			},
-			"engines": {
-				"node": ">= 6"
-			}
-		},
-		"node_modules/formdata-polyfill": {
-			"version": "4.0.10",
-			"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
-			"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
-			"dependencies": {
-				"fetch-blob": "^3.1.2"
-			},
-			"engines": {
-				"node": ">=12.20.0"
-			}
-		},
-		"node_modules/fosscord-gopnik": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/fosscord-gopnik/-/fosscord-gopnik-1.0.0.tgz",
-			"integrity": "sha512-cCJhXTVOEDEhhSOwceYsptU3f97GOVOAVNJ4UFMiQESp4wnYE0GKnlYYYs6gMkZounxPEv0t22kSHdajx6Ed/w==",
-			"dependencies": {
-				"discord.js": "^13.5.1"
-			}
-		},
-		"node_modules/generate-function": {
-			"version": "2.3.1",
-			"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
-			"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
-			"dependencies": {
-				"is-property": "^1.0.2"
-			}
-		},
-		"node_modules/iconv-lite": {
-			"version": "0.6.3",
-			"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-			"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-			"dependencies": {
-				"safer-buffer": ">= 2.1.2 < 3.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/is-property": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-			"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
-		},
-		"node_modules/lodash.uniqwith": {
-			"version": "4.5.0",
-			"resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz",
-			"integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q=="
-		},
-		"node_modules/long": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
-			"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
-		},
-		"node_modules/lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"dependencies": {
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
-		"node_modules/mime-db": {
-			"version": "1.52.0",
-			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-			"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/mime-types": {
-			"version": "2.1.35",
-			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-			"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-			"dependencies": {
-				"mime-db": "1.52.0"
-			},
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/mysql2": {
-			"version": "2.3.3",
-			"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz",
-			"integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==",
-			"dependencies": {
-				"denque": "^2.0.1",
-				"generate-function": "^2.3.1",
-				"iconv-lite": "^0.6.3",
-				"long": "^4.0.0",
-				"lru-cache": "^6.0.0",
-				"named-placeholders": "^1.1.2",
-				"seq-queue": "^0.0.5",
-				"sqlstring": "^2.3.2"
-			},
-			"engines": {
-				"node": ">= 8.0"
-			}
-		},
-		"node_modules/mysql2/node_modules/sqlstring": {
-			"version": "2.3.3",
-			"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
-			"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
-			"engines": {
-				"node": ">= 0.6"
-			}
-		},
-		"node_modules/named-placeholders": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
-			"integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
-			"dependencies": {
-				"lru-cache": "^4.1.3"
-			},
-			"engines": {
-				"node": ">=6.0.0"
-			}
-		},
-		"node_modules/named-placeholders/node_modules/lru-cache": {
-			"version": "4.1.5",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-			"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-			"dependencies": {
-				"pseudomap": "^1.0.2",
-				"yallist": "^2.1.2"
-			}
-		},
-		"node_modules/named-placeholders/node_modules/yallist": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-			"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
-		},
-		"node_modules/node-domexception": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
-			"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
-			"funding": [
-				{
-					"type": "github",
-					"url": "https://github.com/sponsors/jimmywarting"
-				},
-				{
-					"type": "github",
-					"url": "https://paypal.me/jimmywarting"
-				}
-			],
-			"engines": {
-				"node": ">=10.5.0"
-			}
-		},
-		"node_modules/node-fetch": {
-			"version": "3.2.9",
-			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.9.tgz",
-			"integrity": "sha512-/2lI+DBecVvVm9tDhjziTVjo2wmTsSxSk58saUYP0P/fRJ3xxtfMDY24+CKTkfm0Dlhyn3CSXNL0SoRiCZ8Rzg==",
-			"dependencies": {
-				"data-uri-to-buffer": "^4.0.0",
-				"fetch-blob": "^3.1.4",
-				"formdata-polyfill": "^4.0.10"
-			},
-			"engines": {
-				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-			},
-			"funding": {
-				"type": "opencollective",
-				"url": "https://opencollective.com/node-fetch"
-			}
-		},
-		"node_modules/pseudomap": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-			"integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
-		},
-		"node_modules/safer-buffer": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-			"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-		},
-		"node_modules/seq-queue": {
-			"version": "0.0.5",
-			"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
-			"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
-		},
-		"node_modules/tr46": {
-			"version": "0.0.3",
-			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-		},
-		"node_modules/ts-mixer": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz",
-			"integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg=="
-		},
-		"node_modules/tslib": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
-			"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
-		},
-		"node_modules/web-streams-polyfill": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
-			"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
-			"engines": {
-				"node": ">= 8"
-			}
-		},
-		"node_modules/webidl-conversions": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-		},
-		"node_modules/whatwg-url": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-			"dependencies": {
-				"tr46": "~0.0.3",
-				"webidl-conversions": "^3.0.0"
-			}
-		},
-		"node_modules/ws": {
-			"version": "8.8.1",
-			"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
-			"integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
-			"engines": {
-				"node": ">=10.0.0"
-			},
-			"peerDependencies": {
-				"bufferutil": "^4.0.1",
-				"utf-8-validate": "^5.0.2"
-			},
-			"peerDependenciesMeta": {
-				"bufferutil": {
-					"optional": true
-				},
-				"utf-8-validate": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-		}
-	},
-	"dependencies": {
-		"@discordjs/builders": {
-			"version": "0.16.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz",
-			"integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==",
-			"requires": {
-				"@sapphire/shapeshift": "^3.5.1",
-				"discord-api-types": "^0.36.2",
-				"fast-deep-equal": "^3.1.3",
-				"ts-mixer": "^6.0.1",
-				"tslib": "^2.4.0"
-			},
-			"dependencies": {
-				"discord-api-types": {
-					"version": "0.36.2",
-					"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.2.tgz",
-					"integrity": "sha512-TunPAvzwneK/m5fr4hxH3bMsrtI22nr9yjfHyo5NBGMjpsAauGNiGCmwoFf0oO3jSd2mZiKUvZwCKDaB166u2Q=="
-				}
-			}
-		},
-		"@discordjs/collection": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz",
-			"integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA=="
-		},
-		"@sapphire/async-queue": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",
-			"integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g=="
-		},
-		"@sapphire/shapeshift": {
-			"version": "3.5.1",
-			"resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.5.1.tgz",
-			"integrity": "sha512-7JFsW5IglyOIUQI1eE0g6h06D/Far6HqpcowRScgCiLSqTf3hhkPWCWotVTtVycnDCMYIwPeaw6IEPBomKC8pA==",
-			"requires": {
-				"fast-deep-equal": "^3.1.3",
-				"lodash.uniqwith": "^4.5.0"
-			}
-		},
-		"@types/node": {
-			"version": "18.0.6",
-			"resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz",
-			"integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw=="
-		},
-		"@types/node-fetch": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz",
-			"integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==",
-			"requires": {
-				"@types/node": "*",
-				"form-data": "^3.0.0"
-			},
-			"dependencies": {
-				"form-data": {
-					"version": "3.0.1",
-					"resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-					"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-					"requires": {
-						"asynckit": "^0.4.0",
-						"combined-stream": "^1.0.8",
-						"mime-types": "^2.1.12"
-					}
-				}
-			}
-		},
-		"@types/ws": {
-			"version": "8.5.3",
-			"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
-			"integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
-			"requires": {
-				"@types/node": "*"
-			}
-		},
-		"asynckit": {
-			"version": "0.4.0",
-			"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-			"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-		},
-		"combined-stream": {
-			"version": "1.0.8",
-			"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-			"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-			"requires": {
-				"delayed-stream": "~1.0.0"
-			}
-		},
-		"data-uri-to-buffer": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
-			"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
-		},
-		"delayed-stream": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-			"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
-		},
-		"denque": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
-			"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
-		},
-		"discord-api-types": {
-			"version": "0.33.5",
-			"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz",
-			"integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg=="
-		},
-		"discord.js": {
-			"version": "13.9.0",
-			"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.9.0.tgz",
-			"integrity": "sha512-QNscX8lQ2FwHuAd/NptQYc43oMUVijugir/vRbsTSgySidg8pcGQVqtRg8urqY3cbCOCZfNAMD/lR+SM7uijsA==",
-			"requires": {
-				"@discordjs/builders": "^0.16.0",
-				"@discordjs/collection": "^0.7.0",
-				"@sapphire/async-queue": "^1.3.1",
-				"@types/node-fetch": "^2.6.2",
-				"@types/ws": "^8.5.3",
-				"discord-api-types": "^0.33.3",
-				"form-data": "^4.0.0",
-				"node-fetch": "^2.6.7",
-				"ws": "^8.8.1"
-			},
-			"dependencies": {
-				"node-fetch": {
-					"version": "2.6.7",
-					"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-					"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-					"requires": {
-						"whatwg-url": "^5.0.0"
-					}
-				}
-			}
-		},
-		"dotenv": {
-			"version": "16.0.1",
-			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
-			"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
-		},
-		"encoding": {
-			"version": "0.1.13",
-			"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-			"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-			"optional": true,
-			"peer": true,
-			"requires": {
-				"iconv-lite": "^0.6.2"
-			}
-		},
-		"fast-deep-equal": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-		},
-		"fetch-blob": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
-			"integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
-			"requires": {
-				"node-domexception": "^1.0.0",
-				"web-streams-polyfill": "^3.0.3"
-			}
-		},
-		"form-data": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-			"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-			"requires": {
-				"asynckit": "^0.4.0",
-				"combined-stream": "^1.0.8",
-				"mime-types": "^2.1.12"
-			}
-		},
-		"formdata-polyfill": {
-			"version": "4.0.10",
-			"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
-			"integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
-			"requires": {
-				"fetch-blob": "^3.1.2"
-			}
-		},
-		"fosscord-gopnik": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/fosscord-gopnik/-/fosscord-gopnik-1.0.0.tgz",
-			"integrity": "sha512-cCJhXTVOEDEhhSOwceYsptU3f97GOVOAVNJ4UFMiQESp4wnYE0GKnlYYYs6gMkZounxPEv0t22kSHdajx6Ed/w==",
-			"requires": {
-				"discord.js": "^13.5.1"
-			}
-		},
-		"generate-function": {
-			"version": "2.3.1",
-			"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
-			"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
-			"requires": {
-				"is-property": "^1.0.2"
-			}
-		},
-		"iconv-lite": {
-			"version": "0.6.3",
-			"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-			"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-			"requires": {
-				"safer-buffer": ">= 2.1.2 < 3.0.0"
-			}
-		},
-		"is-property": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-			"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
-		},
-		"lodash.uniqwith": {
-			"version": "4.5.0",
-			"resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz",
-			"integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q=="
-		},
-		"long": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
-			"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
-		},
-		"lru-cache": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-			"requires": {
-				"yallist": "^4.0.0"
-			}
-		},
-		"mime-db": {
-			"version": "1.52.0",
-			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-			"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
-		},
-		"mime-types": {
-			"version": "2.1.35",
-			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-			"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-			"requires": {
-				"mime-db": "1.52.0"
-			}
-		},
-		"mysql2": {
-			"version": "2.3.3",
-			"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz",
-			"integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==",
-			"requires": {
-				"denque": "^2.0.1",
-				"generate-function": "^2.3.1",
-				"iconv-lite": "^0.6.3",
-				"long": "^4.0.0",
-				"lru-cache": "^6.0.0",
-				"named-placeholders": "^1.1.2",
-				"seq-queue": "^0.0.5",
-				"sqlstring": "^2.3.2"
-			},
-			"dependencies": {
-				"sqlstring": {
-					"version": "2.3.3",
-					"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
-					"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
-				}
-			}
-		},
-		"named-placeholders": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
-			"integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
-			"requires": {
-				"lru-cache": "^4.1.3"
-			},
-			"dependencies": {
-				"lru-cache": {
-					"version": "4.1.5",
-					"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-					"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-					"requires": {
-						"pseudomap": "^1.0.2",
-						"yallist": "^2.1.2"
-					}
-				},
-				"yallist": {
-					"version": "2.1.2",
-					"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-					"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
-				}
-			}
-		},
-		"node-domexception": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
-			"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
-		},
-		"node-fetch": {
-			"version": "3.2.9",
-			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.9.tgz",
-			"integrity": "sha512-/2lI+DBecVvVm9tDhjziTVjo2wmTsSxSk58saUYP0P/fRJ3xxtfMDY24+CKTkfm0Dlhyn3CSXNL0SoRiCZ8Rzg==",
-			"requires": {
-				"data-uri-to-buffer": "^4.0.0",
-				"fetch-blob": "^3.1.4",
-				"formdata-polyfill": "^4.0.10"
-			}
-		},
-		"pseudomap": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-			"integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
-		},
-		"safer-buffer": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-			"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-		},
-		"seq-queue": {
-			"version": "0.0.5",
-			"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
-			"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
-		},
-		"tr46": {
-			"version": "0.0.3",
-			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-		},
-		"ts-mixer": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz",
-			"integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg=="
-		},
-		"tslib": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
-			"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
-		},
-		"web-streams-polyfill": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
-			"integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q=="
-		},
-		"webidl-conversions": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-		},
-		"whatwg-url": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-			"requires": {
-				"tr46": "~0.0.3",
-				"webidl-conversions": "^3.0.0"
-			}
-		},
-		"ws": {
-			"version": "8.8.1",
-			"resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
-			"integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
-			"requires": {}
-		},
-		"yallist": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-		}
-	}
-}
diff --git a/src-slowcord/status/package.json b/src-slowcord/status/package.json
deleted file mode 100644
index ccec4f55..00000000
--- a/src-slowcord/status/package.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-	"name": "slowcord-status",
-	"version": "1.0.0",
-	"description": "Slowcord status service",
-	"main": "build/index.js",
-	"scripts": {
-		"build": "tsc -b",
-		"start": "node build/index.js",
-		"start:gateway": "node build/gateway.js"
-	},
-	"repository": {
-		"type": "git",
-		"url": "git+https://github.com/maddyunderstars/fosscord-server.git"
-	},
-	"bugs": {
-		"url": "https://github.com/maddyunderstars/fosscord-server/issues"
-	},
-	"homepage": "https://github.com/maddyunderstars/fosscord-server#readme",
-	"author": "MaddyUnderStars",
-	"license": "AGPL-3.0-only",
-	"devDependencies": {
-		"@types/node": "^18.0.6"
-	},
-	"dependencies": {
-		"dotenv": "^16.0.1",
-		"fosscord-gopnik": "^1.0.0",
-		"mysql2": "^2.3.3",
-		"node-fetch": "^3.2.9"
-	},
-	"type": "module"
-}
diff --git a/src-slowcord/status/src/gateway.ts b/src-slowcord/status/src/gateway.ts
deleted file mode 100644
index bc00c2d4..00000000
--- a/src-slowcord/status/src/gateway.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import "dotenv/config";
-import Fosscord from "fosscord-gopnik";
-import Discord from "discord.js";
-import mysql from "mysql2";
-import fetch from "node-fetch";
-
-const dbConn = mysql.createConnection(process.env.DATABASE as string);
-const executePromise = (sql: string, args: any[]) =>
-	new Promise((resolve, reject) =>
-		dbConn.execute(sql, args, (err, res) => {
-			if (err) reject(err);
-			else resolve(res);
-		}),
-	);
-const savePerf = async (time: number, name: string, error?: string | Error) => {
-	if (error && typeof error != "string") error = error.message;
-	try {
-		await executePromise(
-			"INSERT INTO performance (value, endpoint, timestamp, error) VALUES (?, ?, ?, ?)",
-			[time ?? 0, name, new Date(), error ?? null],
-		);
-		// await executePromise("DELETE FROM performance WHERE DATE(timestamp) < now() - interval ? DAY", [process.env.RETENTION_DAYS]);
-	} catch (e) {
-		console.error(e);
-	}
-};
-
-var timestamp: number | undefined;
-
-const doMeasurements = async (channel: Discord.TextChannel) => {
-	timestamp = Date.now();
-	await channel.send("hello this is a special message kthxbye");
-
-	setTimeout(
-		doMeasurements,
-		parseInt(process.env.MEASURE_INTERVAL as string),
-		channel,
-	);
-};
-
-const instance = {
-	app: process.env.INSTANCE_WEB_APP as string,
-	api: process.env.INSTANCE_API as string,
-	cdn: process.env.INSTANCE_CDN as string,
-	token: process.env.INSTANCE_TOKEN as string,
-};
-
-const client = new Fosscord.Client({
-	intents: [],
-	http: {
-		api: instance.api,
-		cdn: instance.cdn,
-	},
-});
-
-client.on("ready", async () => {
-	console.log(`Ready on gateway as ${client.user!.tag}`);
-
-	const channel = await client.channels.fetch("1019955729054267764");
-	if (!channel) return;
-
-	doMeasurements(channel as Discord.TextChannel);
-});
-
-client.on("messageCreate", async (msg: Discord.Message) => {
-	if (!timestamp) return;
-	if (
-		msg.author.id != "992745947417141682" ||
-		msg.channel.id != "1019955729054267764" ||
-		msg.content != "hello this is a special message kthxbye"
-	)
-		return;
-	await savePerf(Date.now() - timestamp, "messageCreate", undefined);
-	timestamp = undefined;
-
-	await fetch(
-		`${instance.api}/channels/1019955729054267764/messages/${msg.id}`,
-		{
-			method: "DELETE",
-			headers: {
-				authorization: instance.token,
-			},
-		},
-	);
-});
-
-client.on("error", (error: any) => {
-	console.log(`Gateway error`, error);
-});
-
-client.on("warn", (msg: any) => {
-	console.log(`Gateway warning:`, msg);
-});
-
-(async () => {
-	await new Promise((resolve) => dbConn.connect(resolve));
-	console.log("Connected to db");
-	await client.login(instance.token);
-})();
diff --git a/src-slowcord/status/src/index.ts b/src-slowcord/status/src/index.ts
deleted file mode 100644
index 979469b6..00000000
--- a/src-slowcord/status/src/index.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import "dotenv/config";
-import https from "https";
-import mysql from "mysql2";
-import fetch from "node-fetch";
-
-const dbConn = mysql.createConnection(process.env.DATABASE as string);
-const executePromise = (sql: string, args: any[]) =>
-	new Promise((resolve, reject) =>
-		dbConn.execute(sql, args, (err, res) => {
-			if (err) reject(err);
-			else resolve(res);
-		}),
-	);
-
-const instance = {
-	app: process.env.INSTANCE_WEB_APP as string,
-	api: process.env.INSTANCE_API as string,
-	cdn: process.env.INSTANCE_CDN as string,
-	token: process.env.INSTANCE_TOKEN as string,
-};
-
-const savePerf = async (time: number, name: string, error?: string | Error) => {
-	if (error && typeof error != "string") error = error.message;
-	try {
-		await executePromise(
-			"INSERT INTO performance (value, endpoint, timestamp, error) VALUES (?, ?, ?, ?)",
-			[time ?? 0, name, new Date(), error ?? null],
-		);
-		// await executePromise("DELETE FROM performance WHERE DATE(timestamp) < now() - interval ? DAY", [process.env.RETENTION_DAYS]);
-	} catch (e) {
-		console.error(e);
-	}
-};
-
-const saveSystemUsage = async (
-	load: number,
-	procUptime: number,
-	sysUptime: number,
-	ram: number,
-	sessions: number,
-) => {
-	try {
-		await executePromise(
-			"INSERT INTO monitor (time, cpu, procUp, sysUp, ram, sessions) VALUES (?, ?, ?, ?, ?, ?)",
-			[new Date(), load, procUptime, sysUptime, ram, sessions],
-		);
-	} catch (e) {
-		console.error(e);
-	}
-};
-
-const makeTimedRequest = (path: string, body?: object): Promise<number> =>
-	new Promise((resolve, reject) => {
-		const opts = {
-			hostname: new URL(path).hostname,
-			port: 443,
-			path: new URL(path).pathname,
-			method: "GET",
-			headers: {
-				"Content-Type": "application/json",
-				Authorization: instance.token,
-			},
-			timeout: 1000,
-		};
-
-		let start: number, end: number;
-		const req = https.request(opts, (res) => {
-			if (res.statusCode! < 200 || res.statusCode! > 300) {
-				return reject(`${res.statusCode} ${res.statusMessage}`);
-			}
-
-			res.on("data", (data) => {});
-
-			res.on("end", () => {
-				end = Date.now();
-				resolve(end - start);
-			});
-		});
-
-		req.on("finish", () => {
-			if (body) req.write(JSON.stringify(body));
-			start = Date.now();
-		});
-
-		req.on("error", (error) => {
-			reject(error);
-		});
-
-		req.end();
-	});
-
-const measureApi = async (name: string, path: string, body?: object) => {
-	let error,
-		time = -1;
-	try {
-		time = await makeTimedRequest(path, body);
-	} catch (e) {
-		error = e as Error | string;
-	}
-
-	console.log(
-		`${name} took ${time}ms ${error ? "with error" : ""}`,
-		error ?? "",
-	);
-
-	await savePerf(time, name, error);
-};
-
-interface monitorzSchema {
-	load: number[];
-	procUptime: number;
-	sysUptime: number;
-	memPercent: number;
-	sessions: number;
-}
-
-const app = async () => {
-	await new Promise((resolve) => dbConn.connect(resolve));
-	console.log("Connected to db");
-	// await client.login(instance.token);
-
-	console.log(
-		`Monitoring performance for instance at ${
-			new URL(instance.api).hostname
-		}`,
-	);
-
-	const doMeasurements = async () => {
-		await measureApi("ping", `${instance.api}/ping`);
-		await measureApi("users/@me", `${instance.api}/users/@me`);
-		await measureApi("login", `${instance.app}/login`);
-		// await gatewayMeasure("websocketPing");
-
-		try {
-			const res = await fetch(`${instance.api}/-/monitorz`, {
-				headers: {
-					Authorization: process.env.INSTANCE_TOKEN as string,
-				},
-			});
-			const json = (await res.json()) as monitorzSchema;
-			await saveSystemUsage(
-				json.load[1],
-				json.procUptime,
-				json.sysUptime,
-				json.memPercent,
-				json.sessions,
-			);
-		} catch (e) {}
-
-		setTimeout(
-			doMeasurements,
-			parseInt(process.env.MEASURE_INTERVAL as string),
-		);
-	};
-
-	doMeasurements();
-};
-
-app();
diff --git a/src-slowcord/status/tsconfig.json b/src-slowcord/status/tsconfig.json
deleted file mode 100644
index 4d96714c..00000000
--- a/src-slowcord/status/tsconfig.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
-	"exclude": ["node_modules"],
-	"include": ["src/**/*.ts"],
-	"compilerOptions": {
-		/* Visit https://aka.ms/tsconfig.json to read more about this file */
-		/* Projects */
-		// "incremental": true,                              /* Enable incremental compilation */
-		// "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */
-		// "tsBuildInfoFile": "./",                          /* Specify the folder for .tsbuildinfo incremental compilation files. */
-		// "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects */
-		// "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */
-		// "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */
-		/* Language and Environment */
-		"target": "ES6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
-		"lib": [
-			"ES2021"
-		] /* Specify a set of bundled library declaration files that describe the target runtime environment. */,
-		// "jsx": "preserve",                                /* Specify what JSX code is generated. */
-		"experimentalDecorators": true /* Enable experimental support for TC39 stage 2 draft decorators. */,
-		// "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
-		// "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
-		// "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
-		// "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
-		// "reactNamespace": "",                             /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
-		// "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
-		// "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */
-		/* Modules */
-		"module": "ES2020" /* Specify what module code is generated. */,
-		// "rootDir": "./",                                  /* Specify the root folder within your source files. */
-		"moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
-		// "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
-		// "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */
-		// "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
-		// "typeRoots": [],                                  /* Specify multiple folders that act like `./node_modules/@types`. */
-		"types": [
-			"node"
-		] /* Specify type package names to be included without being referenced in a source file. */,
-		// "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
-		// "resolveJsonModule": true,                        /* Enable importing .json files */
-		// "noResolve": true,                                /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
-		/* JavaScript Support */
-		// "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
-		// "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
-		// "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
-		/* Emit */
-		// "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
-		// "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
-		// "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
-		"sourceMap": true /* Create source map files for emitted JavaScript files. */,
-		// "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
-		"outDir": "./build" /* Specify an output folder for all emitted files. */,
-		// "removeComments": true,                           /* Disable emitting comments. */
-		// "noEmit": true,                                   /* Disable emitting files from a compilation. */
-		// "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
-		// "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types */
-		// "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
-		// "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
-		// "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
-		// "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
-		// "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
-		// "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
-		// "newLine": "crlf",                                /* Set the newline character for emitting files. */
-		// "stripInternal": true,                            /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
-		// "noEmitHelpers": true,                            /* Disable generating custom helper functions like `__extends` in compiled output. */
-		// "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
-		// "preserveConstEnums": true,                       /* Disable erasing `const enum` declarations in generated code. */
-		// "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */
-		// "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
-		/* Interop Constraints */
-		// "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
-		// "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
-		"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
-		// "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
-		"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
-		/* Type Checking */
-		"strict": true /* Enable all strict type-checking options. */,
-		// "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied `any` type.. */
-		// "strictNullChecks": true,                         /* When type checking, take into account `null` and `undefined`. */
-		// "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
-		// "strictBindCallApply": true,                      /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
-		"strictPropertyInitialization": false /* Check for class properties that are declared but not set in the constructor. */,
-		// "noImplicitThis": true,                           /* Enable error reporting when `this` is given the type `any`. */
-		// "useUnknownInCatchVariables": true,               /* Type catch clause variables as 'unknown' instead of 'any'. */
-		// "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
-		// "noUnusedLocals": true,                           /* Enable error reporting when a local variables aren't read. */
-		// "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read */
-		// "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
-		// "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
-		// "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
-		// "noUncheckedIndexedAccess": true,                 /* Include 'undefined' in index signature results */
-		// "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
-		// "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type */
-		// "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
-		// "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */
-		/* Completeness */
-		// "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
-		"skipLibCheck": true /* Skip type checking all .d.ts files. */
-	}
-}
diff --git a/src/api/middlewares/Authentication.ts b/src/api/middlewares/Authentication.ts
index ecde7fb4..ec2c42e5 100644
--- a/src/api/middlewares/Authentication.ts
+++ b/src/api/middlewares/Authentication.ts
@@ -25,6 +25,8 @@ export const NO_AUTHORIZATION_ROUTES = [
 	"/track",
 	// Public policy pages
 	"/policies/instance",
+	// Oauth callback
+	"/oauth2/callback",
 	// Asset delivery
 	/\/guilds\/\d+\/widget\.(json|png)/,
 ];
diff --git a/src/api/routes/oauth2/callback.ts b/src/api/routes/oauth2/callback.ts
new file mode 100644
index 00000000..3c7fb777
--- /dev/null
+++ b/src/api/routes/oauth2/callback.ts
@@ -0,0 +1,38 @@
+import { Router, Request, Response } from "express";
+import { route, OauthCallbackHandlers } from "@fosscord/api";
+import { FieldErrors, generateToken, User } from "@fosscord/util";
+const router = Router();
+
+router.get("/:type", route({}), async (req: Request, res: Response) => {
+	const { type } = req.params;
+	const handler = OauthCallbackHandlers[type];
+	if (!handler) throw FieldErrors({
+		type: {
+			code: "BASE_TYPE_CHOICES",
+			message: `Value must be one of (${Object.keys(OauthCallbackHandlers).join(", ")}).`,
+		}
+	});
+
+	const { code } = req.query;
+	if (!code || typeof code !== "string") throw FieldErrors({ code: { code: "BASE_TYPE_REQUIRED", message: req.t("common:field.BASE_TYPE_REQUIRED"), } });
+	const access = await handler.getAccessToken(code);
+
+	const oauthUser = await handler.getUserDetals(access.access_token);
+
+	let user = await User.findOne({ where: { email: oauthUser.email } });
+	if (!user) {
+		user = await User.register({
+			email: oauthUser.email,
+			username: oauthUser.username,
+			req
+		});
+
+		// TODO: upload pfp, banner?
+	}
+
+	const token = await generateToken(user.id);
+
+	return { token };
+});
+
+export default router;
\ No newline at end of file
diff --git a/src/api/routes/policies/instance/stats.ts b/src/api/routes/policies/instance/stats.ts
new file mode 100644
index 00000000..fb8c386a
--- /dev/null
+++ b/src/api/routes/policies/instance/stats.ts
@@ -0,0 +1,21 @@
+import { Router, Request, Response } from "express";
+import { route } from "@fosscord/api";
+import { Attachment, Config, Guild, Message, RateLimit, Session, User } from "@fosscord/util";
+const router = Router();
+
+router.get("/", route({}), async (req: Request, res: Response) => {
+	res.json({
+		all_time: {
+			users: await User.count(),
+			guilds: await Guild.count(),
+			messages: await Message.count(),
+			attachments: await Attachment.count(),
+		},
+		now: {
+			sessions: await Session.count(),
+			rate_limits: await RateLimit.count(),
+		}
+	});
+});
+
+export default router;
diff --git a/src/api/util/handlers/Oauth.ts b/src/api/util/handlers/Oauth.ts
new file mode 100644
index 00000000..cc662161
--- /dev/null
+++ b/src/api/util/handlers/Oauth.ts
@@ -0,0 +1,83 @@
+// TODO: Puyo's connections PR would replace this file
+
+import { Config } from "@fosscord/util";
+import fetch from "node-fetch";
+
+export interface OauthAccessToken {
+	access_token: string;
+	token_type: string;
+	expires_in: string;
+	refresh_token: string;
+	scope: string;
+};
+
+export interface OauthUserDetails {
+	id: string;
+	email: string;
+	username: string;
+	avatar_url: string | null;
+}
+
+interface Connection {
+	getAccessToken: (code: string) => Promise<OauthAccessToken>;
+	getUserDetals: (token: string) => Promise<OauthUserDetails>;
+}
+
+const DiscordConnection: Connection = {
+	getAccessToken: async (code) => {
+		const { external } = Config.get();
+		const { discord } = external;
+
+		if (!discord.id || !discord.secret || !discord.redirect)
+			throw new Error("Discord Oauth has not been configured.")
+
+		const body = new URLSearchParams(
+			Object.entries({
+				client_id: discord.id as string,
+				client_secret: discord.secret as string,
+				redirect_uri: discord.redirect as string,
+				code: code as string,
+				grant_type: "authorization_code",
+			})
+		).toString();
+
+		const resp = await fetch("https://discord.com/api/oauth2/token", {
+			method: "POST",
+			headers: {
+				"Content-Type": "application/x-www-form-urlencoded",
+			},
+			body: body,
+		});
+		if (resp.status !== 200) throw new Error(`Failed to get access token.`,);
+
+		const json = await resp.json();
+
+		return json;
+	},
+
+	getUserDetals: async (token) => {
+		const resp = await fetch("https://discord.com/api/users/@me", {
+			headers: {
+				Authorization: `Bearer ${token}`
+			},
+		});
+
+		const json = await resp.json();
+		if (!json.username || !json.email) throw new Error("Failed to get user details via oauth");
+
+		return {
+			id: json.id,
+			email: json.email,
+			username: json.username,
+			avatar_url: json.avatar
+				? `https://cdn.discordapp.com/avatars/${json.id}/${json.avatar}?size=2048`
+				: null,
+		};
+	}
+};
+
+const OauthCallbackHandlers: { [key: string]: Connection; } = {
+	discord: DiscordConnection
+};
+
+export { OauthCallbackHandlers };
\ No newline at end of file
diff --git a/src/api/util/index.ts b/src/api/util/index.ts
index ffad0607..49542ceb 100644
--- a/src/api/util/index.ts
+++ b/src/api/util/index.ts
@@ -7,4 +7,5 @@ export * from "./handlers/route";
 export * from "./utility/String";
 export * from "./handlers/Voice";
 export * from "./utility/captcha";
-export * from "./utility/EmbedHandlers";
\ No newline at end of file
+export * from "./utility/EmbedHandlers";
+export * from "./handlers/Oauth";
\ No newline at end of file
diff --git a/src/util/entities/Config.ts b/src/util/entities/Config.ts
index 5035f552..9b25795d 100644
--- a/src/util/entities/Config.ts
+++ b/src/util/entities/Config.ts
@@ -211,7 +211,12 @@ export interface ConfigValue {
 	};
 	external: {
 		twitter: string | null;
-	}
+		discord: {
+			id: string | null;
+			secret: string | null;
+			redirect: string | null;
+		};
+	};
 }
 
 export const DefaultConfigOptions: ConfigValue = {
@@ -423,5 +428,10 @@ export const DefaultConfigOptions: ConfigValue = {
 	},
 	external: {
 		twitter: null,
+		discord: {
+			id: null,
+			secret: null,
+			redirect: null,
+		}
 	}
 };
diff --git a/src/util/interfaces/Event.ts b/src/util/interfaces/Event.ts
index 8048250c..5e474d9e 100644
--- a/src/util/interfaces/Event.ts
+++ b/src/util/interfaces/Event.ts
@@ -1,19 +1,26 @@
-import { PublicUser, User, UserSettings } from "../entities/User";
-import { Channel } from "../entities/Channel";
-import { Guild } from "../entities/Guild";
-import { Member, PublicMember, UserGuildSettings } from "../entities/Member";
-import { Emoji } from "../entities/Emoji";
-import { Role } from "../entities/Role";
-import { Invite } from "../entities/Invite";
-import { Message, PartialEmoji } from "../entities/Message";
-import { VoiceState } from "../entities/VoiceState";
-import { ApplicationCommand } from "../entities/Application";
-import { Interaction } from "./Interaction";
-import { ConnectedAccount } from "../entities/ConnectedAccount";
-import { Relationship, RelationshipType } from "../entities/Relationship";
-import { Presence } from "./Presence";
-import { Sticker } from "..";
-import { Activity, Status } from ".";
+import {
+	RelationshipType,
+	ConnectedAccount,
+	Interaction,
+	ApplicationCommand,
+	VoiceState,
+	Message,
+	PartialEmoji,
+	Invite,
+	Role,
+	Emoji,
+	PublicMember,
+	UserGuildSettings,
+	Guild,
+	Channel,
+	PublicUser,
+	User,
+	Sticker,
+	Activity,
+	Status,
+	Presence,
+	UserSettings,
+} from "@fosscord/util";
 
 export interface Event {
 	guild_id?: string;
@@ -73,9 +80,9 @@ export interface ReadyEventData {
 		number,
 		null,
 		number,
-		[[number, { e: number; s: number }[]]],
+		[[number, { e: number; s: number; }[]]],
 		[number, [[number, [number, number]]]],
-		{ b: number; k: bigint[] }[],
+		{ b: number; k: bigint[]; }[],
 	][];
 	guild_join_requests?: any[]; // ? what is this? this is new
 	shard?: [number, number];
@@ -473,7 +480,7 @@ export interface SessionsReplace extends Event {
 export interface GuildMemberListUpdate extends Event {
 	event: "GUILD_MEMBER_LIST_UPDATE";
 	data: {
-		groups: { id: string; count: number }[];
+		groups: { id: string; count: number; }[];
 		guild_id: string;
 		id: string;
 		member_count: number;
@@ -481,8 +488,8 @@ export interface GuildMemberListUpdate extends Event {
 		ops: {
 			index: number;
 			item: {
-				member?: PublicMember & { presence: Presence };
-				group?: { id: string; count: number }[];
+				member?: PublicMember & { presence: Presence; };
+				group?: { id: string; count: number; }[];
 			};
 		}[];
 	};