├── .eslintrc.json
├── .gitignore
├── Assets
├── Fonts
│ ├── Whitney-Book.ttf
│ └── whitney-medium.otf
├── gav.png
├── gay.png
├── gun.png
├── hand1.png
├── hand2.png
├── hand3.png
├── hand4.png
├── hand5.png
├── monke.png
└── stonks.jpg
├── Database
├── Init.js
├── Manager.js
├── Schema.js
└── UserManager.js
├── LICENSE
├── README.md
├── Routes
├── Admin.js
├── Attachments.js
├── Canvas.js
├── Facts.js
├── Fun.js
├── Info.js
├── Other.js
└── slash.js
├── index.js
├── package-lock.json
├── package.json
└── util
├── RateLimiter.js
└── Stats.js
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "eslint:recommended",
3 | "env": {
4 | "node": true,
5 | "es6": true
6 | },
7 | "parserOptions": {
8 | "ecmaVersion": 2019
9 | },
10 | "rules": {
11 | "brace-style": ["error", "stroustrup", { "allowSingleLine": true }],
12 | "no-trailing-spaces": "error",
13 | "quotes": ["error", "single"],
14 | "indent": ["error", "tab"],
15 | "spaced-comment": ["error", "always"],
16 | "semi": [
17 | "error",
18 | "always"
19 | ],
20 | "no-empty": [
21 | "error",
22 | {
23 | "allowEmptyCatch": true
24 | }
25 | ],
26 | "no-invalid-regexp": "error",
27 | "no-var": "error",
28 | "max-nested-callbacks": [
29 | "error",
30 | {
31 | "max": 3
32 | }
33 | ],
34 | "max-statements-per-line": [
35 | "error",
36 | {
37 | "max": 2
38 | }
39 | ],
40 | "no-unused-vars": [
41 | "error"
42 | ],
43 | "yoda": "error"
44 | }
45 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
106 | ok.js
107 | .DS_Store
108 |
--------------------------------------------------------------------------------
/Assets/Fonts/Whitney-Book.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/Fonts/Whitney-Book.ttf
--------------------------------------------------------------------------------
/Assets/Fonts/whitney-medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/Fonts/whitney-medium.otf
--------------------------------------------------------------------------------
/Assets/gav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/gav.png
--------------------------------------------------------------------------------
/Assets/gay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/gay.png
--------------------------------------------------------------------------------
/Assets/gun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/gun.png
--------------------------------------------------------------------------------
/Assets/hand1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/hand1.png
--------------------------------------------------------------------------------
/Assets/hand2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/hand2.png
--------------------------------------------------------------------------------
/Assets/hand3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/hand3.png
--------------------------------------------------------------------------------
/Assets/hand4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/hand4.png
--------------------------------------------------------------------------------
/Assets/hand5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/hand5.png
--------------------------------------------------------------------------------
/Assets/monke.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/monke.png
--------------------------------------------------------------------------------
/Assets/stonks.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MonkeDev/API/36d783ee7addfb837329b586e565f64d2a67be88/Assets/stonks.jpg
--------------------------------------------------------------------------------
/Database/Init.js:
--------------------------------------------------------------------------------
1 | const mongo = require('mongoose');
2 | module.exports = async () => {
3 | mongo.connect(process.env.mongoURI, {
4 | useNewUrlParser: true,
5 | useUnifiedTopology: true,
6 | autoIndex: true,
7 | useFindAndModify: false
8 | });
9 |
10 | return new Promise(res => {
11 | mongo.connection.once('connected', () => {
12 | console.log('MongoDB connected!');
13 | res();
14 | });
15 | });
16 | };
--------------------------------------------------------------------------------
/Database/Manager.js:
--------------------------------------------------------------------------------
1 | module.exports = class Manager {
2 | constructor(schema) {
3 | this.schema = schema;
4 | this.cache = new Map();
5 | }
6 |
7 | async get(FOR) {
8 | let data = await this.cache.get(FOR);
9 | if (!data) {
10 | data = await this.schema.findOne({ for: FOR }).lean();
11 | this.cache.set(FOR, data);
12 | }
13 | return data;
14 | }
15 | };
--------------------------------------------------------------------------------
/Database/Schema.js:
--------------------------------------------------------------------------------
1 | const mongo = require('mongoose');
2 |
3 | const imagesAndGifs = mongo.model('imagesAndGifs', new mongo.Schema({
4 | for: { type: String },
5 | data: { type: Array, default: [] }
6 | }));
7 |
8 | const facts = mongo.model('facts', new mongo.Schema({
9 | for: { type: String },
10 | data: { type: Array, default: [] }
11 | }));
12 |
13 | const users = mongo.model('users', new mongo.Schema({
14 | id: { type: String },
15 | key: { type: String },
16 | ratelimit: {
17 | max: { type: Number, default: 300 },
18 | used: { type: Number, default: 0 }
19 | },
20 | stats: {
21 | total: { type: Number, default: 0 }
22 | }
23 | }));
24 |
25 | const fun = mongo.model('fun', new mongo.Schema({
26 | for: { type: String },
27 | data: { type: Array, default: [] }
28 | }));
29 |
30 | const stats = mongo.model('stats', new mongo.Schema({
31 | id: { type: String },
32 |
33 | allTime: { type: Number }
34 |
35 | }));
36 |
37 | module.exports = {
38 | imagesAndGifs,
39 | facts,
40 | users,
41 | fun,
42 | stats
43 | };
--------------------------------------------------------------------------------
/Database/UserManager.js:
--------------------------------------------------------------------------------
1 | const s = require('./Schema').users;
2 |
3 | module.exports = class {
4 | constructor() {
5 | this.schema = s;
6 | this.cache = {
7 | id: new Map(),
8 | key: new Map()
9 | };
10 |
11 |
12 | this.updateCache();
13 | setInterval(() => {
14 | this.updateCache();
15 | }, 10 * 60 * 1000);
16 | }
17 |
18 | updateCache() {
19 | s.find().then(Data => {
20 | Data.forEach(d => {
21 | if (d.ratelimit.used != 0) {
22 | d.ratelimit.used = 0;
23 | d.save();
24 | }
25 | this.cache.id.set(d.id, d);
26 | if (d.key) this.cache.key.set(d.key, d);
27 | });
28 | });
29 | }
30 |
31 | makeKey(length) {
32 | let result = '';
33 | let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
34 | let charactersLength = characters.length;
35 | for (let i = 0; i < length; i++) {
36 | result += characters.charAt(Math.floor(Math.random() * charactersLength));
37 | }
38 | return result;
39 | }
40 |
41 | doSave(data) {
42 | if (!data.fromSave) data.fromSave = 0;
43 | if (data.fromSave >= 2) {
44 | data.fromSave = null;
45 | data.save().then(() => data.fromSave = 0);
46 | } else data.fromSave++;
47 | }
48 |
49 | async getID(id) {
50 | let data = await this.cache.id.get(id);
51 | if (!data) {
52 | data = await s.findOne({ id: id });
53 | this.cache.id.set(id, data);
54 | data = await this.cache.id.get(id);
55 | } else this.doSave(data);
56 | return data;
57 | }
58 |
59 | async getKey(key) {
60 | let data = await this.cache.key.get(key);
61 | if (!data) {
62 | data = await s.findOne({ key: key });
63 | this.cache.key.set(key, data);
64 | data = await this.cache.key.get(key);
65 | } else this.doSave(data);
66 | return data;
67 | }
68 |
69 | async create(id) {
70 | const key = this.makeKey(25);
71 | const data = await new s({ id: id, key: key }).save();
72 | this.cache.id.set(id, data);
73 | this.cache.key.set(key, data);
74 | return data;
75 | }
76 |
77 | async update(data) {
78 | if (data.id) this.cache.id.set(data.id, data);
79 | if (data.key) this.cache.key.set(data.key, data);
80 | return await data.save();
81 | }
82 |
83 |
84 | };
85 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MonkeDev - API
2 |
3 | ### Links:
4 | * [Documentation](https://api.monkedev.com/)
5 | * [Discord](https://monkedev.com/r/discord)
6 | ---
7 | ### API key
8 | ##### This API doesn't require an API key. However, your ratelimits will be much lower and will be shared among everyone that doesn't have an API key.
9 | ---
10 | ### How to get an API key
11 | ##### You may get your API key in our [Discord Server](https://monkedev.com/r/discord). Type out the command, `a!register` in the #commands channel. There you go! You will receive your API credentials in your Discord direct messages.
12 | ---
13 | ### Ratelimits
14 | ##### Each endpoint has a shared ratelimit of 100 requests per minute. The base ratelimit for API keys is 100 requests/min. You may receive a higher ratelimit by boosting our Discord server, voting for our bots/server, etc. Just ask us and we can see what we can do! Additionally, you may become a [Patreon](https://monkedev.com/r/patreon) or link our API in your project.
15 |
--------------------------------------------------------------------------------
/Routes/Admin.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 |
3 | router.use((req, res, next) => {
4 | if (!req.headers.auth || req.headers.auth != process.env.apiAdmin) return res.json({ error: true, message: 'no' });
5 | else next();
6 | });
7 |
8 | router.post('/add', async (req, res) => {
9 |
10 | const userID = req.urlParams.userID;
11 | if (!userID) return res.json({ error: true, message: 'no userID' });
12 |
13 | const amount = parseInt(req.urlParams.amount) || parseInt(req.urlParams.amout); // oops
14 | if (!amount) return res.json({ error: true, message: 'no amount' });
15 |
16 | const users = process.s;
17 | const userData = await users.getID(userID);
18 | if (!userData) return res.json({ error: true, message: 'This user is not registered.' });
19 |
20 | userData.ratelimit.max += amount;
21 |
22 | await users.update(userData).catch(() => null);
23 |
24 | res.json(userData);
25 | });
26 |
27 |
28 |
29 | router.post('/register', async (req, res) => {
30 |
31 | const userID = req.urlParams.userID;
32 | if (!userID) return res.json({ error: true, message: 'no userID' });
33 |
34 | const users = process.s;
35 |
36 | let userData = await users.getID(userID);
37 | if (userData) return res.json({
38 | error: true,
39 | message: 'You may not register again. If you are using our API bot, type `a!info` for your apikey'
40 | });
41 | userData = await users.create(userID);
42 |
43 | return res.json(userData);
44 | });
45 |
46 | router.get('/user/info', async (req, res) => {
47 |
48 |
49 | const userID = req.urlParams.userID;
50 |
51 | if (!userID) return res.json({ error: true, message: 'no userID' });
52 |
53 | const users = process.s;
54 |
55 | const userData = await users.getID(userID);
56 |
57 | return res.json(userData);
58 | });
59 |
60 | router.get('/users', async (req, res) => {
61 | const allUsers = [];
62 | await process.s.cache.id.forEach(user => {
63 | allUsers.push(user);
64 | });
65 |
66 | res.json(allUsers);
67 | });
68 |
69 | const attachments = require('../Database/Schema').imagesAndGifs;
70 |
71 | router.post('/add/attachment', async (req, res) => {
72 | const FOR = req.urlParams.FOR;
73 | const url = req.urlParams.url;
74 | console.log(FOR);
75 |
76 | if (!FOR || !url) return res.status(400).json({ error: true, message: 'FOR and url param.' });
77 |
78 | const FORdata = await attachments.findOne({ for: FOR }).lean();
79 | console.log(FORdata);
80 | // new attachments({for: 'bird'}).save();
81 | if (!FORdata) return res.status(400).json({ error: true, message: 'no data for FOR' });
82 |
83 | attachments.updateOne({ _id: FORdata._id }, { $push: { 'data': url } })
84 | .then(() => {
85 | return res.status(200).json({ message: `${url} added to ${FOR} data.` });
86 | });
87 | });
88 |
89 | module.exports = {
90 | end: '/admin/',
91 | router,
92 | };
93 |
--------------------------------------------------------------------------------
/Routes/Attachments.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 | const db = new (require('../Database/Manager'))(require('../Database/Schema').imagesAndGifs);
3 |
4 |
5 | /**
6 | * @swagger
7 | * /attachments/monkey:
8 | * get:
9 | * description: Get a random monkey image/gif!
10 | * tags: [Attachments]
11 | * parameters:
12 | * - name: key
13 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
14 | * in: query
15 | * type: string
16 | * responses:
17 | * '200':
18 | * description: Success
19 | * '400':
20 | * description: Error
21 | */
22 |
23 |
24 | router.get('/monkey', async (req, res) => {
25 | const data = await db.get('monkey');
26 | res.status(200).json({
27 | url: data.data[Math.floor(Math.random() * data.data.length)]
28 | });
29 | });
30 |
31 | /**
32 | * @swagger
33 | * /attachments/bird:
34 | * get:
35 | * description: Get a random bird image/gif!
36 | * tags: [Attachments]
37 | * parameters:
38 | * - name: key
39 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
40 | * in: query
41 | * type: string
42 | * responses:
43 | * '200':
44 | * description: Success
45 | * '400':
46 | * description: Error
47 | */
48 |
49 |
50 | router.get('/bird', async (req, res) => {
51 | const data = await db.get('bird');
52 | res.status(200).json({
53 | url: data.data[Math.floor(Math.random() * data.data.length)]
54 | });
55 | });
56 |
57 |
58 | module.exports = {
59 | end: '/attachments/',
60 | router,
61 | };
--------------------------------------------------------------------------------
/Routes/Canvas.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 | const canvas = require('canvas');
3 | const path = require('path');
4 | const jimp = require('jimp');
5 | const gifencoder = require('gifencoder');
6 | const { fillTextWithTwemoji } = require('node-canvas-with-twemoji');
7 |
8 | canvas.registerFont(path.join(__dirname, '../Assets/Fonts/Whitney-Book.ttf'), {
9 | family: 'whitney',
10 | });
11 | canvas.registerFont(path.join(__dirname, '../Assets/Fonts/whitney-medium.otf'), {
12 | family: 'whitneyMedium',
13 | });
14 |
15 | /**
16 | * @swagger
17 | * /canvas/gay:
18 | * get:
19 | * description: Make a image gay
20 | * tags: [Canvas]
21 | * parameters:
22 | * - name: imgUrl
23 | * description: The url of the image.
24 | * in: query
25 | * required: true
26 | * type: string
27 | * - name: key
28 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
29 | * in: query
30 | * type: string
31 | * responses:
32 | * 200:
33 | * description: Success
34 | * 400:
35 | * description: Error
36 | */
37 | router.get('/gay', async (req, res) => {
38 |
39 | const imgUrl = req.urlParams.imgUrl;
40 |
41 | if (!imgUrl) return res.json({
42 | error: true,
43 | message: 'Missing the imgUrl parameter'
44 | });
45 |
46 |
47 | let toLayer;
48 | try {
49 | toLayer = await canvas.loadImage(imgUrl);
50 | }
51 | catch (err) {
52 | return res.status(400).json({
53 | error: true,
54 | message: 'Failed to load this image'
55 | });
56 | }
57 |
58 | const gay = await canvas.loadImage(path.join(__dirname + '../../Assets', 'gay.png'));
59 |
60 | const Canvas = canvas.createCanvas(toLayer.width, toLayer.height);
61 | const ctx = Canvas.getContext('2d');
62 | ctx.drawImage(toLayer, 0, 0, Canvas.width, Canvas.height);
63 | ctx.drawImage(gay, 0, 0, Canvas.width, Canvas.height);
64 |
65 | res.set({ 'Content-Type': 'image/png' });
66 | res.status(200).send(Canvas.toBuffer());
67 | });
68 |
69 |
70 | /**
71 | * @swagger
72 | * /canvas/greyscale:
73 | * get:
74 | * description: Add a greyscale filter to a image
75 | * tags: [Canvas]
76 | * parameters:
77 | * - name: imgUrl
78 | * description: The url of the image.
79 | * in: query
80 | * required: true
81 | * type: string
82 | * - name: key
83 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
84 | * in: query
85 | * type: string
86 | * responses:
87 | * 200:
88 | * description: Success
89 | * 400:
90 | * description: Error
91 | */
92 | router.get('/greyscale', async (req, res) => {
93 | const imgUrl = req.urlParams.imgUrl;
94 |
95 | if (!imgUrl) return res.status(400).json({
96 | error: true,
97 | message: 'Missing the imgUrl parameter'
98 | });
99 |
100 | let img;
101 | try {
102 | img = await jimp.read(imgUrl);
103 | }
104 | catch (err) {
105 | return res.status(400).json({
106 | error: true,
107 | message: 'Failed to load this image'
108 | });
109 | }
110 |
111 | img.greyscale();
112 | res.set({ 'Content-Type': 'image/png' });
113 | res.status(200).send(await img.getBufferAsync('image/png'));
114 | });
115 |
116 |
117 | /**
118 | * @swagger
119 | * /canvas/invert:
120 | * get:
121 | * description: Add a invert filter to a image
122 | * tags: [Canvas]
123 | * parameters:
124 | * - name: imgUrl
125 | * description: The url of the image.
126 | * in: query
127 | * required: true
128 | * type: string
129 | * - name: key
130 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
131 | * in: query
132 | * type: string
133 | * responses:
134 | * 200:
135 | * description: Success
136 | * 400:
137 | * description: Error
138 | */
139 | router.get('/invert', async (req, res) => {
140 | const imgUrl = req.urlParams.imgUrl;
141 |
142 | if (!imgUrl) return res.status(400).json({
143 | error: true,
144 | message: 'Missing the imgUrl parameter'
145 | });
146 |
147 | let img;
148 | try {
149 | img = await jimp.read(imgUrl);
150 | }
151 | catch (err) {
152 | return res.status(400).json({
153 | error: true,
154 | message: 'Failed to load this image'
155 | });
156 | }
157 |
158 | img.invert();
159 | res.set({ 'Content-Type': 'image/png' });
160 | res.status(200).send(await img.getBufferAsync('image/png'));
161 | });
162 |
163 |
164 | /**
165 | * @swagger
166 | * /canvas/sepia:
167 | * get:
168 | * description: Add a sepia filter to a image
169 | * tags: [Canvas]
170 | * parameters:
171 | * - name: imgUrl
172 | * description: The url of the image.
173 | * in: query
174 | * required: true
175 | * type: string
176 | * - name: key
177 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
178 | * in: query
179 | * type: string
180 | * responses:
181 | * 200:
182 | * description: Success
183 | * 400:
184 | * description: Error
185 | */
186 | router.get('/sepia', async (req, res) => {
187 | const imgUrl = req.urlParams.imgUrl;
188 |
189 | if (!imgUrl) return res.status(400).json({
190 | error: true,
191 | message: 'Missing the imgUrl parameter'
192 | });
193 |
194 | let img;
195 | try {
196 | img = await jimp.read(imgUrl);
197 | }
198 | catch (err) {
199 | return res.status(400).json({
200 | error: true,
201 | message: 'Failed to load this image'
202 | });
203 | }
204 |
205 | img.sepia();
206 | res.set({ 'Content-Type': 'image/png' });
207 | res.status(200).send(await img.getBufferAsync('image/png'));
208 | });
209 |
210 |
211 | /**
212 | * @swagger
213 | * /canvas/resize:
214 | * get:
215 | * description: Resize a image
216 | * tags: [Canvas]
217 | * parameters:
218 | * - name: imgUrl
219 | * description: The url of the image.
220 | * in: query
221 | * required: true
222 | * type: string
223 | * - name: x
224 | * description: The new width of the image
225 | * in: query
226 | * type: string
227 | * - name: y
228 | * description: The new height of the image
229 | * in: query
230 | * type: string
231 | * - name: key
232 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
233 | * in: query
234 | * type: string
235 | * responses:
236 | * 200:
237 | * description: Success
238 | * 400:
239 | * description: Error
240 | */
241 | router.get('/resize', async (req, res) => {
242 | const imgUrl = req.urlParams.imgUrl;
243 |
244 | if (!imgUrl) return res.status(400).json({
245 | error: true,
246 | message: 'Missing the imgUrl parameter'
247 | });
248 |
249 | let x = req.urlParams.x;
250 | let y = req.urlParams.y;
251 |
252 | if (!x && !y) return res.json({
253 | error: true,
254 | message: 'Missing both the x and y parameters, please provide at least one'
255 | });
256 |
257 | if (y) {
258 | y = Number(y);
259 | if (!y) return res.status(400).json({
260 | error: true,
261 | message: 'Parameter y is not a number type'
262 | });
263 | if (y > 2000) return res.status(400).json({
264 | error: true,
265 | message: 'Parameter y cannot be larger than 2000'
266 | });
267 | }
268 | if (x) {
269 | x = Number(x);
270 | if (!x) return res.status(400).json({
271 | error: true,
272 | message: 'Parameter x is not a number type'
273 | });
274 | if (x > 2000) return res.status(400).json({
275 | error: true,
276 | message: 'Parameter x can not be larger than 2000'
277 | });
278 | }
279 |
280 | let img;
281 | try {
282 | img = await jimp.read(imgUrl);
283 | }
284 | catch (err) {
285 | return res.status(400).json({
286 | error: true,
287 | message: 'Failed to load this image'
288 | });
289 | }
290 |
291 | img.resize(x || jimp.AUTO, y || jimp.AUTO);
292 | res.set({ 'Content-Type': 'image/png' });
293 | res.status(200).send(await img.getBufferAsync('image/png'));
294 | });
295 |
296 | /**
297 | * @swagger
298 | * /canvas/contrast:
299 | * get:
300 | * description: Add a contrast filter to a image
301 | * tags: [Canvas]
302 | * parameters:
303 | * - name: imgUrl
304 | * description: The url of the image.
305 | * in: query
306 | * required: true
307 | * type: string
308 | * - name: val
309 | * description: The contrast by a value -1 to +1
310 | * in: query
311 | * required: true
312 | * type: string
313 | * - name: key
314 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
315 | * in: query
316 | * type: string
317 | * responses:
318 | * 200:
319 | * description: Success
320 | * 400:
321 | * description: Error
322 | */
323 | router.get('/contrast', async (req, res) => {
324 |
325 | const imgUrl = req.urlParams.imgUrl;
326 | let val = req.urlParams.val;
327 |
328 | if (!imgUrl) return res.status(400).json({
329 | error: true,
330 | message: 'Missing the imgUrl parameter'
331 | });
332 | if (!val) return res.status(400).json({
333 | error: true,
334 | message: 'Missing the val parameter'
335 | });
336 |
337 | val = Number(val) || parseInt(val);
338 | if (val != 0 && !val) return res.status(400).json({
339 | error: true,
340 | message: 'the val parameter is not a number type'
341 | });
342 |
343 | if (val > 1 || val < -1) {
344 | return res.status(400).json({
345 | error: true,
346 | message: 'the val parameter must have a value between -1 to +1.'
347 | });
348 | }
349 |
350 | let img;
351 | try {
352 | img = await jimp.read(imgUrl);
353 | }
354 | catch (err) {
355 | return res.status(400).json({
356 | error: true,
357 | message: 'Failed to load this image'
358 | });
359 | }
360 |
361 | img.contrast(val);
362 | res.set({ 'Content-Type': 'image/png' });
363 | res.status(200).send(await img.getBufferAsync('image/png'));
364 |
365 | });
366 |
367 | /**
368 | * @swagger
369 | * /canvas/dither565:
370 | * get:
371 | * description: Add a dither565 filter to a image
372 | * tags: [Canvas]
373 | * parameters:
374 | * - name: imgUrl
375 | * description: The url of the image.
376 | * in: query
377 | * required: true
378 | * type: string
379 | * - name: key
380 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
381 | * in: query
382 | * type: string
383 | * responses:
384 | * 200:
385 | * description: Success
386 | * 400:
387 | * description: Error
388 | */
389 | router.get('/dither565', async (req, res) => {
390 | const imgUrl = req.urlParams.imgUrl;
391 |
392 | if (!imgUrl) return res.status(400).json({
393 | error: true,
394 | message: 'Missing the imgUrl parameter'
395 | });
396 |
397 | let img;
398 | try {
399 | img = await jimp.read(imgUrl);
400 | }
401 | catch (err) {
402 | return res.status(400).json({
403 | error: true,
404 | message: 'Failed to load this image'
405 | });
406 | }
407 |
408 | img.dither565();
409 | res.set({ 'Content-Type': 'image/png' });
410 | res.status(200).send(await img.getBufferAsync('image/png'));
411 | });
412 |
413 |
414 | /**
415 | * @swagger
416 | * /canvas/circle:
417 | * get:
418 | * description: Turn a image into a circle
419 | * tags: [Canvas]
420 | * parameters:
421 | * - name: imgUrl
422 | * description: The url of the image.
423 | * in: query
424 | * required: true
425 | * type: string
426 | * - name: key
427 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
428 | * in: query
429 | * type: string
430 | * responses:
431 | * 200:
432 | * description: Success
433 | * 400:
434 | * description: Error
435 | */
436 | router.get('/circle', async (req, res) => {
437 | const imgUrl = req.urlParams.imgUrl;
438 |
439 | if (!imgUrl) return res.status(400).json({
440 | error: true,
441 | message: 'Missing the imgUrl parameter'
442 | });
443 |
444 | let img;
445 | try {
446 | img = await jimp.read(imgUrl);
447 | }
448 | catch (err) {
449 | return res.status(400).json({
450 | error: true,
451 | message: 'Failed to load this image'
452 | });
453 | }
454 |
455 | img.circle();
456 | res.set({ 'Content-Type': 'image/png' });
457 | res.status(200).send(await img.getBufferAsync('image/png'));
458 | });
459 |
460 | /**
461 | * @swagger
462 | * /canvas/pixelate:
463 | * get:
464 | * description: Pixelate a image
465 | * tags: [Canvas]
466 | * parameters:
467 | * - name: imgUrl
468 | * description: The url of the image.
469 | * in: query
470 | * required: true
471 | * type: string
472 | * - name: val
473 | * description: The pixelate level
474 | * in: query
475 | * type: string
476 | * - name: key
477 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
478 | * in: query
479 | * type: string
480 | * responses:
481 | * 200:
482 | * description: Success
483 | * 400:
484 | * description: Error
485 | */
486 | router.get('/pixelate', async (req, res) => {
487 | const imgUrl = req.urlParams.imgUrl;
488 | const val = req.urlParams.val;
489 |
490 | if (!imgUrl) return res.status(400).json({
491 | error: true,
492 | message: 'Missing the imgUrl parameter'
493 | });
494 |
495 | let img;
496 | try {
497 | img = await jimp.read(imgUrl);
498 | }
499 | catch (err) {
500 | return res.status(400).json({
501 | error: true,
502 | message: 'Failed to load this image'
503 | });
504 | }
505 |
506 | img.pixelate(Number(val) || 10);
507 | res.set({ 'Content-Type': 'image/png' });
508 | res.status(200).send(await img.getBufferAsync('image/png'));
509 | });
510 |
511 | /**
512 | * @swagger
513 | * /canvas/80s:
514 | * get:
515 | * description: This endpoints gives your image an 80s vibe
516 | * tags: [Canvas]
517 | * parameters:
518 | * - name: imgUrl
519 | * description: The url of the image.
520 | * in: query
521 | * required: true
522 | * type: string
523 | * - name: key
524 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
525 | * in: query
526 | * type: string
527 | * responses:
528 | * 200:
529 | * description: Success
530 | * 400:
531 | * description: Error
532 | */
533 | router.get('/80s', async (req, res) => {
534 | const imgUrl = req.urlParams.imgUrl;
535 |
536 | if (!imgUrl) return res.json({
537 | error: true,
538 | message: 'Missing the imgUrl parameter'
539 | });
540 |
541 |
542 | let userImg;
543 | try {
544 | userImg = await canvas.loadImage(imgUrl);
545 | }
546 | catch (err) {
547 | return res.status(400).json({
548 | error: true,
549 | message: 'Failed to load this image'
550 | });
551 | }
552 |
553 | const Canvas = canvas.createCanvas(userImg.width, userImg.height);
554 | const ctx = Canvas.getContext('2d');
555 |
556 | ctx.drawImage(userImg, 0, 0, Canvas.width, Canvas.height);
557 |
558 | const input = ctx.getImageData(0, 0, Canvas.width, Canvas.height);
559 | const output = ctx.createImageData(Canvas.width, Canvas.height);
560 |
561 | const w = input.width, h = input.height;
562 | const inputData = input.data;
563 | const outputData = output.data;
564 |
565 | for (let y = 1; y < h - 1; y++) {
566 | for (let x = 1; x < w - 1; x++) {
567 | for (let c = 0; c < 3; c++) {
568 | const i = (y * w + x) * 4 + c;
569 | outputData[i] = 127 + -inputData[i - w * 4 - 4] - inputData[i - w * 4] - inputData[i - w * 4 + 4] +
570 | -inputData[i - 4] + 8 * inputData[i] - inputData[i + 4] +
571 | -inputData[i + w * 4 - 4] - inputData[i + w * 4] - inputData[i + w * 4 + 4];
572 | }
573 | outputData[(y * w + x) * 4 + 3] = 255; // alpha
574 | }
575 | }
576 |
577 | ctx.putImageData(output, 0, 0);
578 |
579 | res.set({ 'Content-Type': 'image/png' });
580 | res.status(200).send(Canvas.toBuffer());
581 |
582 | });
583 |
584 |
585 | /**
586 | * @swagger
587 | * /canvas/petpet:
588 | * get:
589 | * description: Generate a petpet gif!
590 | * tags: [Canvas]
591 | * parameters:
592 | * - name: imgUrl
593 | * description: The url of the image to pet.
594 | * in: query
595 | * required: true
596 | * type: string
597 | * - name: key
598 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
599 | * in: query
600 | * type: string
601 | * - name: delay
602 | * description: The frame delay in MS, Defualt is 40ms
603 | * in: query
604 | * type: string
605 | * - name: size
606 | * description: The size of the gif, Default is 300
607 | * in: query
608 | * type: string
609 | * responses:
610 | * 200:
611 | * description: Success
612 | * 400:
613 | * description: Error
614 | */
615 |
616 | const handCache = [];
617 | router.get('/petpet', async (req, res) => {
618 | const imgUrl = req.urlParams.imgUrl;
619 |
620 | if (!imgUrl) return res.json({
621 | error: true,
622 | message: 'Missing the imgUrl parameter'
623 | });
624 |
625 | let frameDelay = req.urlParams.delay || 40;
626 | if (!Number(frameDelay)) return res.json({
627 | error: true,
628 | message: 'The delay parameter is not a number type'
629 | });
630 |
631 | let size = req.urlParams.size || 300;
632 | if (!Number(size)) return res.json({
633 | error: true,
634 | message: 'The size parameter is not a number type'
635 | });
636 | else size = Number(size);
637 |
638 | if (size > 2000) return res.json({
639 | error: true,
640 | message: 'The size parameter cannot be greater than 2000'
641 | });
642 |
643 | console.log(size);
644 |
645 |
646 | let userImg;
647 | try {
648 | userImg = await canvas.loadImage(imgUrl);
649 | }
650 | catch (err) {
651 | return res.status(400).json({
652 | error: true,
653 | message: 'Failed to load this image'
654 | });
655 | }
656 |
657 | const GIF = new gifencoder(size, size);
658 | GIF.start();
659 | GIF.setRepeat(0);
660 | GIF.setDelay(frameDelay);
661 |
662 | const Canvas = canvas.createCanvas(size, size);
663 | const ctx = Canvas.getContext('2d');
664 |
665 | for (let i = 0; i < 5; i++) {
666 |
667 | const j = i < 5 / 2 ? i : 5 - i,
668 | width = 0.8 + j * 0.02,
669 | height = 0.8 - j * 0.05,
670 | offsetX = (1 - width) * 0.5 + 0.1,
671 | offsetY = (1 - height) - 0.08;
672 |
673 | if (!handCache[i]) handCache.push(await canvas.loadImage(path.join(__dirname + '../../Assets', `hand${i + 1}.png`)));
674 |
675 | ctx.drawImage(userImg, size * offsetX, size * offsetY, size * width, size * height);
676 | ctx.drawImage(handCache[i], 0, 0, size, size);
677 | GIF.addFrame(ctx);
678 |
679 | ctx.clearRect(0, 0, size, size);
680 | }
681 | GIF.finish();
682 |
683 | res.set({ 'Content-Type': 'image/gif' }).send(await GIF.out.getData());
684 | });
685 | // brightness
686 |
687 |
688 | /**
689 | * @swagger
690 | * /canvas/brightness:
691 | * get:
692 | * description: Change the brightness of an image!
693 | * tags: [Canvas]
694 | * parameters:
695 | * - name: imgUrl
696 | * description: The url of the image to pet.
697 | * in: query
698 | * required: true
699 | * type: string
700 | * - name: key
701 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
702 | * in: query
703 | * type: string
704 | * - name: val
705 | * description: How bright you want your image from -1 to +1
706 | * in: query
707 | * type: string
708 | * required: true
709 | * responses:
710 | * 200:
711 | * description: Success
712 | * 400:
713 | * description: Error
714 | */
715 | router.get('/brightness', async (req, res) => {
716 | const imgUrl = req.urlParams.imgUrl;
717 | let val = req.urlParams.val;
718 |
719 | if (!imgUrl) return res.status(400).json({
720 | error: true,
721 | message: 'Missing the imgUrl parameter'
722 | });
723 | if (!val) return res.status(400).json({
724 | error: true,
725 | message: 'Missing the val parameter'
726 | });
727 |
728 | if (!Number(val)) return res.status(400).json({
729 | error: true,
730 | message: 'The val parameter is not a number type'
731 | });
732 | else val = Number(val);
733 |
734 | if (val > 1 || val < -1) return res.status(400).json({
735 | error: true,
736 | message: 'The val parameter must be between -1 to +1'
737 | });
738 |
739 | let img;
740 | try {
741 | img = await jimp.read(imgUrl);
742 | }
743 | catch (err) {
744 | return res.status(400).json({
745 | error: true,
746 | message: 'Failed to load this image'
747 | });
748 | }
749 |
750 | img.brightness(val);
751 | res.set({ 'Content-Type': 'image/png' });
752 | res.status(200).send(await img.getBufferAsync('image/png'));
753 | });
754 |
755 | /**
756 | * @swagger
757 | * /canvas/gun:
758 | * get:
759 | * description: 🔫
760 | * tags: [Canvas]
761 | * parameters:
762 | * - name: imgUrl
763 | * description: The url of the image.
764 | * in: query
765 | * required: true
766 | * type: string
767 | * - name: key
768 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
769 | * in: query
770 | * type: string
771 | * responses:
772 | * 200:
773 | * description: Success
774 | * 400:
775 | * description: Error
776 | */
777 | router.get('/gun', async (req, res) => {
778 | const imgURL = req.query.imgUrl;
779 |
780 | if (!imgURL) return res.status(400).json({
781 | error: true,
782 | message: 'Missing the imgUrl parameter'
783 | });
784 |
785 | let img;
786 | try {
787 | img = await canvas.loadImage(imgURL);
788 | }
789 | catch(err) {
790 | return res.status(400).json({
791 | error: true,
792 | message: 'Failed to load this image',
793 | });
794 | }
795 |
796 | const base = await canvas.loadImage(path.join(__dirname, '../Assets/gun.png'));
797 | const Canvas = canvas.createCanvas(img.width, img.height);
798 | const ctx = Canvas.getContext('2d');
799 |
800 | ctx.drawImage(img, 0, 0, Canvas.width, Canvas.height);
801 |
802 | const ratio = (img.height / 2) / base.height;
803 | const width = base.width * ratio;
804 |
805 | ctx.drawImage(base, img.width - width, img.height - (img.height / 2), width, img.height / 2);
806 |
807 | res.set({ 'Content-Type': 'image/png' });
808 | res.status(200).send(Canvas.toBuffer());
809 | });
810 |
811 | /**
812 | * @swagger
813 | * /canvas/fakequote:
814 | * get:
815 | * description: Generate a quote
816 | * tags: [Canvas]
817 | * parameters:
818 | * - name: imgUrl
819 | * description: The url of the image.
820 | * in: query
821 | * required: true
822 | * type: string
823 | * - name: text
824 | * description: The text of the quote
825 | * in: query
826 | * required: true
827 | * type: string
828 | * - name: username
829 | * description: The username of the quote
830 | * in: query
831 | * required: true
832 | * type: string
833 | * - name: roleColour
834 | * description: The role color of the quote
835 | * in: query
836 | * required: false
837 | * type: string
838 | * - name: bot
839 | * description: If the quoter is a bot
840 | * in: query
841 | * required: false
842 | * type: string
843 | * - name: key
844 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
845 | * in: query
846 | * type: string
847 | * responses:
848 | * 200:
849 | * description: Success
850 | * 400:
851 | * description: Error
852 | */
853 | router.get('/fakequote', async (req, res) => {
854 | const imgURL = req.query.imgUrl;
855 | const text = req.query.text;
856 | const username = req.query.username;
857 | const roleColour = req.query.roleColour || '#ffffff';
858 | let bot = false;
859 |
860 | if(req.query.bot) bot = true;
861 |
862 | if(!imgURL) return res.status(400).json({
863 | error: true,
864 | message: 'Missing the imgUrl Parameter',
865 | });
866 |
867 | if(!text) return res.status(400).json({
868 | error: true,
869 | message: 'Missing the text parameter'
870 | });
871 |
872 | if(!username) return res.status(400).json({
873 | error: true,
874 | message: 'Missing the username parameter',
875 | });
876 |
877 | let avatar;
878 | try {
879 | avatar = await canvas.loadImage(imgURL);
880 | } catch (err) {
881 | return res.status(400).json({
882 | error: true,
883 | message: 'Failed to load this image'
884 | });
885 | }
886 |
887 | const board = canvas.createCanvas(1000, 200);
888 | const ctx = board.getContext('2d');
889 | ctx.font = '38px Whitney';
890 |
891 | const msgWidth = ctx.measureText(text).width;
892 | if (155 + msgWidth > board.width) board.width = board.width * (msgWidth / board.width) + 220;
893 |
894 | ctx.fillStyle = '#36393E';
895 | ctx.fillRect(0, 0, board.width, board.height);
896 |
897 | ctx.fillStyle = '#ffffff';
898 | ctx.textAlign = 'left';
899 |
900 | let x = 166;
901 |
902 | for(const word of text.split(' ')) {
903 | ctx.font = '38px whitney';
904 | ctx.fillStyle = '#ffffff';
905 |
906 | const width = ctx.measureText(word).width;
907 | fillTextWithTwemoji(ctx, word, x, 138);
908 | x += width + 6;
909 | }
910 |
911 | ctx.fillStyle = '#ffffff';
912 | ctx.globalAlpha = 1;
913 | ctx.font = '38px whitneyMedium';
914 | ctx.fillStyle = roleColour;
915 |
916 | await fillTextWithTwemoji(ctx, username, 165, 85);
917 | const usernameWidth = ctx.measureText(username).width;
918 |
919 | ctx.font = '26px whitneyMedium';
920 | ctx.fillStyle = '#7a7c80';
921 |
922 | const time = new Date().toLocaleString().split(',')[1].split(':');
923 | const ampm = time.splice(2).join('').split(' ')[1];
924 |
925 | if(bot) {
926 | ctx.fillText(`Today at${time.join(':')} ${ampm}`, usernameWidth + 255, 85);
927 | ctx.fillStyle = '#7289da';
928 |
929 | const x = usernameWidth + 175;
930 | const y = 52;
931 | const width = 60;
932 | const height = 35;
933 | const radius = {
934 | tl: 8,
935 | tr: 8,
936 | br: 8,
937 | bl: 8,
938 | };
939 |
940 | ctx.beginPath();
941 | ctx.moveTo(x + radius.tl, );
942 | ctx.lineTo(x + width - radius.tr, y);
943 | ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);
944 | ctx.lineTo(x + width, y + height - radius.br);
945 | ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);
946 | ctx.lineTo(x + radius.bl, y + height);
947 | ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);
948 | ctx.lineTo(x, y + radius.tl);
949 | ctx.quadraticCurveTo(x, y, x + radius.tl, y);
950 | ctx.closePath();
951 | ctx.fill();
952 |
953 | ctx.fillStyle = '#ffffff';
954 | ctx.font = '23px whitneyMedium';
955 | ctx.fillText('BOT', usernameWidth + 184, 78);
956 | }
957 | else {
958 | ctx.fillText(`Today at${time.join(':')} ${ampm}`, usernameWidth + 184, 85);
959 | }
960 |
961 | ctx.beginPath();
962 | ctx.lineWidth = 1;
963 | ctx.arc(90, 100, 50, 0, Math.PI * 2, true);
964 | ctx.strokeStyle = '#36393E';
965 | ctx.stroke();
966 | ctx.closePath();
967 | ctx.clip();
968 |
969 |
970 | ctx.drawImage(avatar, 38, 48, 105, 105);
971 |
972 | return res
973 | .status(200)
974 | .set({ 'Content-Type': 'image/png'})
975 | .send(board.toBuffer());
976 | });
977 |
978 | // Captchgen is undefined(╯°□°)╯︵ ┻━┻
979 |
980 | /* router.get('/captcha', async (req, res) => {
981 | const captch = await captchGen();
982 |
983 | res.set({ 'Content-Type': 'image/png' });
984 | res.status(200).send(captch);
985 | });*/
986 |
987 | /* router.get('/confused', async (req, res) => {
988 | res.send({
989 | nothing: undefined,
990 | message: 'You seriously checked out this endpoint'
991 | });
992 | });*/
993 |
994 | module.exports = {
995 | end: '/canvas/',
996 | router,
997 | };
998 |
--------------------------------------------------------------------------------
/Routes/Facts.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 | const db = new (require('../Database/Manager'))(require('../Database/Schema').facts);
3 |
4 | const facts = ['dog', 'cat', 'monkey'];
5 |
6 |
7 | /**
8 | * @swagger
9 | * /facts/cat:
10 | * get:
11 | * description: Get a random cat fact!
12 | * tags: [Facts]
13 | * parameters:
14 | * - name: key
15 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
16 | * in: query
17 | * type: string
18 | * responses:
19 | * '200':
20 | * description: Success
21 | * '400':
22 | * description: Error
23 | * /facts/dog:
24 | * get:
25 | * description: Get a random dog fact!
26 | * tags: [Facts]
27 | * parameters:
28 | * - name: key
29 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
30 | * in: query
31 | * type: string
32 | * responses:
33 | * '200':
34 | * description: Success
35 | * '400':
36 | * description: Error
37 | * /facts/monkey:
38 | * get:
39 | * description: Get a random monkey fact!
40 | * tags: [Facts]
41 | * parameters:
42 | * - name: key
43 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
44 | * in: query
45 | * type: string
46 | * responses:
47 | * '200':
48 | * description: Success
49 | * '400':
50 | * description: Error
51 | */
52 |
53 | facts.forEach(fact => {
54 | router.get('/' + fact, async (req, res) => {
55 | const data = await db.get(fact);
56 | res.status(200).json({
57 | fact: data.data[Math.floor(Math.random() * data.data.length)]
58 | });
59 | });
60 | });
61 |
62 | module.exports = {
63 | end: '/facts/',
64 | router,
65 | };
--------------------------------------------------------------------------------
/Routes/Fun.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 | const db = new (require('../Database/Manager'))(require('../Database/Schema').fun);
3 | const fetch = require('node-fetch').default;
4 | /**
5 | * @swagger
6 | * /fun/chat:
7 | * get:
8 | * description: Chat with an AI (thanks brainshop.ai)
9 | * tags: [Fun]
10 | * parameters:
11 | * - name: msg
12 | * description: The message you want to send to the AI
13 | * in: query
14 | * required: true
15 | * type: string
16 | * - name: uid
17 | * description: The id of the user
18 | * in: query
19 | * required: false
20 | * type: number
21 | * - name: key
22 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
23 | * in: query
24 | * type: string
25 | * responses:
26 | * 200:
27 | * description: Success
28 | * 400:
29 | * description: Error
30 | */
31 | router.get('/chat', async (req, res) => {
32 | let { msg, uid = 0 } = req.query;
33 | uid = Number(uid);
34 | if(!msg) return res.status(400).send({
35 | error: true,
36 | message: 'Please provide the message parameter'
37 | });
38 | else if(typeof msg !== 'string' || isNaN(uid)) return res.status(400).send({
39 | error: true,
40 | message: 'Please provide the proper type for the parameters',
41 | example: 'msg: string, uid: number'
42 | });
43 |
44 | const result = await (await fetch(`${process.env.chatApiUrl}&msg=${encodeURIComponent(msg)}&uid=${encodeURIComponent(uid)}`)).json();
45 | return res.status(200).send({
46 | response: result.cnt
47 | });
48 | });
49 |
50 | /**
51 | * @swagger
52 | * /fun/shuffle:
53 | * get:
54 | * description: Randomizes a string
55 | * tags: [Fun]
56 | * parameters:
57 | * - name: content
58 | * description: The content that you want to shuffle
59 | * in: query
60 | * required: true
61 | * type: string
62 | * - name: key
63 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
64 | * in: query
65 | * type: string
66 | * responses:
67 | * 200:
68 | * description: Success
69 | * 400:
70 | * description: Error
71 | */
72 | router.get('/shuffle', async (req, res) => {
73 | const content = req.urlParams.content;
74 |
75 | if(!content || typeof content !== 'string') return res.status(400).json({
76 | error: true,
77 | message: 'Missing/Invalid content parameter'
78 | });
79 |
80 | const arr = content.split('');
81 |
82 | for(let i = arr.length - 1; i > 0; i = i - 1) {
83 | let num = Math.floor(Math.random() * (i + 1)),
84 | char = arr[i];
85 | arr[i] = arr[num];
86 | arr[num] = char;
87 | }
88 |
89 | res.status(200).json({
90 | result: arr.join('')
91 | });
92 | });
93 | /**
94 | * @swagger
95 | * /fun/reverse:
96 | * get:
97 | * description: Reverses a string
98 | * tags: [Fun]
99 | * parameters:
100 | * - name: content
101 | * description: The content that you want to reverse
102 | * in: query
103 | * required: true
104 | * type: string
105 | * - name: key
106 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
107 | * in: query
108 | * type: string
109 | * responses:
110 | * 200:
111 | * description: Success
112 | * 400:
113 | * description: Error
114 | */
115 | router.get('/reverse', async (req, res) => {
116 |
117 | // https://discord.com/channels/767569427935133736/779441456464003122/808357425341661205
118 |
119 | const content = req.urlParams.content;
120 |
121 | if(!content || typeof content !== 'string') return res.status(400).json({
122 | error: true,
123 | message: 'Missing/Invalid content parameter'
124 | });
125 |
126 | res.status(200).json({
127 | result: content.split('').reverse().join('')
128 | });
129 |
130 | });
131 |
132 |
133 | /**
134 | * @swagger
135 | * /fun/8ball:
136 | * get:
137 | * description: Gives a random 8ball responce
138 | * tags: [Fun]
139 | * parameters:
140 | * - name: key
141 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
142 | * in: query
143 | * type: string
144 | * responses:
145 | * 200:
146 | * description: Success
147 | * 400:
148 | * description: Error
149 | */
150 | router.get('/8ball', async (req, res) => {
151 | const data = await db.get('8ball');
152 | res.status(200).json({
153 | answer: data.data[Math.floor(Math.random() * data.data.length)]
154 | });
155 | });
156 |
157 | module.exports = {
158 | end: '/fun/',
159 | router,
160 | };
161 |
--------------------------------------------------------------------------------
/Routes/Info.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 | const stats = require('../Database/Schema').stats;
3 |
4 | /**
5 | * @swagger
6 | * /info/ratelimit:
7 | * get:
8 | * description: View your rate limit
9 | * tags: [Info]
10 | * parameters:
11 | * - name: key
12 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
13 | * in: query
14 | * type: string
15 | * responses:
16 | * 200:
17 | * description: Success
18 | * 400:
19 | * description: Error
20 | */
21 | router.get('/ratelimit', (req, res) => {
22 | if(req.keyData) {
23 | res.status(200).json({
24 | type: 'key',
25 | max: req.keyData.ratelimit.max,
26 | used: req.keyData.ratelimit.used
27 | });
28 | } else {
29 | const allEnd = [];
30 | for(let val of req.endPoints) {
31 | allEnd.push({endPoint: val[0], max: val[1].max, used: val[1].used});
32 | }
33 |
34 | return res.status(200).json({
35 | type: 'shared',
36 | endPoints: allEnd
37 | });
38 | }
39 | });
40 |
41 | /**
42 | * @swagger
43 | * /info:
44 | * get:
45 | * description: Get some info on the API
46 | * tags: [Info]
47 | * parameters:
48 | * - name: key
49 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
50 | * in: query
51 | * type: string
52 | * responses:
53 | * 200:
54 | * description: Success
55 | * 400:
56 | * description: Error
57 | */
58 | let allTimeCache;
59 | router.get('/', async (req, res) => {
60 | if(!allTimeCache) {
61 | allTimeCache = (await stats.findOne({id: 'me'})).allTime;
62 | setTimeout(() => {
63 | allTimeCache = null;
64 | }, 10 * 1000);
65 | };
66 | res.status(200).json({
67 | req: {
68 | allTime: allTimeCache,
69 | thisProcess: process.info.total
70 | },
71 | uptime: process.uptime() * 1000
72 | });
73 | });
74 |
75 |
76 | module.exports = {
77 | end: '/info/',
78 | router,
79 | };
--------------------------------------------------------------------------------
/Routes/Other.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 | const { Client } = require('eris');
3 | const bot = new Client();
4 | const canvas = require('canvas');
5 | const path = require('path');
6 |
7 |
8 | /**
9 | * @swagger
10 | * /other/top.gg_vote:
11 | * post:
12 | * description: Top.gg vote logs with a discord webhook
13 | * tags: [Other]
14 | * parameters:
15 | * - name: key
16 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
17 | * in: query
18 | * type: string
19 | * - name: webhookToken
20 | * description: The token of the webhook to execute
21 | * in: query
22 | * required: true
23 | * type: string
24 | * - name: webhookID
25 | * description: The ID of the webhook to execute
26 | * in: query
27 | * required: true
28 | * type: string
29 | * - name: message
30 | * description: The message object to send to the webhook (https://discord.com/developers/docs/resources/webhook#execute-webhook), $USER_ID will be replaced with the voter's ID, $USER_ID will be replaced with the bot's ID, $IS_WEEKEND if it is the weekend it will be replaced with true if not false.
31 | * in: query
32 | * type: string
33 | * responses:
34 | * 200:
35 | * description: Success
36 | * 400:
37 | * description: Error
38 | */
39 | router.post('/top.gg_vote', (req, res) => {
40 |
41 | const webhookID = req.urlParams.webhookID;
42 | if(!webhookID) return res.status(400).json({
43 | error: true,
44 | message: 'A webhookID was not provided.'
45 | });
46 | const webhookToken = req.urlParams.webhookToken;
47 | if(!webhookToken) return res.status(400).json({
48 | error: true,
49 | message: 'A webhookToken was not provided.'
50 | });
51 |
52 |
53 | const toReplace = [
54 | {
55 | in: '$USER_ID',
56 | out: req.body.user
57 | },
58 | {
59 | in: '$BOT_ID',
60 | out: req.body.bot
61 | },
62 | {
63 | in: '$IS_WEEKEND',
64 | out: req.body.isWeekend
65 | }
66 | ];
67 | let message;
68 |
69 | try {
70 |
71 | if(req.urlParams.message) {
72 | toReplace.forEach(x => {
73 | req.urlParams.message = req.urlParams.message.split(x.in).join(x.out);
74 | });
75 | message = JSON.parse(req.urlParams.message);
76 | } else {
77 | message = {
78 | content: req.urlParams.message || `<@!${req.body.user || '000000000000000000'}>, Thank you for voting for <@!${req.body.bot || '000000000000000000'}>!`
79 | };
80 | }
81 |
82 | } catch (err) {
83 | return res.status(400).json({
84 | error: true,
85 | message: 'Failed to parse message content.'
86 | });
87 | }
88 |
89 | try {
90 | bot.executeWebhook(webhookID, webhookToken, message);
91 | } catch (err) {
92 | console.log(err);
93 | res.status(400).json({
94 | error: true,
95 | message: `${err}`
96 | });
97 | }
98 |
99 | res.status(200).json({message: 'Sent'});
100 | });
101 |
102 |
103 | let gavCahce;
104 | /**
105 | * @swagger
106 | * /other/gav:
107 | * get:
108 | * description: Gav
109 | * tags: [Other]
110 | * parameters:
111 | * - name: key
112 | * description: Your API key, Join our discord server to get one (https://monkedev.com/r/discord)
113 | * in: query
114 | * type: string
115 | * - name: imgUrl
116 | * description: The url of the image to place on gav.
117 | * in: query
118 | * required: true
119 | * type: string
120 | * responses:
121 | * 200:
122 | * description: Success
123 | * 400:
124 | * description: Error
125 | */
126 | router.get('/gav', async (req, res) => {
127 |
128 | const imgUrl = req.urlParams.imgUrl;
129 |
130 | if(!imgUrl) return res.json({
131 | error: true,
132 | message: 'Missing imgUrl param'
133 | });
134 |
135 |
136 | let toPlace;
137 | try{
138 | toPlace = await canvas.loadImage(imgUrl);
139 | } catch (err) {
140 | console.log(err);
141 | return res.status(400).json({
142 | error: true,
143 | message: 'Failed to load image.'
144 | });
145 | }
146 |
147 | let gav;
148 | if(gavCahce) gav = gavCahce;
149 | else gav = await canvas.loadImage(path.join(__dirname + '../../Assets', 'gav.png'));
150 |
151 |
152 | const Canvas = canvas.createCanvas(gav.width, gav.height);
153 | const ctx = Canvas.getContext('2d');
154 | ctx.drawImage(gav, 0, 0, Canvas.width, Canvas.height);
155 | ctx.drawImage(toPlace, 270, 70, 60, 60);
156 |
157 |
158 | res.set({'Content-Type': 'image/png'});
159 | res.status(200).send(Canvas.toBuffer());
160 | });
161 |
162 |
163 | module.exports = {
164 | end: '/other/',
165 | router,
166 | };
--------------------------------------------------------------------------------
/Routes/slash.js:
--------------------------------------------------------------------------------
1 | const router = require('express').Router();
2 | const path = require('path');
3 |
4 | /*
5 | router.get('/', (req, res) => {
6 | res.json({
7 | facts: {
8 | dog: '/facts/dog',
9 | cat: '/facts/cat'
10 | },
11 | canvas: {
12 | gay: '/canvas/gay?imgUrl='
13 | }
14 | });
15 | });
16 | */
17 |
18 |
19 | router.get('/', (req, res) => {
20 | res.redirect('/docs');
21 | });
22 | router.get('/favicon.ico', (req, res) => {
23 | res.sendFile(path.join(__dirname + '../../Assets', 'monke.png'));
24 | });
25 |
26 |
27 | module.exports = {
28 | end: '/',
29 | router,
30 | };
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const fs = require('fs');
3 | const url = require('url');
4 | const querystring = require('querystring');
5 | const swaggerJsDoc = require('swagger-jsdoc');
6 | const swaggerUI = require('swagger-ui-express');
7 | const rateLimter = require('./util/RateLimiter');
8 | const stats = require('./util/Stats');
9 | const bodyParser = require('body-parser');
10 | const cors = require('cors');
11 | require('dotenv').config();
12 |
13 | const app = express();
14 | const port = process.env.PORT || 8080;
15 |
16 | app.use(express.static('public'));
17 |
18 | app.use((req, res, next) => {
19 | const parsedQs = querystring.parse(url.parse('https://api.monkedev.com' + req.originalUrl).query);
20 | req.urlParams = parsedQs;
21 | next();
22 | });
23 |
24 | app.use(cors());
25 |
26 | app.use(rateLimter);
27 | app.use(stats);
28 |
29 | app.use(bodyParser.json());
30 |
31 | const swaggerOptions = {
32 | swaggerDefinition: {
33 | info: {
34 | title: 'MonkeDev - API',
35 | description: 'The MonkeDev API'
36 | },
37 | servers: ['https://api.monkedev.com/']
38 | },
39 | apis: [__dirname + '/Routes/*.js']
40 | };
41 | const swaggerDocs = swaggerJsDoc(swaggerOptions);
42 | app.use('/docs', swaggerUI.serve, swaggerUI.setup(swaggerDocs));
43 |
44 | const setFolder = (dir) => {
45 | const routes = fs.readdirSync(dir);
46 | routes.forEach(route => {
47 | if(route.endsWith('.js')) setFile(dir + '/' + route);
48 | else setFolder(dir + '/' + route);
49 | });
50 | };
51 | const setFile = (dir) => {
52 | const file = require(dir);
53 | app.use(file.end, file.router);
54 | };
55 |
56 | const Init = async () => {
57 |
58 | await require('./Database/Init')();
59 | process.s = new (require('./Database/UserManager'))();
60 |
61 | const routes = fs.readdirSync(__dirname + '/Routes');
62 | routes.forEach(route => {
63 | if(route.endsWith('.js')) setFile(__dirname + '/Routes/' + route);
64 | else setFolder(__dirname + '/Routes/' + route);
65 | });
66 |
67 | app.use((req, res, next) => {
68 | if(req.originalUrl.startsWith('/docs/') || req.originalUrl == '/') return next();
69 | return res.status(404).json({
70 | error: true,
71 | message: 'Invalid endPoint'
72 | });
73 | });
74 |
75 | app.listen(port, () => console.log('on port: ' + port));
76 |
77 | };
78 |
79 | Init();
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api",
3 | "version": "1.0.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@apidevtools/json-schema-ref-parser": {
8 | "version": "9.0.7",
9 | "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz",
10 | "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==",
11 | "requires": {
12 | "@jsdevtools/ono": "^7.1.3",
13 | "call-me-maybe": "^1.0.1",
14 | "js-yaml": "^3.13.1"
15 | }
16 | },
17 | "@apidevtools/openapi-schemas": {
18 | "version": "2.0.4",
19 | "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.0.4.tgz",
20 | "integrity": "sha512-ob5c4UiaMYkb24pNhvfSABShAwpREvUGCkqjiz/BX9gKZ32y/S22M+ALIHftTAuv9KsFVSpVdIDzi9ZzFh5TCA=="
21 | },
22 | "@apidevtools/swagger-methods": {
23 | "version": "3.0.2",
24 | "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz",
25 | "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg=="
26 | },
27 | "@apidevtools/swagger-parser": {
28 | "version": "10.0.2",
29 | "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz",
30 | "integrity": "sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg==",
31 | "requires": {
32 | "@apidevtools/json-schema-ref-parser": "^9.0.6",
33 | "@apidevtools/openapi-schemas": "^2.0.4",
34 | "@apidevtools/swagger-methods": "^3.0.2",
35 | "@jsdevtools/ono": "^7.1.3",
36 | "call-me-maybe": "^1.0.1",
37 | "z-schema": "^4.2.3"
38 | }
39 | },
40 | "@babel/code-frame": {
41 | "version": "7.12.11",
42 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
43 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
44 | "requires": {
45 | "@babel/highlight": "^7.10.4"
46 | }
47 | },
48 | "@babel/helper-validator-identifier": {
49 | "version": "7.12.11",
50 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
51 | "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
52 | },
53 | "@babel/highlight": {
54 | "version": "7.13.10",
55 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
56 | "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
57 | "requires": {
58 | "@babel/helper-validator-identifier": "^7.12.11",
59 | "chalk": "^2.0.0",
60 | "js-tokens": "^4.0.0"
61 | },
62 | "dependencies": {
63 | "chalk": {
64 | "version": "2.4.2",
65 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
66 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
67 | "requires": {
68 | "ansi-styles": "^3.2.1",
69 | "escape-string-regexp": "^1.0.5",
70 | "supports-color": "^5.3.0"
71 | }
72 | }
73 | }
74 | },
75 | "@babel/runtime": {
76 | "version": "7.12.5",
77 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
78 | "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
79 | "requires": {
80 | "regenerator-runtime": "^0.13.4"
81 | }
82 | },
83 | "@eslint/eslintrc": {
84 | "version": "0.4.0",
85 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
86 | "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
87 | "requires": {
88 | "ajv": "^6.12.4",
89 | "debug": "^4.1.1",
90 | "espree": "^7.3.0",
91 | "globals": "^12.1.0",
92 | "ignore": "^4.0.6",
93 | "import-fresh": "^3.2.1",
94 | "js-yaml": "^3.13.1",
95 | "minimatch": "^3.0.4",
96 | "strip-json-comments": "^3.1.1"
97 | },
98 | "dependencies": {
99 | "debug": {
100 | "version": "4.3.1",
101 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
102 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
103 | "requires": {
104 | "ms": "2.1.2"
105 | }
106 | },
107 | "globals": {
108 | "version": "12.4.0",
109 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
110 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
111 | "requires": {
112 | "type-fest": "^0.8.1"
113 | }
114 | },
115 | "ms": {
116 | "version": "2.1.2",
117 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
118 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
119 | },
120 | "strip-json-comments": {
121 | "version": "3.1.1",
122 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
123 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
124 | }
125 | }
126 | },
127 | "@jimp/bmp": {
128 | "version": "0.16.1",
129 | "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz",
130 | "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==",
131 | "requires": {
132 | "@babel/runtime": "^7.7.2",
133 | "@jimp/utils": "^0.16.1",
134 | "bmp-js": "^0.1.0"
135 | }
136 | },
137 | "@jimp/core": {
138 | "version": "0.16.1",
139 | "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz",
140 | "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==",
141 | "requires": {
142 | "@babel/runtime": "^7.7.2",
143 | "@jimp/utils": "^0.16.1",
144 | "any-base": "^1.1.0",
145 | "buffer": "^5.2.0",
146 | "exif-parser": "^0.1.12",
147 | "file-type": "^9.0.0",
148 | "load-bmfont": "^1.3.1",
149 | "mkdirp": "^0.5.1",
150 | "phin": "^2.9.1",
151 | "pixelmatch": "^4.0.2",
152 | "tinycolor2": "^1.4.1"
153 | }
154 | },
155 | "@jimp/custom": {
156 | "version": "0.16.1",
157 | "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz",
158 | "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==",
159 | "requires": {
160 | "@babel/runtime": "^7.7.2",
161 | "@jimp/core": "^0.16.1"
162 | }
163 | },
164 | "@jimp/gif": {
165 | "version": "0.16.1",
166 | "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz",
167 | "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==",
168 | "requires": {
169 | "@babel/runtime": "^7.7.2",
170 | "@jimp/utils": "^0.16.1",
171 | "gifwrap": "^0.9.2",
172 | "omggif": "^1.0.9"
173 | }
174 | },
175 | "@jimp/jpeg": {
176 | "version": "0.16.1",
177 | "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz",
178 | "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==",
179 | "requires": {
180 | "@babel/runtime": "^7.7.2",
181 | "@jimp/utils": "^0.16.1",
182 | "jpeg-js": "0.4.2"
183 | }
184 | },
185 | "@jimp/plugin-blit": {
186 | "version": "0.16.1",
187 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz",
188 | "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==",
189 | "requires": {
190 | "@babel/runtime": "^7.7.2",
191 | "@jimp/utils": "^0.16.1"
192 | }
193 | },
194 | "@jimp/plugin-blur": {
195 | "version": "0.16.1",
196 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz",
197 | "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==",
198 | "requires": {
199 | "@babel/runtime": "^7.7.2",
200 | "@jimp/utils": "^0.16.1"
201 | }
202 | },
203 | "@jimp/plugin-circle": {
204 | "version": "0.16.1",
205 | "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz",
206 | "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==",
207 | "requires": {
208 | "@babel/runtime": "^7.7.2",
209 | "@jimp/utils": "^0.16.1"
210 | }
211 | },
212 | "@jimp/plugin-color": {
213 | "version": "0.16.1",
214 | "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz",
215 | "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==",
216 | "requires": {
217 | "@babel/runtime": "^7.7.2",
218 | "@jimp/utils": "^0.16.1",
219 | "tinycolor2": "^1.4.1"
220 | }
221 | },
222 | "@jimp/plugin-contain": {
223 | "version": "0.16.1",
224 | "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz",
225 | "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==",
226 | "requires": {
227 | "@babel/runtime": "^7.7.2",
228 | "@jimp/utils": "^0.16.1"
229 | }
230 | },
231 | "@jimp/plugin-cover": {
232 | "version": "0.16.1",
233 | "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz",
234 | "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==",
235 | "requires": {
236 | "@babel/runtime": "^7.7.2",
237 | "@jimp/utils": "^0.16.1"
238 | }
239 | },
240 | "@jimp/plugin-crop": {
241 | "version": "0.16.1",
242 | "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz",
243 | "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==",
244 | "requires": {
245 | "@babel/runtime": "^7.7.2",
246 | "@jimp/utils": "^0.16.1"
247 | }
248 | },
249 | "@jimp/plugin-displace": {
250 | "version": "0.16.1",
251 | "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz",
252 | "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==",
253 | "requires": {
254 | "@babel/runtime": "^7.7.2",
255 | "@jimp/utils": "^0.16.1"
256 | }
257 | },
258 | "@jimp/plugin-dither": {
259 | "version": "0.16.1",
260 | "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz",
261 | "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==",
262 | "requires": {
263 | "@babel/runtime": "^7.7.2",
264 | "@jimp/utils": "^0.16.1"
265 | }
266 | },
267 | "@jimp/plugin-fisheye": {
268 | "version": "0.16.1",
269 | "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz",
270 | "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==",
271 | "requires": {
272 | "@babel/runtime": "^7.7.2",
273 | "@jimp/utils": "^0.16.1"
274 | }
275 | },
276 | "@jimp/plugin-flip": {
277 | "version": "0.16.1",
278 | "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz",
279 | "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==",
280 | "requires": {
281 | "@babel/runtime": "^7.7.2",
282 | "@jimp/utils": "^0.16.1"
283 | }
284 | },
285 | "@jimp/plugin-gaussian": {
286 | "version": "0.16.1",
287 | "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz",
288 | "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==",
289 | "requires": {
290 | "@babel/runtime": "^7.7.2",
291 | "@jimp/utils": "^0.16.1"
292 | }
293 | },
294 | "@jimp/plugin-invert": {
295 | "version": "0.16.1",
296 | "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz",
297 | "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==",
298 | "requires": {
299 | "@babel/runtime": "^7.7.2",
300 | "@jimp/utils": "^0.16.1"
301 | }
302 | },
303 | "@jimp/plugin-mask": {
304 | "version": "0.16.1",
305 | "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz",
306 | "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==",
307 | "requires": {
308 | "@babel/runtime": "^7.7.2",
309 | "@jimp/utils": "^0.16.1"
310 | }
311 | },
312 | "@jimp/plugin-normalize": {
313 | "version": "0.16.1",
314 | "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz",
315 | "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==",
316 | "requires": {
317 | "@babel/runtime": "^7.7.2",
318 | "@jimp/utils": "^0.16.1"
319 | }
320 | },
321 | "@jimp/plugin-print": {
322 | "version": "0.16.1",
323 | "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz",
324 | "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==",
325 | "requires": {
326 | "@babel/runtime": "^7.7.2",
327 | "@jimp/utils": "^0.16.1",
328 | "load-bmfont": "^1.4.0"
329 | }
330 | },
331 | "@jimp/plugin-resize": {
332 | "version": "0.16.1",
333 | "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz",
334 | "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==",
335 | "requires": {
336 | "@babel/runtime": "^7.7.2",
337 | "@jimp/utils": "^0.16.1"
338 | }
339 | },
340 | "@jimp/plugin-rotate": {
341 | "version": "0.16.1",
342 | "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz",
343 | "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==",
344 | "requires": {
345 | "@babel/runtime": "^7.7.2",
346 | "@jimp/utils": "^0.16.1"
347 | }
348 | },
349 | "@jimp/plugin-scale": {
350 | "version": "0.16.1",
351 | "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz",
352 | "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==",
353 | "requires": {
354 | "@babel/runtime": "^7.7.2",
355 | "@jimp/utils": "^0.16.1"
356 | }
357 | },
358 | "@jimp/plugin-shadow": {
359 | "version": "0.16.1",
360 | "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz",
361 | "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==",
362 | "requires": {
363 | "@babel/runtime": "^7.7.2",
364 | "@jimp/utils": "^0.16.1"
365 | }
366 | },
367 | "@jimp/plugin-threshold": {
368 | "version": "0.16.1",
369 | "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz",
370 | "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==",
371 | "requires": {
372 | "@babel/runtime": "^7.7.2",
373 | "@jimp/utils": "^0.16.1"
374 | }
375 | },
376 | "@jimp/plugins": {
377 | "version": "0.16.1",
378 | "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz",
379 | "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==",
380 | "requires": {
381 | "@babel/runtime": "^7.7.2",
382 | "@jimp/plugin-blit": "^0.16.1",
383 | "@jimp/plugin-blur": "^0.16.1",
384 | "@jimp/plugin-circle": "^0.16.1",
385 | "@jimp/plugin-color": "^0.16.1",
386 | "@jimp/plugin-contain": "^0.16.1",
387 | "@jimp/plugin-cover": "^0.16.1",
388 | "@jimp/plugin-crop": "^0.16.1",
389 | "@jimp/plugin-displace": "^0.16.1",
390 | "@jimp/plugin-dither": "^0.16.1",
391 | "@jimp/plugin-fisheye": "^0.16.1",
392 | "@jimp/plugin-flip": "^0.16.1",
393 | "@jimp/plugin-gaussian": "^0.16.1",
394 | "@jimp/plugin-invert": "^0.16.1",
395 | "@jimp/plugin-mask": "^0.16.1",
396 | "@jimp/plugin-normalize": "^0.16.1",
397 | "@jimp/plugin-print": "^0.16.1",
398 | "@jimp/plugin-resize": "^0.16.1",
399 | "@jimp/plugin-rotate": "^0.16.1",
400 | "@jimp/plugin-scale": "^0.16.1",
401 | "@jimp/plugin-shadow": "^0.16.1",
402 | "@jimp/plugin-threshold": "^0.16.1",
403 | "timm": "^1.6.1"
404 | }
405 | },
406 | "@jimp/png": {
407 | "version": "0.16.1",
408 | "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz",
409 | "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==",
410 | "requires": {
411 | "@babel/runtime": "^7.7.2",
412 | "@jimp/utils": "^0.16.1",
413 | "pngjs": "^3.3.3"
414 | }
415 | },
416 | "@jimp/tiff": {
417 | "version": "0.16.1",
418 | "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz",
419 | "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==",
420 | "requires": {
421 | "@babel/runtime": "^7.7.2",
422 | "utif": "^2.0.1"
423 | }
424 | },
425 | "@jimp/types": {
426 | "version": "0.16.1",
427 | "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz",
428 | "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==",
429 | "requires": {
430 | "@babel/runtime": "^7.7.2",
431 | "@jimp/bmp": "^0.16.1",
432 | "@jimp/gif": "^0.16.1",
433 | "@jimp/jpeg": "^0.16.1",
434 | "@jimp/png": "^0.16.1",
435 | "@jimp/tiff": "^0.16.1",
436 | "timm": "^1.6.1"
437 | }
438 | },
439 | "@jimp/utils": {
440 | "version": "0.16.1",
441 | "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz",
442 | "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==",
443 | "requires": {
444 | "@babel/runtime": "^7.7.2",
445 | "regenerator-runtime": "^0.13.3"
446 | }
447 | },
448 | "@jsdevtools/ono": {
449 | "version": "7.1.3",
450 | "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
451 | "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="
452 | },
453 | "@types/bson": {
454 | "version": "4.0.3",
455 | "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz",
456 | "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==",
457 | "requires": {
458 | "@types/node": "*"
459 | }
460 | },
461 | "@types/mongodb": {
462 | "version": "3.6.3",
463 | "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.3.tgz",
464 | "integrity": "sha512-6YNqGP1hk5bjUFaim+QoFFuI61WjHiHE1BNeB41TA00Xd2K7zG4lcWyLLq/XtIp36uMavvS5hoAUJ+1u/GcX2Q==",
465 | "requires": {
466 | "@types/bson": "*",
467 | "@types/node": "*"
468 | }
469 | },
470 | "@types/node": {
471 | "version": "14.14.22",
472 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz",
473 | "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw=="
474 | },
475 | "abbrev": {
476 | "version": "1.1.1",
477 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
478 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
479 | },
480 | "accepts": {
481 | "version": "1.3.7",
482 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
483 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
484 | "requires": {
485 | "mime-types": "~2.1.24",
486 | "negotiator": "0.6.2"
487 | }
488 | },
489 | "acorn": {
490 | "version": "7.4.1",
491 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
492 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
493 | },
494 | "acorn-jsx": {
495 | "version": "5.3.1",
496 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
497 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng=="
498 | },
499 | "ajv": {
500 | "version": "6.12.6",
501 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
502 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
503 | "requires": {
504 | "fast-deep-equal": "^3.1.1",
505 | "fast-json-stable-stringify": "^2.0.0",
506 | "json-schema-traverse": "^0.4.1",
507 | "uri-js": "^4.2.2"
508 | }
509 | },
510 | "ansi-colors": {
511 | "version": "4.1.1",
512 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
513 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
514 | },
515 | "ansi-regex": {
516 | "version": "2.1.1",
517 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
518 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
519 | },
520 | "ansi-styles": {
521 | "version": "3.2.1",
522 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
523 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
524 | "requires": {
525 | "color-convert": "^1.9.0"
526 | }
527 | },
528 | "any-base": {
529 | "version": "1.1.0",
530 | "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
531 | "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="
532 | },
533 | "aproba": {
534 | "version": "1.2.0",
535 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
536 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
537 | },
538 | "are-we-there-yet": {
539 | "version": "1.1.5",
540 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
541 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
542 | "requires": {
543 | "delegates": "^1.0.0",
544 | "readable-stream": "^2.0.6"
545 | }
546 | },
547 | "argparse": {
548 | "version": "1.0.10",
549 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
550 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
551 | "requires": {
552 | "sprintf-js": "~1.0.2"
553 | }
554 | },
555 | "array-flatten": {
556 | "version": "1.1.1",
557 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
558 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
559 | },
560 | "astral-regex": {
561 | "version": "2.0.0",
562 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
563 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
564 | },
565 | "balanced-match": {
566 | "version": "1.0.0",
567 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
568 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
569 | },
570 | "base64-js": {
571 | "version": "1.5.1",
572 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
573 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
574 | },
575 | "bl": {
576 | "version": "2.2.1",
577 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
578 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
579 | "requires": {
580 | "readable-stream": "^2.3.5",
581 | "safe-buffer": "^5.1.1"
582 | }
583 | },
584 | "bluebird": {
585 | "version": "3.5.1",
586 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
587 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
588 | },
589 | "bmp-js": {
590 | "version": "0.1.0",
591 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
592 | "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM="
593 | },
594 | "body-parser": {
595 | "version": "1.19.0",
596 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
597 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
598 | "requires": {
599 | "bytes": "3.1.0",
600 | "content-type": "~1.0.4",
601 | "debug": "2.6.9",
602 | "depd": "~1.1.2",
603 | "http-errors": "1.7.2",
604 | "iconv-lite": "0.4.24",
605 | "on-finished": "~2.3.0",
606 | "qs": "6.7.0",
607 | "raw-body": "2.4.0",
608 | "type-is": "~1.6.17"
609 | }
610 | },
611 | "brace-expansion": {
612 | "version": "1.1.11",
613 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
614 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
615 | "requires": {
616 | "balanced-match": "^1.0.0",
617 | "concat-map": "0.0.1"
618 | }
619 | },
620 | "bson": {
621 | "version": "1.1.5",
622 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz",
623 | "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg=="
624 | },
625 | "buffer": {
626 | "version": "5.7.1",
627 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
628 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
629 | "requires": {
630 | "base64-js": "^1.3.1",
631 | "ieee754": "^1.1.13"
632 | }
633 | },
634 | "buffer-equal": {
635 | "version": "0.0.1",
636 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
637 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs="
638 | },
639 | "bytes": {
640 | "version": "3.1.0",
641 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
642 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
643 | },
644 | "call-me-maybe": {
645 | "version": "1.0.1",
646 | "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
647 | "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
648 | },
649 | "callsites": {
650 | "version": "3.1.0",
651 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
652 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
653 | },
654 | "canvas": {
655 | "version": "2.6.1",
656 | "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz",
657 | "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==",
658 | "requires": {
659 | "nan": "^2.14.0",
660 | "node-pre-gyp": "^0.11.0",
661 | "simple-get": "^3.0.3"
662 | }
663 | },
664 | "chalk": {
665 | "version": "4.1.0",
666 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
667 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
668 | "requires": {
669 | "ansi-styles": "^4.1.0",
670 | "supports-color": "^7.1.0"
671 | },
672 | "dependencies": {
673 | "ansi-styles": {
674 | "version": "4.3.0",
675 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
676 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
677 | "requires": {
678 | "color-convert": "^2.0.1"
679 | }
680 | },
681 | "color-convert": {
682 | "version": "2.0.1",
683 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
684 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
685 | "requires": {
686 | "color-name": "~1.1.4"
687 | }
688 | },
689 | "color-name": {
690 | "version": "1.1.4",
691 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
692 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
693 | },
694 | "has-flag": {
695 | "version": "4.0.0",
696 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
697 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
698 | },
699 | "supports-color": {
700 | "version": "7.2.0",
701 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
702 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
703 | "requires": {
704 | "has-flag": "^4.0.0"
705 | }
706 | }
707 | }
708 | },
709 | "chownr": {
710 | "version": "1.1.4",
711 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
712 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
713 | },
714 | "code-point-at": {
715 | "version": "1.1.0",
716 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
717 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
718 | },
719 | "color-convert": {
720 | "version": "1.9.3",
721 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
722 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
723 | "requires": {
724 | "color-name": "1.1.3"
725 | }
726 | },
727 | "color-name": {
728 | "version": "1.1.3",
729 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
730 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
731 | },
732 | "commander": {
733 | "version": "6.2.0",
734 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
735 | "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q=="
736 | },
737 | "concat-map": {
738 | "version": "0.0.1",
739 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
740 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
741 | },
742 | "console-control-strings": {
743 | "version": "1.1.0",
744 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
745 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
746 | },
747 | "content-disposition": {
748 | "version": "0.5.3",
749 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
750 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
751 | "requires": {
752 | "safe-buffer": "5.1.2"
753 | }
754 | },
755 | "content-type": {
756 | "version": "1.0.4",
757 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
758 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
759 | },
760 | "cookie": {
761 | "version": "0.4.0",
762 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
763 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
764 | },
765 | "cookie-signature": {
766 | "version": "1.0.6",
767 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
768 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
769 | },
770 | "core-util-is": {
771 | "version": "1.0.2",
772 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
773 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
774 | },
775 | "cors": {
776 | "version": "2.8.5",
777 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
778 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
779 | "requires": {
780 | "object-assign": "^4",
781 | "vary": "^1"
782 | }
783 | },
784 | "cross-spawn": {
785 | "version": "7.0.3",
786 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
787 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
788 | "requires": {
789 | "path-key": "^3.1.0",
790 | "shebang-command": "^2.0.0",
791 | "which": "^2.0.1"
792 | }
793 | },
794 | "debug": {
795 | "version": "2.6.9",
796 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
797 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
798 | "requires": {
799 | "ms": "2.0.0"
800 | }
801 | },
802 | "decompress-response": {
803 | "version": "4.2.1",
804 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
805 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
806 | "requires": {
807 | "mimic-response": "^2.0.0"
808 | }
809 | },
810 | "deep-extend": {
811 | "version": "0.6.0",
812 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
813 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
814 | },
815 | "deep-is": {
816 | "version": "0.1.3",
817 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
818 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
819 | },
820 | "delegates": {
821 | "version": "1.0.0",
822 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
823 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
824 | },
825 | "denque": {
826 | "version": "1.5.0",
827 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
828 | "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ=="
829 | },
830 | "depd": {
831 | "version": "1.1.2",
832 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
833 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
834 | },
835 | "destroy": {
836 | "version": "1.0.4",
837 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
838 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
839 | },
840 | "detect-libc": {
841 | "version": "1.0.3",
842 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
843 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
844 | },
845 | "doctrine": {
846 | "version": "3.0.0",
847 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
848 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
849 | "requires": {
850 | "esutils": "^2.0.2"
851 | }
852 | },
853 | "dom-walk": {
854 | "version": "0.1.2",
855 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
856 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
857 | },
858 | "dotenv": {
859 | "version": "8.2.0",
860 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
861 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
862 | },
863 | "ee-first": {
864 | "version": "1.1.1",
865 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
866 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
867 | },
868 | "emoji-regex": {
869 | "version": "8.0.0",
870 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
871 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
872 | },
873 | "encodeurl": {
874 | "version": "1.0.2",
875 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
876 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
877 | },
878 | "enquirer": {
879 | "version": "2.3.6",
880 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
881 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
882 | "requires": {
883 | "ansi-colors": "^4.1.1"
884 | }
885 | },
886 | "eris": {
887 | "version": "0.14.0",
888 | "resolved": "https://registry.npmjs.org/eris/-/eris-0.14.0.tgz",
889 | "integrity": "sha512-/W6X0SFR2swtA9oc4ga5Wh1TQcZtPgbUaDDdwYc67fvFUAtwC+V1xzWUZq2yDeJnTfB8Uot9SJWA8Lthe2sDtQ==",
890 | "requires": {
891 | "opusscript": "^0.0.7",
892 | "tweetnacl": "^1.0.1",
893 | "ws": "^7.2.1"
894 | }
895 | },
896 | "escape-html": {
897 | "version": "1.0.3",
898 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
899 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
900 | },
901 | "escape-string-regexp": {
902 | "version": "1.0.5",
903 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
904 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
905 | },
906 | "eslint": {
907 | "version": "7.22.0",
908 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz",
909 | "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==",
910 | "requires": {
911 | "@babel/code-frame": "7.12.11",
912 | "@eslint/eslintrc": "^0.4.0",
913 | "ajv": "^6.10.0",
914 | "chalk": "^4.0.0",
915 | "cross-spawn": "^7.0.2",
916 | "debug": "^4.0.1",
917 | "doctrine": "^3.0.0",
918 | "enquirer": "^2.3.5",
919 | "eslint-scope": "^5.1.1",
920 | "eslint-utils": "^2.1.0",
921 | "eslint-visitor-keys": "^2.0.0",
922 | "espree": "^7.3.1",
923 | "esquery": "^1.4.0",
924 | "esutils": "^2.0.2",
925 | "file-entry-cache": "^6.0.1",
926 | "functional-red-black-tree": "^1.0.1",
927 | "glob-parent": "^5.0.0",
928 | "globals": "^13.6.0",
929 | "ignore": "^4.0.6",
930 | "import-fresh": "^3.0.0",
931 | "imurmurhash": "^0.1.4",
932 | "is-glob": "^4.0.0",
933 | "js-yaml": "^3.13.1",
934 | "json-stable-stringify-without-jsonify": "^1.0.1",
935 | "levn": "^0.4.1",
936 | "lodash": "^4.17.21",
937 | "minimatch": "^3.0.4",
938 | "natural-compare": "^1.4.0",
939 | "optionator": "^0.9.1",
940 | "progress": "^2.0.0",
941 | "regexpp": "^3.1.0",
942 | "semver": "^7.2.1",
943 | "strip-ansi": "^6.0.0",
944 | "strip-json-comments": "^3.1.0",
945 | "table": "^6.0.4",
946 | "text-table": "^0.2.0",
947 | "v8-compile-cache": "^2.0.3"
948 | },
949 | "dependencies": {
950 | "ansi-regex": {
951 | "version": "5.0.0",
952 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
953 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
954 | },
955 | "debug": {
956 | "version": "4.3.1",
957 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
958 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
959 | "requires": {
960 | "ms": "2.1.2"
961 | }
962 | },
963 | "ms": {
964 | "version": "2.1.2",
965 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
966 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
967 | },
968 | "semver": {
969 | "version": "7.3.4",
970 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
971 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
972 | "requires": {
973 | "lru-cache": "^6.0.0"
974 | }
975 | },
976 | "strip-ansi": {
977 | "version": "6.0.0",
978 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
979 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
980 | "requires": {
981 | "ansi-regex": "^5.0.0"
982 | }
983 | },
984 | "strip-json-comments": {
985 | "version": "3.1.1",
986 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
987 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
988 | }
989 | }
990 | },
991 | "eslint-scope": {
992 | "version": "5.1.1",
993 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
994 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
995 | "requires": {
996 | "esrecurse": "^4.3.0",
997 | "estraverse": "^4.1.1"
998 | }
999 | },
1000 | "eslint-utils": {
1001 | "version": "2.1.0",
1002 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
1003 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
1004 | "requires": {
1005 | "eslint-visitor-keys": "^1.1.0"
1006 | },
1007 | "dependencies": {
1008 | "eslint-visitor-keys": {
1009 | "version": "1.3.0",
1010 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
1011 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
1012 | }
1013 | }
1014 | },
1015 | "eslint-visitor-keys": {
1016 | "version": "2.0.0",
1017 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
1018 | "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ=="
1019 | },
1020 | "espree": {
1021 | "version": "7.3.1",
1022 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
1023 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
1024 | "requires": {
1025 | "acorn": "^7.4.0",
1026 | "acorn-jsx": "^5.3.1",
1027 | "eslint-visitor-keys": "^1.3.0"
1028 | },
1029 | "dependencies": {
1030 | "eslint-visitor-keys": {
1031 | "version": "1.3.0",
1032 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
1033 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
1034 | }
1035 | }
1036 | },
1037 | "esprima": {
1038 | "version": "4.0.1",
1039 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1040 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
1041 | },
1042 | "esquery": {
1043 | "version": "1.4.0",
1044 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
1045 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
1046 | "requires": {
1047 | "estraverse": "^5.1.0"
1048 | },
1049 | "dependencies": {
1050 | "estraverse": {
1051 | "version": "5.2.0",
1052 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
1053 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
1054 | }
1055 | }
1056 | },
1057 | "esrecurse": {
1058 | "version": "4.3.0",
1059 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1060 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1061 | "requires": {
1062 | "estraverse": "^5.2.0"
1063 | },
1064 | "dependencies": {
1065 | "estraverse": {
1066 | "version": "5.2.0",
1067 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
1068 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
1069 | }
1070 | }
1071 | },
1072 | "estraverse": {
1073 | "version": "4.3.0",
1074 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1075 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
1076 | },
1077 | "esutils": {
1078 | "version": "2.0.3",
1079 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1080 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
1081 | },
1082 | "etag": {
1083 | "version": "1.8.1",
1084 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1085 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
1086 | },
1087 | "exif-parser": {
1088 | "version": "0.1.12",
1089 | "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
1090 | "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI="
1091 | },
1092 | "express": {
1093 | "version": "4.17.1",
1094 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
1095 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
1096 | "requires": {
1097 | "accepts": "~1.3.7",
1098 | "array-flatten": "1.1.1",
1099 | "body-parser": "1.19.0",
1100 | "content-disposition": "0.5.3",
1101 | "content-type": "~1.0.4",
1102 | "cookie": "0.4.0",
1103 | "cookie-signature": "1.0.6",
1104 | "debug": "2.6.9",
1105 | "depd": "~1.1.2",
1106 | "encodeurl": "~1.0.2",
1107 | "escape-html": "~1.0.3",
1108 | "etag": "~1.8.1",
1109 | "finalhandler": "~1.1.2",
1110 | "fresh": "0.5.2",
1111 | "merge-descriptors": "1.0.1",
1112 | "methods": "~1.1.2",
1113 | "on-finished": "~2.3.0",
1114 | "parseurl": "~1.3.3",
1115 | "path-to-regexp": "0.1.7",
1116 | "proxy-addr": "~2.0.5",
1117 | "qs": "6.7.0",
1118 | "range-parser": "~1.2.1",
1119 | "safe-buffer": "5.1.2",
1120 | "send": "0.17.1",
1121 | "serve-static": "1.14.1",
1122 | "setprototypeof": "1.1.1",
1123 | "statuses": "~1.5.0",
1124 | "type-is": "~1.6.18",
1125 | "utils-merge": "1.0.1",
1126 | "vary": "~1.1.2"
1127 | }
1128 | },
1129 | "fast-deep-equal": {
1130 | "version": "3.1.3",
1131 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1132 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
1133 | },
1134 | "fast-json-stable-stringify": {
1135 | "version": "2.1.0",
1136 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1137 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
1138 | },
1139 | "fast-levenshtein": {
1140 | "version": "2.0.6",
1141 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1142 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
1143 | },
1144 | "file-entry-cache": {
1145 | "version": "6.0.1",
1146 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
1147 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
1148 | "requires": {
1149 | "flat-cache": "^3.0.4"
1150 | }
1151 | },
1152 | "file-type": {
1153 | "version": "9.0.0",
1154 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
1155 | "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw=="
1156 | },
1157 | "finalhandler": {
1158 | "version": "1.1.2",
1159 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
1160 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
1161 | "requires": {
1162 | "debug": "2.6.9",
1163 | "encodeurl": "~1.0.2",
1164 | "escape-html": "~1.0.3",
1165 | "on-finished": "~2.3.0",
1166 | "parseurl": "~1.3.3",
1167 | "statuses": "~1.5.0",
1168 | "unpipe": "~1.0.0"
1169 | }
1170 | },
1171 | "flat-cache": {
1172 | "version": "3.0.4",
1173 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
1174 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
1175 | "requires": {
1176 | "flatted": "^3.1.0",
1177 | "rimraf": "^3.0.2"
1178 | },
1179 | "dependencies": {
1180 | "rimraf": {
1181 | "version": "3.0.2",
1182 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1183 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1184 | "requires": {
1185 | "glob": "^7.1.3"
1186 | }
1187 | }
1188 | }
1189 | },
1190 | "flatted": {
1191 | "version": "3.1.1",
1192 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
1193 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA=="
1194 | },
1195 | "forwarded": {
1196 | "version": "0.1.2",
1197 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
1198 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
1199 | },
1200 | "fresh": {
1201 | "version": "0.5.2",
1202 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1203 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
1204 | },
1205 | "fs-extra": {
1206 | "version": "8.1.0",
1207 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
1208 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
1209 | "requires": {
1210 | "graceful-fs": "^4.2.0",
1211 | "jsonfile": "^4.0.0",
1212 | "universalify": "^0.1.0"
1213 | },
1214 | "dependencies": {
1215 | "jsonfile": {
1216 | "version": "4.0.0",
1217 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
1218 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
1219 | "requires": {
1220 | "graceful-fs": "^4.1.6"
1221 | }
1222 | }
1223 | }
1224 | },
1225 | "fs-minipass": {
1226 | "version": "1.2.7",
1227 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
1228 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
1229 | "requires": {
1230 | "minipass": "^2.6.0"
1231 | }
1232 | },
1233 | "fs.realpath": {
1234 | "version": "1.0.0",
1235 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1236 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
1237 | },
1238 | "functional-red-black-tree": {
1239 | "version": "1.0.1",
1240 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1241 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
1242 | },
1243 | "gauge": {
1244 | "version": "2.7.4",
1245 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
1246 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
1247 | "requires": {
1248 | "aproba": "^1.0.3",
1249 | "console-control-strings": "^1.0.0",
1250 | "has-unicode": "^2.0.0",
1251 | "object-assign": "^4.1.0",
1252 | "signal-exit": "^3.0.0",
1253 | "string-width": "^1.0.1",
1254 | "strip-ansi": "^3.0.1",
1255 | "wide-align": "^1.1.0"
1256 | }
1257 | },
1258 | "gifencoder": {
1259 | "version": "2.0.1",
1260 | "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
1261 | "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==",
1262 | "requires": {
1263 | "canvas": "^2.2.0"
1264 | }
1265 | },
1266 | "gifwrap": {
1267 | "version": "0.9.2",
1268 | "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz",
1269 | "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==",
1270 | "requires": {
1271 | "image-q": "^1.1.1",
1272 | "omggif": "^1.0.10"
1273 | }
1274 | },
1275 | "glob": {
1276 | "version": "7.1.6",
1277 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
1278 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
1279 | "requires": {
1280 | "fs.realpath": "^1.0.0",
1281 | "inflight": "^1.0.4",
1282 | "inherits": "2",
1283 | "minimatch": "^3.0.4",
1284 | "once": "^1.3.0",
1285 | "path-is-absolute": "^1.0.0"
1286 | }
1287 | },
1288 | "glob-parent": {
1289 | "version": "5.1.2",
1290 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1291 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1292 | "requires": {
1293 | "is-glob": "^4.0.1"
1294 | }
1295 | },
1296 | "global": {
1297 | "version": "4.4.0",
1298 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
1299 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
1300 | "requires": {
1301 | "min-document": "^2.19.0",
1302 | "process": "^0.11.10"
1303 | }
1304 | },
1305 | "globals": {
1306 | "version": "13.7.0",
1307 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz",
1308 | "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==",
1309 | "requires": {
1310 | "type-fest": "^0.20.2"
1311 | },
1312 | "dependencies": {
1313 | "type-fest": {
1314 | "version": "0.20.2",
1315 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
1316 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
1317 | }
1318 | }
1319 | },
1320 | "graceful-fs": {
1321 | "version": "4.2.6",
1322 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
1323 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
1324 | },
1325 | "has-flag": {
1326 | "version": "3.0.0",
1327 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1328 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
1329 | },
1330 | "has-unicode": {
1331 | "version": "2.0.1",
1332 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
1333 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
1334 | },
1335 | "http-errors": {
1336 | "version": "1.7.2",
1337 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
1338 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
1339 | "requires": {
1340 | "depd": "~1.1.2",
1341 | "inherits": "2.0.3",
1342 | "setprototypeof": "1.1.1",
1343 | "statuses": ">= 1.5.0 < 2",
1344 | "toidentifier": "1.0.0"
1345 | }
1346 | },
1347 | "iconv-lite": {
1348 | "version": "0.4.24",
1349 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1350 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1351 | "requires": {
1352 | "safer-buffer": ">= 2.1.2 < 3"
1353 | }
1354 | },
1355 | "ieee754": {
1356 | "version": "1.2.1",
1357 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
1358 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
1359 | },
1360 | "ignore": {
1361 | "version": "4.0.6",
1362 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
1363 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
1364 | },
1365 | "ignore-walk": {
1366 | "version": "3.0.3",
1367 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
1368 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
1369 | "requires": {
1370 | "minimatch": "^3.0.4"
1371 | }
1372 | },
1373 | "image-q": {
1374 | "version": "1.1.1",
1375 | "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz",
1376 | "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY="
1377 | },
1378 | "import-fresh": {
1379 | "version": "3.3.0",
1380 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1381 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1382 | "requires": {
1383 | "parent-module": "^1.0.0",
1384 | "resolve-from": "^4.0.0"
1385 | },
1386 | "dependencies": {
1387 | "resolve-from": {
1388 | "version": "4.0.0",
1389 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1390 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
1391 | }
1392 | }
1393 | },
1394 | "imurmurhash": {
1395 | "version": "0.1.4",
1396 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1397 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
1398 | },
1399 | "inflight": {
1400 | "version": "1.0.6",
1401 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1402 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1403 | "requires": {
1404 | "once": "^1.3.0",
1405 | "wrappy": "1"
1406 | }
1407 | },
1408 | "inherits": {
1409 | "version": "2.0.3",
1410 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1411 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1412 | },
1413 | "ini": {
1414 | "version": "1.3.8",
1415 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
1416 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
1417 | },
1418 | "ipaddr.js": {
1419 | "version": "1.9.1",
1420 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1421 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1422 | },
1423 | "is-extglob": {
1424 | "version": "2.1.1",
1425 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1426 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
1427 | },
1428 | "is-fullwidth-code-point": {
1429 | "version": "1.0.0",
1430 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1431 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1432 | "requires": {
1433 | "number-is-nan": "^1.0.0"
1434 | }
1435 | },
1436 | "is-function": {
1437 | "version": "1.0.2",
1438 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
1439 | "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
1440 | },
1441 | "is-glob": {
1442 | "version": "4.0.1",
1443 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1444 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1445 | "requires": {
1446 | "is-extglob": "^2.1.1"
1447 | }
1448 | },
1449 | "isarray": {
1450 | "version": "1.0.0",
1451 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1452 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1453 | },
1454 | "isexe": {
1455 | "version": "2.0.0",
1456 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1457 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
1458 | },
1459 | "jimp": {
1460 | "version": "0.16.1",
1461 | "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz",
1462 | "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==",
1463 | "requires": {
1464 | "@babel/runtime": "^7.7.2",
1465 | "@jimp/custom": "^0.16.1",
1466 | "@jimp/plugins": "^0.16.1",
1467 | "@jimp/types": "^0.16.1",
1468 | "regenerator-runtime": "^0.13.3"
1469 | }
1470 | },
1471 | "jpeg-js": {
1472 | "version": "0.4.2",
1473 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz",
1474 | "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw=="
1475 | },
1476 | "js-tokens": {
1477 | "version": "4.0.0",
1478 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1479 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1480 | },
1481 | "js-yaml": {
1482 | "version": "3.14.1",
1483 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
1484 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
1485 | "requires": {
1486 | "argparse": "^1.0.7",
1487 | "esprima": "^4.0.0"
1488 | }
1489 | },
1490 | "json-schema-traverse": {
1491 | "version": "0.4.1",
1492 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1493 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
1494 | },
1495 | "json-stable-stringify-without-jsonify": {
1496 | "version": "1.0.1",
1497 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1498 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
1499 | },
1500 | "jsonfile": {
1501 | "version": "5.0.0",
1502 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz",
1503 | "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==",
1504 | "requires": {
1505 | "graceful-fs": "^4.1.6",
1506 | "universalify": "^0.1.2"
1507 | }
1508 | },
1509 | "kareem": {
1510 | "version": "2.3.2",
1511 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz",
1512 | "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ=="
1513 | },
1514 | "levn": {
1515 | "version": "0.4.1",
1516 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1517 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1518 | "requires": {
1519 | "prelude-ls": "^1.2.1",
1520 | "type-check": "~0.4.0"
1521 | }
1522 | },
1523 | "load-bmfont": {
1524 | "version": "1.4.1",
1525 | "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz",
1526 | "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==",
1527 | "requires": {
1528 | "buffer-equal": "0.0.1",
1529 | "mime": "^1.3.4",
1530 | "parse-bmfont-ascii": "^1.0.3",
1531 | "parse-bmfont-binary": "^1.0.5",
1532 | "parse-bmfont-xml": "^1.1.4",
1533 | "phin": "^2.9.1",
1534 | "xhr": "^2.0.1",
1535 | "xtend": "^4.0.0"
1536 | }
1537 | },
1538 | "lodash": {
1539 | "version": "4.17.21",
1540 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1541 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
1542 | },
1543 | "lodash.get": {
1544 | "version": "4.4.2",
1545 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
1546 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
1547 | },
1548 | "lodash.isequal": {
1549 | "version": "4.5.0",
1550 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
1551 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
1552 | },
1553 | "lru-cache": {
1554 | "version": "6.0.0",
1555 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1556 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1557 | "requires": {
1558 | "yallist": "^4.0.0"
1559 | },
1560 | "dependencies": {
1561 | "yallist": {
1562 | "version": "4.0.0",
1563 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1564 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1565 | }
1566 | }
1567 | },
1568 | "media-typer": {
1569 | "version": "0.3.0",
1570 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1571 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
1572 | },
1573 | "memory-pager": {
1574 | "version": "1.5.0",
1575 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
1576 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
1577 | "optional": true
1578 | },
1579 | "merge-descriptors": {
1580 | "version": "1.0.1",
1581 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1582 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1583 | },
1584 | "methods": {
1585 | "version": "1.1.2",
1586 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1587 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1588 | },
1589 | "mime": {
1590 | "version": "1.6.0",
1591 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1592 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1593 | },
1594 | "mime-db": {
1595 | "version": "1.45.0",
1596 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
1597 | "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
1598 | },
1599 | "mime-types": {
1600 | "version": "2.1.28",
1601 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
1602 | "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
1603 | "requires": {
1604 | "mime-db": "1.45.0"
1605 | }
1606 | },
1607 | "mimic-response": {
1608 | "version": "2.1.0",
1609 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
1610 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
1611 | },
1612 | "min-document": {
1613 | "version": "2.19.0",
1614 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
1615 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
1616 | "requires": {
1617 | "dom-walk": "^0.1.0"
1618 | }
1619 | },
1620 | "minimatch": {
1621 | "version": "3.0.4",
1622 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1623 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1624 | "requires": {
1625 | "brace-expansion": "^1.1.7"
1626 | }
1627 | },
1628 | "minimist": {
1629 | "version": "1.2.5",
1630 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1631 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1632 | },
1633 | "minipass": {
1634 | "version": "2.9.0",
1635 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
1636 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
1637 | "requires": {
1638 | "safe-buffer": "^5.1.2",
1639 | "yallist": "^3.0.0"
1640 | }
1641 | },
1642 | "minizlib": {
1643 | "version": "1.3.3",
1644 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
1645 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
1646 | "requires": {
1647 | "minipass": "^2.9.0"
1648 | }
1649 | },
1650 | "mkdirp": {
1651 | "version": "0.5.5",
1652 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1653 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1654 | "requires": {
1655 | "minimist": "^1.2.5"
1656 | }
1657 | },
1658 | "mongodb": {
1659 | "version": "3.6.3",
1660 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz",
1661 | "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==",
1662 | "requires": {
1663 | "bl": "^2.2.1",
1664 | "bson": "^1.1.4",
1665 | "denque": "^1.4.1",
1666 | "require_optional": "^1.0.1",
1667 | "safe-buffer": "^5.1.2",
1668 | "saslprep": "^1.0.0"
1669 | }
1670 | },
1671 | "mongoose": {
1672 | "version": "5.11.13",
1673 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.11.13.tgz",
1674 | "integrity": "sha512-rXbaxSJfLnKKO2RTm8MKt65glrtfKDc4ATEb6vEbbzsVGCiLut753K5axdpyvE7KeTH7GOh4LzmuQLOvaaWOmA==",
1675 | "requires": {
1676 | "@types/mongodb": "^3.5.27",
1677 | "bson": "^1.1.4",
1678 | "kareem": "2.3.2",
1679 | "mongodb": "3.6.3",
1680 | "mongoose-legacy-pluralize": "1.0.2",
1681 | "mpath": "0.8.3",
1682 | "mquery": "3.2.3",
1683 | "ms": "2.1.2",
1684 | "regexp-clone": "1.0.0",
1685 | "safe-buffer": "5.2.1",
1686 | "sift": "7.0.1",
1687 | "sliced": "1.0.1"
1688 | },
1689 | "dependencies": {
1690 | "ms": {
1691 | "version": "2.1.2",
1692 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1693 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1694 | },
1695 | "safe-buffer": {
1696 | "version": "5.2.1",
1697 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1698 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1699 | }
1700 | }
1701 | },
1702 | "mongoose-legacy-pluralize": {
1703 | "version": "1.0.2",
1704 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
1705 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
1706 | },
1707 | "mpath": {
1708 | "version": "0.8.3",
1709 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
1710 | "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA=="
1711 | },
1712 | "mquery": {
1713 | "version": "3.2.3",
1714 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.3.tgz",
1715 | "integrity": "sha512-cIfbP4TyMYX+SkaQ2MntD+F2XbqaBHUYWk3j+kqdDztPWok3tgyssOZxMHMtzbV1w9DaSlvEea0Iocuro41A4g==",
1716 | "requires": {
1717 | "bluebird": "3.5.1",
1718 | "debug": "3.1.0",
1719 | "regexp-clone": "^1.0.0",
1720 | "safe-buffer": "5.1.2",
1721 | "sliced": "1.0.1"
1722 | },
1723 | "dependencies": {
1724 | "debug": {
1725 | "version": "3.1.0",
1726 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1727 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1728 | "requires": {
1729 | "ms": "2.0.0"
1730 | }
1731 | }
1732 | }
1733 | },
1734 | "ms": {
1735 | "version": "2.0.0",
1736 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1737 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1738 | },
1739 | "nan": {
1740 | "version": "2.14.2",
1741 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
1742 | "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ=="
1743 | },
1744 | "natural-compare": {
1745 | "version": "1.4.0",
1746 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1747 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
1748 | },
1749 | "needle": {
1750 | "version": "2.6.0",
1751 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz",
1752 | "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==",
1753 | "requires": {
1754 | "debug": "^3.2.6",
1755 | "iconv-lite": "^0.4.4",
1756 | "sax": "^1.2.4"
1757 | },
1758 | "dependencies": {
1759 | "debug": {
1760 | "version": "3.2.7",
1761 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1762 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1763 | "requires": {
1764 | "ms": "^2.1.1"
1765 | }
1766 | },
1767 | "ms": {
1768 | "version": "2.1.3",
1769 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1770 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1771 | }
1772 | }
1773 | },
1774 | "negotiator": {
1775 | "version": "0.6.2",
1776 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1777 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1778 | },
1779 | "node-canvas-with-twemoji": {
1780 | "version": "0.1.6",
1781 | "resolved": "https://registry.npmjs.org/node-canvas-with-twemoji/-/node-canvas-with-twemoji-0.1.6.tgz",
1782 | "integrity": "sha512-i2utagYpQPdLgcjkWlsET7VEq1TFvwYKJ76FeZwGelBBggycejS+3oSf9V//oWZFW7n1GaVLIpMnZoLUuR/0pQ==",
1783 | "requires": {
1784 | "canvas": "^2.6.1",
1785 | "twemoji": "^13.0.1"
1786 | }
1787 | },
1788 | "node-fetch": {
1789 | "version": "2.6.1",
1790 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
1791 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
1792 | },
1793 | "node-pre-gyp": {
1794 | "version": "0.11.0",
1795 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
1796 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
1797 | "requires": {
1798 | "detect-libc": "^1.0.2",
1799 | "mkdirp": "^0.5.1",
1800 | "needle": "^2.2.1",
1801 | "nopt": "^4.0.1",
1802 | "npm-packlist": "^1.1.6",
1803 | "npmlog": "^4.0.2",
1804 | "rc": "^1.2.7",
1805 | "rimraf": "^2.6.1",
1806 | "semver": "^5.3.0",
1807 | "tar": "^4"
1808 | }
1809 | },
1810 | "nopt": {
1811 | "version": "4.0.3",
1812 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
1813 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
1814 | "requires": {
1815 | "abbrev": "1",
1816 | "osenv": "^0.1.4"
1817 | }
1818 | },
1819 | "npm-bundled": {
1820 | "version": "1.1.1",
1821 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
1822 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
1823 | "requires": {
1824 | "npm-normalize-package-bin": "^1.0.1"
1825 | }
1826 | },
1827 | "npm-normalize-package-bin": {
1828 | "version": "1.0.1",
1829 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
1830 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
1831 | },
1832 | "npm-packlist": {
1833 | "version": "1.4.8",
1834 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
1835 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
1836 | "requires": {
1837 | "ignore-walk": "^3.0.1",
1838 | "npm-bundled": "^1.0.1",
1839 | "npm-normalize-package-bin": "^1.0.1"
1840 | }
1841 | },
1842 | "npmlog": {
1843 | "version": "4.1.2",
1844 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
1845 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
1846 | "requires": {
1847 | "are-we-there-yet": "~1.1.2",
1848 | "console-control-strings": "~1.1.0",
1849 | "gauge": "~2.7.3",
1850 | "set-blocking": "~2.0.0"
1851 | }
1852 | },
1853 | "number-is-nan": {
1854 | "version": "1.0.1",
1855 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1856 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
1857 | },
1858 | "object-assign": {
1859 | "version": "4.1.1",
1860 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1861 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1862 | },
1863 | "omggif": {
1864 | "version": "1.0.10",
1865 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
1866 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="
1867 | },
1868 | "on-finished": {
1869 | "version": "2.3.0",
1870 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1871 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1872 | "requires": {
1873 | "ee-first": "1.1.1"
1874 | }
1875 | },
1876 | "once": {
1877 | "version": "1.4.0",
1878 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1879 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1880 | "requires": {
1881 | "wrappy": "1"
1882 | }
1883 | },
1884 | "optionator": {
1885 | "version": "0.9.1",
1886 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
1887 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
1888 | "requires": {
1889 | "deep-is": "^0.1.3",
1890 | "fast-levenshtein": "^2.0.6",
1891 | "levn": "^0.4.1",
1892 | "prelude-ls": "^1.2.1",
1893 | "type-check": "^0.4.0",
1894 | "word-wrap": "^1.2.3"
1895 | }
1896 | },
1897 | "opusscript": {
1898 | "version": "0.0.7",
1899 | "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.7.tgz",
1900 | "integrity": "sha512-DcBadTdYTUuH9zQtepsLjQn4Ll6rs3dmeFvN+SD0ThPnxRBRm/WC1zXWPg+wgAJimB784gdZvUMA57gDP7FdVg==",
1901 | "optional": true
1902 | },
1903 | "os-homedir": {
1904 | "version": "1.0.2",
1905 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1906 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
1907 | },
1908 | "os-tmpdir": {
1909 | "version": "1.0.2",
1910 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1911 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
1912 | },
1913 | "osenv": {
1914 | "version": "0.1.5",
1915 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
1916 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
1917 | "requires": {
1918 | "os-homedir": "^1.0.0",
1919 | "os-tmpdir": "^1.0.0"
1920 | }
1921 | },
1922 | "pako": {
1923 | "version": "1.0.11",
1924 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
1925 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
1926 | },
1927 | "parent-module": {
1928 | "version": "1.0.1",
1929 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1930 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1931 | "requires": {
1932 | "callsites": "^3.0.0"
1933 | }
1934 | },
1935 | "parse-bmfont-ascii": {
1936 | "version": "1.0.6",
1937 | "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
1938 | "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU="
1939 | },
1940 | "parse-bmfont-binary": {
1941 | "version": "1.0.6",
1942 | "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
1943 | "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY="
1944 | },
1945 | "parse-bmfont-xml": {
1946 | "version": "1.1.4",
1947 | "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
1948 | "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
1949 | "requires": {
1950 | "xml-parse-from-string": "^1.0.0",
1951 | "xml2js": "^0.4.5"
1952 | }
1953 | },
1954 | "parse-headers": {
1955 | "version": "2.0.3",
1956 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz",
1957 | "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA=="
1958 | },
1959 | "parseurl": {
1960 | "version": "1.3.3",
1961 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1962 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1963 | },
1964 | "path-is-absolute": {
1965 | "version": "1.0.1",
1966 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1967 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1968 | },
1969 | "path-key": {
1970 | "version": "3.1.1",
1971 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1972 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
1973 | },
1974 | "path-to-regexp": {
1975 | "version": "0.1.7",
1976 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1977 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1978 | },
1979 | "phin": {
1980 | "version": "2.9.3",
1981 | "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
1982 | "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA=="
1983 | },
1984 | "pixelmatch": {
1985 | "version": "4.0.2",
1986 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
1987 | "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=",
1988 | "requires": {
1989 | "pngjs": "^3.0.0"
1990 | }
1991 | },
1992 | "pngjs": {
1993 | "version": "3.4.0",
1994 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
1995 | "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
1996 | },
1997 | "prelude-ls": {
1998 | "version": "1.2.1",
1999 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2000 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
2001 | },
2002 | "process": {
2003 | "version": "0.11.10",
2004 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
2005 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
2006 | },
2007 | "process-nextick-args": {
2008 | "version": "2.0.1",
2009 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2010 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
2011 | },
2012 | "progress": {
2013 | "version": "2.0.3",
2014 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
2015 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
2016 | },
2017 | "proxy-addr": {
2018 | "version": "2.0.6",
2019 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
2020 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
2021 | "requires": {
2022 | "forwarded": "~0.1.2",
2023 | "ipaddr.js": "1.9.1"
2024 | }
2025 | },
2026 | "punycode": {
2027 | "version": "2.1.1",
2028 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2029 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
2030 | },
2031 | "qs": {
2032 | "version": "6.7.0",
2033 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
2034 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
2035 | },
2036 | "querystring": {
2037 | "version": "0.2.0",
2038 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
2039 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
2040 | },
2041 | "range-parser": {
2042 | "version": "1.2.1",
2043 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
2044 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
2045 | },
2046 | "raw-body": {
2047 | "version": "2.4.0",
2048 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
2049 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
2050 | "requires": {
2051 | "bytes": "3.1.0",
2052 | "http-errors": "1.7.2",
2053 | "iconv-lite": "0.4.24",
2054 | "unpipe": "1.0.0"
2055 | }
2056 | },
2057 | "rc": {
2058 | "version": "1.2.8",
2059 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
2060 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
2061 | "requires": {
2062 | "deep-extend": "^0.6.0",
2063 | "ini": "~1.3.0",
2064 | "minimist": "^1.2.0",
2065 | "strip-json-comments": "~2.0.1"
2066 | }
2067 | },
2068 | "readable-stream": {
2069 | "version": "2.3.7",
2070 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
2071 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
2072 | "requires": {
2073 | "core-util-is": "~1.0.0",
2074 | "inherits": "~2.0.3",
2075 | "isarray": "~1.0.0",
2076 | "process-nextick-args": "~2.0.0",
2077 | "safe-buffer": "~5.1.1",
2078 | "string_decoder": "~1.1.1",
2079 | "util-deprecate": "~1.0.1"
2080 | }
2081 | },
2082 | "regenerator-runtime": {
2083 | "version": "0.13.7",
2084 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
2085 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
2086 | },
2087 | "regexp-clone": {
2088 | "version": "1.0.0",
2089 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
2090 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
2091 | },
2092 | "regexpp": {
2093 | "version": "3.1.0",
2094 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
2095 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q=="
2096 | },
2097 | "require-from-string": {
2098 | "version": "2.0.2",
2099 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
2100 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
2101 | },
2102 | "require_optional": {
2103 | "version": "1.0.1",
2104 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
2105 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
2106 | "requires": {
2107 | "resolve-from": "^2.0.0",
2108 | "semver": "^5.1.0"
2109 | }
2110 | },
2111 | "resolve-from": {
2112 | "version": "2.0.0",
2113 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
2114 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
2115 | },
2116 | "rimraf": {
2117 | "version": "2.7.1",
2118 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
2119 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
2120 | "requires": {
2121 | "glob": "^7.1.3"
2122 | }
2123 | },
2124 | "safe-buffer": {
2125 | "version": "5.1.2",
2126 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2127 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
2128 | },
2129 | "safer-buffer": {
2130 | "version": "2.1.2",
2131 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2132 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
2133 | },
2134 | "saslprep": {
2135 | "version": "1.0.3",
2136 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
2137 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
2138 | "optional": true,
2139 | "requires": {
2140 | "sparse-bitfield": "^3.0.3"
2141 | }
2142 | },
2143 | "sax": {
2144 | "version": "1.2.4",
2145 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
2146 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
2147 | },
2148 | "semver": {
2149 | "version": "5.7.1",
2150 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2151 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
2152 | },
2153 | "send": {
2154 | "version": "0.17.1",
2155 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
2156 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
2157 | "requires": {
2158 | "debug": "2.6.9",
2159 | "depd": "~1.1.2",
2160 | "destroy": "~1.0.4",
2161 | "encodeurl": "~1.0.2",
2162 | "escape-html": "~1.0.3",
2163 | "etag": "~1.8.1",
2164 | "fresh": "0.5.2",
2165 | "http-errors": "~1.7.2",
2166 | "mime": "1.6.0",
2167 | "ms": "2.1.1",
2168 | "on-finished": "~2.3.0",
2169 | "range-parser": "~1.2.1",
2170 | "statuses": "~1.5.0"
2171 | },
2172 | "dependencies": {
2173 | "ms": {
2174 | "version": "2.1.1",
2175 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
2176 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
2177 | }
2178 | }
2179 | },
2180 | "serve-static": {
2181 | "version": "1.14.1",
2182 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
2183 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
2184 | "requires": {
2185 | "encodeurl": "~1.0.2",
2186 | "escape-html": "~1.0.3",
2187 | "parseurl": "~1.3.3",
2188 | "send": "0.17.1"
2189 | }
2190 | },
2191 | "set-blocking": {
2192 | "version": "2.0.0",
2193 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2194 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
2195 | },
2196 | "setprototypeof": {
2197 | "version": "1.1.1",
2198 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
2199 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
2200 | },
2201 | "shebang-command": {
2202 | "version": "2.0.0",
2203 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2204 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2205 | "requires": {
2206 | "shebang-regex": "^3.0.0"
2207 | }
2208 | },
2209 | "shebang-regex": {
2210 | "version": "3.0.0",
2211 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2212 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
2213 | },
2214 | "sift": {
2215 | "version": "7.0.1",
2216 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
2217 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
2218 | },
2219 | "signal-exit": {
2220 | "version": "3.0.3",
2221 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
2222 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
2223 | },
2224 | "simple-concat": {
2225 | "version": "1.0.1",
2226 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
2227 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
2228 | },
2229 | "simple-get": {
2230 | "version": "3.1.0",
2231 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
2232 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
2233 | "requires": {
2234 | "decompress-response": "^4.2.0",
2235 | "once": "^1.3.1",
2236 | "simple-concat": "^1.0.0"
2237 | }
2238 | },
2239 | "slice-ansi": {
2240 | "version": "4.0.0",
2241 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
2242 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
2243 | "requires": {
2244 | "ansi-styles": "^4.0.0",
2245 | "astral-regex": "^2.0.0",
2246 | "is-fullwidth-code-point": "^3.0.0"
2247 | },
2248 | "dependencies": {
2249 | "ansi-styles": {
2250 | "version": "4.3.0",
2251 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2252 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2253 | "requires": {
2254 | "color-convert": "^2.0.1"
2255 | }
2256 | },
2257 | "color-convert": {
2258 | "version": "2.0.1",
2259 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2260 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2261 | "requires": {
2262 | "color-name": "~1.1.4"
2263 | }
2264 | },
2265 | "color-name": {
2266 | "version": "1.1.4",
2267 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2268 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
2269 | },
2270 | "is-fullwidth-code-point": {
2271 | "version": "3.0.0",
2272 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2273 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
2274 | }
2275 | }
2276 | },
2277 | "sliced": {
2278 | "version": "1.0.1",
2279 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
2280 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
2281 | },
2282 | "sparse-bitfield": {
2283 | "version": "3.0.3",
2284 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
2285 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
2286 | "optional": true,
2287 | "requires": {
2288 | "memory-pager": "^1.0.2"
2289 | }
2290 | },
2291 | "sprintf-js": {
2292 | "version": "1.0.3",
2293 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2294 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
2295 | },
2296 | "statuses": {
2297 | "version": "1.5.0",
2298 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
2299 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
2300 | },
2301 | "string-width": {
2302 | "version": "1.0.2",
2303 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
2304 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
2305 | "requires": {
2306 | "code-point-at": "^1.0.0",
2307 | "is-fullwidth-code-point": "^1.0.0",
2308 | "strip-ansi": "^3.0.0"
2309 | }
2310 | },
2311 | "string_decoder": {
2312 | "version": "1.1.1",
2313 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2314 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2315 | "requires": {
2316 | "safe-buffer": "~5.1.0"
2317 | }
2318 | },
2319 | "strip-ansi": {
2320 | "version": "3.0.1",
2321 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2322 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2323 | "requires": {
2324 | "ansi-regex": "^2.0.0"
2325 | }
2326 | },
2327 | "strip-json-comments": {
2328 | "version": "2.0.1",
2329 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2330 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
2331 | },
2332 | "supports-color": {
2333 | "version": "5.5.0",
2334 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2335 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2336 | "requires": {
2337 | "has-flag": "^3.0.0"
2338 | }
2339 | },
2340 | "swagger-jsdoc": {
2341 | "version": "6.0.1",
2342 | "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.0.1.tgz",
2343 | "integrity": "sha512-Rpyq3aMR3wlLie9syaLRwF7WmWHNvSXRBzqn4P45rdJ1tXGIxFBeKRQG/Y/1YmBh3BmK6ds29CMavzDLWqRlpw==",
2344 | "requires": {
2345 | "commander": "6.2.0",
2346 | "doctrine": "3.0.0",
2347 | "glob": "7.1.6",
2348 | "swagger-parser": "10.0.2",
2349 | "yaml": "2.0.0-1"
2350 | }
2351 | },
2352 | "swagger-parser": {
2353 | "version": "10.0.2",
2354 | "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.2.tgz",
2355 | "integrity": "sha512-9jHkHM+QXyLGFLk1DkXBwV+4HyNm0Za3b8/zk/+mjr8jgOSiqm3FOTHBSDsBjtn9scdL+8eWcHdupp2NLM8tDw==",
2356 | "requires": {
2357 | "@apidevtools/swagger-parser": "10.0.2"
2358 | }
2359 | },
2360 | "swagger-ui-dist": {
2361 | "version": "3.40.0",
2362 | "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.40.0.tgz",
2363 | "integrity": "sha512-R0eaS61/cOE6wiFOY7AtmoTBV5lZqmyosuE14G9nAudp5MNsNfCTdI9MWJLs8iF28HXdtH8EACiFFtUbQomHog=="
2364 | },
2365 | "swagger-ui-express": {
2366 | "version": "4.1.6",
2367 | "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.6.tgz",
2368 | "integrity": "sha512-Xs2BGGudvDBtL7RXcYtNvHsFtP1DBFPMJFRxHe5ez/VG/rzVOEjazJOOSc/kSCyxreCTKfJrII6MJlL9a6t8vw==",
2369 | "requires": {
2370 | "swagger-ui-dist": "^3.18.1"
2371 | }
2372 | },
2373 | "table": {
2374 | "version": "6.0.7",
2375 | "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
2376 | "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
2377 | "requires": {
2378 | "ajv": "^7.0.2",
2379 | "lodash": "^4.17.20",
2380 | "slice-ansi": "^4.0.0",
2381 | "string-width": "^4.2.0"
2382 | },
2383 | "dependencies": {
2384 | "ajv": {
2385 | "version": "7.2.1",
2386 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
2387 | "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
2388 | "requires": {
2389 | "fast-deep-equal": "^3.1.1",
2390 | "json-schema-traverse": "^1.0.0",
2391 | "require-from-string": "^2.0.2",
2392 | "uri-js": "^4.2.2"
2393 | }
2394 | },
2395 | "ansi-regex": {
2396 | "version": "5.0.0",
2397 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
2398 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
2399 | },
2400 | "is-fullwidth-code-point": {
2401 | "version": "3.0.0",
2402 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2403 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
2404 | },
2405 | "json-schema-traverse": {
2406 | "version": "1.0.0",
2407 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
2408 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
2409 | },
2410 | "string-width": {
2411 | "version": "4.2.2",
2412 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
2413 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
2414 | "requires": {
2415 | "emoji-regex": "^8.0.0",
2416 | "is-fullwidth-code-point": "^3.0.0",
2417 | "strip-ansi": "^6.0.0"
2418 | }
2419 | },
2420 | "strip-ansi": {
2421 | "version": "6.0.0",
2422 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2423 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2424 | "requires": {
2425 | "ansi-regex": "^5.0.0"
2426 | }
2427 | }
2428 | }
2429 | },
2430 | "tar": {
2431 | "version": "4.4.13",
2432 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
2433 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
2434 | "requires": {
2435 | "chownr": "^1.1.1",
2436 | "fs-minipass": "^1.2.5",
2437 | "minipass": "^2.8.6",
2438 | "minizlib": "^1.2.1",
2439 | "mkdirp": "^0.5.0",
2440 | "safe-buffer": "^5.1.2",
2441 | "yallist": "^3.0.3"
2442 | }
2443 | },
2444 | "text-table": {
2445 | "version": "0.2.0",
2446 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2447 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
2448 | },
2449 | "timm": {
2450 | "version": "1.7.1",
2451 | "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
2452 | "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw=="
2453 | },
2454 | "tinycolor2": {
2455 | "version": "1.4.2",
2456 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
2457 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
2458 | },
2459 | "toidentifier": {
2460 | "version": "1.0.0",
2461 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
2462 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
2463 | },
2464 | "tweetnacl": {
2465 | "version": "1.0.3",
2466 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
2467 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
2468 | "optional": true
2469 | },
2470 | "twemoji": {
2471 | "version": "13.0.2",
2472 | "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-13.0.2.tgz",
2473 | "integrity": "sha512-R9tDS4pEVczjVYM5SvoAJ0AcZ4EgG1h3yw1oi1m/yrXOH17OOjaaRxZU4r5TIHEy3xYbuZQLB/tJZyC6rpQVmA==",
2474 | "requires": {
2475 | "fs-extra": "^8.0.1",
2476 | "jsonfile": "^5.0.0",
2477 | "twemoji-parser": "13.0.0",
2478 | "universalify": "^0.1.2"
2479 | }
2480 | },
2481 | "twemoji-parser": {
2482 | "version": "13.0.0",
2483 | "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-13.0.0.tgz",
2484 | "integrity": "sha512-zMaGdskpH8yKjT2RSE/HwE340R4Fm+fbie4AaqjDa4H/l07YUmAvxkSfNl6awVWNRRQ0zdzLQ8SAJZuY5MgstQ=="
2485 | },
2486 | "type-check": {
2487 | "version": "0.4.0",
2488 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2489 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2490 | "requires": {
2491 | "prelude-ls": "^1.2.1"
2492 | }
2493 | },
2494 | "type-fest": {
2495 | "version": "0.8.1",
2496 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
2497 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
2498 | },
2499 | "type-is": {
2500 | "version": "1.6.18",
2501 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
2502 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
2503 | "requires": {
2504 | "media-typer": "0.3.0",
2505 | "mime-types": "~2.1.24"
2506 | }
2507 | },
2508 | "universalify": {
2509 | "version": "0.1.2",
2510 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
2511 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
2512 | },
2513 | "unpipe": {
2514 | "version": "1.0.0",
2515 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2516 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
2517 | },
2518 | "uri-js": {
2519 | "version": "4.4.1",
2520 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2521 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2522 | "requires": {
2523 | "punycode": "^2.1.0"
2524 | }
2525 | },
2526 | "utif": {
2527 | "version": "2.0.1",
2528 | "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
2529 | "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
2530 | "requires": {
2531 | "pako": "^1.0.5"
2532 | }
2533 | },
2534 | "util-deprecate": {
2535 | "version": "1.0.2",
2536 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2537 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2538 | },
2539 | "utils-merge": {
2540 | "version": "1.0.1",
2541 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2542 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
2543 | },
2544 | "v8-compile-cache": {
2545 | "version": "2.3.0",
2546 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
2547 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
2548 | },
2549 | "validator": {
2550 | "version": "12.2.0",
2551 | "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz",
2552 | "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ=="
2553 | },
2554 | "vary": {
2555 | "version": "1.1.2",
2556 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2557 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
2558 | },
2559 | "which": {
2560 | "version": "2.0.2",
2561 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2562 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2563 | "requires": {
2564 | "isexe": "^2.0.0"
2565 | }
2566 | },
2567 | "wide-align": {
2568 | "version": "1.1.3",
2569 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
2570 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
2571 | "requires": {
2572 | "string-width": "^1.0.2 || 2"
2573 | }
2574 | },
2575 | "word-wrap": {
2576 | "version": "1.2.3",
2577 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
2578 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
2579 | },
2580 | "wrappy": {
2581 | "version": "1.0.2",
2582 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2583 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
2584 | },
2585 | "ws": {
2586 | "version": "7.4.3",
2587 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz",
2588 | "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA=="
2589 | },
2590 | "xhr": {
2591 | "version": "2.6.0",
2592 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
2593 | "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
2594 | "requires": {
2595 | "global": "~4.4.0",
2596 | "is-function": "^1.0.1",
2597 | "parse-headers": "^2.0.0",
2598 | "xtend": "^4.0.0"
2599 | }
2600 | },
2601 | "xml-parse-from-string": {
2602 | "version": "1.0.1",
2603 | "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
2604 | "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig="
2605 | },
2606 | "xml2js": {
2607 | "version": "0.4.23",
2608 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
2609 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
2610 | "requires": {
2611 | "sax": ">=0.6.0",
2612 | "xmlbuilder": "~11.0.0"
2613 | }
2614 | },
2615 | "xmlbuilder": {
2616 | "version": "11.0.1",
2617 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
2618 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
2619 | },
2620 | "xtend": {
2621 | "version": "4.0.2",
2622 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2623 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
2624 | },
2625 | "yallist": {
2626 | "version": "3.1.1",
2627 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2628 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
2629 | },
2630 | "yaml": {
2631 | "version": "2.0.0-1",
2632 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz",
2633 | "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ=="
2634 | },
2635 | "z-schema": {
2636 | "version": "4.2.3",
2637 | "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz",
2638 | "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==",
2639 | "requires": {
2640 | "commander": "^2.7.1",
2641 | "lodash.get": "^4.4.2",
2642 | "lodash.isequal": "^4.5.0",
2643 | "validator": "^12.0.0"
2644 | },
2645 | "dependencies": {
2646 | "commander": {
2647 | "version": "2.20.3",
2648 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
2649 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
2650 | "optional": true
2651 | }
2652 | }
2653 | }
2654 | }
2655 | }
2656 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api",
3 | "version": "1.0.1",
4 | "description": "api.monke.vip",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index.js"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/MonkeDev/API.git"
12 | },
13 | "author": "MonkeDev",
14 | "license": "ISC",
15 | "bugs": {
16 | "url": "https://github.com/MonkeDev/API/issues"
17 | },
18 | "homepage": "https://github.com/MonkeDev/API#readme",
19 | "dependencies": {
20 | "body-parser": "^1.19.0",
21 | "canvas": "^2.6.1",
22 | "cors": "^2.8.5",
23 | "dotenv": "^8.2.0",
24 | "eris": "^0.14.0",
25 | "eslint": "^7.22.0",
26 | "express": "^4.17.1",
27 | "gifencoder": "^2.0.1",
28 | "jimp": "^0.16.1",
29 | "mongoose": "^5.11.13",
30 | "node-canvas-with-twemoji": "^0.1.6",
31 | "node-fetch": "^2.6.1",
32 | "querystring": "^0.2.0",
33 | "swagger-jsdoc": "^6.0.1",
34 | "swagger-ui-express": "^4.1.6"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/util/RateLimiter.js:
--------------------------------------------------------------------------------
1 | const endPoints = new Map();
2 | const costlyEndPoints = [
3 | {
4 | path: '/fun/chat',
5 | cost: 7
6 | }
7 | ]
8 |
9 | module.exports = async (req, res, next) => {
10 |
11 | const s = process.s;
12 |
13 | if(req.originalUrl.startsWith('/docs') || req.originalUrl == '/' || req.originalUrl == '/favicon.ico') return next();
14 |
15 | const key = req.urlParams.key;
16 | const endPoint = req.originalUrl.split('?')[0];
17 |
18 | if(key) {
19 | const keyData = await s.getKey(key);
20 | if(!keyData) return res.json({error: true, message: 'An invalid key was givin.'});
21 | keyData.stats.total++;
22 |
23 |
24 | if(keyData.ratelimit.used > keyData.ratelimit.max) {
25 | return res.json({error: true, message: `You have been ratelimited (${keyData.ratelimit.max}/m), If you want this number higher join our discord server and ask! (https://monkedev.com/r/discord)`});
26 | } else {
27 |
28 | let amount = 1;
29 | if(costlyEndPoints.map(x => x.path).includes(req.path)) {
30 | amount = costlyEndPoints.find(x => x.path == req.path).cost;
31 | };
32 |
33 | keyData.ratelimit.used += amount;
34 | setTimeout(() => {
35 | keyData.ratelimit.used -= amount;
36 | }, 60 * 1000);
37 |
38 | }
39 |
40 | req.keyData = keyData;
41 |
42 | } else {
43 | let endData = await endPoints.get(endPoint);
44 | if(!endData) {
45 | endPoints.set(endPoint, { max: 100, used: 0 });
46 | endData = await endPoints.get(endPoint);
47 | }
48 |
49 | if(endData.used > endData.max) {
50 | return res.json({error: true, message: `This endPoint is at its max of ${endData.max} request per minute, You can use a API key to bypass this. Join our discord server (https://monkedev.com/r/discord) to get your key for FREE.`});
51 | } else {
52 | let amount = 1;
53 | if(costlyEndPoints.map(x => x.path).includes(req.path)) {
54 | amount = costlyEndPoints.find(x => x.path == req.path).cost;
55 | };
56 | endData.used += amount;
57 | setTimeout(() => {
58 | endData.used -= amount;
59 | }, 60 * 1000);
60 | }
61 |
62 | req.endPoints = endPoints;
63 |
64 | }
65 |
66 |
67 |
68 |
69 | next();
70 |
71 | };
--------------------------------------------------------------------------------
/util/Stats.js:
--------------------------------------------------------------------------------
1 | const { request, response } = require('express');
2 | const stats = require('../Database/Schema').stats;
3 |
4 | /**
5 | *
6 | * @param {request} req
7 | * @param {response} res
8 | * @param {*} mext
9 | */
10 | module.exports = async (req, res, next) => {
11 | next();
12 |
13 | if(!process.info) process.info = { total: 0 };
14 | process.info.total++;
15 |
16 | await stats.updateOne({id: 'me'}, { $inc: { allTime: 1 } });
17 | };
--------------------------------------------------------------------------------