diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b58b603fea78041071d125a30db58d79b3d49217
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,5 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/architecture-et-application-web-2022-2023-tp-rajohnson.iml b/.idea/architecture-et-application-web-2022-2023-tp-rajohnson.iml
new file mode 100644
index 0000000000000000000000000000000000000000..24643cc37449b4bde54411a80b8ed61258225e34
--- /dev/null
+++ b/.idea/architecture-et-application-web-2022-2023-tp-rajohnson.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+      <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/tmp" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..03d9549ea8e4ada36fb3ecbc30fef08175b7d728
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
+  </profile>
+</component>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6b038613cf9feeb36a1fd306f2e28dc3136e557f
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/architecture-et-application-web-2022-2023-tp-rajohnson.iml" filepath="$PROJECT_DIR$/.idea/architecture-et-application-web-2022-2023-tp-rajohnson.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/API/package-lock.json b/API/package-lock.json
index 02c4b6bb659828c00c082a081c164ed48e838d81..95ae996a3fc4c9bc82ec749ee6cdf3466772489b 100644
--- a/API/package-lock.json
+++ b/API/package-lock.json
@@ -22,6 +22,7 @@
                 "node": "^19.8.1",
                 "npm": "^9.6.3",
                 "socket.io": "^4.6.1",
+                "sqlite3": "^5.1.6",
                 "winston": "^3.8.2"
             },
             "devDependencies": {
@@ -32,7 +33,10 @@
                 "@types/morgan": "^1.9.4",
                 "@types/multer": "^1.4.7",
                 "@types/node": "^18.15.11",
+                "@types/sequelize": "^4.28.14",
+                "@types/sqlite3": "^3.1.8",
                 "nodemon": "^2.0.22",
+                "sequelize-typescript": "^2.1.5",
                 "ts-node": "^10.9.1",
                 "typescript": "^5.0.3"
             }
@@ -67,6 +71,12 @@
                 "kuler": "^2.0.0"
             }
         },
+        "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/@jridgewell/resolve-uri": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
@@ -92,11 +102,89 @@
                 "@jridgewell/sourcemap-codec": "^1.4.10"
             }
         },
+        "node_modules/@mapbox/node-pre-gyp": {
+            "version": "1.0.10",
+            "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
+            "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
+            "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/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/@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==",
+            "deprecated": "This functionality has been moved to @npmcli/fs",
+            "optional": true,
+            "dependencies": {
+                "mkdirp": "^1.0.4",
+                "rimraf": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/@npmcli/move-file/node_modules/mkdirp": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+            "optional": true,
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/@socket.io/component-emitter": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
             "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
         },
+        "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/@tsconfig/node10": {
             "version": "1.0.9",
             "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
@@ -127,6 +215,12 @@
             "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==",
             "dev": true
         },
+        "node_modules/@types/bluebird": {
+            "version": "3.5.38",
+            "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz",
+            "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==",
+            "dev": true
+        },
         "node_modules/@types/body-parser": {
             "version": "1.19.2",
             "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
@@ -146,6 +240,15 @@
                 "@types/node": "*"
             }
         },
+        "node_modules/@types/continuation-local-storage": {
+            "version": "3.2.4",
+            "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.4.tgz",
+            "integrity": "sha512-OT32vCVMymU1JMPKDeY0lX3cduAr0Pm/VwIbxygMeDS4lRcv57qYXn9bMwBRcRnEpXKBb/r4xYaZCARTZllP0A==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
         "node_modules/@types/cookie": {
             "version": "0.4.1",
             "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
@@ -159,6 +262,16 @@
                 "@types/node": "*"
             }
         },
+        "node_modules/@types/debug": {
+            "version": "4.1.7",
+            "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz",
+            "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==",
+            "dev": true,
+            "peer": true,
+            "dependencies": {
+                "@types/ms": "*"
+            }
+        },
         "node_modules/@types/express": {
             "version": "4.17.17",
             "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
@@ -191,6 +304,12 @@
                 "@types/node": "*"
             }
         },
+        "node_modules/@types/lodash": {
+            "version": "4.14.194",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz",
+            "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==",
+            "dev": true
+        },
         "node_modules/@types/mime": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
@@ -206,6 +325,13 @@
                 "@types/node": "*"
             }
         },
+        "node_modules/@types/ms": {
+            "version": "0.7.31",
+            "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
+            "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==",
+            "dev": true,
+            "peer": true
+        },
         "node_modules/@types/multer": {
             "version": "1.4.7",
             "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz",
@@ -232,6 +358,18 @@
             "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
             "dev": true
         },
+        "node_modules/@types/sequelize": {
+            "version": "4.28.14",
+            "resolved": "https://registry.npmjs.org/@types/sequelize/-/sequelize-4.28.14.tgz",
+            "integrity": "sha512-O8lTJ8YPVVaoY9xjduchDlo0MOS3w262pro2H1QMuFIo/kc/p1elP/UxLOTP2wcVO2cFd6Gvghg9ZSAiJi0GLA==",
+            "dev": true,
+            "dependencies": {
+                "@types/bluebird": "*",
+                "@types/continuation-local-storage": "*",
+                "@types/lodash": "*",
+                "@types/validator": "*"
+            }
+        },
         "node_modules/@types/serve-static": {
             "version": "1.15.1",
             "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz",
@@ -242,11 +380,26 @@
                 "@types/node": "*"
             }
         },
+        "node_modules/@types/sqlite3": {
+            "version": "3.1.8",
+            "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.8.tgz",
+            "integrity": "sha512-sQMt/qnyUWnqiTcJXm5ZfNPIBeJ/DVvJDwxw+0tAxPJvadzfiP1QhryO1JOR6t1yfb8NpzQb/Rud06mob5laIA==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
         "node_modules/@types/triple-beam": {
             "version": "1.3.2",
             "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz",
             "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g=="
         },
+        "node_modules/@types/validator": {
+            "version": "13.7.15",
+            "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz",
+            "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ==",
+            "dev": true
+        },
         "node_modules/abbrev": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -285,6 +438,96 @@
                 "node": ">=0.4.0"
             }
         },
+        "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.3.0",
+            "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
+            "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
+            "optional": true,
+            "dependencies": {
+                "debug": "^4.1.0",
+                "depd": "^2.0.0",
+                "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/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/anymatch": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -303,6 +546,36 @@
             "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
             "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
         },
