├── .env ├── Dockerfile ├── README.md ├── app.json ├── index.js ├── package-lock.json ├── package.json ├── render.yaml └── static ├── 404.html ├── assets ├── css │ └── style.css ├── images │ └── branding │ │ └── favicon.png └── js │ ├── go.js │ └── index.js ├── go.html ├── index.html ├── loading.html ├── sw.js ├── uv.sw-handler.js └── uv ├── uv.bundle.js ├── uv.config.js ├── uv.handler.js └── uv.sw.js /.env: -------------------------------------------------------------------------------- 1 | PORT=8080 -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | 3 | FROM node:19-bullseye 4 | ENV NODE_ENV=production 5 | 6 | WORKDIR /app 7 | 8 | COPY ["package.json", "package-lock.json*", "./"] 9 | 10 | RUN npm install 11 | 12 | COPY . . 13 | 14 | CMD [ "node", "index.js" ] 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # 🚀 P45 🚀 4 | 5 | Access the web and unblock sites with ease using this proxy website! Say goodbye to frustratingly slow loading times and pesky censorship filters. 6 | 7 |
8 | 9 | ## Usage 🛠️ 10 | You can deploy the tool on [render](https://dashboard.render.com/select-repo?type=web). To run the webapp locally, use the following commands: 11 | ```bash 12 | $ git clone https://github.com/AbdulRKB/P45.git 13 | $ cd P45 14 | $ npm install 15 | $ node index.js 16 | ``` 17 | 18 | You can also use docker to run locally: 19 | ```bash 20 | $ docker build -t pfortyfive:latest . 21 | $ docker run -p 8080:8080 pfortyfive:latest 22 | ``` 23 | 24 | `default port: 8080` 25 | 26 | ## Functions 27 | 28 | - Zero Ads/Tracking 🚫👀 29 | - User-friendly Interface 😊 30 | - Privacy Maintained 🔒 31 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "P45", 3 | "description": "P45", 4 | "repository": "https://github.com/AbdulRKB/P45", 5 | "logo": "assets/images/branding/favicon.png", 6 | "keywords": ["P45", "proxy", "www"] 7 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import cluster from "cluster"; 2 | import os from "os"; 3 | import express from "express"; 4 | import http from "node:http"; 5 | import createBareServer from "@tomphttp/bare-server-node"; 6 | import path from "node:path"; 7 | import * as dotenv from "dotenv"; 8 | dotenv.config(); 9 | 10 | const __dirname = process.cwd(); 11 | 12 | // Increase max sockets to 1000 13 | http.globalAgent.maxSockets = 1000; 14 | 15 | if (cluster.isMaster) { 16 | const numCPUs = os.cpus().length; 17 | console.log(`Master process running with PID ${process.pid}`); 18 | 19 | // Fork worker processes 20 | for (let i = 0; i < numCPUs; i++) { 21 | cluster.fork(); 22 | } 23 | 24 | // Handle worker exit events 25 | cluster.on("exit", (worker, code, signal) => { 26 | console.log( 27 | `Worker ${worker.process.pid} died with code ${code} and signal ${signal}` 28 | ); 29 | console.log("Forking a new worker..."); 30 | cluster.fork(); 31 | }); 32 | } else { 33 | const server = http.createServer(); 34 | const app = express(server); 35 | const bareServer = createBareServer("/bare/"); 36 | 37 | // Serve static files with caching 38 | const staticOptions = { 39 | maxAge: "1d", 40 | setHeaders: (res, path) => { 41 | if (path.endsWith(".html")) { 42 | res.setHeader("Cache-Control", "no-cache"); 43 | } else { 44 | res.setHeader("Cache-Control", "public, max-age=86400"); 45 | } 46 | }, 47 | }; 48 | app.use(express.static(path.join(__dirname, "static"), staticOptions)); 49 | 50 | app.use(express.json()); 51 | app.use( 52 | express.urlencoded({ 53 | extended: true, 54 | }) 55 | ); 56 | 57 | // Define routes 58 | const routes = [ 59 | { path: "/", file: "web.html" }, 60 | { path: "/go", file: "go.html" }, 61 | { path: "/404", file: "404.html" }, 62 | ]; 63 | 64 | // Define routes using the routes array 65 | routes.forEach((route) => { 66 | app.get(route.path, (req, res) => { 67 | res.sendFile(path.join(__dirname, "static", route.file)); 68 | }); 69 | }); 70 | 71 | // Catch-all route 72 | app.get("/*", (req, res) => { 73 | res.redirect("/404"); 74 | }); 75 | 76 | // Bare Server 77 | server.on("request", (req, res) => { 78 | if (bareServer.shouldRoute(req)) { 79 | bareServer.routeRequest(req, res); 80 | } else { 81 | app(req, res); 82 | } 83 | }); 84 | 85 | server.on("upgrade", (req, socket, head) => { 86 | if (bareServer.shouldRoute(req)) { 87 | bareServer.routeUpgrade(req, socket, head); 88 | } else { 89 | socket.end(); 90 | } 91 | }); 92 | 93 | server.listen({ 94 | port: process.env.PORT, 95 | }); 96 | 97 | console.log(`Worker process running with PID ${process.pid}`); 98 | } 99 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "PFortyFive", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "PFortyFive", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "@titaniumnetwork-dev/ultraviolet": "^1.0.10", 12 | "@tomphttp/bare-server-node": "^1.2.5", 13 | "express": "^4.18.2" 14 | }, 15 | "devDependencies": { 16 | "eslint": "^8.36.0", 17 | "prettier": "^2.8.4" 18 | }, 19 | "engines": { 20 | "node": ">=16.0.0", 21 | "npm": ">=7.0.0" 22 | } 23 | }, 24 | "node_modules/@eslint-community/eslint-utils": { 25 | "version": "4.4.0", 26 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 27 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 28 | "dev": true, 29 | "dependencies": { 30 | "eslint-visitor-keys": "^3.3.0" 31 | }, 32 | "engines": { 33 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 34 | }, 35 | "peerDependencies": { 36 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 37 | } 38 | }, 39 | "node_modules/@eslint-community/regexpp": { 40 | "version": "4.5.0", 41 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", 42 | "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", 43 | "dev": true, 44 | "engines": { 45 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 46 | } 47 | }, 48 | "node_modules/@eslint/eslintrc": { 49 | "version": "2.0.2", 50 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", 51 | "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", 52 | "dev": true, 53 | "dependencies": { 54 | "ajv": "^6.12.4", 55 | "debug": "^4.3.2", 56 | "espree": "^9.5.1", 57 | "globals": "^13.19.0", 58 | "ignore": "^5.2.0", 59 | "import-fresh": "^3.2.1", 60 | "js-yaml": "^4.1.0", 61 | "minimatch": "^3.1.2", 62 | "strip-json-comments": "^3.1.1" 63 | }, 64 | "engines": { 65 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 66 | }, 67 | "funding": { 68 | "url": "https://opencollective.com/eslint" 69 | } 70 | }, 71 | "node_modules/@eslint/js": { 72 | "version": "8.38.0", 73 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", 74 | "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", 75 | "dev": true, 76 | "engines": { 77 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 78 | } 79 | }, 80 | "node_modules/@humanwhocodes/config-array": { 81 | "version": "0.11.8", 82 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", 83 | "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", 84 | "dev": true, 85 | "dependencies": { 86 | "@humanwhocodes/object-schema": "^1.2.1", 87 | "debug": "^4.1.1", 88 | "minimatch": "^3.0.5" 89 | }, 90 | "engines": { 91 | "node": ">=10.10.0" 92 | } 93 | }, 94 | "node_modules/@humanwhocodes/module-importer": { 95 | "version": "1.0.1", 96 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 97 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 98 | "dev": true, 99 | "engines": { 100 | "node": ">=12.22" 101 | }, 102 | "funding": { 103 | "type": "github", 104 | "url": "https://github.com/sponsors/nzakas" 105 | } 106 | }, 107 | "node_modules/@humanwhocodes/object-schema": { 108 | "version": "1.2.1", 109 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 110 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 111 | "dev": true 112 | }, 113 | "node_modules/@nodelib/fs.scandir": { 114 | "version": "2.1.5", 115 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 116 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 117 | "dev": true, 118 | "dependencies": { 119 | "@nodelib/fs.stat": "2.0.5", 120 | "run-parallel": "^1.1.9" 121 | }, 122 | "engines": { 123 | "node": ">= 8" 124 | } 125 | }, 126 | "node_modules/@nodelib/fs.stat": { 127 | "version": "2.0.5", 128 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 129 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 130 | "dev": true, 131 | "engines": { 132 | "node": ">= 8" 133 | } 134 | }, 135 | "node_modules/@nodelib/fs.walk": { 136 | "version": "1.2.8", 137 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 138 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 139 | "dev": true, 140 | "dependencies": { 141 | "@nodelib/fs.scandir": "2.1.5", 142 | "fastq": "^1.6.0" 143 | }, 144 | "engines": { 145 | "node": ">= 8" 146 | } 147 | }, 148 | "node_modules/@titaniumnetwork-dev/ultraviolet": { 149 | "version": "1.0.11", 150 | "resolved": "https://registry.npmjs.org/@titaniumnetwork-dev/ultraviolet/-/ultraviolet-1.0.11.tgz", 151 | "integrity": "sha512-FJtZw/xQubrgk8pJLs5wx9k6okCGZPR7FXWXTiL5wOiCvjqgDQCmHBTb7M5eYqnQil05tbaz92+16Ki/7rRWIw==", 152 | "dependencies": { 153 | "@tomphttp/bare-client": "^1.1.2-beta.3", 154 | "css-tree": "^2.0.4", 155 | "esotope-hammerhead": "^0.6.1", 156 | "events": "^3.3.0", 157 | "idb": "^7.1.1", 158 | "meriyah": "^4.3.3", 159 | "mime-db": "^1.51.0", 160 | "parse5": "^7.1.2", 161 | "set-cookie-parser": "^2.4.8" 162 | } 163 | }, 164 | "node_modules/@tomphttp/bare-client": { 165 | "version": "1.1.2-beta.3", 166 | "resolved": "https://registry.npmjs.org/@tomphttp/bare-client/-/bare-client-1.1.2-beta.3.tgz", 167 | "integrity": "sha512-WyIVnSAqzfrLejmOhh/l/LtDOeK+SHnBGi/z+QyliVP1T1JxoNE5eecwxlV+osM9J6FTAYVGNHr8/5bubaIj6Q==" 168 | }, 169 | "node_modules/@tomphttp/bare-server-node": { 170 | "version": "1.2.5", 171 | "resolved": "https://registry.npmjs.org/@tomphttp/bare-server-node/-/bare-server-node-1.2.5.tgz", 172 | "integrity": "sha512-qe76XM3nhDLDSIDZ0tblUsiBdgcqakjvBmXgrarXBH/Wul5AtE3BnK+/j7+BWEwJNZfgwL8uGL8IJjVG/iZH1A==", 173 | "dependencies": { 174 | "async-exit-hook": "^2.0.1", 175 | "commander": "^9.4.1", 176 | "dotenv": "^16.0.3", 177 | "headers-polyfill": "^3.1.2", 178 | "http-errors": "^2.0.0", 179 | "ipaddr.js": "^2.0.1", 180 | "source-map-support": "^0.5.21" 181 | }, 182 | "bin": { 183 | "bare-server-node": "bin.js" 184 | }, 185 | "engines": { 186 | "node": ">=18.0.0" 187 | } 188 | }, 189 | "node_modules/@types/estree": { 190 | "version": "0.0.46", 191 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", 192 | "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" 193 | }, 194 | "node_modules/accepts": { 195 | "version": "1.3.8", 196 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 197 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 198 | "dependencies": { 199 | "mime-types": "~2.1.34", 200 | "negotiator": "0.6.3" 201 | }, 202 | "engines": { 203 | "node": ">= 0.6" 204 | } 205 | }, 206 | "node_modules/acorn": { 207 | "version": "8.8.2", 208 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 209 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 210 | "dev": true, 211 | "bin": { 212 | "acorn": "bin/acorn" 213 | }, 214 | "engines": { 215 | "node": ">=0.4.0" 216 | } 217 | }, 218 | "node_modules/acorn-jsx": { 219 | "version": "5.3.2", 220 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 221 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 222 | "dev": true, 223 | "peerDependencies": { 224 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 225 | } 226 | }, 227 | "node_modules/ajv": { 228 | "version": "6.12.6", 229 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 230 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 231 | "dev": true, 232 | "dependencies": { 233 | "fast-deep-equal": "^3.1.1", 234 | "fast-json-stable-stringify": "^2.0.0", 235 | "json-schema-traverse": "^0.4.1", 236 | "uri-js": "^4.2.2" 237 | }, 238 | "funding": { 239 | "type": "github", 240 | "url": "https://github.com/sponsors/epoberezkin" 241 | } 242 | }, 243 | "node_modules/ansi-regex": { 244 | "version": "5.0.1", 245 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 246 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 247 | "dev": true, 248 | "engines": { 249 | "node": ">=8" 250 | } 251 | }, 252 | "node_modules/ansi-styles": { 253 | "version": "4.3.0", 254 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 255 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 256 | "dev": true, 257 | "dependencies": { 258 | "color-convert": "^2.0.1" 259 | }, 260 | "engines": { 261 | "node": ">=8" 262 | }, 263 | "funding": { 264 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 265 | } 266 | }, 267 | "node_modules/argparse": { 268 | "version": "2.0.1", 269 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 270 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 271 | "dev": true 272 | }, 273 | "node_modules/array-flatten": { 274 | "version": "1.1.1", 275 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 276 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 277 | }, 278 | "node_modules/async-exit-hook": { 279 | "version": "2.0.1", 280 | "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", 281 | "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", 282 | "engines": { 283 | "node": ">=0.12.0" 284 | } 285 | }, 286 | "node_modules/balanced-match": { 287 | "version": "1.0.2", 288 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 289 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 290 | "dev": true 291 | }, 292 | "node_modules/body-parser": { 293 | "version": "1.20.1", 294 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 295 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 296 | "dependencies": { 297 | "bytes": "3.1.2", 298 | "content-type": "~1.0.4", 299 | "debug": "2.6.9", 300 | "depd": "2.0.0", 301 | "destroy": "1.2.0", 302 | "http-errors": "2.0.0", 303 | "iconv-lite": "0.4.24", 304 | "on-finished": "2.4.1", 305 | "qs": "6.11.0", 306 | "raw-body": "2.5.1", 307 | "type-is": "~1.6.18", 308 | "unpipe": "1.0.0" 309 | }, 310 | "engines": { 311 | "node": ">= 0.8", 312 | "npm": "1.2.8000 || >= 1.4.16" 313 | } 314 | }, 315 | "node_modules/body-parser/node_modules/debug": { 316 | "version": "2.6.9", 317 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 318 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 319 | "dependencies": { 320 | "ms": "2.0.0" 321 | } 322 | }, 323 | "node_modules/body-parser/node_modules/ms": { 324 | "version": "2.0.0", 325 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 326 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 327 | }, 328 | "node_modules/brace-expansion": { 329 | "version": "1.1.11", 330 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 331 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 332 | "dev": true, 333 | "dependencies": { 334 | "balanced-match": "^1.0.0", 335 | "concat-map": "0.0.1" 336 | } 337 | }, 338 | "node_modules/buffer-from": { 339 | "version": "1.1.2", 340 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 341 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 342 | }, 343 | "node_modules/bytes": { 344 | "version": "3.1.2", 345 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 346 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 347 | "engines": { 348 | "node": ">= 0.8" 349 | } 350 | }, 351 | "node_modules/call-bind": { 352 | "version": "1.0.2", 353 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 354 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 355 | "dependencies": { 356 | "function-bind": "^1.1.1", 357 | "get-intrinsic": "^1.0.2" 358 | }, 359 | "funding": { 360 | "url": "https://github.com/sponsors/ljharb" 361 | } 362 | }, 363 | "node_modules/callsites": { 364 | "version": "3.1.0", 365 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 366 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 367 | "dev": true, 368 | "engines": { 369 | "node": ">=6" 370 | } 371 | }, 372 | "node_modules/chalk": { 373 | "version": "4.1.2", 374 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 375 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 376 | "dev": true, 377 | "dependencies": { 378 | "ansi-styles": "^4.1.0", 379 | "supports-color": "^7.1.0" 380 | }, 381 | "engines": { 382 | "node": ">=10" 383 | }, 384 | "funding": { 385 | "url": "https://github.com/chalk/chalk?sponsor=1" 386 | } 387 | }, 388 | "node_modules/color-convert": { 389 | "version": "2.0.1", 390 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 391 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 392 | "dev": true, 393 | "dependencies": { 394 | "color-name": "~1.1.4" 395 | }, 396 | "engines": { 397 | "node": ">=7.0.0" 398 | } 399 | }, 400 | "node_modules/color-name": { 401 | "version": "1.1.4", 402 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 403 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 404 | "dev": true 405 | }, 406 | "node_modules/commander": { 407 | "version": "9.5.0", 408 | "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 409 | "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", 410 | "engines": { 411 | "node": "^12.20.0 || >=14" 412 | } 413 | }, 414 | "node_modules/concat-map": { 415 | "version": "0.0.1", 416 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 417 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 418 | "dev": true 419 | }, 420 | "node_modules/content-disposition": { 421 | "version": "0.5.4", 422 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 423 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 424 | "dependencies": { 425 | "safe-buffer": "5.2.1" 426 | }, 427 | "engines": { 428 | "node": ">= 0.6" 429 | } 430 | }, 431 | "node_modules/content-type": { 432 | "version": "1.0.5", 433 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 434 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 435 | "engines": { 436 | "node": ">= 0.6" 437 | } 438 | }, 439 | "node_modules/cookie": { 440 | "version": "0.5.0", 441 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 442 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 443 | "engines": { 444 | "node": ">= 0.6" 445 | } 446 | }, 447 | "node_modules/cookie-signature": { 448 | "version": "1.0.6", 449 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 450 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 451 | }, 452 | "node_modules/cross-spawn": { 453 | "version": "7.0.3", 454 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 455 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 456 | "dev": true, 457 | "dependencies": { 458 | "path-key": "^3.1.0", 459 | "shebang-command": "^2.0.0", 460 | "which": "^2.0.1" 461 | }, 462 | "engines": { 463 | "node": ">= 8" 464 | } 465 | }, 466 | "node_modules/css-tree": { 467 | "version": "2.3.1", 468 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", 469 | "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", 470 | "dependencies": { 471 | "mdn-data": "2.0.30", 472 | "source-map-js": "^1.0.1" 473 | }, 474 | "engines": { 475 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 476 | } 477 | }, 478 | "node_modules/debug": { 479 | "version": "4.3.4", 480 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 481 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 482 | "dev": true, 483 | "dependencies": { 484 | "ms": "2.1.2" 485 | }, 486 | "engines": { 487 | "node": ">=6.0" 488 | }, 489 | "peerDependenciesMeta": { 490 | "supports-color": { 491 | "optional": true 492 | } 493 | } 494 | }, 495 | "node_modules/deep-is": { 496 | "version": "0.1.4", 497 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 498 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 499 | "dev": true 500 | }, 501 | "node_modules/depd": { 502 | "version": "2.0.0", 503 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 504 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 505 | "engines": { 506 | "node": ">= 0.8" 507 | } 508 | }, 509 | "node_modules/destroy": { 510 | "version": "1.2.0", 511 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 512 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 513 | "engines": { 514 | "node": ">= 0.8", 515 | "npm": "1.2.8000 || >= 1.4.16" 516 | } 517 | }, 518 | "node_modules/doctrine": { 519 | "version": "3.0.0", 520 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 521 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 522 | "dev": true, 523 | "dependencies": { 524 | "esutils": "^2.0.2" 525 | }, 526 | "engines": { 527 | "node": ">=6.0.0" 528 | } 529 | }, 530 | "node_modules/dotenv": { 531 | "version": "16.0.3", 532 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", 533 | "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", 534 | "engines": { 535 | "node": ">=12" 536 | } 537 | }, 538 | "node_modules/ee-first": { 539 | "version": "1.1.1", 540 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 541 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 542 | }, 543 | "node_modules/encodeurl": { 544 | "version": "1.0.2", 545 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 546 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 547 | "engines": { 548 | "node": ">= 0.8" 549 | } 550 | }, 551 | "node_modules/entities": { 552 | "version": "4.4.0", 553 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", 554 | "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", 555 | "engines": { 556 | "node": ">=0.12" 557 | }, 558 | "funding": { 559 | "url": "https://github.com/fb55/entities?sponsor=1" 560 | } 561 | }, 562 | "node_modules/escape-html": { 563 | "version": "1.0.3", 564 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 565 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 566 | }, 567 | "node_modules/escape-string-regexp": { 568 | "version": "4.0.0", 569 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 570 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 571 | "dev": true, 572 | "engines": { 573 | "node": ">=10" 574 | }, 575 | "funding": { 576 | "url": "https://github.com/sponsors/sindresorhus" 577 | } 578 | }, 579 | "node_modules/eslint": { 580 | "version": "8.38.0", 581 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", 582 | "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", 583 | "dev": true, 584 | "dependencies": { 585 | "@eslint-community/eslint-utils": "^4.2.0", 586 | "@eslint-community/regexpp": "^4.4.0", 587 | "@eslint/eslintrc": "^2.0.2", 588 | "@eslint/js": "8.38.0", 589 | "@humanwhocodes/config-array": "^0.11.8", 590 | "@humanwhocodes/module-importer": "^1.0.1", 591 | "@nodelib/fs.walk": "^1.2.8", 592 | "ajv": "^6.10.0", 593 | "chalk": "^4.0.0", 594 | "cross-spawn": "^7.0.2", 595 | "debug": "^4.3.2", 596 | "doctrine": "^3.0.0", 597 | "escape-string-regexp": "^4.0.0", 598 | "eslint-scope": "^7.1.1", 599 | "eslint-visitor-keys": "^3.4.0", 600 | "espree": "^9.5.1", 601 | "esquery": "^1.4.2", 602 | "esutils": "^2.0.2", 603 | "fast-deep-equal": "^3.1.3", 604 | "file-entry-cache": "^6.0.1", 605 | "find-up": "^5.0.0", 606 | "glob-parent": "^6.0.2", 607 | "globals": "^13.19.0", 608 | "grapheme-splitter": "^1.0.4", 609 | "ignore": "^5.2.0", 610 | "import-fresh": "^3.0.0", 611 | "imurmurhash": "^0.1.4", 612 | "is-glob": "^4.0.0", 613 | "is-path-inside": "^3.0.3", 614 | "js-sdsl": "^4.1.4", 615 | "js-yaml": "^4.1.0", 616 | "json-stable-stringify-without-jsonify": "^1.0.1", 617 | "levn": "^0.4.1", 618 | "lodash.merge": "^4.6.2", 619 | "minimatch": "^3.1.2", 620 | "natural-compare": "^1.4.0", 621 | "optionator": "^0.9.1", 622 | "strip-ansi": "^6.0.1", 623 | "strip-json-comments": "^3.1.0", 624 | "text-table": "^0.2.0" 625 | }, 626 | "bin": { 627 | "eslint": "bin/eslint.js" 628 | }, 629 | "engines": { 630 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 631 | }, 632 | "funding": { 633 | "url": "https://opencollective.com/eslint" 634 | } 635 | }, 636 | "node_modules/eslint-scope": { 637 | "version": "7.1.1", 638 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 639 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 640 | "dev": true, 641 | "dependencies": { 642 | "esrecurse": "^4.3.0", 643 | "estraverse": "^5.2.0" 644 | }, 645 | "engines": { 646 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 647 | } 648 | }, 649 | "node_modules/eslint-visitor-keys": { 650 | "version": "3.4.0", 651 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", 652 | "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", 653 | "dev": true, 654 | "engines": { 655 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 656 | }, 657 | "funding": { 658 | "url": "https://opencollective.com/eslint" 659 | } 660 | }, 661 | "node_modules/esotope-hammerhead": { 662 | "version": "0.6.3", 663 | "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.6.3.tgz", 664 | "integrity": "sha512-Aq6gUznvm0xPtjpbZo9OSsRO1+m+NM0hjZOYufH3HDlJWeOZpBskR/vuP9/tiMaQFD3+ES5BQq5fAY1qOLKWUA==", 665 | "dependencies": { 666 | "@types/estree": "0.0.46" 667 | } 668 | }, 669 | "node_modules/espree": { 670 | "version": "9.5.1", 671 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", 672 | "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", 673 | "dev": true, 674 | "dependencies": { 675 | "acorn": "^8.8.0", 676 | "acorn-jsx": "^5.3.2", 677 | "eslint-visitor-keys": "^3.4.0" 678 | }, 679 | "engines": { 680 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 681 | }, 682 | "funding": { 683 | "url": "https://opencollective.com/eslint" 684 | } 685 | }, 686 | "node_modules/esquery": { 687 | "version": "1.5.0", 688 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 689 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 690 | "dev": true, 691 | "dependencies": { 692 | "estraverse": "^5.1.0" 693 | }, 694 | "engines": { 695 | "node": ">=0.10" 696 | } 697 | }, 698 | "node_modules/esrecurse": { 699 | "version": "4.3.0", 700 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 701 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 702 | "dev": true, 703 | "dependencies": { 704 | "estraverse": "^5.2.0" 705 | }, 706 | "engines": { 707 | "node": ">=4.0" 708 | } 709 | }, 710 | "node_modules/estraverse": { 711 | "version": "5.3.0", 712 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 713 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 714 | "dev": true, 715 | "engines": { 716 | "node": ">=4.0" 717 | } 718 | }, 719 | "node_modules/esutils": { 720 | "version": "2.0.3", 721 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 722 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 723 | "dev": true, 724 | "engines": { 725 | "node": ">=0.10.0" 726 | } 727 | }, 728 | "node_modules/etag": { 729 | "version": "1.8.1", 730 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 731 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 732 | "engines": { 733 | "node": ">= 0.6" 734 | } 735 | }, 736 | "node_modules/events": { 737 | "version": "3.3.0", 738 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 739 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 740 | "engines": { 741 | "node": ">=0.8.x" 742 | } 743 | }, 744 | "node_modules/express": { 745 | "version": "4.18.2", 746 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 747 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 748 | "dependencies": { 749 | "accepts": "~1.3.8", 750 | "array-flatten": "1.1.1", 751 | "body-parser": "1.20.1", 752 | "content-disposition": "0.5.4", 753 | "content-type": "~1.0.4", 754 | "cookie": "0.5.0", 755 | "cookie-signature": "1.0.6", 756 | "debug": "2.6.9", 757 | "depd": "2.0.0", 758 | "encodeurl": "~1.0.2", 759 | "escape-html": "~1.0.3", 760 | "etag": "~1.8.1", 761 | "finalhandler": "1.2.0", 762 | "fresh": "0.5.2", 763 | "http-errors": "2.0.0", 764 | "merge-descriptors": "1.0.1", 765 | "methods": "~1.1.2", 766 | "on-finished": "2.4.1", 767 | "parseurl": "~1.3.3", 768 | "path-to-regexp": "0.1.7", 769 | "proxy-addr": "~2.0.7", 770 | "qs": "6.11.0", 771 | "range-parser": "~1.2.1", 772 | "safe-buffer": "5.2.1", 773 | "send": "0.18.0", 774 | "serve-static": "1.15.0", 775 | "setprototypeof": "1.2.0", 776 | "statuses": "2.0.1", 777 | "type-is": "~1.6.18", 778 | "utils-merge": "1.0.1", 779 | "vary": "~1.1.2" 780 | }, 781 | "engines": { 782 | "node": ">= 0.10.0" 783 | } 784 | }, 785 | "node_modules/express/node_modules/debug": { 786 | "version": "2.6.9", 787 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 788 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 789 | "dependencies": { 790 | "ms": "2.0.0" 791 | } 792 | }, 793 | "node_modules/express/node_modules/ms": { 794 | "version": "2.0.0", 795 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 796 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 797 | }, 798 | "node_modules/fast-deep-equal": { 799 | "version": "3.1.3", 800 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 801 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 802 | "dev": true 803 | }, 804 | "node_modules/fast-json-stable-stringify": { 805 | "version": "2.1.0", 806 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 807 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 808 | "dev": true 809 | }, 810 | "node_modules/fast-levenshtein": { 811 | "version": "2.0.6", 812 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 813 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 814 | "dev": true 815 | }, 816 | "node_modules/fastq": { 817 | "version": "1.15.0", 818 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 819 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 820 | "dev": true, 821 | "dependencies": { 822 | "reusify": "^1.0.4" 823 | } 824 | }, 825 | "node_modules/file-entry-cache": { 826 | "version": "6.0.1", 827 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 828 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 829 | "dev": true, 830 | "dependencies": { 831 | "flat-cache": "^3.0.4" 832 | }, 833 | "engines": { 834 | "node": "^10.12.0 || >=12.0.0" 835 | } 836 | }, 837 | "node_modules/finalhandler": { 838 | "version": "1.2.0", 839 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 840 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 841 | "dependencies": { 842 | "debug": "2.6.9", 843 | "encodeurl": "~1.0.2", 844 | "escape-html": "~1.0.3", 845 | "on-finished": "2.4.1", 846 | "parseurl": "~1.3.3", 847 | "statuses": "2.0.1", 848 | "unpipe": "~1.0.0" 849 | }, 850 | "engines": { 851 | "node": ">= 0.8" 852 | } 853 | }, 854 | "node_modules/finalhandler/node_modules/debug": { 855 | "version": "2.6.9", 856 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 857 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 858 | "dependencies": { 859 | "ms": "2.0.0" 860 | } 861 | }, 862 | "node_modules/finalhandler/node_modules/ms": { 863 | "version": "2.0.0", 864 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 865 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 866 | }, 867 | "node_modules/find-up": { 868 | "version": "5.0.0", 869 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 870 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 871 | "dev": true, 872 | "dependencies": { 873 | "locate-path": "^6.0.0", 874 | "path-exists": "^4.0.0" 875 | }, 876 | "engines": { 877 | "node": ">=10" 878 | }, 879 | "funding": { 880 | "url": "https://github.com/sponsors/sindresorhus" 881 | } 882 | }, 883 | "node_modules/flat-cache": { 884 | "version": "3.0.4", 885 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 886 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 887 | "dev": true, 888 | "dependencies": { 889 | "flatted": "^3.1.0", 890 | "rimraf": "^3.0.2" 891 | }, 892 | "engines": { 893 | "node": "^10.12.0 || >=12.0.0" 894 | } 895 | }, 896 | "node_modules/flatted": { 897 | "version": "3.2.7", 898 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 899 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 900 | "dev": true 901 | }, 902 | "node_modules/forwarded": { 903 | "version": "0.2.0", 904 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 905 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 906 | "engines": { 907 | "node": ">= 0.6" 908 | } 909 | }, 910 | "node_modules/fresh": { 911 | "version": "0.5.2", 912 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 913 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 914 | "engines": { 915 | "node": ">= 0.6" 916 | } 917 | }, 918 | "node_modules/fs.realpath": { 919 | "version": "1.0.0", 920 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 921 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 922 | "dev": true 923 | }, 924 | "node_modules/function-bind": { 925 | "version": "1.1.1", 926 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 927 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 928 | }, 929 | "node_modules/get-intrinsic": { 930 | "version": "1.2.0", 931 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 932 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 933 | "dependencies": { 934 | "function-bind": "^1.1.1", 935 | "has": "^1.0.3", 936 | "has-symbols": "^1.0.3" 937 | }, 938 | "funding": { 939 | "url": "https://github.com/sponsors/ljharb" 940 | } 941 | }, 942 | "node_modules/glob": { 943 | "version": "7.2.3", 944 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 945 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 946 | "dev": true, 947 | "dependencies": { 948 | "fs.realpath": "^1.0.0", 949 | "inflight": "^1.0.4", 950 | "inherits": "2", 951 | "minimatch": "^3.1.1", 952 | "once": "^1.3.0", 953 | "path-is-absolute": "^1.0.0" 954 | }, 955 | "engines": { 956 | "node": "*" 957 | }, 958 | "funding": { 959 | "url": "https://github.com/sponsors/isaacs" 960 | } 961 | }, 962 | "node_modules/glob-parent": { 963 | "version": "6.0.2", 964 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 965 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 966 | "dev": true, 967 | "dependencies": { 968 | "is-glob": "^4.0.3" 969 | }, 970 | "engines": { 971 | "node": ">=10.13.0" 972 | } 973 | }, 974 | "node_modules/globals": { 975 | "version": "13.20.0", 976 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 977 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 978 | "dev": true, 979 | "dependencies": { 980 | "type-fest": "^0.20.2" 981 | }, 982 | "engines": { 983 | "node": ">=8" 984 | }, 985 | "funding": { 986 | "url": "https://github.com/sponsors/sindresorhus" 987 | } 988 | }, 989 | "node_modules/grapheme-splitter": { 990 | "version": "1.0.4", 991 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 992 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 993 | "dev": true 994 | }, 995 | "node_modules/has": { 996 | "version": "1.0.3", 997 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 998 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 999 | "dependencies": { 1000 | "function-bind": "^1.1.1" 1001 | }, 1002 | "engines": { 1003 | "node": ">= 0.4.0" 1004 | } 1005 | }, 1006 | "node_modules/has-flag": { 1007 | "version": "4.0.0", 1008 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1009 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1010 | "dev": true, 1011 | "engines": { 1012 | "node": ">=8" 1013 | } 1014 | }, 1015 | "node_modules/has-symbols": { 1016 | "version": "1.0.3", 1017 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1018 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1019 | "engines": { 1020 | "node": ">= 0.4" 1021 | }, 1022 | "funding": { 1023 | "url": "https://github.com/sponsors/ljharb" 1024 | } 1025 | }, 1026 | "node_modules/headers-polyfill": { 1027 | "version": "3.1.2", 1028 | "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.1.2.tgz", 1029 | "integrity": "sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==" 1030 | }, 1031 | "node_modules/http-errors": { 1032 | "version": "2.0.0", 1033 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1034 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1035 | "dependencies": { 1036 | "depd": "2.0.0", 1037 | "inherits": "2.0.4", 1038 | "setprototypeof": "1.2.0", 1039 | "statuses": "2.0.1", 1040 | "toidentifier": "1.0.1" 1041 | }, 1042 | "engines": { 1043 | "node": ">= 0.8" 1044 | } 1045 | }, 1046 | "node_modules/iconv-lite": { 1047 | "version": "0.4.24", 1048 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1049 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1050 | "dependencies": { 1051 | "safer-buffer": ">= 2.1.2 < 3" 1052 | }, 1053 | "engines": { 1054 | "node": ">=0.10.0" 1055 | } 1056 | }, 1057 | "node_modules/idb": { 1058 | "version": "7.1.1", 1059 | "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", 1060 | "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" 1061 | }, 1062 | "node_modules/ignore": { 1063 | "version": "5.2.4", 1064 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 1065 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 1066 | "dev": true, 1067 | "engines": { 1068 | "node": ">= 4" 1069 | } 1070 | }, 1071 | "node_modules/import-fresh": { 1072 | "version": "3.3.0", 1073 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1074 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1075 | "dev": true, 1076 | "dependencies": { 1077 | "parent-module": "^1.0.0", 1078 | "resolve-from": "^4.0.0" 1079 | }, 1080 | "engines": { 1081 | "node": ">=6" 1082 | }, 1083 | "funding": { 1084 | "url": "https://github.com/sponsors/sindresorhus" 1085 | } 1086 | }, 1087 | "node_modules/imurmurhash": { 1088 | "version": "0.1.4", 1089 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1090 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1091 | "dev": true, 1092 | "engines": { 1093 | "node": ">=0.8.19" 1094 | } 1095 | }, 1096 | "node_modules/inflight": { 1097 | "version": "1.0.6", 1098 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1099 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1100 | "dev": true, 1101 | "dependencies": { 1102 | "once": "^1.3.0", 1103 | "wrappy": "1" 1104 | } 1105 | }, 1106 | "node_modules/inherits": { 1107 | "version": "2.0.4", 1108 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1109 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1110 | }, 1111 | "node_modules/ipaddr.js": { 1112 | "version": "2.0.1", 1113 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", 1114 | "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", 1115 | "engines": { 1116 | "node": ">= 10" 1117 | } 1118 | }, 1119 | "node_modules/is-extglob": { 1120 | "version": "2.1.1", 1121 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1122 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1123 | "dev": true, 1124 | "engines": { 1125 | "node": ">=0.10.0" 1126 | } 1127 | }, 1128 | "node_modules/is-glob": { 1129 | "version": "4.0.3", 1130 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1131 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1132 | "dev": true, 1133 | "dependencies": { 1134 | "is-extglob": "^2.1.1" 1135 | }, 1136 | "engines": { 1137 | "node": ">=0.10.0" 1138 | } 1139 | }, 1140 | "node_modules/is-path-inside": { 1141 | "version": "3.0.3", 1142 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1143 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1144 | "dev": true, 1145 | "engines": { 1146 | "node": ">=8" 1147 | } 1148 | }, 1149 | "node_modules/isexe": { 1150 | "version": "2.0.0", 1151 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1152 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1153 | "dev": true 1154 | }, 1155 | "node_modules/js-sdsl": { 1156 | "version": "4.4.0", 1157 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", 1158 | "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", 1159 | "dev": true, 1160 | "funding": { 1161 | "type": "opencollective", 1162 | "url": "https://opencollective.com/js-sdsl" 1163 | } 1164 | }, 1165 | "node_modules/js-yaml": { 1166 | "version": "4.1.0", 1167 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1168 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1169 | "dev": true, 1170 | "dependencies": { 1171 | "argparse": "^2.0.1" 1172 | }, 1173 | "bin": { 1174 | "js-yaml": "bin/js-yaml.js" 1175 | } 1176 | }, 1177 | "node_modules/json-schema-traverse": { 1178 | "version": "0.4.1", 1179 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1180 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1181 | "dev": true 1182 | }, 1183 | "node_modules/json-stable-stringify-without-jsonify": { 1184 | "version": "1.0.1", 1185 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1186 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1187 | "dev": true 1188 | }, 1189 | "node_modules/levn": { 1190 | "version": "0.4.1", 1191 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1192 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1193 | "dev": true, 1194 | "dependencies": { 1195 | "prelude-ls": "^1.2.1", 1196 | "type-check": "~0.4.0" 1197 | }, 1198 | "engines": { 1199 | "node": ">= 0.8.0" 1200 | } 1201 | }, 1202 | "node_modules/locate-path": { 1203 | "version": "6.0.0", 1204 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1205 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "p-locate": "^5.0.0" 1209 | }, 1210 | "engines": { 1211 | "node": ">=10" 1212 | }, 1213 | "funding": { 1214 | "url": "https://github.com/sponsors/sindresorhus" 1215 | } 1216 | }, 1217 | "node_modules/lodash.merge": { 1218 | "version": "4.6.2", 1219 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1220 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1221 | "dev": true 1222 | }, 1223 | "node_modules/mdn-data": { 1224 | "version": "2.0.30", 1225 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", 1226 | "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" 1227 | }, 1228 | "node_modules/media-typer": { 1229 | "version": "0.3.0", 1230 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1231 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1232 | "engines": { 1233 | "node": ">= 0.6" 1234 | } 1235 | }, 1236 | "node_modules/merge-descriptors": { 1237 | "version": "1.0.1", 1238 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1239 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1240 | }, 1241 | "node_modules/meriyah": { 1242 | "version": "4.3.5", 1243 | "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-4.3.5.tgz", 1244 | "integrity": "sha512-oCOuzPtD4udAYnvxIi4Rp99nEHJWHtAFHEFmS27hQuDNjxTQ39Z/hQ9uWW+ZgJjCmpi0nRo7wwciT7rtQE31Bw==", 1245 | "engines": { 1246 | "node": ">=10.4.0" 1247 | } 1248 | }, 1249 | "node_modules/methods": { 1250 | "version": "1.1.2", 1251 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1252 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1253 | "engines": { 1254 | "node": ">= 0.6" 1255 | } 1256 | }, 1257 | "node_modules/mime": { 1258 | "version": "1.6.0", 1259 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1260 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1261 | "bin": { 1262 | "mime": "cli.js" 1263 | }, 1264 | "engines": { 1265 | "node": ">=4" 1266 | } 1267 | }, 1268 | "node_modules/mime-db": { 1269 | "version": "1.52.0", 1270 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1271 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1272 | "engines": { 1273 | "node": ">= 0.6" 1274 | } 1275 | }, 1276 | "node_modules/mime-types": { 1277 | "version": "2.1.35", 1278 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1279 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1280 | "dependencies": { 1281 | "mime-db": "1.52.0" 1282 | }, 1283 | "engines": { 1284 | "node": ">= 0.6" 1285 | } 1286 | }, 1287 | "node_modules/minimatch": { 1288 | "version": "3.1.2", 1289 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1290 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1291 | "dev": true, 1292 | "dependencies": { 1293 | "brace-expansion": "^1.1.7" 1294 | }, 1295 | "engines": { 1296 | "node": "*" 1297 | } 1298 | }, 1299 | "node_modules/ms": { 1300 | "version": "2.1.2", 1301 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1302 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1303 | "dev": true 1304 | }, 1305 | "node_modules/natural-compare": { 1306 | "version": "1.4.0", 1307 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1308 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1309 | "dev": true 1310 | }, 1311 | "node_modules/negotiator": { 1312 | "version": "0.6.3", 1313 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1314 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1315 | "engines": { 1316 | "node": ">= 0.6" 1317 | } 1318 | }, 1319 | "node_modules/object-inspect": { 1320 | "version": "1.12.3", 1321 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1322 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1323 | "funding": { 1324 | "url": "https://github.com/sponsors/ljharb" 1325 | } 1326 | }, 1327 | "node_modules/on-finished": { 1328 | "version": "2.4.1", 1329 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1330 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1331 | "dependencies": { 1332 | "ee-first": "1.1.1" 1333 | }, 1334 | "engines": { 1335 | "node": ">= 0.8" 1336 | } 1337 | }, 1338 | "node_modules/once": { 1339 | "version": "1.4.0", 1340 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1341 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1342 | "dev": true, 1343 | "dependencies": { 1344 | "wrappy": "1" 1345 | } 1346 | }, 1347 | "node_modules/optionator": { 1348 | "version": "0.9.1", 1349 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1350 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1351 | "dev": true, 1352 | "dependencies": { 1353 | "deep-is": "^0.1.3", 1354 | "fast-levenshtein": "^2.0.6", 1355 | "levn": "^0.4.1", 1356 | "prelude-ls": "^1.2.1", 1357 | "type-check": "^0.4.0", 1358 | "word-wrap": "^1.2.3" 1359 | }, 1360 | "engines": { 1361 | "node": ">= 0.8.0" 1362 | } 1363 | }, 1364 | "node_modules/p-limit": { 1365 | "version": "3.1.0", 1366 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1367 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1368 | "dev": true, 1369 | "dependencies": { 1370 | "yocto-queue": "^0.1.0" 1371 | }, 1372 | "engines": { 1373 | "node": ">=10" 1374 | }, 1375 | "funding": { 1376 | "url": "https://github.com/sponsors/sindresorhus" 1377 | } 1378 | }, 1379 | "node_modules/p-locate": { 1380 | "version": "5.0.0", 1381 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1382 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1383 | "dev": true, 1384 | "dependencies": { 1385 | "p-limit": "^3.0.2" 1386 | }, 1387 | "engines": { 1388 | "node": ">=10" 1389 | }, 1390 | "funding": { 1391 | "url": "https://github.com/sponsors/sindresorhus" 1392 | } 1393 | }, 1394 | "node_modules/parent-module": { 1395 | "version": "1.0.1", 1396 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1397 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1398 | "dev": true, 1399 | "dependencies": { 1400 | "callsites": "^3.0.0" 1401 | }, 1402 | "engines": { 1403 | "node": ">=6" 1404 | } 1405 | }, 1406 | "node_modules/parse5": { 1407 | "version": "7.1.2", 1408 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", 1409 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", 1410 | "dependencies": { 1411 | "entities": "^4.4.0" 1412 | }, 1413 | "funding": { 1414 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1415 | } 1416 | }, 1417 | "node_modules/parseurl": { 1418 | "version": "1.3.3", 1419 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1420 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1421 | "engines": { 1422 | "node": ">= 0.8" 1423 | } 1424 | }, 1425 | "node_modules/path-exists": { 1426 | "version": "4.0.0", 1427 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1428 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1429 | "dev": true, 1430 | "engines": { 1431 | "node": ">=8" 1432 | } 1433 | }, 1434 | "node_modules/path-is-absolute": { 1435 | "version": "1.0.1", 1436 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1437 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1438 | "dev": true, 1439 | "engines": { 1440 | "node": ">=0.10.0" 1441 | } 1442 | }, 1443 | "node_modules/path-key": { 1444 | "version": "3.1.1", 1445 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1446 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1447 | "dev": true, 1448 | "engines": { 1449 | "node": ">=8" 1450 | } 1451 | }, 1452 | "node_modules/path-to-regexp": { 1453 | "version": "0.1.7", 1454 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1455 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1456 | }, 1457 | "node_modules/prelude-ls": { 1458 | "version": "1.2.1", 1459 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1460 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1461 | "dev": true, 1462 | "engines": { 1463 | "node": ">= 0.8.0" 1464 | } 1465 | }, 1466 | "node_modules/prettier": { 1467 | "version": "2.8.7", 1468 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", 1469 | "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", 1470 | "dev": true, 1471 | "bin": { 1472 | "prettier": "bin-prettier.js" 1473 | }, 1474 | "engines": { 1475 | "node": ">=10.13.0" 1476 | }, 1477 | "funding": { 1478 | "url": "https://github.com/prettier/prettier?sponsor=1" 1479 | } 1480 | }, 1481 | "node_modules/proxy-addr": { 1482 | "version": "2.0.7", 1483 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1484 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1485 | "dependencies": { 1486 | "forwarded": "0.2.0", 1487 | "ipaddr.js": "1.9.1" 1488 | }, 1489 | "engines": { 1490 | "node": ">= 0.10" 1491 | } 1492 | }, 1493 | "node_modules/proxy-addr/node_modules/ipaddr.js": { 1494 | "version": "1.9.1", 1495 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1496 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1497 | "engines": { 1498 | "node": ">= 0.10" 1499 | } 1500 | }, 1501 | "node_modules/punycode": { 1502 | "version": "2.3.0", 1503 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1504 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1505 | "dev": true, 1506 | "engines": { 1507 | "node": ">=6" 1508 | } 1509 | }, 1510 | "node_modules/qs": { 1511 | "version": "6.11.0", 1512 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1513 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1514 | "dependencies": { 1515 | "side-channel": "^1.0.4" 1516 | }, 1517 | "engines": { 1518 | "node": ">=0.6" 1519 | }, 1520 | "funding": { 1521 | "url": "https://github.com/sponsors/ljharb" 1522 | } 1523 | }, 1524 | "node_modules/queue-microtask": { 1525 | "version": "1.2.3", 1526 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1527 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1528 | "dev": true, 1529 | "funding": [ 1530 | { 1531 | "type": "github", 1532 | "url": "https://github.com/sponsors/feross" 1533 | }, 1534 | { 1535 | "type": "patreon", 1536 | "url": "https://www.patreon.com/feross" 1537 | }, 1538 | { 1539 | "type": "consulting", 1540 | "url": "https://feross.org/support" 1541 | } 1542 | ] 1543 | }, 1544 | "node_modules/range-parser": { 1545 | "version": "1.2.1", 1546 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1547 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1548 | "engines": { 1549 | "node": ">= 0.6" 1550 | } 1551 | }, 1552 | "node_modules/raw-body": { 1553 | "version": "2.5.1", 1554 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1555 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1556 | "dependencies": { 1557 | "bytes": "3.1.2", 1558 | "http-errors": "2.0.0", 1559 | "iconv-lite": "0.4.24", 1560 | "unpipe": "1.0.0" 1561 | }, 1562 | "engines": { 1563 | "node": ">= 0.8" 1564 | } 1565 | }, 1566 | "node_modules/resolve-from": { 1567 | "version": "4.0.0", 1568 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1569 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1570 | "dev": true, 1571 | "engines": { 1572 | "node": ">=4" 1573 | } 1574 | }, 1575 | "node_modules/reusify": { 1576 | "version": "1.0.4", 1577 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1578 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1579 | "dev": true, 1580 | "engines": { 1581 | "iojs": ">=1.0.0", 1582 | "node": ">=0.10.0" 1583 | } 1584 | }, 1585 | "node_modules/rimraf": { 1586 | "version": "3.0.2", 1587 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1588 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1589 | "dev": true, 1590 | "dependencies": { 1591 | "glob": "^7.1.3" 1592 | }, 1593 | "bin": { 1594 | "rimraf": "bin.js" 1595 | }, 1596 | "funding": { 1597 | "url": "https://github.com/sponsors/isaacs" 1598 | } 1599 | }, 1600 | "node_modules/run-parallel": { 1601 | "version": "1.2.0", 1602 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1603 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1604 | "dev": true, 1605 | "funding": [ 1606 | { 1607 | "type": "github", 1608 | "url": "https://github.com/sponsors/feross" 1609 | }, 1610 | { 1611 | "type": "patreon", 1612 | "url": "https://www.patreon.com/feross" 1613 | }, 1614 | { 1615 | "type": "consulting", 1616 | "url": "https://feross.org/support" 1617 | } 1618 | ], 1619 | "dependencies": { 1620 | "queue-microtask": "^1.2.2" 1621 | } 1622 | }, 1623 | "node_modules/safe-buffer": { 1624 | "version": "5.2.1", 1625 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1626 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1627 | "funding": [ 1628 | { 1629 | "type": "github", 1630 | "url": "https://github.com/sponsors/feross" 1631 | }, 1632 | { 1633 | "type": "patreon", 1634 | "url": "https://www.patreon.com/feross" 1635 | }, 1636 | { 1637 | "type": "consulting", 1638 | "url": "https://feross.org/support" 1639 | } 1640 | ] 1641 | }, 1642 | "node_modules/safer-buffer": { 1643 | "version": "2.1.2", 1644 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1645 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1646 | }, 1647 | "node_modules/send": { 1648 | "version": "0.18.0", 1649 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1650 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1651 | "dependencies": { 1652 | "debug": "2.6.9", 1653 | "depd": "2.0.0", 1654 | "destroy": "1.2.0", 1655 | "encodeurl": "~1.0.2", 1656 | "escape-html": "~1.0.3", 1657 | "etag": "~1.8.1", 1658 | "fresh": "0.5.2", 1659 | "http-errors": "2.0.0", 1660 | "mime": "1.6.0", 1661 | "ms": "2.1.3", 1662 | "on-finished": "2.4.1", 1663 | "range-parser": "~1.2.1", 1664 | "statuses": "2.0.1" 1665 | }, 1666 | "engines": { 1667 | "node": ">= 0.8.0" 1668 | } 1669 | }, 1670 | "node_modules/send/node_modules/debug": { 1671 | "version": "2.6.9", 1672 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1673 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1674 | "dependencies": { 1675 | "ms": "2.0.0" 1676 | } 1677 | }, 1678 | "node_modules/send/node_modules/debug/node_modules/ms": { 1679 | "version": "2.0.0", 1680 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1681 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1682 | }, 1683 | "node_modules/send/node_modules/ms": { 1684 | "version": "2.1.3", 1685 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1686 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1687 | }, 1688 | "node_modules/serve-static": { 1689 | "version": "1.15.0", 1690 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1691 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1692 | "dependencies": { 1693 | "encodeurl": "~1.0.2", 1694 | "escape-html": "~1.0.3", 1695 | "parseurl": "~1.3.3", 1696 | "send": "0.18.0" 1697 | }, 1698 | "engines": { 1699 | "node": ">= 0.8.0" 1700 | } 1701 | }, 1702 | "node_modules/set-cookie-parser": { 1703 | "version": "2.6.0", 1704 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 1705 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" 1706 | }, 1707 | "node_modules/setprototypeof": { 1708 | "version": "1.2.0", 1709 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1710 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1711 | }, 1712 | "node_modules/shebang-command": { 1713 | "version": "2.0.0", 1714 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1715 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1716 | "dev": true, 1717 | "dependencies": { 1718 | "shebang-regex": "^3.0.0" 1719 | }, 1720 | "engines": { 1721 | "node": ">=8" 1722 | } 1723 | }, 1724 | "node_modules/shebang-regex": { 1725 | "version": "3.0.0", 1726 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1727 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1728 | "dev": true, 1729 | "engines": { 1730 | "node": ">=8" 1731 | } 1732 | }, 1733 | "node_modules/side-channel": { 1734 | "version": "1.0.4", 1735 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1736 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1737 | "dependencies": { 1738 | "call-bind": "^1.0.0", 1739 | "get-intrinsic": "^1.0.2", 1740 | "object-inspect": "^1.9.0" 1741 | }, 1742 | "funding": { 1743 | "url": "https://github.com/sponsors/ljharb" 1744 | } 1745 | }, 1746 | "node_modules/source-map": { 1747 | "version": "0.6.1", 1748 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1749 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1750 | "engines": { 1751 | "node": ">=0.10.0" 1752 | } 1753 | }, 1754 | "node_modules/source-map-js": { 1755 | "version": "1.0.2", 1756 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1757 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1758 | "engines": { 1759 | "node": ">=0.10.0" 1760 | } 1761 | }, 1762 | "node_modules/source-map-support": { 1763 | "version": "0.5.21", 1764 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1765 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1766 | "dependencies": { 1767 | "buffer-from": "^1.0.0", 1768 | "source-map": "^0.6.0" 1769 | } 1770 | }, 1771 | "node_modules/statuses": { 1772 | "version": "2.0.1", 1773 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1774 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1775 | "engines": { 1776 | "node": ">= 0.8" 1777 | } 1778 | }, 1779 | "node_modules/strip-ansi": { 1780 | "version": "6.0.1", 1781 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1782 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1783 | "dev": true, 1784 | "dependencies": { 1785 | "ansi-regex": "^5.0.1" 1786 | }, 1787 | "engines": { 1788 | "node": ">=8" 1789 | } 1790 | }, 1791 | "node_modules/strip-json-comments": { 1792 | "version": "3.1.1", 1793 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1794 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1795 | "dev": true, 1796 | "engines": { 1797 | "node": ">=8" 1798 | }, 1799 | "funding": { 1800 | "url": "https://github.com/sponsors/sindresorhus" 1801 | } 1802 | }, 1803 | "node_modules/supports-color": { 1804 | "version": "7.2.0", 1805 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1806 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1807 | "dev": true, 1808 | "dependencies": { 1809 | "has-flag": "^4.0.0" 1810 | }, 1811 | "engines": { 1812 | "node": ">=8" 1813 | } 1814 | }, 1815 | "node_modules/text-table": { 1816 | "version": "0.2.0", 1817 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1818 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1819 | "dev": true 1820 | }, 1821 | "node_modules/toidentifier": { 1822 | "version": "1.0.1", 1823 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1824 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1825 | "engines": { 1826 | "node": ">=0.6" 1827 | } 1828 | }, 1829 | "node_modules/type-check": { 1830 | "version": "0.4.0", 1831 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1832 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1833 | "dev": true, 1834 | "dependencies": { 1835 | "prelude-ls": "^1.2.1" 1836 | }, 1837 | "engines": { 1838 | "node": ">= 0.8.0" 1839 | } 1840 | }, 1841 | "node_modules/type-fest": { 1842 | "version": "0.20.2", 1843 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1844 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1845 | "dev": true, 1846 | "engines": { 1847 | "node": ">=10" 1848 | }, 1849 | "funding": { 1850 | "url": "https://github.com/sponsors/sindresorhus" 1851 | } 1852 | }, 1853 | "node_modules/type-is": { 1854 | "version": "1.6.18", 1855 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1856 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1857 | "dependencies": { 1858 | "media-typer": "0.3.0", 1859 | "mime-types": "~2.1.24" 1860 | }, 1861 | "engines": { 1862 | "node": ">= 0.6" 1863 | } 1864 | }, 1865 | "node_modules/unpipe": { 1866 | "version": "1.0.0", 1867 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1868 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1869 | "engines": { 1870 | "node": ">= 0.8" 1871 | } 1872 | }, 1873 | "node_modules/uri-js": { 1874 | "version": "4.4.1", 1875 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1876 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1877 | "dev": true, 1878 | "dependencies": { 1879 | "punycode": "^2.1.0" 1880 | } 1881 | }, 1882 | "node_modules/utils-merge": { 1883 | "version": "1.0.1", 1884 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1885 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1886 | "engines": { 1887 | "node": ">= 0.4.0" 1888 | } 1889 | }, 1890 | "node_modules/vary": { 1891 | "version": "1.1.2", 1892 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1893 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1894 | "engines": { 1895 | "node": ">= 0.8" 1896 | } 1897 | }, 1898 | "node_modules/which": { 1899 | "version": "2.0.2", 1900 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1901 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1902 | "dev": true, 1903 | "dependencies": { 1904 | "isexe": "^2.0.0" 1905 | }, 1906 | "bin": { 1907 | "node-which": "bin/node-which" 1908 | }, 1909 | "engines": { 1910 | "node": ">= 8" 1911 | } 1912 | }, 1913 | "node_modules/word-wrap": { 1914 | "version": "1.2.5", 1915 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1916 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1917 | "dev": true, 1918 | "engines": { 1919 | "node": ">=0.10.0" 1920 | } 1921 | }, 1922 | "node_modules/wrappy": { 1923 | "version": "1.0.2", 1924 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1925 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1926 | "dev": true 1927 | }, 1928 | "node_modules/yocto-queue": { 1929 | "version": "0.1.0", 1930 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1931 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1932 | "dev": true, 1933 | "engines": { 1934 | "node": ">=10" 1935 | }, 1936 | "funding": { 1937 | "url": "https://github.com/sponsors/sindresorhus" 1938 | } 1939 | } 1940 | } 1941 | } 1942 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "PFortyFive", 3 | "version": "1.0.0", 4 | "description": "P45", 5 | "type": "module", 6 | "engines": { 7 | "npm": ">=7.0.0", 8 | "node": ">=16.0.0" 9 | }, 10 | "scripts": { 11 | "start": "node index.js" 12 | }, 13 | "keywords": ["P45"], 14 | "author": "ARKB", 15 | "dependencies": { 16 | "@titaniumnetwork-dev/ultraviolet": "^1.0.10", 17 | "@tomphttp/bare-server-node": "^1.2.5", 18 | "express": "^4.18.2" 19 | }, 20 | "devDependencies": { 21 | "eslint": "^8.36.0", 22 | "prettier": "^2.8.4" 23 | } 24 | } -------------------------------------------------------------------------------- /render.yaml: -------------------------------------------------------------------------------- 1 | 2 | services: 3 | - type: web 4 | name: PFortyFive 5 | env: docker 6 | plan: free 7 | -------------------------------------------------------------------------------- /static/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Microsoft Teams 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
404 | Page Not Found
14 | 15 | -------------------------------------------------------------------------------- /static/assets/css/style.css: -------------------------------------------------------------------------------- 1 | :root{ 2 | --bg: #111; 3 | --text: #f4f3ee; 4 | --hover: coral; 5 | } 6 | 7 | body{ 8 | background: var(--bg); 9 | font: 1.5em/1.5 Verdana, Helvetica, sans-serif; 10 | color: var(--text); 11 | } 12 | 13 | *::selection{ 14 | background: greenyellow; 15 | color: #111; 16 | } 17 | 18 | .container{ 19 | width: 80%; 20 | margin: 0 auto; 21 | } 22 | 23 | /*Home Page*/ 24 | 25 | main{ 26 | padding-top: 18%; 27 | display: flex; 28 | flex-direction: column; 29 | align-items: center; 30 | } 31 | 32 | .brand{ 33 | margin: 10px; 34 | font-size: 2em; 35 | font-weight: 600; 36 | text-align: center; 37 | } 38 | 39 | .data{ 40 | padding: 12px; 41 | width: 75%; 42 | outline-color: transparent; 43 | background: transparent; 44 | border: 2px solid var(--text); 45 | border-radius: 25px; 46 | color: var(--text); 47 | font-family: Arial, Verdana, Helvetica, sans-serif; 48 | font-size: 16px; 49 | } 50 | 51 | .apps{ 52 | display: flex; 53 | gap: 1em; 54 | font-size: 12px; 55 | margin-top: 5px; 56 | } 57 | 58 | .app{ 59 | cursor: pointer; 60 | } 61 | 62 | .app:hover{ 63 | color: var(--hover); 64 | } 65 | 66 | .func{ 67 | user-select: none; 68 | position: fixed; 69 | top: 5px; 70 | right: 5px; 71 | cursor: pointer; 72 | font-size: 25px; 73 | } 74 | 75 | .func:hover{ 76 | color: var(--hover); 77 | } 78 | 79 | 80 | .loading{ 81 | margin: 0; 82 | animation: loading 1.5s infinite; 83 | animation-delay: revert; 84 | } 85 | 86 | 87 | @keyframes loading{ 88 | 0%{ 89 | color: #fff; 90 | }50%{ 91 | color: grey; 92 | } 93 | } 94 | 95 | 96 | @media(max-width: 500px){ 97 | .data{ 98 | width: 100%; 99 | } 100 | } 101 | 102 | @media(min-width: 1330px){ 103 | .data{ 104 | width: 60%; 105 | } 106 | } -------------------------------------------------------------------------------- /static/assets/images/branding/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdulRKB/P45/16b7b5229990fd2e49428cfd75c2597857d974d0/static/assets/images/branding/favicon.png -------------------------------------------------------------------------------- /static/assets/js/go.js: -------------------------------------------------------------------------------- 1 | function go(value) { 2 | let iframe = document.querySelector(".iframe.active"); 3 | window.navigator.serviceWorker 4 | .register("./sw.js", { 5 | scope: __uv$config.prefix, 6 | }) 7 | .then(() => { 8 | let url = value.trim(); 9 | if (!isUrl(url)) url = "https://www.google.com/search?q=" + url; 10 | else if (!(url.startsWith("https://") || url.startsWith("http://"))) 11 | url = "https://" + url; 12 | //pass the encoded url to the second page 13 | sessionStorage.setItem("encodedUrl", __uv$config.encodeUrl(url)); 14 | location.href = "go"; 15 | }); 16 | } 17 | 18 | function isUrl(val = "") { 19 | if ( 20 | /^http(s?):\/\//.test(val) || 21 | (val.includes(".") && val.substr(0, 1) !== " ") 22 | ) 23 | return true; 24 | return false; 25 | } 26 | 27 | -------------------------------------------------------------------------------- /static/assets/js/index.js: -------------------------------------------------------------------------------- 1 | const input = document.querySelector("input"); 2 | input.onkeypress = function(e){ 3 | if (!e) e = window.event; 4 | var keyCode = e.code || e.key; 5 | if (keyCode == 'Enter'){ 6 | go(input.value) 7 | return false; 8 | } 9 | } 10 | 11 | if (window.location !== window.parent.location){ 12 | document.querySelector("#func").style.display = "none"; 13 | } 14 | 15 | 16 | function blank3(){ 17 | let inFrame 18 | 19 | try { 20 | inFrame = window !== top 21 | } catch (e) { 22 | inFrame = true 23 | } 24 | 25 | if (!inFrame && !navigator.userAgent.includes("Firefox")) { 26 | const popup = open("about:blank", "_blank") 27 | if (!popup || popup.closed) { 28 | alert("Enable Popups to hide from history...") 29 | } else { 30 | const doc = popup.document 31 | const iframe = doc.createElement("iframe") 32 | const style = iframe.style 33 | const link = doc.createElement("link") 34 | 35 | doc.title = "about:blank" 36 | link.rel = "icon"; 37 | link.href = ""; 38 | iframe.src = location.href 39 | style.position = "fixed" 40 | style.top = style.bottom = style.left = style.right = 0 41 | style.border = style.outline = "none" 42 | style.width = style.height = "100%" 43 | doc.body.appendChild(iframe) 44 | location.replace("https://teams.microsoft.com/") 45 | } 46 | }} 47 | -------------------------------------------------------------------------------- /static/go.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Microsoft Teams 6 | 7 | 8 | 53 | 54 | 55 |
56 |
57 | 58 | 59 |
60 |
61 | 72 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Microsoft Teams 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
P45
14 | 15 | 26 | 27 |
Iframe
28 |
29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /static/loading.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Microsoft Teams 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 16 | 19 | 21 | 22 |

Loading

23 | 24 | 25 | -------------------------------------------------------------------------------- /static/sw.js: -------------------------------------------------------------------------------- 1 | importScripts("./uv/uv.bundle.js"); 2 | importScripts("./uv/uv.config.js"); 3 | importScripts("./uv/uv.sw.js"); 4 | 5 | const sw = new UVServiceWorker(); 6 | let userKey = new URL(location).searchParams.get('userkey'); 7 | 8 | self.addEventListener("fetch", (event) => event.respondWith(sw.fetch(event))); -------------------------------------------------------------------------------- /static/uv.sw-handler.js: -------------------------------------------------------------------------------- 1 | importScripts('/uv/uv.bundle.js'); 2 | importScripts('/uv/uv.config.js'); 3 | importScripts(__uv$config.sw || '/uv/uv.sw.js'); 4 | 5 | const sw = new UVServiceWorker(); 6 | self.addEventListener('fetch', event => { 7 | event.respondWith(sw.fetch(event)) 8 | }); -------------------------------------------------------------------------------- /static/uv/uv.config.js: -------------------------------------------------------------------------------- 1 | self.__uv$config = { 2 | prefix: '/service/', 3 | bare: '/bare/', 4 | encodeUrl: Ultraviolet.codec.xor.encode, 5 | decodeUrl: Ultraviolet.codec.xor.decode, 6 | handler: '/uv/uv.handler.js', 7 | bundle: '/uv/uv.bundle.js', 8 | config: '/uv/uv.config.js', 9 | sw: '/uv/uv.sw.js', 10 | }; 11 | -------------------------------------------------------------------------------- /static/uv/uv.handler.js: -------------------------------------------------------------------------------- 1 | if (!self.__uv) { 2 | __uvHook(self, self.__uv$config, self.__uv$config.bare); 3 | }; 4 | 5 | async function __uvHook(window, config = {}, bare = '/bare/') { 6 | if ('__uv' in window && window.__uv instanceof Ultraviolet) return false; 7 | 8 | if (window.document && !!window.window) { 9 | window.document.querySelectorAll("script[__uv-script]").forEach(node => node.remove()) 10 | }; 11 | 12 | const worker = !window.window; 13 | const master = '__uv'; 14 | const methodPrefix = '__uv$'; 15 | const __uv = new Ultraviolet({ 16 | ...config, 17 | window, 18 | }); 19 | 20 | if (typeof config.construct === 'function') { 21 | config.construct(__uv, worker ? 'worker' : 'window'); 22 | }; 23 | 24 | const { client } = __uv; 25 | const { 26 | HTMLMediaElement, 27 | HTMLScriptElement, 28 | HTMLAudioElement, 29 | HTMLVideoElement, 30 | HTMLInputElement, 31 | HTMLEmbedElement, 32 | HTMLTrackElement, 33 | HTMLAnchorElement, 34 | HTMLIFrameElement, 35 | HTMLAreaElement, 36 | HTMLLinkElement, 37 | HTMLBaseElement, 38 | HTMLFormElement, 39 | HTMLImageElement, 40 | HTMLSourceElement, 41 | } = window; 42 | 43 | client.nativeMethods.defineProperty(window, '__uv', { 44 | value: __uv, 45 | enumerable: false, 46 | }); 47 | 48 | 49 | __uv.meta.origin = location.origin; 50 | __uv.location = client.location.emulate( 51 | (href) => { 52 | if (href === 'about:srcdoc') return new URL(href); 53 | if (href.startsWith('blob:')) href = href.slice('blob:'.length); 54 | return new URL(__uv.sourceUrl(href)); 55 | }, 56 | (href) => { 57 | return __uv.rewriteUrl(href); 58 | }, 59 | ); 60 | 61 | __uv.cookieStr = window.__uv$cookies || ''; 62 | __uv.meta.url = __uv.location; 63 | __uv.domain = __uv.meta.url.host; 64 | __uv.blobUrls = new window.Map(); 65 | __uv.referrer = ''; 66 | __uv.cookies = []; 67 | __uv.localStorageObj = {}; 68 | __uv.sessionStorageObj = {}; 69 | 70 | try { 71 | __uv.bare = new URL(bare, window.location.href); 72 | } catch(e) { 73 | __uv.bare = window.parent.__uv.bare; 74 | }; 75 | 76 | if (__uv.location.href === 'about:srcdoc') { 77 | __uv.meta = window.parent.__uv.meta; 78 | }; 79 | 80 | if (window.EventTarget) { 81 | __uv.addEventListener = window.EventTarget.prototype.addEventListener; 82 | __uv.removeListener = window.EventTarget.prototype.removeListener; 83 | __uv.dispatchEvent = window.EventTarget.prototype.dispatchEvent; 84 | }; 85 | 86 | // Storage wrappers 87 | client.nativeMethods.defineProperty(client.storage.storeProto, '__uv$storageObj', { 88 | get() { 89 | if (this === client.storage.sessionStorage) return __uv.sessionStorageObj; 90 | if (this === client.storage.localStorage) return __uv.localStorageObj; 91 | }, 92 | enumerable: false, 93 | }); 94 | 95 | if (window.localStorage) { 96 | for (const key in window.localStorage) { 97 | if (key.startsWith(methodPrefix + __uv.location.origin + '@')) { 98 | __uv.localStorageObj[key.slice((methodPrefix + __uv.location.origin + '@').length)] = window.localStorage.getItem(key); 99 | }; 100 | }; 101 | 102 | __uv.lsWrap = client.storage.emulate(client.storage.localStorage, __uv.localStorageObj); 103 | }; 104 | 105 | if (window.sessionStorage) { 106 | for (const key in window.sessionStorage) { 107 | if (key.startsWith(methodPrefix + __uv.location.origin + '@')) { 108 | __uv.sessionStorageObj[key.slice((methodPrefix + __uv.location.origin + '@').length)] = window.sessionStorage.getItem(key); 109 | }; 110 | }; 111 | 112 | __uv.ssWrap = client.storage.emulate(client.storage.sessionStorage, __uv.sessionStorageObj); 113 | }; 114 | 115 | 116 | 117 | let rawBase = window.document ? client.node.baseURI.get.call(window.document) : window.location.href; 118 | let base = __uv.sourceUrl(rawBase); 119 | 120 | client.nativeMethods.defineProperty(__uv.meta, 'base', { 121 | get() { 122 | if (!window.document) return __uv.meta.url.href; 123 | 124 | if (client.node.baseURI.get.call(window.document) !== rawBase) { 125 | rawBase = client.node.baseURI.get.call(window.document); 126 | base = __uv.sourceUrl(rawBase); 127 | }; 128 | 129 | return base; 130 | }, 131 | }); 132 | 133 | 134 | __uv.methods = { 135 | setSource: methodPrefix + 'setSource', 136 | source: methodPrefix + 'source', 137 | location: methodPrefix + 'location', 138 | function: methodPrefix + 'function', 139 | string: methodPrefix + 'string', 140 | eval: methodPrefix + 'eval', 141 | parent: methodPrefix + 'parent', 142 | top: methodPrefix + 'top', 143 | }; 144 | 145 | __uv.filterKeys = [ 146 | master, 147 | __uv.methods.setSource, 148 | __uv.methods.source, 149 | __uv.methods.location, 150 | __uv.methods.function, 151 | __uv.methods.string, 152 | __uv.methods.eval, 153 | __uv.methods.parent, 154 | __uv.methods.top, 155 | methodPrefix + 'protocol', 156 | methodPrefix + 'storageObj', 157 | methodPrefix + 'url', 158 | methodPrefix + 'modifiedStyle', 159 | methodPrefix + 'config', 160 | methodPrefix + 'dispatched', 161 | 'Ultraviolet', 162 | '__uvHook', 163 | ]; 164 | 165 | 166 | client.on('wrap', (target, wrapped) => { 167 | client.nativeMethods.defineProperty(wrapped, 'name', client.nativeMethods.getOwnPropertyDescriptor(target, 'name')); 168 | client.nativeMethods.defineProperty(wrapped, 'length', client.nativeMethods.getOwnPropertyDescriptor(target, 'length')); 169 | 170 | client.nativeMethods.defineProperty(wrapped, __uv.methods.string, { 171 | enumerable: false, 172 | value: client.nativeMethods.fnToString.call(target), 173 | }); 174 | 175 | client.nativeMethods.defineProperty(wrapped, __uv.methods.function, { 176 | enumerable: false, 177 | value: target, 178 | }); 179 | }); 180 | 181 | client.fetch.on('request', event => { 182 | event.data.input = __uv.rewriteUrl(event.data.input); 183 | }); 184 | 185 | client.fetch.on('requestUrl', event => { 186 | event.data.value = __uv.sourceUrl(event.data.value); 187 | }); 188 | 189 | client.fetch.on('responseUrl', event => { 190 | event.data.value = __uv.sourceUrl(event.data.value); 191 | }); 192 | 193 | // XMLHttpRequest 194 | client.xhr.on('open', event => { 195 | event.data.input = __uv.rewriteUrl(event.data.input); 196 | }); 197 | 198 | client.xhr.on('responseUrl', event => { 199 | event.data.value = __uv.sourceUrl(event.data.value); 200 | }); 201 | 202 | 203 | // Workers 204 | client.workers.on('worker', event => { 205 | event.data.url = __uv.rewriteUrl(event.data.url); 206 | }); 207 | 208 | client.workers.on('addModule', event => { 209 | event.data.url = __uv.rewriteUrl(event.data.url); 210 | }); 211 | 212 | client.workers.on('importScripts', event => { 213 | for (const i in event.data.scripts) { 214 | event.data.scripts[i] = __uv.rewriteUrl(event.data.scripts[i]); 215 | }; 216 | }); 217 | 218 | client.workers.on('postMessage', event => { 219 | let to = event.data.origin; 220 | 221 | event.data.origin = '*'; 222 | event.data.message = { 223 | __data: event.data.message, 224 | __origin: __uv.meta.url.origin, 225 | __to: to, 226 | }; 227 | }); 228 | 229 | // Navigator 230 | client.navigator.on('sendBeacon', event => { 231 | event.data.url = __uv.rewriteUrl(event.data.url); 232 | }); 233 | 234 | // Cookies 235 | client.document.on('getCookie', event => { 236 | event.data.value = __uv.cookieStr; 237 | }); 238 | 239 | client.document.on('setCookie', event => { 240 | Promise.resolve(__uv.cookie.setCookies(event.data.value, __uv.db, __uv.meta)).then(() => { 241 | __uv.cookie.db().then(db => { 242 | __uv.cookie.getCookies(db).then(cookies => { 243 | __uv.cookieStr = __uv.cookie.serialize(cookies, __uv.meta, true); 244 | }); 245 | }); 246 | }); 247 | const cookie = __uv.cookie.setCookie(event.data.value)[0]; 248 | 249 | if (!cookie.path) cookie.path = '/'; 250 | if (!cookie.domain) cookie.domain = __uv.meta.url.hostname; 251 | 252 | if (__uv.cookie.validateCookie(cookie, __uv.meta, true)) { 253 | if (__uv.cookieStr.length) __uv.cookieStr += '; '; 254 | __uv.cookieStr += `${cookie.name}=${cookie.value}`; 255 | }; 256 | 257 | event.respondWith(event.data.value); 258 | }); 259 | 260 | // HTML 261 | client.element.on('setInnerHTML', event => { 262 | switch (event.that.tagName) { 263 | case 'SCRIPT': 264 | event.data.value = __uv.js.rewrite(event.data.value); 265 | break; 266 | case 'STYLE': 267 | event.data.value = __uv.rewriteCSS(event.data.value); 268 | break; 269 | default: 270 | event.data.value = __uv.rewriteHtml(event.data.value); 271 | }; 272 | }); 273 | 274 | client.element.on('getInnerHTML', event => { 275 | switch (event.that.tagName) { 276 | case 'SCRIPT': 277 | event.data.value = __uv.js.source(event.data.value); 278 | break; 279 | default: 280 | event.data.value = __uv.sourceHtml(event.data.value); 281 | }; 282 | }); 283 | 284 | client.element.on('setOuterHTML', event => { 285 | event.data.value = __uv.rewriteHtml(event.data.value, { document: event.that.tagName === 'HTML' }); 286 | }); 287 | 288 | client.element.on('getOuterHTML', event => { 289 | switch (event.that.tagName) { 290 | case 'HEAD': 291 | event.data.value = __uv.sourceHtml( 292 | event.data.value.replace(/(.*)<\/head>/s, '$2') 293 | ).replace(/(.*)<\/op-head>/s, '$2'); 294 | break; 295 | case 'BODY': 296 | event.data.value = __uv.sourceHtml( 297 | event.data.value.replace(/(.*)<\/body>/s, '$2') 298 | ).replace(/(.*)<\/op-body>/s, '$2'); 299 | break; 300 | default: 301 | event.data.value = __uv.sourceHtml(event.data.value, { document: event.that.tagName === 'HTML' }); 302 | break; 303 | }; 304 | 305 | //event.data.value = __uv.sourceHtml(event.data.value, { document: event.that.tagName === 'HTML' }); 306 | }); 307 | 308 | client.document.on('write', event => { 309 | if (!event.data.html.length) return false; 310 | event.data.html = [__uv.rewriteHtml(event.data.html.join(''))]; 311 | }); 312 | 313 | client.document.on('writeln', event => { 314 | if (!event.data.html.length) return false; 315 | event.data.html = [__uv.rewriteHtml(event.data.html.join(''))]; 316 | }); 317 | 318 | client.element.on('insertAdjacentHTML', event => { 319 | event.data.html = __uv.rewriteHtml(event.data.html); 320 | }); 321 | 322 | // EventSource 323 | 324 | client.eventSource.on('construct', event => { 325 | event.data.url = __uv.rewriteUrl(event.data.url); 326 | }); 327 | 328 | 329 | client.eventSource.on('url', event => { 330 | event.data.url = __uv.rewriteUrl(event.data.url); 331 | }); 332 | 333 | // History 334 | client.history.on('replaceState', event => { 335 | if (event.data.url) event.data.url = __uv.rewriteUrl(event.data.url, '__uv' in event.that ? event.that.__uv.meta : __uv.meta); 336 | }); 337 | client.history.on('pushState', event => { 338 | if (event.data.url) event.data.url = __uv.rewriteUrl(event.data.url, '__uv' in event.that ? event.that.__uv.meta : __uv.meta); 339 | }); 340 | 341 | // Element get set attribute methods 342 | client.element.on('getAttribute', event => { 343 | if (client.element.hasAttribute.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name)) { 344 | event.respondWith( 345 | event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name) 346 | ); 347 | }; 348 | }); 349 | 350 | // Message 351 | client.message.on('postMessage', event => { 352 | let to = event.data.origin; 353 | let call = __uv.call; 354 | 355 | 356 | if (event.that) { 357 | call = event.that.__uv$source.call; 358 | }; 359 | 360 | event.data.origin = '*'; 361 | event.data.message = { 362 | __data: event.data.message, 363 | __origin: (event.that || event.target).__uv$source.location.origin, 364 | __to: to, 365 | }; 366 | 367 | event.respondWith( 368 | worker ? 369 | call(event.target, [event.data.message, event.data.transfer], event.that) : 370 | call(event.target, [event.data.message, event.data.origin, event.data.transfer], event.that) 371 | ); 372 | 373 | }); 374 | 375 | client.message.on('data', event => { 376 | const { value: data } = event.data; 377 | if (typeof data === 'object' && '__data' in data && '__origin' in data) { 378 | event.respondWith(data.__data); 379 | }; 380 | }); 381 | 382 | client.message.on('origin', event => { 383 | const data = client.message.messageData.get.call(event.that); 384 | if (typeof data === 'object' && data.__data && data.__origin) { 385 | event.respondWith(data.__origin); 386 | }; 387 | }); 388 | 389 | client.overrideDescriptor(window, 'origin', { 390 | get: (target, that) => { 391 | return __uv.location.origin; 392 | }, 393 | }); 394 | 395 | client.node.on('baseURI', event => { 396 | if (event.data.value.startsWith(window.location.origin)) event.data.value = __uv.sourceUrl(event.data.value); 397 | }); 398 | 399 | client.element.on('setAttribute', event => { 400 | if (event.that instanceof HTMLMediaElement && event.data.name === 'src' && event.data.value.startsWith('blob:')) { 401 | event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 402 | event.data.value = __uv.blobUrls.get(event.data.value); 403 | return; 404 | }; 405 | 406 | if (__uv.attrs.isUrl(event.data.name)) { 407 | event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 408 | event.data.value = __uv.rewriteUrl(event.data.value); 409 | }; 410 | 411 | if (__uv.attrs.isStyle(event.data.name)) { 412 | event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 413 | event.data.value = __uv.rewriteCSS(event.data.value, { context: 'declarationList' }); 414 | }; 415 | 416 | if (__uv.attrs.isHtml(event.data.name)) { 417 | event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 418 | event.data.value = __uv.rewriteHtml(event.data.value, {...__uv.meta, document: true, injectHead:__uv.createHtmlInject(__uv.handlerScript, __uv.bundleScript, __uv.configScript, __uv.cookieStr, window.location.href) }); 419 | }; 420 | 421 | if (__uv.attrs.isSrcset(event.data.name)) { 422 | event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 423 | event.data.value = __uv.html.wrapSrcset(event.data.value); 424 | }; 425 | 426 | if (__uv.attrs.isForbidden(event.data.name)) { 427 | event.data.name = __uv.attributePrefix + '-attr-' + event.data.name; 428 | }; 429 | }); 430 | 431 | client.element.on('audio', event => { 432 | event.data.url = __uv.rewriteUrl(event.data.url); 433 | }); 434 | 435 | // Element Property Attributes 436 | client.element.hookProperty([HTMLAnchorElement, HTMLAreaElement, HTMLLinkElement, HTMLBaseElement], 'href', { 437 | get: (target, that) => { 438 | return __uv.sourceUrl( 439 | target.call(that) 440 | ); 441 | }, 442 | set: (target, that, [val]) => { 443 | client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-href', val) 444 | target.call(that, __uv.rewriteUrl(val)); 445 | }, 446 | }); 447 | 448 | client.element.hookProperty([HTMLScriptElement, HTMLAudioElement, HTMLVideoElement, HTMLMediaElement, HTMLImageElement, HTMLInputElement, HTMLEmbedElement, HTMLIFrameElement, HTMLTrackElement, HTMLSourceElement], 'src', { 449 | get: (target, that) => { 450 | return __uv.sourceUrl( 451 | target.call(that) 452 | ); 453 | }, 454 | set: (target, that, [val]) => { 455 | if (new String(val).toString().trim().startsWith('blob:') && that instanceof HTMLMediaElement) { 456 | client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-src', val) 457 | return target.call(that, __uv.blobUrls.get(val) || val); 458 | }; 459 | 460 | client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-src', val) 461 | target.call(that, __uv.rewriteUrl(val)); 462 | }, 463 | }); 464 | 465 | client.element.hookProperty([HTMLFormElement], 'action', { 466 | get: (target, that) => { 467 | return __uv.sourceUrl( 468 | target.call(that) 469 | ); 470 | }, 471 | set: (target, that, [val]) => { 472 | client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-action', val) 473 | target.call(that, __uv.rewriteUrl(val)); 474 | }, 475 | }); 476 | 477 | client.element.hookProperty([HTMLImageElement], 'srcset', { 478 | get: (target, that) => { 479 | return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-srcset') || target.call(that); 480 | }, 481 | set: (target, that, [val]) => { 482 | client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-srcset', val) 483 | target.call(that, __uv.html.wrapSrcset(val)); 484 | }, 485 | }); 486 | 487 | client.element.hookProperty(HTMLScriptElement, 'integrity', { 488 | get: (target, that) => { 489 | return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-integrity'); 490 | }, 491 | set: (target, that, [val]) => { 492 | client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-integrity', val); 493 | }, 494 | }); 495 | 496 | client.element.hookProperty(HTMLIFrameElement, 'sandbox', { 497 | get: (target, that) => { 498 | return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-sandbox') || target.call(that); 499 | }, 500 | set: (target, that, [val]) => { 501 | client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-sandbox', val); 502 | }, 503 | }); 504 | 505 | client.element.hookProperty(HTMLIFrameElement, 'contentWindow', { 506 | get: (target, that) => { 507 | const win = target.call(that); 508 | try { 509 | if (!win.__uv) __uvHook(win, config, bare); 510 | return win; 511 | } catch (e) { 512 | return win; 513 | }; 514 | }, 515 | }); 516 | 517 | client.element.hookProperty(HTMLIFrameElement, 'contentDocument', { 518 | get: (target, that) => { 519 | const doc = target.call(that); 520 | try { 521 | const win = doc.defaultView 522 | if (!win.__uv) __uvHook(win, config, bare); 523 | return doc; 524 | } catch (e) { 525 | return win; 526 | }; 527 | }, 528 | }); 529 | 530 | client.element.hookProperty(HTMLIFrameElement, 'srcdoc', { 531 | get: (target, that) => { 532 | return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-srcdoc') || target.call(that); 533 | }, 534 | set: (target, that, [val]) => { 535 | target.call(that, __uv.rewriteHtml(val, { 536 | document: true, 537 | injectHead: __uv.createHtmlInject(__uv.handlerScript, __uv.bundleScript, __uv.configScript, __uv.cookieStr, window.location.href) 538 | })) 539 | }, 540 | }); 541 | 542 | client.node.on('getTextContent', event => { 543 | if (event.that.tagName === 'SCRIPT') { 544 | event.data.value = __uv.js.source(event.data.value); 545 | }; 546 | }); 547 | 548 | client.node.on('setTextContent', event => { 549 | if (event.that.tagName === 'SCRIPT') { 550 | event.data.value = __uv.js.rewrite(event.data.value); 551 | }; 552 | }); 553 | 554 | // Until proper rewriting is implemented for service workers. 555 | // Not sure atm how to implement it with the already built in service worker 556 | if ('serviceWorker' in window.navigator) { 557 | delete window.Navigator.prototype.serviceWorker; 558 | }; 559 | 560 | // Document 561 | client.document.on('getDomain', event => { 562 | event.data.value = __uv.domain; 563 | }); 564 | client.document.on('setDomain', event => { 565 | if (!event.data.value.toString().endsWith(__uv.meta.url.hostname.split('.').slice(-2).join('.'))) return event.respondWith(''); 566 | event.respondWith(__uv.domain = event.data.value); 567 | }) 568 | 569 | client.document.on('url', event => { 570 | event.data.value = __uv.location.href; 571 | }); 572 | 573 | client.document.on('documentURI', event => { 574 | event.data.value = __uv.location.href; 575 | }); 576 | 577 | client.document.on('referrer', event => { 578 | event.data.value = __uv.referrer || __uv.sourceUrl(event.data.value); 579 | }); 580 | 581 | client.document.on('parseFromString', event => { 582 | if (event.data.type !== 'text/html') return false; 583 | event.data.string = __uv.rewriteHtml(event.data.string, {...__uv.meta, document: true, }); 584 | }); 585 | 586 | // Attribute (node.attributes) 587 | client.attribute.on('getValue', event => { 588 | if (client.element.hasAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name)) { 589 | event.data.value = client.element.getAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name); 590 | }; 591 | }); 592 | 593 | client.attribute.on('setValue', event => { 594 | if (__uv.attrs.isUrl(event.data.name)) { 595 | client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 596 | event.data.value = __uv.rewriteUrl(event.data.value); 597 | }; 598 | 599 | if (__uv.attrs.isStyle(event.data.name)) { 600 | client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 601 | event.data.value = __uv.rewriteCSS(event.data.value, { context: 'declarationList' }); 602 | }; 603 | 604 | if (__uv.attrs.isHtml(event.data.name)) { 605 | client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 606 | event.data.value = __uv.rewriteHtml(event.data.value, {...__uv.meta, document: true, injectHead:__uv.createHtmlInject(__uv.handlerScript, __uv.bundleScript, __uv.configScript, __uv.cookieStr, window.location.href) }); 607 | }; 608 | 609 | if (__uv.attrs.isSrcset(event.data.name)) { 610 | client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); 611 | event.data.value = __uv.html.wrapSrcset(event.data.value); 612 | }; 613 | 614 | }); 615 | 616 | // URL 617 | client.url.on('createObjectURL', event => { 618 | let url = event.target.call(event.that, event.data.object); 619 | if (url.startsWith('blob:' + location.origin)) { 620 | let newUrl = 'blob:' + (__uv.meta.url.href !== 'about:blank' ? __uv.meta.url.origin : window.parent.__uv.meta.url.origin) + url.slice('blob:'.length + location.origin.length); 621 | __uv.blobUrls.set(newUrl, url); 622 | event.respondWith(newUrl); 623 | } else { 624 | event.respondWith(url); 625 | }; 626 | }); 627 | 628 | client.url.on('revokeObjectURL', event => { 629 | if (__uv.blobUrls.has(event.data.url)) { 630 | const old = event.data.url; 631 | event.data.url = __uv.blobUrls.get(event.data.url); 632 | __uv.blobUrls.delete(old); 633 | }; 634 | }); 635 | 636 | client.storage.on('get', event => { 637 | event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; 638 | }); 639 | 640 | client.storage.on('set', event => { 641 | if (event.that.__uv$storageObj) { 642 | event.that.__uv$storageObj[event.data.name] = event.data.value; 643 | }; 644 | event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; 645 | }); 646 | 647 | client.storage.on('delete', event => { 648 | if (event.that.__uv$storageObj) { 649 | delete event.that.__uv$storageObj[event.data.name]; 650 | }; 651 | event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; 652 | }); 653 | 654 | client.storage.on('getItem', event => { 655 | event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; 656 | }); 657 | 658 | client.storage.on('setItem', event => { 659 | if (event.that.__uv$storageObj) { 660 | event.that.__uv$storageObj[event.data.name] = event.data.value; 661 | }; 662 | event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; 663 | }); 664 | 665 | client.storage.on('removeItem', event => { 666 | if (event.that.__uv$storageObj) { 667 | delete event.that.__uv$storageObj[event.data.name]; 668 | }; 669 | event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; 670 | }); 671 | 672 | client.storage.on('clear', event => { 673 | if (event.that.__uv$storageObj) { 674 | for (const key of client.nativeMethods.keys.call(null, event.that.__uv$storageObj)) { 675 | delete event.that.__uv$storageObj[key]; 676 | client.storage.removeItem.call(event.that, methodPrefix + __uv.meta.url.origin + '@' + key); 677 | event.respondWith(); 678 | }; 679 | }; 680 | }); 681 | 682 | client.storage.on('length', event => { 683 | if (event.that.__uv$storageObj) { 684 | event.respondWith(client.nativeMethods.keys.call(null, event.that.__uv$storageObj).length); 685 | }; 686 | }); 687 | 688 | client.storage.on('key', event => { 689 | if (event.that.__uv$storageObj) { 690 | event.respondWith( 691 | (client.nativeMethods.keys.call(null, event.that.__uv$storageObj)[event.data.index] || null) 692 | ); 693 | }; 694 | }); 695 | 696 | client.websocket.on('websocket', async event => { 697 | let url; 698 | try { 699 | url = new URL(event.data.url); 700 | } catch(e) { 701 | return; 702 | }; 703 | 704 | const headers = { 705 | Host: url.host, 706 | Origin: __uv.meta.url.origin, 707 | Pragma: 'no-cache', 708 | 'Cache-Control': 'no-cache', 709 | Upgrade: 'websocket', 710 | 'User-Agent': window.navigator.userAgent, 711 | 'Connection': 'Upgrade', 712 | }; 713 | 714 | const cookies = __uv.cookie.serialize(__uv.cookies, { url }, false); 715 | 716 | if (cookies) headers.Cookie = cookies; 717 | const protocols = [...event.data.protocols]; 718 | 719 | const remote = { 720 | protocol: url.protocol, 721 | host: url.hostname, 722 | port: url.port || (url.protocol === 'wss:' ? '443' : '80'), 723 | path: url.pathname + url.search, 724 | }; 725 | 726 | if (protocols.length) headers['Sec-WebSocket-Protocol'] = protocols.join(', '); 727 | 728 | event.data.url = (__uv.bare.protocol === 'https:' ? 'wss://' : 'ws://') + __uv.bare.host + __uv.bare.pathname + 'v1/'; 729 | event.data.protocols = [ 730 | 'bare', 731 | __uv.encodeProtocol(JSON.stringify({ 732 | remote, 733 | headers, 734 | forward_headers: [ 735 | 'accept', 736 | 'accept-encoding', 737 | 'accept-language', 738 | 'sec-websocket-extensions', 739 | 'sec-websocket-key', 740 | 'sec-websocket-version', 741 | ], 742 | })), 743 | ]; 744 | 745 | const ws = new event.target(event.data.url, event.data.protocols); 746 | 747 | client.nativeMethods.defineProperty(ws, methodPrefix + 'url', { 748 | enumerable: false, 749 | value: url.href, 750 | }); 751 | 752 | event.respondWith( 753 | ws 754 | ); 755 | }); 756 | 757 | client.websocket.on('url', event => { 758 | if ('__uv$url' in event.that) { 759 | event.data.value = event.that.__uv$url; 760 | }; 761 | }); 762 | 763 | client.websocket.on('protocol', event => { 764 | if ('__uv$protocol' in event.that) { 765 | event.data.value = event.that.__uv$protocol; 766 | }; 767 | }); 768 | 769 | client.function.on('function', event => { 770 | event.data.script = __uv.rewriteJS(event.data.script); 771 | }); 772 | 773 | client.function.on('toString', event => { 774 | if (__uv.methods.string in event.that) event.respondWith(event.that[__uv.methods.string]); 775 | }); 776 | 777 | client.object.on('getOwnPropertyNames', event => { 778 | event.data.names = event.data.names.filter(element => !(__uv.filterKeys.includes(element))); 779 | }); 780 | 781 | client.object.on('getOwnPropertyDescriptors', event => { 782 | for (const forbidden of __uv.filterKeys) { 783 | delete event.data.descriptors[forbidden]; 784 | }; 785 | 786 | }); 787 | 788 | client.style.on('setProperty', event => { 789 | if (client.style.dashedUrlProps.includes(event.data.property)) { 790 | event.data.value = __uv.rewriteCSS(event.data.value, { 791 | context: 'value', 792 | ...__uv.meta 793 | }) 794 | }; 795 | }); 796 | 797 | client.style.on('getPropertyValue', event => { 798 | if (client.style.dashedUrlProps.includes(event.data.property)) { 799 | event.respondWith( 800 | __uv.sourceCSS( 801 | event.target.call(event.that, event.data.property), 802 | { 803 | context: 'value', 804 | ...__uv.meta 805 | } 806 | ) 807 | ); 808 | }; 809 | }); 810 | 811 | if ('CSS2Properties' in window) { 812 | for (const key of client.style.urlProps) { 813 | client.overrideDescriptor(window.CSS2Properties.prototype, key, { 814 | get: (target, that) => { 815 | return __uv.sourceCSS( 816 | target.call(that), 817 | { 818 | context: 'value', 819 | ...__uv.meta 820 | } 821 | ) 822 | }, 823 | set: (target, that, val) => { 824 | target.call( 825 | that, 826 | __uv.rewriteCSS(val, { 827 | context: 'value', 828 | ...__uv.meta 829 | }) 830 | ); 831 | } 832 | }); 833 | }; 834 | } else if ('HTMLElement' in window) { 835 | 836 | client.overrideDescriptor( 837 | window.HTMLElement.prototype, 838 | 'style', 839 | { 840 | get: (target, that) => { 841 | const value = target.call(that); 842 | if (!value[methodPrefix + 'modifiedStyle']) { 843 | 844 | for (const key of client.style.urlProps) { 845 | client.nativeMethods.defineProperty(value, key, { 846 | enumerable: true, 847 | configurable: true, 848 | get() { 849 | const value = client.style.getPropertyValue.call(this, key) || ''; 850 | return __uv.sourceCSS( 851 | value, 852 | { 853 | context: 'value', 854 | ...__uv.meta 855 | } 856 | ) 857 | }, 858 | set(val) { 859 | client.style.setProperty.call(this, 860 | (client.style.propToDashed[key] || key), 861 | __uv.rewriteCSS(val, { 862 | context: 'value', 863 | ...__uv.meta 864 | }) 865 | ) 866 | } 867 | }); 868 | client.nativeMethods.defineProperty(value, methodPrefix + 'modifiedStyle', { 869 | enumerable: false, 870 | value: true 871 | }); 872 | }; 873 | }; 874 | return value; 875 | } 876 | } 877 | ); 878 | }; 879 | 880 | client.style.on('setCssText', event => { 881 | event.data.value = __uv.rewriteCSS(event.data.value, { 882 | context: 'declarationList', 883 | ...__uv.meta 884 | }); 885 | }); 886 | 887 | client.style.on('getCssText', event => { 888 | event.data.value = __uv.sourceCSS(event.data.value, { 889 | context: 'declarationList', 890 | ...__uv.meta 891 | }); 892 | }); 893 | 894 | // Proper hash emulation. 895 | if (!!window.window) { 896 | __uv.addEventListener.call(window, 'hashchange', event => { 897 | if (event.__uv$dispatched) return false; 898 | event.stopImmediatePropagation(); 899 | const hash = window.location.hash; 900 | client.history.replaceState.call(window.history, '', '', event.oldURL); 901 | __uv.location.hash = hash; 902 | }); 903 | }; 904 | 905 | client.location.on('hashchange', (oldUrl, newUrl, ctx) => { 906 | if (ctx.HashChangeEvent && client.history.replaceState) { 907 | client.history.replaceState.call(window.history, '', '', __uv.rewriteUrl(newUrl)); 908 | 909 | const event = new ctx.HashChangeEvent('hashchange', { newURL: newUrl, oldURL: oldUrl }); 910 | 911 | client.nativeMethods.defineProperty(event, methodPrefix + 'dispatched', { 912 | value: true, 913 | enumerable: false, 914 | }); 915 | 916 | __uv.dispatchEvent.call(window, event); 917 | }; 918 | }); 919 | 920 | // Hooking functions & descriptors 921 | client.fetch.overrideRequest(); 922 | client.fetch.overrideUrl(); 923 | client.xhr.overrideOpen(); 924 | client.xhr.overrideResponseUrl(); 925 | client.element.overrideHtml(); 926 | client.element.overrideAttribute(); 927 | client.element.overrideInsertAdjacentHTML(); 928 | client.element.overrideAudio(); 929 | // client.element.overrideQuerySelector(); 930 | client.node.overrideBaseURI(); 931 | client.node.overrideTextContent(); 932 | client.attribute.overrideNameValue(); 933 | client.document.overrideDomain(); 934 | client.document.overrideURL(); 935 | client.document.overrideDocumentURI(); 936 | client.document.overrideWrite(); 937 | client.document.overrideReferrer(); 938 | client.document.overrideParseFromString(); 939 | client.storage.overrideMethods(); 940 | client.storage.overrideLength(); 941 | //client.document.overrideQuerySelector(); 942 | client.object.overrideGetPropertyNames(); 943 | client.object.overrideGetOwnPropertyDescriptors(); 944 | client.history.overridePushState(); 945 | client.history.overrideReplaceState(); 946 | client.eventSource.overrideConstruct(); 947 | client.eventSource.overrideUrl(); 948 | client.websocket.overrideWebSocket(); 949 | client.websocket.overrideProtocol(); 950 | client.websocket.overrideUrl(); 951 | client.url.overrideObjectURL(); 952 | client.document.overrideCookie(); 953 | client.message.overridePostMessage(); 954 | client.message.overrideMessageOrigin(); 955 | client.message.overrideMessageData(); 956 | client.workers.overrideWorker(); 957 | client.workers.overrideAddModule(); 958 | client.workers.overrideImportScripts(); 959 | client.workers.overridePostMessage(); 960 | client.style.overrideSetGetProperty(); 961 | client.style.overrideCssText(); 962 | client.navigator.overrideSendBeacon(); 963 | client.function.overrideFunction(); 964 | client.function.overrideToString(); 965 | client.location.overrideWorkerLocation( 966 | (href) => { 967 | return new URL(__uv.sourceUrl(href)); 968 | } 969 | ); 970 | 971 | client.overrideDescriptor(window, 'localStorage', { 972 | get: (target, that) => { 973 | return (that || window).__uv.lsWrap; 974 | }, 975 | }); 976 | client.overrideDescriptor(window, 'sessionStorage', { 977 | get: (target, that) => { 978 | return (that || window).__uv.ssWrap; 979 | }, 980 | }); 981 | 982 | 983 | client.override(window, 'open', (target, that, args) => { 984 | if (!args.length) return target.apply(that, args); 985 | let [url] = args; 986 | 987 | url = __uv.rewriteUrl(url); 988 | 989 | return target.call(that, url); 990 | }); 991 | 992 | __uv.$wrap = function(name) { 993 | if (name === 'location') return __uv.methods.location; 994 | if (name === 'eval') return __uv.methods.eval; 995 | return name; 996 | }; 997 | 998 | 999 | __uv.$get = function(that) { 1000 | if (that === window.location) return __uv.location; 1001 | if (that === window.eval) return __uv.eval; 1002 | if (that === window.parent) { 1003 | return window.__uv$parent; 1004 | }; 1005 | if (that === window.top) { 1006 | return window.__uv$top; 1007 | }; 1008 | return that; 1009 | }; 1010 | 1011 | __uv.eval = client.wrap(window, 'eval', (target, that, args) => { 1012 | if (!args.length || typeof args[0] !== 'string') return target.apply(that, args); 1013 | let [script] = args; 1014 | 1015 | script = __uv.rewriteJS(script); 1016 | return target.call(that, script); 1017 | }); 1018 | 1019 | __uv.call = function(target, args, that) { 1020 | return that ? target.apply(that, args) : target(...args); 1021 | }; 1022 | 1023 | __uv.call$ = function(obj, prop, args = []) { 1024 | return obj[prop].apply(obj, args); 1025 | }; 1026 | 1027 | client.nativeMethods.defineProperty(window.Object.prototype, master, { 1028 | get: () => { 1029 | return __uv; 1030 | }, 1031 | enumerable: false 1032 | }); 1033 | 1034 | client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.setSource, { 1035 | value: function(source) { 1036 | if (!client.nativeMethods.isExtensible(this)) return this; 1037 | 1038 | client.nativeMethods.defineProperty(this, __uv.methods.source, { 1039 | value: source, 1040 | writable: true, 1041 | enumerable: false 1042 | }); 1043 | 1044 | return this; 1045 | }, 1046 | enumerable: false, 1047 | }); 1048 | 1049 | client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.source, { 1050 | value: __uv, 1051 | writable: true, 1052 | enumerable: false 1053 | }); 1054 | 1055 | client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.location, { 1056 | configurable: true, 1057 | get() { 1058 | return (this === window.document || this === window) ? __uv.location : this.location; 1059 | }, 1060 | set(val) { 1061 | if (this === window.document || this === window) { 1062 | __uv.location.href = val; 1063 | } else { 1064 | this.location = val; 1065 | }; 1066 | }, 1067 | }); 1068 | 1069 | client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.parent, { 1070 | configurable: true, 1071 | get() { 1072 | const val = this.parent; 1073 | 1074 | if (this === window) { 1075 | try { 1076 | return '__uv' in val ? val : this; 1077 | } catch (e) { 1078 | return this; 1079 | }; 1080 | }; 1081 | return val; 1082 | }, 1083 | set(val) { 1084 | this.parent = val; 1085 | }, 1086 | }); 1087 | 1088 | client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.top, { 1089 | configurable: true, 1090 | get() { 1091 | const val = this.top; 1092 | 1093 | if (this === window) { 1094 | if (val === this.parent) return this[__uv.methods.parent]; 1095 | try { 1096 | if (!('__uv' in val)) { 1097 | let current = this; 1098 | 1099 | while (current.parent !== val) { 1100 | current = current.parent 1101 | }; 1102 | 1103 | return '__uv' in current ? current : this; 1104 | 1105 | } else { 1106 | return val; 1107 | }; 1108 | } catch (e) { 1109 | return this; 1110 | }; 1111 | }; 1112 | return val; 1113 | }, 1114 | set(val) { 1115 | this.top = val; 1116 | }, 1117 | }); 1118 | 1119 | 1120 | client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.eval, { 1121 | configurable: true, 1122 | get() { 1123 | return this === window ? __uv.eval : this.eval; 1124 | }, 1125 | set(val) { 1126 | this.eval = val; 1127 | }, 1128 | }); 1129 | }; 1130 | -------------------------------------------------------------------------------- /static/uv/uv.sw.js: -------------------------------------------------------------------------------- 1 | importScripts('/uv/uv.bundle.js'); 2 | importScripts('/uv/uv.config.js'); 3 | 4 | class UVServiceWorker extends EventEmitter { 5 | constructor(config = __uv$config) { 6 | super(); 7 | if (!config.bare) config.bare = '/bare/'; 8 | this.addresses = typeof config.bare === 'string' ? [ new URL(config.bare, location) ] : config.bare.map(str => new URL(str, location)); 9 | this.headers = { 10 | csp: [ 11 | 'cross-origin-embedder-policy', 12 | 'cross-origin-opener-policy', 13 | 'cross-origin-resource-policy', 14 | 'content-security-policy', 15 | 'content-security-policy-report-only', 16 | 'expect-ct', 17 | 'feature-policy', 18 | 'origin-isolation', 19 | 'strict-transport-security', 20 | 'upgrade-insecure-requests', 21 | 'x-content-type-options', 22 | 'x-download-options', 23 | 'x-frame-options', 24 | 'x-permitted-cross-domain-policies', 25 | 'x-powered-by', 26 | 'x-xss-protection', 27 | ], 28 | forward: [ 29 | 'accept-encoding', 30 | 'connection', 31 | 'content-length', 32 | ], 33 | }; 34 | this.method = { 35 | empty: [ 36 | 'GET', 37 | 'HEAD' 38 | ] 39 | }; 40 | this.statusCode = { 41 | empty: [ 42 | 204, 43 | 304, 44 | ], 45 | }; 46 | this.config = config; 47 | this.browser = Ultraviolet.Bowser.getParser(self.navigator.userAgent).getBrowserName(); 48 | 49 | if (this.browser === 'Firefox') { 50 | this.headers.forward.push('user-agent'); 51 | this.headers.forward.push('content-type'); 52 | }; 53 | }; 54 | async fetch({ request }) { 55 | if (!request.url.startsWith(location.origin + (this.config.prefix || '/service/'))) { 56 | return fetch(request); 57 | }; 58 | try { 59 | 60 | const ultraviolet = new Ultraviolet(this.config); 61 | 62 | if (typeof this.config.construct === 'function') { 63 | this.config.construct(ultraviolet, 'service'); 64 | }; 65 | 66 | const db = await ultraviolet.cookie.db(); 67 | 68 | ultraviolet.meta.origin = location.origin; 69 | ultraviolet.meta.base = ultraviolet.meta.url = new URL(ultraviolet.sourceUrl(request.url)); 70 | 71 | const requestCtx = new RequestContext( 72 | request, 73 | this, 74 | ultraviolet, 75 | !this.method.empty.includes(request.method.toUpperCase()) ? await request.blob() : null 76 | ); 77 | 78 | if (ultraviolet.meta.url.protocol === 'blob:') { 79 | requestCtx.blob = true; 80 | requestCtx.base = requestCtx.url = new URL(requestCtx.url.pathname); 81 | }; 82 | 83 | if (request.referrer && request.referrer.startsWith(location.origin)) { 84 | const referer = new URL(ultraviolet.sourceUrl(request.referrer)); 85 | 86 | if (requestCtx.headers.origin || ultraviolet.meta.url.origin !== referer.origin && request.mode === 'cors') { 87 | requestCtx.headers.origin = referer.origin; 88 | }; 89 | 90 | requestCtx.headers.referer = referer.href; 91 | }; 92 | 93 | const cookies = await ultraviolet.cookie.getCookies(db) || []; 94 | const cookieStr = ultraviolet.cookie.serialize(cookies, ultraviolet.meta, false); 95 | 96 | if (this.browser === 'Firefox' && !(request.destination === 'iframe' || request.destination === 'document')) { 97 | requestCtx.forward.shift(); 98 | }; 99 | 100 | if (cookieStr) requestCtx.headers.cookie = cookieStr; 101 | requestCtx.headers.Host = requestCtx.url.host; 102 | 103 | 104 | const reqEvent = new HookEvent(requestCtx, null, null); 105 | this.emit('request', reqEvent); 106 | 107 | if (reqEvent.intercepted) return reqEvent.returnValue; 108 | 109 | const response = await fetch(requestCtx.send); 110 | 111 | if (response.status === 500) { 112 | return Promise.reject(''); 113 | }; 114 | 115 | const responseCtx = new ResponseContext(requestCtx, response, this); 116 | const resEvent = new HookEvent(responseCtx, null, null); 117 | 118 | this.emit('beforemod', resEvent); 119 | if (resEvent.intercepted) return resEvent.returnValue; 120 | 121 | for (const name of this.headers.csp) { 122 | if (responseCtx.headers[name]) delete responseCtx.headers[name]; 123 | }; 124 | 125 | if (responseCtx.headers.location) { 126 | responseCtx.headers.location = ultraviolet.rewriteUrl(responseCtx.headers.location); 127 | }; 128 | 129 | if (responseCtx.headers['set-cookie']) { 130 | Promise.resolve(ultraviolet.cookie.setCookies(responseCtx.headers['set-cookie'], db, ultraviolet.meta)).then(() => { 131 | self.clients.matchAll().then(function (clients){ 132 | clients.forEach(function(client){ 133 | client.postMessage({ 134 | msg: 'updateCookies', 135 | url: ultraviolet.meta.url.href, 136 | }); 137 | }); 138 | }); 139 | }); 140 | delete responseCtx.headers['set-cookie']; 141 | }; 142 | 143 | if (responseCtx.body) { 144 | switch(request.destination) { 145 | case 'script': 146 | case 'worker': 147 | responseCtx.body = `if (!self.__uv && self.importScripts) importScripts('${__uv$config.bundle}', '${__uv$config.config}', '${__uv$config.handler}');\n`; 148 | responseCtx.body += ultraviolet.js.rewrite( 149 | await response.text() 150 | ); 151 | break; 152 | case 'style': 153 | responseCtx.body = ultraviolet.rewriteCSS( 154 | await response.text() 155 | ); 156 | break; 157 | case 'iframe': 158 | case 'document': 159 | if (isHtml(ultraviolet.meta.url, (responseCtx.headers['content-type'] || ''))) { 160 | responseCtx.body = ultraviolet.rewriteHtml( 161 | await response.text(), 162 | { 163 | document: true , 164 | injectHead: ultraviolet.createHtmlInject( 165 | this.config.handler, 166 | this.config.bundle, 167 | this.config.config, 168 | ultraviolet.cookie.serialize(cookies, ultraviolet.meta, true), 169 | request.referrer 170 | ) 171 | } 172 | ); 173 | }; 174 | }; 175 | }; 176 | 177 | if (requestCtx.headers.accept === 'text/event-stream') { 178 | responseCtx.headers['content-type'] = 'text/event-stream'; 179 | }; 180 | 181 | this.emit('response', resEvent); 182 | if (resEvent.intercepted) return resEvent.returnValue; 183 | 184 | return new Response(responseCtx.body, { 185 | headers: responseCtx.headers, 186 | status: responseCtx.status, 187 | statusText: responseCtx.statusText, 188 | }); 189 | 190 | } catch(err) { 191 | return new Response(err.toString(), { 192 | status: 500, 193 | }); 194 | }; 195 | }; 196 | getBarerResponse(response) { 197 | const headers = {}; 198 | const raw = JSON.parse(response.headers.get('x-bare-headers')); 199 | 200 | for (const key in raw) { 201 | headers[key.toLowerCase()] = raw[key]; 202 | }; 203 | 204 | return { 205 | headers, 206 | status: +response.headers.get('x-bare-status'), 207 | statusText: response.headers.get('x-bare-status-text'), 208 | body: !this.statusCode.empty.includes(+response.headers.get('x-bare-status')) ? response.body : null, 209 | }; 210 | }; 211 | get address() { 212 | return this.addresses[Math.floor(Math.random() * this.addresses.length)]; 213 | }; 214 | static Ultraviolet = Ultraviolet; 215 | }; 216 | 217 | self.UVServiceWorker = UVServiceWorker; 218 | 219 | 220 | class ResponseContext { 221 | constructor(request, response, worker) { 222 | const { headers, status, statusText, body } = !request.blob ? worker.getBarerResponse(response) : { 223 | status: response.status, 224 | statusText: response.statusText, 225 | headers: Object.fromEntries([...response.headers.entries()]), 226 | body: response.body, 227 | }; 228 | this.request = request; 229 | this.raw = response; 230 | this.ultraviolet = request.ultraviolet; 231 | this.headers = headers; 232 | this.status = status; 233 | this.statusText = statusText; 234 | this.body = body; 235 | }; 236 | get url() { 237 | return this.request.url; 238 | } 239 | get base() { 240 | return this.request.base; 241 | }; 242 | set base(val) { 243 | this.request.base = val; 244 | }; 245 | }; 246 | 247 | class RequestContext { 248 | constructor(request, worker, ultraviolet, body = null) { 249 | this.ultraviolet = ultraviolet; 250 | this.request = request; 251 | this.headers = Object.fromEntries([...request.headers.entries()]); 252 | this.method = request.method; 253 | this.forward = [...worker.headers.forward]; 254 | this.address = worker.address; 255 | this.body = body || null; 256 | this.redirect = request.redirect; 257 | this.credentials = 'omit'; 258 | this.mode = request.mode === 'cors' ? request.mode : 'same-origin'; 259 | this.blob = false; 260 | }; 261 | get send() { 262 | return new Request((!this.blob ? this.address.href + 'v1/' : 'blob:' + location.origin + this.url.pathname), { 263 | method: this.method, 264 | headers: { 265 | 'x-bare-protocol': this.url.protocol, 266 | 'x-bare-host': this.url.hostname, 267 | 'x-bare-path': this.url.pathname + this.url.search, 268 | 'x-bare-port': this.url.port || (this.url.protocol === 'https:' ? '443' : '80'), 269 | 'x-bare-headers': JSON.stringify(this.headers), 270 | 'x-bare-forward-headers': JSON.stringify(this.forward), 271 | 'userKey': userKey, 272 | }, 273 | redirect: this.redirect, 274 | credentials: this.credentials, 275 | mode: location.origin !== this.address.origin ? 'cors' : this.mode, 276 | body: this.body 277 | }); 278 | }; 279 | get url() { 280 | return this.ultraviolet.meta.url; 281 | }; 282 | set url(val) { 283 | this.ultraviolet.meta.url = val; 284 | }; 285 | get base() { 286 | return this.ultraviolet.meta.base; 287 | }; 288 | set base(val) { 289 | this.ultraviolet.meta.base = val; 290 | }; 291 | } 292 | 293 | function isHtml(url, contentType = '') { 294 | return (Ultraviolet.mime.contentType((contentType || url.pathname)) || 'text/html').split(';')[0] === 'text/html'; 295 | }; 296 | 297 | class HookEvent { 298 | #intercepted; 299 | #returnValue; 300 | constructor(data = {}, target = null, that = null) { 301 | this.#intercepted = false; 302 | this.#returnValue = null; 303 | this.data = data; 304 | this.target = target; 305 | this.that = that; 306 | }; 307 | get intercepted() { 308 | return this.#intercepted; 309 | }; 310 | get returnValue() { 311 | return this.#returnValue; 312 | }; 313 | respondWith(input) { 314 | this.#returnValue = input; 315 | this.#intercepted = true; 316 | }; 317 | }; 318 | 319 | var R = typeof Reflect === 'object' ? Reflect : null 320 | var ReflectApply = R && typeof R.apply === 'function' 321 | ? R.apply 322 | : function ReflectApply(target, receiver, args) { 323 | return Function.prototype.apply.call(target, receiver, args); 324 | } 325 | 326 | var ReflectOwnKeys 327 | if (R && typeof R.ownKeys === 'function') { 328 | ReflectOwnKeys = R.ownKeys 329 | } else if (Object.getOwnPropertySymbols) { 330 | ReflectOwnKeys = function ReflectOwnKeys(target) { 331 | return Object.getOwnPropertyNames(target) 332 | .concat(Object.getOwnPropertySymbols(target)); 333 | }; 334 | } else { 335 | ReflectOwnKeys = function ReflectOwnKeys(target) { 336 | return Object.getOwnPropertyNames(target); 337 | }; 338 | } 339 | 340 | function ProcessEmitWarning(warning) { 341 | if (console && console.warn) console.warn(warning); 342 | } 343 | 344 | var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { 345 | return value !== value; 346 | } 347 | 348 | function EventEmitter() { 349 | EventEmitter.init.call(this); 350 | } 351 | 352 | // Backwards-compat with node 0.10.x 353 | EventEmitter.EventEmitter = EventEmitter; 354 | 355 | EventEmitter.prototype._events = undefined; 356 | EventEmitter.prototype._eventsCount = 0; 357 | EventEmitter.prototype._maxListeners = undefined; 358 | 359 | // By default EventEmitters will print a warning if more than 10 listeners are 360 | // added to it. This is a useful default which helps finding memory leaks. 361 | var defaultMaxListeners = 10; 362 | 363 | function checkListener(listener) { 364 | if (typeof listener !== 'function') { 365 | throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); 366 | } 367 | } 368 | 369 | Object.defineProperty(EventEmitter, 'defaultMaxListeners', { 370 | enumerable: true, 371 | get: function() { 372 | return defaultMaxListeners; 373 | }, 374 | set: function(arg) { 375 | if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { 376 | throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); 377 | } 378 | defaultMaxListeners = arg; 379 | } 380 | }); 381 | 382 | EventEmitter.init = function() { 383 | 384 | if (this._events === undefined || 385 | this._events === Object.getPrototypeOf(this)._events) { 386 | this._events = Object.create(null); 387 | this._eventsCount = 0; 388 | } 389 | 390 | this._maxListeners = this._maxListeners || undefined; 391 | }; 392 | 393 | // Obviously not all Emitters should be limited to 10. This function allows 394 | // that to be increased. Set to zero for unlimited. 395 | EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { 396 | if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { 397 | throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); 398 | } 399 | this._maxListeners = n; 400 | return this; 401 | }; 402 | 403 | function _getMaxListeners(that) { 404 | if (that._maxListeners === undefined) 405 | return EventEmitter.defaultMaxListeners; 406 | return that._maxListeners; 407 | } 408 | 409 | EventEmitter.prototype.getMaxListeners = function getMaxListeners() { 410 | return _getMaxListeners(this); 411 | }; 412 | 413 | EventEmitter.prototype.emit = function emit(type) { 414 | var args = []; 415 | for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); 416 | var doError = (type === 'error'); 417 | 418 | var events = this._events; 419 | if (events !== undefined) 420 | doError = (doError && events.error === undefined); 421 | else if (!doError) 422 | return false; 423 | 424 | // If there is no 'error' event listener then throw. 425 | if (doError) { 426 | var er; 427 | if (args.length > 0) 428 | er = args[0]; 429 | if (er instanceof Error) { 430 | // Note: The comments on the `throw` lines are intentional, they show 431 | // up in Node's output if this results in an unhandled exception. 432 | throw er; // Unhandled 'error' event 433 | } 434 | // At least give some kind of context to the user 435 | var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); 436 | err.context = er; 437 | throw err; // Unhandled 'error' event 438 | } 439 | 440 | var handler = events[type]; 441 | 442 | if (handler === undefined) 443 | return false; 444 | 445 | if (typeof handler === 'function') { 446 | ReflectApply(handler, this, args); 447 | } else { 448 | var len = handler.length; 449 | var listeners = arrayClone(handler, len); 450 | for (var i = 0; i < len; ++i) 451 | ReflectApply(listeners[i], this, args); 452 | } 453 | 454 | return true; 455 | }; 456 | 457 | function _addListener(target, type, listener, prepend) { 458 | var m; 459 | var events; 460 | var existing; 461 | 462 | checkListener(listener); 463 | 464 | events = target._events; 465 | if (events === undefined) { 466 | events = target._events = Object.create(null); 467 | target._eventsCount = 0; 468 | } else { 469 | // To avoid recursion in the case that type === "newListener"! Before 470 | // adding it to the listeners, first emit "newListener". 471 | if (events.newListener !== undefined) { 472 | target.emit('newListener', type, 473 | listener.listener ? listener.listener : listener); 474 | 475 | // Re-assign `events` because a newListener handler could have caused the 476 | // this._events to be assigned to a new object 477 | events = target._events; 478 | } 479 | existing = events[type]; 480 | } 481 | 482 | if (existing === undefined) { 483 | // Optimize the case of one listener. Don't need the extra array object. 484 | existing = events[type] = listener; 485 | ++target._eventsCount; 486 | } else { 487 | if (typeof existing === 'function') { 488 | // Adding the second element, need to change to array. 489 | existing = events[type] = 490 | prepend ? [listener, existing] : [existing, listener]; 491 | // If we've already got an array, just append. 492 | } else if (prepend) { 493 | existing.unshift(listener); 494 | } else { 495 | existing.push(listener); 496 | } 497 | 498 | // Check for listener leak 499 | m = _getMaxListeners(target); 500 | if (m > 0 && existing.length > m && !existing.warned) { 501 | existing.warned = true; 502 | // No error code for this since it is a Warning 503 | // eslint-disable-next-line no-restricted-syntax 504 | var w = new Error('Possible EventEmitter memory leak detected. ' + 505 | existing.length + ' ' + String(type) + ' listeners ' + 506 | 'added. Use emitter.setMaxListeners() to ' + 507 | 'increase limit'); 508 | w.name = 'MaxListenersExceededWarning'; 509 | w.emitter = target; 510 | w.type = type; 511 | w.count = existing.length; 512 | ProcessEmitWarning(w); 513 | } 514 | } 515 | 516 | return target; 517 | } 518 | 519 | EventEmitter.prototype.addListener = function addListener(type, listener) { 520 | return _addListener(this, type, listener, false); 521 | }; 522 | 523 | EventEmitter.prototype.on = EventEmitter.prototype.addListener; 524 | 525 | EventEmitter.prototype.prependListener = 526 | function prependListener(type, listener) { 527 | return _addListener(this, type, listener, true); 528 | }; 529 | 530 | function onceWrapper() { 531 | if (!this.fired) { 532 | this.target.removeListener(this.type, this.wrapFn); 533 | this.fired = true; 534 | if (arguments.length === 0) 535 | return this.listener.call(this.target); 536 | return this.listener.apply(this.target, arguments); 537 | } 538 | } 539 | 540 | function _onceWrap(target, type, listener) { 541 | var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; 542 | var wrapped = onceWrapper.bind(state); 543 | wrapped.listener = listener; 544 | state.wrapFn = wrapped; 545 | return wrapped; 546 | } 547 | 548 | EventEmitter.prototype.once = function once(type, listener) { 549 | checkListener(listener); 550 | this.on(type, _onceWrap(this, type, listener)); 551 | return this; 552 | }; 553 | 554 | EventEmitter.prototype.prependOnceListener = 555 | function prependOnceListener(type, listener) { 556 | checkListener(listener); 557 | this.prependListener(type, _onceWrap(this, type, listener)); 558 | return this; 559 | }; 560 | 561 | // Emits a 'removeListener' event if and only if the listener was removed. 562 | EventEmitter.prototype.removeListener = 563 | function removeListener(type, listener) { 564 | var list, events, position, i, originalListener; 565 | 566 | checkListener(listener); 567 | 568 | events = this._events; 569 | if (events === undefined) 570 | return this; 571 | 572 | list = events[type]; 573 | if (list === undefined) 574 | return this; 575 | 576 | if (list === listener || list.listener === listener) { 577 | if (--this._eventsCount === 0) 578 | this._events = Object.create(null); 579 | else { 580 | delete events[type]; 581 | if (events.removeListener) 582 | this.emit('removeListener', type, list.listener || listener); 583 | } 584 | } else if (typeof list !== 'function') { 585 | position = -1; 586 | 587 | for (i = list.length - 1; i >= 0; i--) { 588 | if (list[i] === listener || list[i].listener === listener) { 589 | originalListener = list[i].listener; 590 | position = i; 591 | break; 592 | } 593 | } 594 | 595 | if (position < 0) 596 | return this; 597 | 598 | if (position === 0) 599 | list.shift(); 600 | else { 601 | spliceOne(list, position); 602 | } 603 | 604 | if (list.length === 1) 605 | events[type] = list[0]; 606 | 607 | if (events.removeListener !== undefined) 608 | this.emit('removeListener', type, originalListener || listener); 609 | } 610 | 611 | return this; 612 | }; 613 | 614 | EventEmitter.prototype.off = EventEmitter.prototype.removeListener; 615 | 616 | EventEmitter.prototype.removeAllListeners = 617 | function removeAllListeners(type) { 618 | var listeners, events, i; 619 | 620 | events = this._events; 621 | if (events === undefined) 622 | return this; 623 | 624 | // not listening for removeListener, no need to emit 625 | if (events.removeListener === undefined) { 626 | if (arguments.length === 0) { 627 | this._events = Object.create(null); 628 | this._eventsCount = 0; 629 | } else if (events[type] !== undefined) { 630 | if (--this._eventsCount === 0) 631 | this._events = Object.create(null); 632 | else 633 | delete events[type]; 634 | } 635 | return this; 636 | } 637 | 638 | // emit removeListener for all listeners on all events 639 | if (arguments.length === 0) { 640 | var keys = Object.keys(events); 641 | var key; 642 | for (i = 0; i < keys.length; ++i) { 643 | key = keys[i]; 644 | if (key === 'removeListener') continue; 645 | this.removeAllListeners(key); 646 | } 647 | this.removeAllListeners('removeListener'); 648 | this._events = Object.create(null); 649 | this._eventsCount = 0; 650 | return this; 651 | } 652 | 653 | listeners = events[type]; 654 | 655 | if (typeof listeners === 'function') { 656 | this.removeListener(type, listeners); 657 | } else if (listeners !== undefined) { 658 | // LIFO order 659 | for (i = listeners.length - 1; i >= 0; i--) { 660 | this.removeListener(type, listeners[i]); 661 | } 662 | } 663 | 664 | return this; 665 | }; 666 | 667 | function _listeners(target, type, unwrap) { 668 | var events = target._events; 669 | 670 | if (events === undefined) 671 | return []; 672 | 673 | var evlistener = events[type]; 674 | if (evlistener === undefined) 675 | return []; 676 | 677 | if (typeof evlistener === 'function') 678 | return unwrap ? [evlistener.listener || evlistener] : [evlistener]; 679 | 680 | return unwrap ? 681 | unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); 682 | } 683 | 684 | EventEmitter.prototype.listeners = function listeners(type) { 685 | return _listeners(this, type, true); 686 | }; 687 | 688 | EventEmitter.prototype.rawListeners = function rawListeners(type) { 689 | return _listeners(this, type, false); 690 | }; 691 | 692 | EventEmitter.listenerCount = function(emitter, type) { 693 | if (typeof emitter.listenerCount === 'function') { 694 | return emitter.listenerCount(type); 695 | } else { 696 | return listenerCount.call(emitter, type); 697 | } 698 | }; 699 | 700 | EventEmitter.prototype.listenerCount = listenerCount; 701 | function listenerCount(type) { 702 | var events = this._events; 703 | 704 | if (events !== undefined) { 705 | var evlistener = events[type]; 706 | 707 | if (typeof evlistener === 'function') { 708 | return 1; 709 | } else if (evlistener !== undefined) { 710 | return evlistener.length; 711 | } 712 | } 713 | 714 | return 0; 715 | } 716 | 717 | EventEmitter.prototype.eventNames = function eventNames() { 718 | return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; 719 | }; 720 | 721 | function arrayClone(arr, n) { 722 | var copy = new Array(n); 723 | for (var i = 0; i < n; ++i) 724 | copy[i] = arr[i]; 725 | return copy; 726 | } 727 | 728 | function spliceOne(list, index) { 729 | for (; index + 1 < list.length; index++) 730 | list[index] = list[index + 1]; 731 | list.pop(); 732 | } 733 | 734 | function unwrapListeners(arr) { 735 | var ret = new Array(arr.length); 736 | for (var i = 0; i < ret.length; ++i) { 737 | ret[i] = arr[i].listener || arr[i]; 738 | } 739 | return ret; 740 | } 741 | 742 | function once(emitter, name) { 743 | return new Promise(function (resolve, reject) { 744 | function errorListener(err) { 745 | emitter.removeListener(name, resolver); 746 | reject(err); 747 | } 748 | 749 | function resolver() { 750 | if (typeof emitter.removeListener === 'function') { 751 | emitter.removeListener('error', errorListener); 752 | } 753 | resolve([].slice.call(arguments)); 754 | }; 755 | 756 | eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); 757 | if (name !== 'error') { 758 | addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); 759 | } 760 | }); 761 | } 762 | 763 | function addErrorHandlerIfEventEmitter(emitter, handler, flags) { 764 | if (typeof emitter.on === 'function') { 765 | eventTargetAgnosticAddListener(emitter, 'error', handler, flags); 766 | } 767 | } 768 | 769 | function eventTargetAgnosticAddListener(emitter, name, listener, flags) { 770 | if (typeof emitter.on === 'function') { 771 | if (flags.once) { 772 | emitter.once(name, listener); 773 | } else { 774 | emitter.on(name, listener); 775 | } 776 | } else if (typeof emitter.addEventListener === 'function') { 777 | // EventTarget does not have `error` event semantics like Node 778 | // EventEmitters, we do not listen for `error` events here. 779 | emitter.addEventListener(name, function wrapListener(arg) { 780 | // IE does not have builtin `{ once: true }` support so we 781 | // have to do it manually. 782 | if (flags.once) { 783 | emitter.removeEventListener(name, wrapListener); 784 | } 785 | listener(arg); 786 | }); 787 | } else { 788 | throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); 789 | } 790 | } 791 | --------------------------------------------------------------------------------