+        "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/are-we-there-yet/node_modules/readable-stream": {
+            "version": "3.6.2",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+            "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
         "node_modules/arg": {
             "version": "4.1.3",
             "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
@@ -440,6 +713,47 @@
                 "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/cacache/node_modules/mkdirp": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+            "optional": true,
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/call-bind": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -479,6 +793,23 @@
                 "fsevents": "~2.3.2"
             }
         },
+        "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": {
             "version": "3.2.1",
             "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
@@ -510,6 +841,14 @@
                 "simple-swizzle": "^0.2.2"
             }
         },
+        "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/colorspace": {
             "version": "1.1.4",
             "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
@@ -549,6 +888,11 @@
                 "typedarray": "^0.0.6"
             }
         },
+        "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",
             "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -620,6 +964,11 @@
                 "node": ">=0.4.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",
             "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -637,6 +986,14 @@
                 "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/diff": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
@@ -654,6 +1011,13 @@
                 "node": ">=12"
             }
         },
+        "node_modules/dottie": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.3.tgz",
+            "integrity": "sha512-4liA0PuRkZWQFQjwBypdxPfZaRWiv5tkhMXY2hzsa2pNf5s7U3m9cwUchfNKe8wZQxdGPQQzO6Rm2uGe0rvohQ==",
+            "dev": true,
+            "peer": true
+        },
         "node_modules/ecdsa-sig-formatter": {
             "version": "1.0.11",
             "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -667,6 +1031,11 @@
             "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
         },
+        "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/enabled": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
@@ -680,6 +1049,27 @@
                 "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/engine.io": {
             "version": "6.4.1",
             "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz",
@@ -737,13 +1127,28 @@
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
             "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
         },
-        "node_modules/escape-html": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-            "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
-        },
-        "node_modules/etag": {
-            "version": "1.8.1",
+        "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",
+            "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+            "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+        },
+        "node_modules/etag": {
+            "version": "1.8.1",
             "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
             "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
             "engines": {
@@ -871,6 +1276,22 @@
                 "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/fsevents": {
             "version": "2.3.2",
             "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -890,6 +1311,25 @@
             "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
             "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
         },
+        "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.2.0",
             "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
@@ -903,6 +1343,25 @@
                 "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/glob-parent": {
             "version": "5.1.2",
             "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -915,6 +1374,12 @@
                 "node": ">= 6"
             }
         },
+        "node_modules/graceful-fs": {
+            "version": "4.2.11",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+            "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+            "optional": true
+        },
         "node_modules/has": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -946,6 +1411,11 @@
                 "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/helmet": {
             "version": "6.0.1",
             "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.0.1.tgz",
@@ -954,6 +1424,12 @@
                 "node": ">=14.0.0"
             }
         },
+        "node_modules/http-cache-semantics": {
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+            "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+            "optional": true
+        },
         "node_modules/http-errors": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -969,11 +1445,90 @@
                 "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/http-status-codes": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz",
             "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng=="
         },
+        "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",
             "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -991,11 +1546,60 @@
             "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
             "dev": true
         },
+        "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/inflection": {
+            "version": "1.13.4",
+            "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
+            "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
+            "dev": true,
+            "engines": [
+                "node >= 0.4.0"
+            ],
+            "peer": 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",
             "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
             "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
         },
+        "node_modules/ip": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+            "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+            "optional": true
+        },
         "node_modules/ipaddr.js": {
             "version": "1.9.1",
             "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -1030,6 +1634,14 @@
                 "node": ">=0.10.0"
             }
         },
+        "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-glob": {
             "version": "4.0.3",
             "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -1042,6 +1654,12 @@
                 "node": ">=0.10.0"
             }
         },
+        "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/is-number": {
             "version": "7.0.0",
             "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -1067,6 +1685,12 @@
             "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
             "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
         },
+        "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/jsonwebtoken": {
             "version": "9.0.0",
             "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
@@ -1145,12 +1769,61 @@
                 "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-error": {
             "version": "1.3.6",
             "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
             "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
             "dev": true
         },
+        "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",
             "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -1221,70 +1894,181 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/mkdirp": {
-            "version": "0.5.6",
-            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-            "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+        "node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
             "dependencies": {
-                "minimist": "^1.2.6"
+                "yallist": "^4.0.0"
             },
-            "bin": {
-                "mkdirp": "bin/cmd.js"
+            "engines": {
+                "node": ">=8"
             }
         },
-        "node_modules/morgan": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
-            "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+        "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": {
-                "basic-auth": "~2.0.1",
-                "debug": "2.6.9",
-                "depd": "~2.0.0",
-                "on-finished": "~2.3.0",
-                "on-headers": "~1.0.2"
+                "minipass": "^3.0.0"
             },
             "engines": {
-                "node": ">= 0.8.0"
+                "node": ">= 8"
             }
         },
-        "node_modules/morgan/node_modules/on-finished": {
-            "version": "2.3.0",
-            "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-            "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+        "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": {
-                "ee-first": "1.1.1"
+                "minipass": "^3.1.0",
+                "minipass-sized": "^1.0.3",
+                "minizlib": "^2.0.0"
             },
             "engines": {
-                "node": ">= 0.8"
+                "node": ">=8"
+            },
+            "optionalDependencies": {
+                "encoding": "^0.1.12"
             }
         },
-        "node_modules/ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-        },
-        "node_modules/multer": {
-            "version": "1.4.5-lts.1",
-            "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
-            "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+        "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": {
-                "append-field": "^1.0.0",
-                "busboy": "^1.0.0",
-                "concat-stream": "^1.5.2",
-                "mkdirp": "^0.5.4",
-                "object-assign": "^4.1.1",
-                "type-is": "^1.6.4",
-                "xtend": "^4.0.0"
+                "minipass": "^3.0.0"
             },
             "engines": {
-                "node": ">= 6.0.0"
+                "node": ">= 8"
             }
         },
-        "node_modules/negotiator": {
-            "version": "0.6.3",
-            "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
-            "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
-            "engines": {
+        "node_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": "0.5.6",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+            "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+            "dependencies": {
+                "minimist": "^1.2.6"
+            },
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            }
+        },
+        "node_modules/moment": {
+            "version": "2.29.4",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+            "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
+            "dev": true,
+            "peer": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/moment-timezone": {
+            "version": "0.5.43",
+            "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz",
+            "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==",
+            "dev": true,
+            "peer": true,
+            "dependencies": {
+                "moment": "^2.29.4"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/morgan": {
+            "version": "1.10.0",
+            "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
+            "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+            "dependencies": {
+                "basic-auth": "~2.0.1",
+                "debug": "2.6.9",
+                "depd": "~2.0.0",
+                "on-finished": "~2.3.0",
+                "on-headers": "~1.0.2"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/morgan/node_modules/on-finished": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+            "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+            "dependencies": {
+                "ee-first": "1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+        },
+        "node_modules/multer": {
+            "version": "1.4.5-lts.1",
+            "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
+            "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+            "dependencies": {
+                "append-field": "^1.0.0",
+                "busboy": "^1.0.0",
+                "concat-stream": "^1.5.2",
+                "mkdirp": "^0.5.4",
+                "object-assign": "^4.1.1",
+                "type-is": "^1.6.4",
+                "xtend": "^4.0.0"
+            },
+            "engines": {
+                "node": ">= 6.0.0"
+            }
+        },
+        "node_modules/negotiator": {
+            "version": "0.6.3",
+            "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+            "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+            "engines": {
                 "node": ">= 0.6"
             }
         },
@@ -1303,11 +2087,135 @@
                 "npm": ">=5.0.0"
             }
         },
+        "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-bin-setup": {
             "version": "1.1.3",
             "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz",
             "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg=="
         },
+        "node_modules/node-fetch": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+            "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
+            "dependencies": {
+                "whatwg-url": "^5.0.0"
+            },
+            "engines": {
+                "node": "4.x || >=6.0.0"
+            },
+            "peerDependencies": {
+                "encoding": "^0.1.0"
+            },
+            "peerDependenciesMeta": {
+                "encoding": {
+                    "optional": true
+                }
+            }
+        },
+        "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.1",
+            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+            "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+            "optional": true,
+            "dependencies": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^3.6.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "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/nopt": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+            "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+            "optional": true,
+            "dependencies": {
+                "abbrev": "1"
+            },
+            "bin": {
+                "nopt": "bin/nopt.js"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "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/node-gyp/node_modules/readable-stream": {
+            "version": "3.6.2",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+            "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+            "optional": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
         "node_modules/nodemon": {
             "version": "2.0.22",
             "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz",
@@ -1364,6 +2272,7 @@
             "version": "1.0.10",
             "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
             "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
+            "dev": true,
             "dependencies": {
                 "abbrev": "1"
             },
@@ -4109,6 +5018,17 @@
             "inBundle": true,
             "license": "ISC"
         },
+        "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",
@@ -4144,6 +5064,14 @@
                 "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/one-time": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
@@ -4152,6 +5080,21 @@
                 "fn.name": "1.x.x"
             }
         },
+        "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",
             "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -4160,11 +5103,26 @@
                 "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",
             "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
             "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
         },
+        "node_modules/pg-connection-string": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
+            "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==",
+            "dev": true,
+            "peer": true
+        },
         "node_modules/picomatch": {
             "version": "2.3.1",
             "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
@@ -4182,6 +5140,25 @@
             "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/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",
             "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -4267,21 +5244,58 @@
                 "node": ">=8.10.0"
             }
         },
-        "node_modules/safe-buffer": {
-            "version": "5.2.1",
-            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-            "funding": [
-                {
-                    "type": "github",
-                    "url": "https://github.com/sponsors/feross"
-                },
-                {
-                    "type": "patreon",
-                    "url": "https://www.patreon.com/feross"
-                },
-                {
-                    "type": "consulting",
+        "node_modules/reflect-metadata": {
+            "version": "0.1.13",
+            "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
+            "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
+            "dev": true,
+            "peer": true
+        },
+        "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/retry-as-promised": {
+            "version": "7.0.4",
+            "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
+            "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==",
+            "dev": true,
+            "peer": true
+        },
+        "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",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
                     "url": "https://feross.org/support"
                 }
             ]
@@ -4341,6 +5355,142 @@
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
             "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
         },
+        "node_modules/sequelize": {
+            "version": "6.31.0",
+            "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.0.tgz",
+            "integrity": "sha512-nCPVtv+QydBmb3Us2jCNAr1Dx3gST83VZxxrUQn/JAVFCOrmYOgUaPUz5bevummyNf30zfHsZhIKYAOD3ULfTA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/sequelize"
+                }
+            ],
+            "peer": true,
+            "dependencies": {
+                "@types/debug": "^4.1.7",
+                "@types/validator": "^13.7.1",
+                "debug": "^4.3.3",
+                "dottie": "^2.0.2",
+                "inflection": "^1.13.2",
+                "lodash": "^4.17.21",
+                "moment": "^2.29.1",
+                "moment-timezone": "^0.5.35",
+                "pg-connection-string": "^2.5.0",
+                "retry-as-promised": "^7.0.3",
+                "semver": "^7.3.5",
+                "sequelize-pool": "^7.1.0",
+                "toposort-class": "^1.0.1",
+                "uuid": "^8.3.2",
+                "validator": "^13.7.0",
+                "wkx": "^0.5.0"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependenciesMeta": {
+                "ibm_db": {
+                    "optional": true
+                },
+                "mariadb": {
+                    "optional": true
+                },
+                "mysql2": {
+                    "optional": true
+                },
+                "oracledb": {
+                    "optional": true
+                },
+                "pg": {
+                    "optional": true
+                },
+                "pg-hstore": {
+                    "optional": true
+                },
+                "snowflake-sdk": {
+                    "optional": true
+                },
+                "sqlite3": {
+                    "optional": true
+                },
+                "tedious": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/sequelize-pool": {
+            "version": "7.1.0",
+            "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
+            "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
+            "dev": true,
+            "peer": true,
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
+        "node_modules/sequelize-typescript": {
+            "version": "2.1.5",
+            "resolved": "https://registry.npmjs.org/sequelize-typescript/-/sequelize-typescript-2.1.5.tgz",
+            "integrity": "sha512-x1CNODct8gJyfZPwEZBU5uVGNwgJI2Fda913ZxD5ZtCSRyTDPBTS/0uXciF+MlCpyqjpmoCAPtudQWzw579bzA==",
+            "dev": true,
+            "dependencies": {
+                "glob": "7.2.0"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "@types/node": "*",
+                "@types/validator": "*",
+                "reflect-metadata": "*",
+                "sequelize": ">=6.20.1"
+            }
+        },
+        "node_modules/sequelize-typescript/node_modules/glob": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+            "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+            "dev": true,
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+            },
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/sequelize/node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "peer": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/sequelize/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==",
+            "dev": true,
+            "peer": true
+        },
         "node_modules/serve-static": {
             "version": "1.15.0",
             "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
@@ -4355,6 +5505,11 @@
                 "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",
             "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -4373,6 +5528,11 @@
                 "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/simple-swizzle": {
             "version": "0.2.2",
             "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -4402,6 +5562,16 @@
                 "semver": "bin/semver.js"
             }
         },
+        "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/socket.io": {
             "version": "4.6.1",
             "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz",
@@ -4480,6 +5650,91 @@
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
             "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
         },
+        "node_modules/socks": {
+            "version": "2.7.1",
+            "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+            "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+            "optional": true,
+            "dependencies": {
+                "ip": "^2.0.0",
+                "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.1.6",
+            "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz",
+            "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==",
+            "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/stack-trace": {
             "version": "0.0.10",
             "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@@ -4517,6 +5772,30 @@
             "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
             "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
         },
+        "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/supports-color": {
             "version": "5.5.0",
             "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -4529,6 +5808,41 @@
                 "node": ">=4"
             }
         },
+        "node_modules/tar": {
+            "version": "6.1.13",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+            "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
+            "dependencies": {
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.0.0",
+                "minipass": "^4.0.0",
+                "minizlib": "^2.1.1",
+                "mkdirp": "^1.0.3",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/tar/node_modules/minipass": {
+            "version": "4.2.8",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
+            "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/tar/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/text-hex": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
@@ -4554,6 +5868,13 @@
                 "node": ">=0.6"
             }
         },
+        "node_modules/toposort-class": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
+            "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==",
+            "dev": true,
+            "peer": true
+        },
         "node_modules/touch": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
@@ -4566,6 +5887,11 @@
                 "nodetouch": "bin/nodetouch.js"
             }
         },
+        "node_modules/tr46": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+            "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+        },
         "node_modules/triple-beam": {
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
@@ -4650,6 +5976,24 @@
             "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
             "dev": true
         },
+        "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",
             "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -4671,6 +6015,16 @@
                 "node": ">= 0.4.0"
             }
         },
+        "node_modules/uuid": {
+            "version": "8.3.2",
+            "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+            "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+            "dev": true,
+            "peer": true,
+            "bin": {
+                "uuid": "dist/bin/uuid"
+            }
+        },
         "node_modules/v8-compile-cache-lib": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -4693,6 +6047,43 @@
                 "node": ">= 0.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/winston": {
             "version": "3.8.2",
             "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz",
@@ -4753,6 +6144,21 @@
                 "node": ">= 6"
             }
         },
+        "node_modules/wkx": {
+            "version": "0.5.0",
+            "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
+            "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
+            "dev": true,
+            "peer": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "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/ws": {
             "version": "8.11.0",
             "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
diff --git a/API/package.json b/API/package.json
index aeadf915777c380b5d67531318f4ed2e62672422..c1a2a82d25d0f737698de20f3ed799ca461287dc 100644
--- a/API/package.json
+++ b/API/package.json
@@ -26,6 +26,7 @@
         "node": "^19.8.1",
         "npm": "^9.6.3",
         "socket.io": "^4.6.1",
+        "sqlite3": "^5.1.6",
         "winston": "^3.8.2"
     },
     "devDependencies": {
@@ -36,7 +37,10 @@
         "@types/morgan": "^1.9.4",
         "@types/multer": "^1.4.7",
         "@types/node": "^18.15.11",
+        "@types/sequelize": "^4.28.14",
+        "@types/sqlite3": "^3.1.8",
         "nodemon": "^2.0.22",
+        "sequelize-typescript": "^2.1.5",
         "ts-node": "^10.9.1",
         "typescript": "^5.0.3"
     }
diff --git a/API/src/database/Database.ts b/API/src/database/Database.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5f81cbbac10eebbe104e754df8fe927c2ec2ee49
--- /dev/null
+++ b/API/src/database/Database.ts
@@ -0,0 +1,138 @@
+import {Sequelize} from 'sequelize';
+import * as path from "path";
+import {userType} from "../models/user";
+import {initUser} from "./migrations/User_init";
+import {initQuestion} from "./migrations/Question_init";
+import {User} from "./models/User"
+import {Question} from "./models/Question";
+import {categoriesQuestion} from "../models/question";
+
+
+const sequelize = new Sequelize({
+    dialect: 'sqlite',
+    storage: path.join(__dirname, 'database.sqlite')
+});
+
+initUser(sequelize);
+initQuestion(sequelize);
+
+// Synchronisation des modèles avec la base de données
+sequelize.sync({ force: false }).then(() => {
+    console.log('Tables synchronisées avec succès !');
+});
+
+export class Database{
+    private static _instance: Database;
+
+    private constructor(){
+
+    }
+    public static get instance(): Database {
+        if (!Database._instance) {
+            Database._instance = new Database();
+        }
+
+        return Database._instance;
+    }
+
+    static async createAccount(username: string, password: string, accountType: userType): Promise<[number, string]> {
+        let result: [number, string];
+        const user = await User.findOne({where: {username}});
+
+
+        if (user) {
+            console.log('Le nom d\'utilisateur existe déjà.');
+            result = [-1, "Exist"];
+        } else {
+            await User.create({
+                username: username,
+                password: password,
+                type: accountType === userType.Gamer ? 'user' : 'admin'
+            }).then(user => {
+                console.log(`Utilisateur "${user.username}" ajouté avec succès !`);
+                if (accountType === userType.Gamer) result = [0, "User"];
+                else result = [0, "Admin"]
+            }).catch(err => {
+                console.log(`Une erreur s'est produite lors de l'ajout de l'utilisateur "${username}" `)
+                result = [-1, undefined];
+            });
+        }
+        return result;
+
+
+    }
+
+    static async createQuestion(question: string, possibleResponse: string[], correctResponse: string, category: string): Promise<number> {
+        let result: number=-1;
+        await Question.create({
+            question: question,
+            possibleResponse: JSON.stringify(possibleResponse),
+            correctResponse: correctResponse,
+            category: category
+        }).then(question => {
+            console.log(`Question "${question.id}" ajouté avec succès !`);
+            result= 0;
+        }).catch(err => {
+            console.log(`Une erreur s'est produite lors de l'ajout de la question: ${err}`)
+            result= -1;
+        });
+        return result;
+
+
+    }
+
+
+    static async accountExist(username: string): Promise<string>{
+        const user= await User.findOne({ where: { username } });
+        return !!user?user.dataValues.type: undefined;
+
+    }
+
+
+    static async getAllUsers(): Promise<User[]>{
+        return await User.findAll();
+    }
+
+    static async getAllQuestions(): Promise<Question[]>{
+        return await Question.findAll();
+    }
+
+    static async deleteUser(username: string): Promise<number>{
+        return await User.destroy({ where: { username: username } });
+    }
+
+    static async deleteQuestion(id: number): Promise<number>{
+        return await Question.destroy({ where: { id: id } });
+    }
+
+    static async updateUserAccount(username: string, password?:string, typeUser?: userType){
+        let updatedData: User=new User();
+        updatedData.username=username;
+        if(password!==undefined) updatedData.password = password;
+        if(typeUser!==undefined) updatedData.type = typeUser===userType.Gamer?'user':'admin';
+        console.log(`updatedDate=${updatedData}`)
+
+
+        return await User.update(updatedData.dataValues, { where: { username: username } });
+
+    }
+
+    static async updateQuestion(id: number, question?: string, possibleResponse?: string[], correctResponse?: string, category? : string){
+        let updatedData: Question=new Question();
+        updatedData.id=id;
+        if(question !== undefined) updatedData.question = question;
+        if(possibleResponse !== undefined) updatedData.possibleResponse = JSON.stringify(possibleResponse);
+        if(correctResponse !== undefined) updatedData.correctResponse = correctResponse;
+        if(category !== undefined) updatedData.category=category;
+
+
+        return await Question.update(updatedData.dataValues, { where: { id: id } });
+
+    }
+
+
+
+}
+
+export default Database.instance;
+
diff --git a/API/src/database/database.sqlite b/API/src/database/database.sqlite
new file mode 100644
index 0000000000000000000000000000000000000000..62529667cf8732a4e82d5028fddb2338c4399ca7
Binary files /dev/null and b/API/src/database/database.sqlite differ
diff --git a/API/src/database/migrations/Question_init.ts b/API/src/database/migrations/Question_init.ts
new file mode 100644
index 0000000000000000000000000000000000000000..877119ad3f6a47bdee03e8acc2cbb055f5607806
--- /dev/null
+++ b/API/src/database/migrations/Question_init.ts
@@ -0,0 +1,32 @@
+import { Question } from "../models/Question"
+import {DataTypes, Sequelize} from 'sequelize';
+
+export function initQuestion(sequelize: Sequelize){
+    // Définition des modèles dans la base de données
+    Question.init({
+        id: {
+            type: DataTypes.INTEGER,
+            autoIncrement: true,
+            primaryKey: true
+        },
+        question: {
+            type: DataTypes.STRING,
+            allowNull: false
+        },
+        possibleResponse: {
+            type: DataTypes.STRING,
+            allowNull: false
+        },
+        correctResponse: {
+            type: DataTypes.STRING,
+            allowNull: false
+        },
+        category: {
+            type: DataTypes.STRING,
+            allowNull: false
+        }
+    }, {
+        sequelize,
+        tableName: 'questions'
+    });
+}
\ No newline at end of file
diff --git a/API/src/database/migrations/User_init.ts b/API/src/database/migrations/User_init.ts
new file mode 100644
index 0000000000000000000000000000000000000000..034bc4be298ea17965ac2d275c544cb96628a964
--- /dev/null
+++ b/API/src/database/migrations/User_init.ts
@@ -0,0 +1,24 @@
+import { User } from "../models/User"
+import {DataTypes, Sequelize} from 'sequelize';
+
+export function initUser(sequelize: Sequelize){
+    // Définition des modèles dans la base de données
+    User.init({
+        username: {
+            type: DataTypes.STRING,
+            allowNull: false,
+            primaryKey: true
+        },
+        password: {
+            type: DataTypes.STRING,
+            allowNull: false
+        },
+        type: {
+            type: DataTypes.STRING,
+            allowNull: false
+        }
+    }, {
+        sequelize,
+        tableName: 'users'
+    });
+}
\ No newline at end of file
diff --git a/API/src/database/models/Question.ts b/API/src/database/models/Question.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8fe9145bdeda595e653e0938606a96dd39084ed3
--- /dev/null
+++ b/API/src/database/models/Question.ts
@@ -0,0 +1,12 @@
+import {Model} from "sequelize";
+
+export class Question extends Model {
+    public id!: number;
+    public question!: string;
+    public possibleResponse!: string;
+    public correctResponse!: string;
+    public category!: string;
+
+    public readonly createdAt!: Date;
+    public readonly updatedAt!: Date;
+}
\ No newline at end of file
diff --git a/API/src/database/models/User.ts b/API/src/database/models/User.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f0a6cbbd39d8abbb59f3fc4b77c150cb989cf20e
--- /dev/null
+++ b/API/src/database/models/User.ts
@@ -0,0 +1,11 @@
+import {Model} from "sequelize";
+
+export class User extends Model {
+    public id!: number;
+    public username!: string;
+    public password!: string;
+    public type!: string;
+
+    public readonly createdAt!: Date;
+    public readonly updatedAt!: Date;
+}
\ No newline at end of file
diff --git a/API/src/express/Server.ts b/API/src/express/Server.ts
index 855c4b9238e4b12ab46e1d464c86c04491ad8802..b9adf9bb34ea1835f2c64ea74d68a3dfedc1fbcc 100644
--- a/API/src/express/Server.ts
+++ b/API/src/express/Server.ts
@@ -10,6 +10,10 @@ import multer           from 'multer';
 import Config           from '../config/Config';
 import BaseRoutes       from '../routes/BaseRoutes';
 import ServerIO         from '../socket.io/ServerIO';
+import routerUser from "../routes/router-gamer";
+import routerGamer from "../routes/router-gamer";
+import routerGuest from "../routes/router-guest";
+import routerAdmin from "../routes/router-admin";
 
 
 class Server {
@@ -24,9 +28,26 @@ class Server {
         this.backend.use(morganMiddleware); //Log API accesses
         this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/
         this.backend.use(cors()); //Allow CORS requests
+        this.backend.use(this.logError);
 
         //TODO: Add routes and middlewares
-        this.backend.use('/', BaseRoutes);
+        const routes = [
+            { path: '/', router: BaseRoutes},
+            { path: '/guest', router: routerGuest },
+            { path: '/gamer', router: routerGamer },
+            { path: '/admin', router: routerAdmin }
+        ];
+        this.backend.use(express.json())
+        this.backend.use((req, res, next) => {
+            if (req.url === '/') {
+                res.redirect('/api/v1');
+            } else {
+                next();
+            }
+        });
+        routes.forEach(route => {
+            this.backend.use(`/api/v1${route.path}`, route.router);
+        });
 
         this.server = http.createServer(this.backend);
 
@@ -42,6 +63,11 @@ class Server {
             logger.info(`Server started on http://${ address }:${ port }`);
         });
     }
+
+    private logError(err: Error, req: express.Request, resp: express.Response, next: express.NextFunction){
+        console.log(err.stack)
+        resp.status(500).send("Erreur rencontré")
+    }
 }
 
 
diff --git a/API/src/models/question.ts b/API/src/models/question.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8b8558a1557fe219addb06a27252f10bc406bb0f
--- /dev/null
+++ b/API/src/models/question.ts
@@ -0,0 +1,54 @@
+const questions: Question[] = [];
+
+export enum categoriesQuestion {
+    Sport,
+    Cinema,
+    Actuality
+}
+export class Question {
+    private question: string;
+    private possibleResponse: Array<string>;
+    private correctResponseIndex: number;
+    private category: categoriesQuestion;
+    private _id: number;
+    constructor(question: string, possibleResponse: Array<string>, correctResponseIndex: number, category: categoriesQuestion) {
+        this.question = question;
+        this.possibleResponse = possibleResponse;
+        this.correctResponseIndex = correctResponseIndex;
+        this.category=category;
+    }
+
+    get id(){
+        return this._id;
+    }
+
+    static createQuestion(question: Question):void {
+        question._id=questions.length;
+        questions.push(question);
+    }
+
+    static getAllQuestions(): Question[] {
+        return questions;
+    }
+
+
+    updateData(question?: string, possibleResponse?: Array<string>, correctResponseIndex?: number, category? : categoriesQuestion):void {
+        if(question !== undefined) this.question = question;
+        if(possibleResponse !== undefined) this.possibleResponse = possibleResponse;
+        if(correctResponseIndex !== undefined) this.correctResponseIndex = correctResponseIndex;
+        if(category !== undefined) this.category=category;
+    }
+
+    static deleteUserById(id: number): number {
+        const index = questions.findIndex(question => question._id === id);
+        if (index !== -1) {
+            questions.splice(index, 1);
+            for(let i=index; i<questions.length; i++){
+                questions[i]._id=i;
+            }
+        }
+        return index;
+
+    }
+}
+
diff --git a/API/src/models/user.ts b/API/src/models/user.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dae98a2c37ee000bee2f869a0a6790b1a23cb267
--- /dev/null
+++ b/API/src/models/user.ts
@@ -0,0 +1,62 @@
+import {Database} from "../database/Database";
+
+const users: User[] = [];
+
+export enum userType{
+    Gamer,
+    Admin
+}
+export class User {
+
+    private _username: string;
+    private password: string;
+    private typeUser: userType;
+    constructor(username: string, password: string, userType: userType) {
+        this._username = username;
+        this.password = password;
+        this.typeUser = userType;
+    }
+
+    get username():string{
+        return this._username;
+    }
+
+    static createUser(username: string, password: string):void {
+        //let new_user=new User(username, password, userType.Gamer);
+        //users.push(new_user);
+        //Database.createAccount(username, password, userType.Gamer)
+    }
+
+    static createAdmin(username: string, password: string){
+        //let new_admin=new User(username, password, userType.Admin);
+        //users.push(new_admin);
+        //Database.createAccount(username, password, userType.Admin)
+    }
+
+
+
+
+    static getAllUsers(): User[] {
+        return users;
+    }
+
+    static getUserById(username: string):User {
+        return users.find(user => user._username === username);
+    }
+
+    updateData(username?: string, password?:string, typeUser?: userType):void {
+        if(username!==undefined) this._username = username;
+        if(password!==undefined) this.password = password;
+        if(typeUser!==undefined) this.typeUser = typeUser;
+    }
+
+    static deleteUserById(username: string): number {
+        const index = users.findIndex(user => user._username === username);
+        if (index !== -1) {
+            users.splice(index, 1);
+            return 0;
+        }
+        return index;
+    }
+}
+
diff --git a/API/src/routes/BaseRoutes.ts b/API/src/routes/BaseRoutes.ts
index f9d1c752a51bcc06bacd9363cc84c2b01947a340..aeb0f7a3a4842d16970518552adaee4942cb1bb0 100644
--- a/API/src/routes/BaseRoutes.ts
+++ b/API/src/routes/BaseRoutes.ts
@@ -4,8 +4,10 @@ import { StatusCodes } from 'http-status-codes';
 
 const router: express.Router = express.Router();
 
-router.get('/', (req: express.Request, res: express.Response) => res.status(StatusCodes.OK).end());
+router.get('/', (req: express.Request, res: express.Response) => res.status(StatusCodes.OK).json({message: "Base route"}));
+
+
+
 
-router.get('/helloworld', (req: express.Request, res: express.Response) => res.status(StatusCodes.OK).json({ message: 'Hello World' }));
 
 export default router;
diff --git a/API/src/routes/middleware.ts b/API/src/routes/middleware.ts
new file mode 100644
index 0000000000000000000000000000000000000000..287ee204619c157c711e608a5465642dd007c028
--- /dev/null
+++ b/API/src/routes/middleware.ts
@@ -0,0 +1,96 @@
+import express         from 'express';
+import { StatusCodes } from 'http-status-codes';
+import {userType} from '../models/user'
+import {Database} from "../database/Database";
+
+export function checkUserFields(req: express.Request, res: express.Response, next: express.NextFunction)  {
+    if (!req.body.username && !req.body.password && !req.body.accountType) {
+        return res.status(400).json({ error: '"username", "password" and "accountType" required' });
+    }
+    if(req.body.accountType !== userType.Gamer && req.body.accountType !== userType.Admin){
+        const accountType={
+            Gamer: 0,
+            Admin: 1
+        }
+        return res.status(StatusCodes.NOT_ACCEPTABLE).json({error: {
+                valueAccountTypePossible: accountType
+            } });
+    }
+
+    next();
+}
+
+export async function checkExistingUser(req: express.Request, res: express.Response, next: express.NextFunction) {
+    let id = "";
+    if (req.params.username) {
+        id = req.params.username;
+    }
+    if (req.params.admin) {
+        id = req.params.admin;
+    }
+    console.log(`id = ${id}`);
+    const typeAccount = await Database.accountExist(id);
+    if(typeAccount !== undefined){
+        console.log(`type = ${typeAccount}`);
+        console.log({message: typeAccount === 'user' ? `"${id}" => user` : `"${id}" => admin`});
+    }else{
+        res.status(StatusCodes.OK).json({message: 'Username not exist'});
+    }
+
+    next();
+
+}
+
+
+
+export function checkQuestionFields(req: express.Request, res: express.Response, next: express.NextFunction)  {
+    if (!req.body.question && !req.body.possibleResponse && !req.body.correctResponse && !req.body.category) {
+        return res.status(400).json({ error: '"question", "possibleResponse", "correctResponse" and "category" required' });
+    }
+
+    if(req.body.possibleResponse.length < 2){
+        return res.status(400).json({error: "possibleResponse must be under 2 response possible"})
+    }
+
+    next();
+}
+
+export function checkIdField(req: express.Request, res: express.Response, next: express.NextFunction)  {
+    if (!req.body.id) {
+        return res.status(400).json({ error: 'ID is required' });
+    }
+
+    next();
+}
+
+export function checkUsernameField(req: express.Request, res: express.Response, next: express.NextFunction)  {
+
+    if (!req.body.username) {
+        return res.status(400).json({ error: 'Username is required' });
+    }
+
+    next();
+}
+
+export function createAccountCheck(req: express.Request, res: express.Response){
+    const data=req.body
+    Database.createAccount(data.username, data.password, data.accountType)
+        .then(result => {
+            if(result[0] !== -1){
+                if(result[1] === "User") res.status(StatusCodes.OK).json({new_user: {
+                        username: data.username,
+                        password: data.password
+                    }});
+                if(result[1] === "Admin") res.status(StatusCodes.OK).json({new_admin: {
+                        username: data.username,
+                        password: data.password
+                    }});
+            }else{
+                if(result[1] === "Exist"){
+                    res.status(StatusCodes.NOT_ACCEPTABLE).json({error: "Username already exist"});
+                }
+            }
+        }).catch(error => {
+        res.status(StatusCodes.BAD_REQUEST).json({error: "An error occured"});
+    });
+}
\ No newline at end of file
diff --git a/API/src/routes/router-admin.ts b/API/src/routes/router-admin.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d353b4413e81d02346aeedde16eefa7315ebfa72
--- /dev/null
+++ b/API/src/routes/router-admin.ts
@@ -0,0 +1,236 @@
+import express from 'express';
+import {StatusCodes} from 'http-status-codes';
+import {User} from '../database/models/User'
+
+import {Question} from '../database/models/Question'
+import {
+    checkExistingUser,
+    checkIdField,
+    checkQuestionFields,
+    checkUserFields,
+    checkUsernameField,
+    createAccountCheck
+} from './middleware'
+import {Database} from "../database/Database";
+
+
+const router: express.Router = express.Router();
+
+router.get('/', (req: express.Request, res: express.Response) => {
+    res.status(StatusCodes.OK).json({ message: 'Admins route' })
+});
+
+router.get('/:admin', checkExistingUser, (req: express.Request, res: express.Response) => {
+    res.status(StatusCodes.OK).json({ message: 'Admin id route' })
+});
+
+router.get('/:admin/list-users', checkExistingUser,async (req: express.Request, res: express.Response) => {
+    try {
+        const users = await Database.getAllUsers();
+        res.status(StatusCodes.OK).json({ users: users });
+    } catch (error) {
+        res.status(StatusCodes.BAD_REQUEST).json({ error: `An error occured: ${error}` });
+    }
+});
+
+router.get('/:admin/list-questions',  checkExistingUser, async (req: express.Request, res: express.Response) => {
+    try {
+        const questions = await Database.getAllQuestions();
+        questions.forEach(q => {
+            q.possibleResponse = JSON.parse(q.possibleResponse);
+        });
+        res.status(StatusCodes.OK).json({ questions: questions });
+
+    } catch (error) {
+        res.status(StatusCodes.BAD_REQUEST).json({ error: `An error occured: ${error}` });
+    }
+});
+
+router.post('/:admin/create-user-account', checkExistingUser, checkUserFields,  (req: express.Request, res: express.Response) => {
+    //let data=req.body
+    //User.createUser(data.username, data.password);
+    //res.status(StatusCodes.OK).json({new_user: req.body});
+    createAccountCheck(req, res);
+});
+
+router.post('/:admin/create-question', checkExistingUser, checkQuestionFields,async (req: express.Request, res: express.Response) => {
+    /*
+    let data=req.body
+    Question.createQuestion(new Question(data.question, data.possibleResponse, data.correctResponse, data.category));
+    res.status(StatusCodes.OK).json({
+        new_question: data,
+        response: data.possibleResponse[data.correctResponse]
+    });
+
+     */
+    const data = req.body
+    const correctResponse: string = data.possibleResponse[data.correctResponse];
+    if (correctResponse !== undefined) {
+        try{
+            const result=await Database.createQuestion(data.question, data.possibleResponse, correctResponse, data.category);
+            if (result === 0) {
+                res.status(StatusCodes.OK).json({
+                    new_question: {
+                        question: data.question,
+                        possibleResponse: data.possibleResponse,
+                        correctResponse: correctResponse,
+                        category: data.category
+                    }
+                });
+            }
+        }catch(error){
+            res.status(StatusCodes.BAD_REQUEST).json({error: `An error occured: ${error}`});
+
+        }
+    } else {
+        res.status(StatusCodes.NOT_ACCEPTABLE).json({error: "Correct Response index must not reach the maximum capacity of the array possibleResponse"});
+    }
+});
+
+router.put('/:admin/update-user-account', checkExistingUser, checkUsernameField, async (req: express.Request, res: express.Response) => {
+    /*
+    const data=req.body
+    if(req.params.admin !== data.username){
+        const modifiedUser=User.getAllUsers().find(user=> user.username === data.username);
+        if(modifiedUser) {
+            modifiedUser.updateData(data.username, data.password, data.accountType);
+            res.status(StatusCodes.OK).json({
+                message: "User updated",
+                userUpdated: modifiedUser
+            });
+        }else{
+            res.status(StatusCodes.NOT_FOUND).send(`The user ${data.username} not exist`);
+        }
+    }else{
+        res.status(StatusCodes.NOT_ACCEPTABLE).send(`Edit your account is not possible`);
+    }
+
+     */
+    const data=req.body;
+    const username = data.username;
+    try{
+        const user = await User.findOne({where: {username}});
+        if(user){
+            if(req.params.admin === data.username && data.accountType!==undefined){
+                res.status(StatusCodes.NOT_ACCEPTABLE).send(`Edit your account type is not possible`);
+                return;
+            }
+            try{
+                const nbUserUpdated=await Database.updateUserAccount(data.username, data.password, data.accountType);
+                if(nbUserUpdated){
+                    res.status(StatusCodes.OK).json({
+                        message: `User ${data.username} updated`
+                    });
+                }
+            }catch(error){
+                res.status(StatusCodes.BAD_REQUEST).json({error: `An error occured: ${error}`});
+            }
+        }else{
+            res.status(StatusCodes.NOT_FOUND).send(`The user ${data.username} not exist`);
+        }
+    }catch (error){
+        res.status(StatusCodes.BAD_REQUEST).json({error: `An error occured: ${error}`});
+    }
+
+
+
+});
+
+router.put('/:admin/update-question', checkExistingUser,checkIdField,async (req: express.Request, res: express.Response) => {
+    /*
+    let data=req.body
+    let modifiedQuestion=Question.getAllQuestions().find(question=> question.id === data.id);
+    if(modifiedQuestion) {
+        modifiedQuestion.updateData(data.question, data.possibleResponse, data.correctResponseIndex, data.category);
+        res.status(StatusCodes.OK).json({
+            message: "Question updated",
+            userUpdated: modifiedQuestion
+        });
+    }else{
+        res.status(StatusCodes.NOT_FOUND).send(`The question not exist`);
+    }
+    */
+    const data=req.body;
+    const id = data.id;
+    try{
+        const question = await Question.findOne({where: {id}});
+        if(question){
+            try{
+                const correctResponse=data.possibleResponse!==undefined?data.possibleResponse[data.correctResponse]:JSON.parse(question.possibleResponse)[data.correctResponse];
+                const nbQuestionUpdated=await Database.updateQuestion(data.id, data.question, data.possibleResponse, correctResponse, data.category);
+                if(nbQuestionUpdated){
+                    res.status(StatusCodes.OK).json({
+                        message: `Question ${data.id} updated`
+                    });
+                }
+            }catch(error){
+                res.status(StatusCodes.BAD_REQUEST).json({error: `An error occured: ${error}`});
+            }
+        }else{
+            res.status(StatusCodes.NOT_FOUND).send(`The question ${data.id} not exist`);
+        }
+    }catch (error){
+        res.status(StatusCodes.BAD_REQUEST).json({error: `An error occured: ${error}`});
+    }
+});
+
+// Middleware pour vérifier si l'id requis a été saisi
+
+
+router.delete('/:admin/delete-user-account', checkExistingUser, checkUsernameField, async (req: express.Request, res: express.Response) => {
+    let data=req.body
+    if(req.params.admin !== data.username) {
+        try{
+            let userDelete=await Database.deleteUser(data.username);
+            console.log(`user delete= ${userDelete}`)
+            if(userDelete === 1){
+                res.status(StatusCodes.OK).json({message: `The user ${data.username} is successfully deleted`});
+            }else{
+                res.status(StatusCodes.NOT_FOUND).send(`User "${data.username}" not exist`);
+            }
+
+        }catch(error){
+            res.status(StatusCodes.BAD_REQUEST).json({error: `An error occured: ${error}`});
+        }
+
+    }else{
+        res.status(StatusCodes.NOT_ACCEPTABLE).send(`Delete your account is not possible`);
+    }
+
+});
+
+router.delete('/:admin/delete-question', checkExistingUser, checkIdField, async (req: express.Request, res: express.Response) => {
+    let data = req.body
+    try {
+        let questionDelete = await Database.deleteQuestion(data.id);
+        console.log(`question delete= ${questionDelete}`)
+        if (questionDelete === 1) {
+            res.status(StatusCodes.OK).json({message: `The question ${data.id} is successfully deleted`});
+        } else {
+            res.status(StatusCodes.NOT_FOUND).send(`Question "${data.id}" not exist`);
+        }
+
+    } catch (error) {
+        res.status(StatusCodes.BAD_REQUEST).json({error: `An error occured: ${error}`});
+    }
+
+
+
+});
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+export default router;
diff --git a/API/src/routes/router-gamer.ts b/API/src/routes/router-gamer.ts
new file mode 100644
index 0000000000000000000000000000000000000000..98619ce3808779ce0343b2163ccab66649fcb7dc
--- /dev/null
+++ b/API/src/routes/router-gamer.ts
@@ -0,0 +1,24 @@
+import express         from 'express';
+import { StatusCodes } from 'http-status-codes';
+import {Database} from "../database/Database";
+import {checkExistingUser} from "./middleware";
+
+
+const router: express.Router = express.Router();
+
+router.get('/', (req: express.Request, res: express.Response) => {
+    res.status(StatusCodes.OK).json({ message: 'Gamers route' })
+});
+
+router.get('/:username', checkExistingUser, (req: express.Request, res: express.Response) => {
+
+});
+
+
+
+
+
+
+
+
+export default router;
diff --git a/API/src/routes/router-guest.ts b/API/src/routes/router-guest.ts
new file mode 100644
index 0000000000000000000000000000000000000000..de2f38fc4aac0ee6e466b6be4fb90aa4e0aa4ef7
--- /dev/null
+++ b/API/src/routes/router-guest.ts
@@ -0,0 +1,32 @@
+import express         from 'express';
+import { StatusCodes } from 'http-status-codes';
+import { User } from '../models/user'
+import {checkUserFields, createAccountCheck} from './middleware'
+import {Database} from "../database/Database";
+
+
+
+const router: express.Router = express.Router();
+
+router.get('/', (req: express.Request, res: express.Response) => {
+    res.status(StatusCodes.OK).json({ message: 'Guests route' })
+});
+
+
+
+
+
+router.post('/create-account', checkUserFields, (req: express.Request, res: express.Response) => {
+    createAccountCheck(req, res);
+});
+
+
+
+
+
+
+
+
+
+
+export default router;