├── .dockerignore ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .nvmrc ├── Dockerfile ├── README.md ├── app.js ├── package-lock.json ├── package.json ├── screenshot.png └── server.js /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | indent_size = 4 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | commonjs: true, 4 | es6: true, 5 | node: true, 6 | }, 7 | extends: [ 8 | 'eslint:recommended', 9 | 'airbnb-base', 10 | ], 11 | globals: { 12 | Atomics: 'readonly', 13 | SharedArrayBuffer: 'readonly', 14 | }, 15 | parserOptions: { 16 | ecmaVersion: 11, 17 | }, 18 | rules: { 19 | indent: [ 20 | 'error', 21 | 2, 22 | ], 23 | 'linebreak-style': [ 24 | 'error', 25 | 'unix', 26 | ], 27 | quotes: [ 28 | 'error', 29 | 'single', 30 | ], 31 | semi: [ 32 | 'error', 33 | 'never', 34 | ], 35 | 'arrow-parens': [ 36 | 'error', 37 | 'as-needed', 38 | ], 39 | }, 40 | } 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v12.16.3 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:14 2 | 3 | # Create app directory 4 | WORKDIR /usr/src/app 5 | 6 | # Install app dependencies 7 | # A wildcard is used to ensure both package.json AND package-lock.json are copied 8 | # where available (npm@5+) 9 | COPY package*.json ./ 10 | 11 | RUN npm install 12 | # If you are building your code for production 13 | # RUN npm ci --only=production 14 | 15 | # Bundle app source 16 | COPY . . 17 | 18 | EXPOSE 3000 19 | CMD [ "npm", "start" ] 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | timeprox 2 | ======== 3 | 4 | https://remino.net/retrosurfing/ 5 | https://github.com/remino/timeprox 6 | 7 | Node.js HTTP proxy to the [Wayback Machine](https://web.archive.org) for retro browsers. By [remino](https://github.com/remino). 8 | 9 | ![Screenshot](screenshot.png) 10 | 11 | _Above: Screenshot of Netscape Navigator 2.01 on Windows for Workgroups 3.11 accessing via the timeprox HTTP proxy the front page of Yahoo! archived in 1998 by the Internet Archive's Wayback Machine. (2020-05-24)_ 12 | 13 | If you like nostalgia and love toying with retro operating systems and software from the late 90s, there's one thing missing: access the WWW, or the World Wide Web (we just call that the Web today). 14 | 15 | Accessing the modern Web via an old browser typically doesn't work. Most sites require SSL nowadays and any implementation of HTTPS in those browsers is outdated. And in turn, trying to mimic the Web back then through a proxy doesn't work in modern browsers, since they also require more security and often force redirect to HTTPS sites. 16 | 17 | In other words, a retro OS and a retro browser need a retro Web. This is when _timeprox_ comes in. 18 | 19 | Simply have Node 12 or later installed, clone this repo, do `npm install` to install the requirements, then `npm start` to start. This will launch an HTTP proxy at port 3000. Set up your retro browser to use that proxy then browse the Web as you normally would. Now you're not only surfing, you're [_retrosurfing!_](https://remino.net/retrosurfing/) 20 | 21 | By default, pages will be loaded from what was cached in 1998 or later, if there's anything. If nothing is found, you'll get a really boring 404 page. 22 | 23 | The year is hardcoded, but feel free to change it and experiement. If there's anything you'd like to contribute, feel free to submit a pull request. 24 | 25 | ## Docker 26 | 27 | This is also available on Docker: 28 | 29 | ``` 30 | docker run remino/timeprox 31 | ``` 32 | 33 | The proxy server uses port 3000 by default. 34 | 35 | Thanks to [kcleong](https://github.com/kcleong) for the Dockerfile. 36 | 37 | ## Contributing 38 | 39 | You know the drill. If you have anything you wish to contribute to this repo or something you want to fix, feel free to fork this repo and send a PR. I'll get to it... eventually. 40 | 41 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const nodemon = require('nodemon'); 2 | 3 | nodemon({ 4 | script: './server.js', 5 | ext: 'js json' 6 | }); 7 | 8 | nodemon.on('start', () => { 9 | console.log('App has started'); 10 | }).on('quit', () => { 11 | console.log('App has quit'); 12 | process.exit(); 13 | }).on('restart', (files) => { 14 | console.log('App restarted due to: ', files); 15 | }); 16 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "timeprox", 3 | "version": "0.4.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.9.5", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 19 | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.9.0", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 25 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.9.0", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "ansi-styles": { 34 | "version": "3.2.1", 35 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 36 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 37 | "dev": true, 38 | "requires": { 39 | "color-convert": "^1.9.0" 40 | } 41 | }, 42 | "chalk": { 43 | "version": "2.4.2", 44 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 45 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 46 | "dev": true, 47 | "requires": { 48 | "ansi-styles": "^3.2.1", 49 | "escape-string-regexp": "^1.0.5", 50 | "supports-color": "^5.3.0" 51 | } 52 | }, 53 | "color-convert": { 54 | "version": "1.9.3", 55 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 56 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 57 | "dev": true, 58 | "requires": { 59 | "color-name": "1.1.3" 60 | } 61 | }, 62 | "color-name": { 63 | "version": "1.1.3", 64 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 65 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 66 | "dev": true 67 | } 68 | } 69 | }, 70 | "@types/color-name": { 71 | "version": "1.1.1", 72 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 73 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 74 | "dev": true 75 | }, 76 | "abbrev": { 77 | "version": "1.1.1", 78 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 79 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 80 | "dev": true 81 | }, 82 | "acorn": { 83 | "version": "7.2.0", 84 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", 85 | "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", 86 | "dev": true 87 | }, 88 | "acorn-jsx": { 89 | "version": "5.2.0", 90 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 91 | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 92 | "dev": true 93 | }, 94 | "ajv": { 95 | "version": "6.12.6", 96 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 97 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 98 | "dev": true, 99 | "requires": { 100 | "fast-deep-equal": "^3.1.1", 101 | "fast-json-stable-stringify": "^2.0.0", 102 | "json-schema-traverse": "^0.4.1", 103 | "uri-js": "^4.2.2" 104 | } 105 | }, 106 | "ansi-escapes": { 107 | "version": "4.3.1", 108 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 109 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 110 | "dev": true, 111 | "requires": { 112 | "type-fest": "^0.11.0" 113 | }, 114 | "dependencies": { 115 | "type-fest": { 116 | "version": "0.11.0", 117 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 118 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 119 | "dev": true 120 | } 121 | } 122 | }, 123 | "ansi-regex": { 124 | "version": "5.0.1", 125 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 126 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 127 | "dev": true 128 | }, 129 | "ansi-styles": { 130 | "version": "4.2.1", 131 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 132 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 133 | "dev": true, 134 | "requires": { 135 | "@types/color-name": "^1.1.1", 136 | "color-convert": "^2.0.1" 137 | } 138 | }, 139 | "anymatch": { 140 | "version": "3.1.3", 141 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 142 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 143 | "dev": true, 144 | "requires": { 145 | "normalize-path": "^3.0.0", 146 | "picomatch": "^2.0.4" 147 | } 148 | }, 149 | "argparse": { 150 | "version": "1.0.10", 151 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 152 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 153 | "dev": true, 154 | "requires": { 155 | "sprintf-js": "~1.0.2" 156 | } 157 | }, 158 | "array-includes": { 159 | "version": "3.1.1", 160 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", 161 | "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", 162 | "dev": true, 163 | "requires": { 164 | "define-properties": "^1.1.3", 165 | "es-abstract": "^1.17.0", 166 | "is-string": "^1.0.5" 167 | } 168 | }, 169 | "array.prototype.flat": { 170 | "version": "1.2.3", 171 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", 172 | "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", 173 | "dev": true, 174 | "requires": { 175 | "define-properties": "^1.1.3", 176 | "es-abstract": "^1.17.0-next.1" 177 | } 178 | }, 179 | "astral-regex": { 180 | "version": "1.0.0", 181 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 182 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 183 | "dev": true 184 | }, 185 | "balanced-match": { 186 | "version": "1.0.0", 187 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 188 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 189 | "dev": true 190 | }, 191 | "binary-extensions": { 192 | "version": "2.2.0", 193 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 194 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 195 | "dev": true 196 | }, 197 | "brace-expansion": { 198 | "version": "1.1.11", 199 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 200 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 201 | "dev": true, 202 | "requires": { 203 | "balanced-match": "^1.0.0", 204 | "concat-map": "0.0.1" 205 | } 206 | }, 207 | "braces": { 208 | "version": "3.0.3", 209 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 210 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 211 | "dev": true, 212 | "requires": { 213 | "fill-range": "^7.1.1" 214 | }, 215 | "dependencies": { 216 | "fill-range": { 217 | "version": "7.1.1", 218 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 219 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 220 | "dev": true, 221 | "requires": { 222 | "to-regex-range": "^5.0.1" 223 | } 224 | } 225 | } 226 | }, 227 | "callsites": { 228 | "version": "3.1.0", 229 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 230 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 231 | "dev": true 232 | }, 233 | "chalk": { 234 | "version": "3.0.0", 235 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 236 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 237 | "dev": true, 238 | "requires": { 239 | "ansi-styles": "^4.1.0", 240 | "supports-color": "^7.1.0" 241 | }, 242 | "dependencies": { 243 | "has-flag": { 244 | "version": "4.0.0", 245 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 246 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 247 | "dev": true 248 | }, 249 | "supports-color": { 250 | "version": "7.1.0", 251 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 252 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 253 | "dev": true, 254 | "requires": { 255 | "has-flag": "^4.0.0" 256 | } 257 | } 258 | } 259 | }, 260 | "chardet": { 261 | "version": "0.7.0", 262 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 263 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 264 | "dev": true 265 | }, 266 | "charenc": { 267 | "version": "0.0.2", 268 | "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", 269 | "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" 270 | }, 271 | "charset": { 272 | "version": "1.0.1", 273 | "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", 274 | "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==" 275 | }, 276 | "chokidar": { 277 | "version": "3.5.3", 278 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 279 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 280 | "dev": true, 281 | "requires": { 282 | "anymatch": "~3.1.2", 283 | "braces": "~3.0.2", 284 | "fsevents": "~2.3.2", 285 | "glob-parent": "~5.1.2", 286 | "is-binary-path": "~2.1.0", 287 | "is-glob": "~4.0.1", 288 | "normalize-path": "~3.0.0", 289 | "readdirp": "~3.6.0" 290 | } 291 | }, 292 | "cli-cursor": { 293 | "version": "3.1.0", 294 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 295 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 296 | "dev": true, 297 | "requires": { 298 | "restore-cursor": "^3.1.0" 299 | } 300 | }, 301 | "cli-width": { 302 | "version": "2.2.1", 303 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 304 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 305 | "dev": true 306 | }, 307 | "color-convert": { 308 | "version": "2.0.1", 309 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 310 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 311 | "dev": true, 312 | "requires": { 313 | "color-name": "~1.1.4" 314 | } 315 | }, 316 | "color-name": { 317 | "version": "1.1.4", 318 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 319 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 320 | "dev": true 321 | }, 322 | "concat-map": { 323 | "version": "0.0.1", 324 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 325 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 326 | "dev": true 327 | }, 328 | "confusing-browser-globals": { 329 | "version": "1.0.9", 330 | "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", 331 | "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", 332 | "dev": true 333 | }, 334 | "contains-path": { 335 | "version": "0.1.0", 336 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 337 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 338 | "dev": true 339 | }, 340 | "cross-spawn": { 341 | "version": "6.0.5", 342 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 343 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 344 | "dev": true, 345 | "requires": { 346 | "nice-try": "^1.0.4", 347 | "path-key": "^2.0.1", 348 | "semver": "^5.5.0", 349 | "shebang-command": "^1.2.0", 350 | "which": "^1.2.9" 351 | }, 352 | "dependencies": { 353 | "which": { 354 | "version": "1.3.1", 355 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 356 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 357 | "dev": true, 358 | "requires": { 359 | "isexe": "^2.0.0" 360 | } 361 | } 362 | } 363 | }, 364 | "crypt": { 365 | "version": "0.0.2", 366 | "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", 367 | "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" 368 | }, 369 | "debug": { 370 | "version": "3.2.7", 371 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 372 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 373 | "dev": true, 374 | "requires": { 375 | "ms": "^2.1.1" 376 | } 377 | }, 378 | "deep-is": { 379 | "version": "0.1.3", 380 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 381 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 382 | "dev": true 383 | }, 384 | "define-properties": { 385 | "version": "1.1.3", 386 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 387 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 388 | "dev": true, 389 | "requires": { 390 | "object-keys": "^1.0.12" 391 | } 392 | }, 393 | "doctrine": { 394 | "version": "3.0.0", 395 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 396 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 397 | "dev": true, 398 | "requires": { 399 | "esutils": "^2.0.2" 400 | } 401 | }, 402 | "emoji-regex": { 403 | "version": "7.0.3", 404 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 405 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 406 | "dev": true 407 | }, 408 | "error-ex": { 409 | "version": "1.3.2", 410 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 411 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 412 | "dev": true, 413 | "requires": { 414 | "is-arrayish": "^0.2.1" 415 | } 416 | }, 417 | "es-abstract": { 418 | "version": "1.17.5", 419 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 420 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 421 | "dev": true, 422 | "requires": { 423 | "es-to-primitive": "^1.2.1", 424 | "function-bind": "^1.1.1", 425 | "has": "^1.0.3", 426 | "has-symbols": "^1.0.1", 427 | "is-callable": "^1.1.5", 428 | "is-regex": "^1.0.5", 429 | "object-inspect": "^1.7.0", 430 | "object-keys": "^1.1.1", 431 | "object.assign": "^4.1.0", 432 | "string.prototype.trimleft": "^2.1.1", 433 | "string.prototype.trimright": "^2.1.1" 434 | } 435 | }, 436 | "es-to-primitive": { 437 | "version": "1.2.1", 438 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 439 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 440 | "dev": true, 441 | "requires": { 442 | "is-callable": "^1.1.4", 443 | "is-date-object": "^1.0.1", 444 | "is-symbol": "^1.0.2" 445 | } 446 | }, 447 | "es6-promisify": { 448 | "version": "6.1.1", 449 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", 450 | "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==" 451 | }, 452 | "escape-string-regexp": { 453 | "version": "1.0.5", 454 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 455 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 456 | "dev": true 457 | }, 458 | "eslint": { 459 | "version": "6.8.0", 460 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 461 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 462 | "dev": true, 463 | "requires": { 464 | "@babel/code-frame": "^7.0.0", 465 | "ajv": "^6.10.0", 466 | "chalk": "^2.1.0", 467 | "cross-spawn": "^6.0.5", 468 | "debug": "^4.0.1", 469 | "doctrine": "^3.0.0", 470 | "eslint-scope": "^5.0.0", 471 | "eslint-utils": "^1.4.3", 472 | "eslint-visitor-keys": "^1.1.0", 473 | "espree": "^6.1.2", 474 | "esquery": "^1.0.1", 475 | "esutils": "^2.0.2", 476 | "file-entry-cache": "^5.0.1", 477 | "functional-red-black-tree": "^1.0.1", 478 | "glob-parent": "^5.0.0", 479 | "globals": "^12.1.0", 480 | "ignore": "^4.0.6", 481 | "import-fresh": "^3.0.0", 482 | "imurmurhash": "^0.1.4", 483 | "inquirer": "^7.0.0", 484 | "is-glob": "^4.0.0", 485 | "js-yaml": "^3.13.1", 486 | "json-stable-stringify-without-jsonify": "^1.0.1", 487 | "levn": "^0.3.0", 488 | "lodash": "^4.17.14", 489 | "minimatch": "^3.0.4", 490 | "mkdirp": "^0.5.1", 491 | "natural-compare": "^1.4.0", 492 | "optionator": "^0.8.3", 493 | "progress": "^2.0.0", 494 | "regexpp": "^2.0.1", 495 | "semver": "^6.1.2", 496 | "strip-ansi": "^5.2.0", 497 | "strip-json-comments": "^3.0.1", 498 | "table": "^5.2.3", 499 | "text-table": "^0.2.0", 500 | "v8-compile-cache": "^2.0.3" 501 | }, 502 | "dependencies": { 503 | "ansi-styles": { 504 | "version": "3.2.1", 505 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 506 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 507 | "dev": true, 508 | "requires": { 509 | "color-convert": "^1.9.0" 510 | } 511 | }, 512 | "chalk": { 513 | "version": "2.4.2", 514 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 515 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 516 | "dev": true, 517 | "requires": { 518 | "ansi-styles": "^3.2.1", 519 | "escape-string-regexp": "^1.0.5", 520 | "supports-color": "^5.3.0" 521 | } 522 | }, 523 | "color-convert": { 524 | "version": "1.9.3", 525 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 526 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 527 | "dev": true, 528 | "requires": { 529 | "color-name": "1.1.3" 530 | } 531 | }, 532 | "color-name": { 533 | "version": "1.1.3", 534 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 535 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 536 | "dev": true 537 | }, 538 | "debug": { 539 | "version": "4.1.1", 540 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 541 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 542 | "dev": true, 543 | "requires": { 544 | "ms": "^2.1.1" 545 | } 546 | }, 547 | "semver": { 548 | "version": "6.3.0", 549 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 550 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 551 | "dev": true 552 | }, 553 | "strip-json-comments": { 554 | "version": "3.1.0", 555 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", 556 | "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", 557 | "dev": true 558 | } 559 | } 560 | }, 561 | "eslint-config-airbnb-base": { 562 | "version": "14.1.0", 563 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", 564 | "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", 565 | "dev": true, 566 | "requires": { 567 | "confusing-browser-globals": "^1.0.9", 568 | "object.assign": "^4.1.0", 569 | "object.entries": "^1.1.1" 570 | } 571 | }, 572 | "eslint-import-resolver-node": { 573 | "version": "0.3.3", 574 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", 575 | "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", 576 | "dev": true, 577 | "requires": { 578 | "debug": "^2.6.9", 579 | "resolve": "^1.13.1" 580 | }, 581 | "dependencies": { 582 | "debug": { 583 | "version": "2.6.9", 584 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 585 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 586 | "dev": true, 587 | "requires": { 588 | "ms": "2.0.0" 589 | } 590 | }, 591 | "ms": { 592 | "version": "2.0.0", 593 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 594 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 595 | "dev": true 596 | } 597 | } 598 | }, 599 | "eslint-module-utils": { 600 | "version": "2.6.0", 601 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", 602 | "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", 603 | "dev": true, 604 | "requires": { 605 | "debug": "^2.6.9", 606 | "pkg-dir": "^2.0.0" 607 | }, 608 | "dependencies": { 609 | "debug": { 610 | "version": "2.6.9", 611 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 612 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 613 | "dev": true, 614 | "requires": { 615 | "ms": "2.0.0" 616 | } 617 | }, 618 | "ms": { 619 | "version": "2.0.0", 620 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 621 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 622 | "dev": true 623 | } 624 | } 625 | }, 626 | "eslint-plugin-import": { 627 | "version": "2.20.2", 628 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", 629 | "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", 630 | "dev": true, 631 | "requires": { 632 | "array-includes": "^3.0.3", 633 | "array.prototype.flat": "^1.2.1", 634 | "contains-path": "^0.1.0", 635 | "debug": "^2.6.9", 636 | "doctrine": "1.5.0", 637 | "eslint-import-resolver-node": "^0.3.2", 638 | "eslint-module-utils": "^2.4.1", 639 | "has": "^1.0.3", 640 | "minimatch": "^3.0.4", 641 | "object.values": "^1.1.0", 642 | "read-pkg-up": "^2.0.0", 643 | "resolve": "^1.12.0" 644 | }, 645 | "dependencies": { 646 | "debug": { 647 | "version": "2.6.9", 648 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 649 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 650 | "dev": true, 651 | "requires": { 652 | "ms": "2.0.0" 653 | } 654 | }, 655 | "doctrine": { 656 | "version": "1.5.0", 657 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 658 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 659 | "dev": true, 660 | "requires": { 661 | "esutils": "^2.0.2", 662 | "isarray": "^1.0.0" 663 | } 664 | }, 665 | "ms": { 666 | "version": "2.0.0", 667 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 668 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 669 | "dev": true 670 | } 671 | } 672 | }, 673 | "eslint-scope": { 674 | "version": "5.0.0", 675 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 676 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 677 | "dev": true, 678 | "requires": { 679 | "esrecurse": "^4.1.0", 680 | "estraverse": "^4.1.1" 681 | } 682 | }, 683 | "eslint-utils": { 684 | "version": "1.4.3", 685 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 686 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 687 | "dev": true, 688 | "requires": { 689 | "eslint-visitor-keys": "^1.1.0" 690 | } 691 | }, 692 | "eslint-visitor-keys": { 693 | "version": "1.1.0", 694 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 695 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 696 | "dev": true 697 | }, 698 | "espree": { 699 | "version": "6.2.1", 700 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 701 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 702 | "dev": true, 703 | "requires": { 704 | "acorn": "^7.1.1", 705 | "acorn-jsx": "^5.2.0", 706 | "eslint-visitor-keys": "^1.1.0" 707 | } 708 | }, 709 | "esprima": { 710 | "version": "4.0.1", 711 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 712 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 713 | "dev": true 714 | }, 715 | "esquery": { 716 | "version": "1.3.1", 717 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 718 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 719 | "dev": true, 720 | "requires": { 721 | "estraverse": "^5.1.0" 722 | }, 723 | "dependencies": { 724 | "estraverse": { 725 | "version": "5.1.0", 726 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", 727 | "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", 728 | "dev": true 729 | } 730 | } 731 | }, 732 | "esrecurse": { 733 | "version": "4.2.1", 734 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 735 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 736 | "dev": true, 737 | "requires": { 738 | "estraverse": "^4.1.0" 739 | } 740 | }, 741 | "estraverse": { 742 | "version": "4.3.0", 743 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 744 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 745 | "dev": true 746 | }, 747 | "esutils": { 748 | "version": "2.0.3", 749 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 750 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 751 | "dev": true 752 | }, 753 | "eventemitter3": { 754 | "version": "4.0.4", 755 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", 756 | "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" 757 | }, 758 | "external-editor": { 759 | "version": "3.1.0", 760 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 761 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 762 | "dev": true, 763 | "requires": { 764 | "chardet": "^0.7.0", 765 | "iconv-lite": "^0.4.24", 766 | "tmp": "^0.0.33" 767 | }, 768 | "dependencies": { 769 | "iconv-lite": { 770 | "version": "0.4.24", 771 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 772 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 773 | "dev": true, 774 | "requires": { 775 | "safer-buffer": ">= 2.1.2 < 3" 776 | } 777 | } 778 | } 779 | }, 780 | "fast-deep-equal": { 781 | "version": "3.1.1", 782 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 783 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 784 | "dev": true 785 | }, 786 | "fast-json-stable-stringify": { 787 | "version": "2.1.0", 788 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 789 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 790 | "dev": true 791 | }, 792 | "fast-levenshtein": { 793 | "version": "2.0.6", 794 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 795 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 796 | "dev": true 797 | }, 798 | "figures": { 799 | "version": "3.2.0", 800 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 801 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 802 | "dev": true, 803 | "requires": { 804 | "escape-string-regexp": "^1.0.5" 805 | } 806 | }, 807 | "file-entry-cache": { 808 | "version": "5.0.1", 809 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 810 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 811 | "dev": true, 812 | "requires": { 813 | "flat-cache": "^2.0.1" 814 | } 815 | }, 816 | "find-up": { 817 | "version": "2.1.0", 818 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 819 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 820 | "dev": true, 821 | "requires": { 822 | "locate-path": "^2.0.0" 823 | } 824 | }, 825 | "flat-cache": { 826 | "version": "2.0.1", 827 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 828 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 829 | "dev": true, 830 | "requires": { 831 | "flatted": "^2.0.0", 832 | "rimraf": "2.6.3", 833 | "write": "1.0.3" 834 | } 835 | }, 836 | "flatted": { 837 | "version": "2.0.2", 838 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 839 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 840 | "dev": true 841 | }, 842 | "follow-redirects": { 843 | "version": "1.15.6", 844 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 845 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" 846 | }, 847 | "fs.realpath": { 848 | "version": "1.0.0", 849 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 850 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 851 | "dev": true 852 | }, 853 | "fsevents": { 854 | "version": "2.3.2", 855 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 856 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 857 | "dev": true, 858 | "optional": true 859 | }, 860 | "function-bind": { 861 | "version": "1.1.1", 862 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 863 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 864 | "dev": true 865 | }, 866 | "functional-red-black-tree": { 867 | "version": "1.0.1", 868 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 869 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 870 | "dev": true 871 | }, 872 | "glob": { 873 | "version": "7.1.6", 874 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 875 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 876 | "dev": true, 877 | "requires": { 878 | "fs.realpath": "^1.0.0", 879 | "inflight": "^1.0.4", 880 | "inherits": "2", 881 | "minimatch": "^3.0.4", 882 | "once": "^1.3.0", 883 | "path-is-absolute": "^1.0.0" 884 | } 885 | }, 886 | "glob-parent": { 887 | "version": "5.1.2", 888 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 889 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 890 | "dev": true, 891 | "requires": { 892 | "is-glob": "^4.0.1" 893 | } 894 | }, 895 | "globals": { 896 | "version": "12.4.0", 897 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 898 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 899 | "dev": true, 900 | "requires": { 901 | "type-fest": "^0.8.1" 902 | } 903 | }, 904 | "graceful-fs": { 905 | "version": "4.2.4", 906 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 907 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 908 | "dev": true 909 | }, 910 | "has": { 911 | "version": "1.0.3", 912 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 913 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 914 | "dev": true, 915 | "requires": { 916 | "function-bind": "^1.1.1" 917 | } 918 | }, 919 | "has-flag": { 920 | "version": "3.0.0", 921 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 922 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 923 | "dev": true 924 | }, 925 | "has-symbols": { 926 | "version": "1.0.1", 927 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 928 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 929 | "dev": true 930 | }, 931 | "hosted-git-info": { 932 | "version": "2.8.9", 933 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 934 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 935 | "dev": true 936 | }, 937 | "http-proxy": { 938 | "version": "1.18.1", 939 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 940 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 941 | "requires": { 942 | "eventemitter3": "^4.0.0", 943 | "follow-redirects": "^1.0.0", 944 | "requires-port": "^1.0.0" 945 | } 946 | }, 947 | "iconv-lite": { 948 | "version": "0.5.1", 949 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", 950 | "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", 951 | "requires": { 952 | "safer-buffer": ">= 2.1.2 < 3" 953 | } 954 | }, 955 | "ignore": { 956 | "version": "4.0.6", 957 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 958 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 959 | "dev": true 960 | }, 961 | "ignore-by-default": { 962 | "version": "1.0.1", 963 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 964 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 965 | "dev": true 966 | }, 967 | "import-fresh": { 968 | "version": "3.2.1", 969 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 970 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 971 | "dev": true, 972 | "requires": { 973 | "parent-module": "^1.0.0", 974 | "resolve-from": "^4.0.0" 975 | } 976 | }, 977 | "imurmurhash": { 978 | "version": "0.1.4", 979 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 980 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 981 | "dev": true 982 | }, 983 | "inflight": { 984 | "version": "1.0.6", 985 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 986 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 987 | "dev": true, 988 | "requires": { 989 | "once": "^1.3.0", 990 | "wrappy": "1" 991 | } 992 | }, 993 | "inherits": { 994 | "version": "2.0.4", 995 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 996 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 997 | "dev": true 998 | }, 999 | "inquirer": { 1000 | "version": "7.1.0", 1001 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", 1002 | "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", 1003 | "dev": true, 1004 | "requires": { 1005 | "ansi-escapes": "^4.2.1", 1006 | "chalk": "^3.0.0", 1007 | "cli-cursor": "^3.1.0", 1008 | "cli-width": "^2.0.0", 1009 | "external-editor": "^3.0.3", 1010 | "figures": "^3.0.0", 1011 | "lodash": "^4.17.15", 1012 | "mute-stream": "0.0.8", 1013 | "run-async": "^2.4.0", 1014 | "rxjs": "^6.5.3", 1015 | "string-width": "^4.1.0", 1016 | "strip-ansi": "^6.0.0", 1017 | "through": "^2.3.6" 1018 | }, 1019 | "dependencies": { 1020 | "strip-ansi": { 1021 | "version": "6.0.0", 1022 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1023 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1024 | "dev": true, 1025 | "requires": { 1026 | "ansi-regex": "^5.0.0" 1027 | } 1028 | } 1029 | } 1030 | }, 1031 | "is-arrayish": { 1032 | "version": "0.2.1", 1033 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1034 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1035 | "dev": true 1036 | }, 1037 | "is-binary-path": { 1038 | "version": "2.1.0", 1039 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1040 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1041 | "dev": true, 1042 | "requires": { 1043 | "binary-extensions": "^2.0.0" 1044 | } 1045 | }, 1046 | "is-buffer": { 1047 | "version": "1.1.6", 1048 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1049 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1050 | }, 1051 | "is-callable": { 1052 | "version": "1.1.5", 1053 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1054 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1055 | "dev": true 1056 | }, 1057 | "is-date-object": { 1058 | "version": "1.0.2", 1059 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1060 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1061 | "dev": true 1062 | }, 1063 | "is-extglob": { 1064 | "version": "2.1.1", 1065 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1066 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1067 | "dev": true 1068 | }, 1069 | "is-fullwidth-code-point": { 1070 | "version": "2.0.0", 1071 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1072 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1073 | "dev": true 1074 | }, 1075 | "is-glob": { 1076 | "version": "4.0.1", 1077 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1078 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1079 | "dev": true, 1080 | "requires": { 1081 | "is-extglob": "^2.1.1" 1082 | } 1083 | }, 1084 | "is-number": { 1085 | "version": "7.0.0", 1086 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1087 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1088 | "dev": true 1089 | }, 1090 | "is-regex": { 1091 | "version": "1.0.5", 1092 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1093 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1094 | "dev": true, 1095 | "requires": { 1096 | "has": "^1.0.3" 1097 | } 1098 | }, 1099 | "is-string": { 1100 | "version": "1.0.5", 1101 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1102 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 1103 | "dev": true 1104 | }, 1105 | "is-symbol": { 1106 | "version": "1.0.3", 1107 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1108 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1109 | "dev": true, 1110 | "requires": { 1111 | "has-symbols": "^1.0.1" 1112 | } 1113 | }, 1114 | "isarray": { 1115 | "version": "1.0.0", 1116 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1117 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1118 | "dev": true 1119 | }, 1120 | "isexe": { 1121 | "version": "2.0.0", 1122 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1123 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1124 | }, 1125 | "js-tokens": { 1126 | "version": "4.0.0", 1127 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1128 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1129 | "dev": true 1130 | }, 1131 | "js-yaml": { 1132 | "version": "3.14.0", 1133 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 1134 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 1135 | "dev": true, 1136 | "requires": { 1137 | "argparse": "^1.0.7", 1138 | "esprima": "^4.0.0" 1139 | } 1140 | }, 1141 | "json-schema-traverse": { 1142 | "version": "0.4.1", 1143 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1144 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1145 | "dev": true 1146 | }, 1147 | "json-stable-stringify-without-jsonify": { 1148 | "version": "1.0.1", 1149 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1150 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1151 | "dev": true 1152 | }, 1153 | "levn": { 1154 | "version": "0.3.0", 1155 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1156 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1157 | "dev": true, 1158 | "requires": { 1159 | "prelude-ls": "~1.1.2", 1160 | "type-check": "~0.3.2" 1161 | } 1162 | }, 1163 | "load-json-file": { 1164 | "version": "2.0.0", 1165 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1166 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1167 | "dev": true, 1168 | "requires": { 1169 | "graceful-fs": "^4.1.2", 1170 | "parse-json": "^2.2.0", 1171 | "pify": "^2.0.0", 1172 | "strip-bom": "^3.0.0" 1173 | } 1174 | }, 1175 | "locate-path": { 1176 | "version": "2.0.0", 1177 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1178 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1179 | "dev": true, 1180 | "requires": { 1181 | "p-locate": "^2.0.0", 1182 | "path-exists": "^3.0.0" 1183 | } 1184 | }, 1185 | "lodash": { 1186 | "version": "4.17.21", 1187 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1188 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1189 | "dev": true 1190 | }, 1191 | "md5": { 1192 | "version": "2.2.1", 1193 | "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", 1194 | "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", 1195 | "requires": { 1196 | "charenc": "~0.0.1", 1197 | "crypt": "~0.0.1", 1198 | "is-buffer": "~1.1.1" 1199 | } 1200 | }, 1201 | "mimic-fn": { 1202 | "version": "2.1.0", 1203 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1204 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1205 | "dev": true 1206 | }, 1207 | "minimatch": { 1208 | "version": "3.1.2", 1209 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1210 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1211 | "dev": true, 1212 | "requires": { 1213 | "brace-expansion": "^1.1.7" 1214 | } 1215 | }, 1216 | "minimist": { 1217 | "version": "1.2.6", 1218 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1219 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1220 | "dev": true 1221 | }, 1222 | "mkdirp": { 1223 | "version": "0.5.5", 1224 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1225 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1226 | "dev": true, 1227 | "requires": { 1228 | "minimist": "^1.2.5" 1229 | } 1230 | }, 1231 | "ms": { 1232 | "version": "2.1.2", 1233 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1234 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1235 | "dev": true 1236 | }, 1237 | "mute-stream": { 1238 | "version": "0.0.8", 1239 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1240 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1241 | "dev": true 1242 | }, 1243 | "natural-compare": { 1244 | "version": "1.4.0", 1245 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1246 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1247 | "dev": true 1248 | }, 1249 | "nice-try": { 1250 | "version": "1.0.5", 1251 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1252 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1253 | "dev": true 1254 | }, 1255 | "node-fetch-cjs": { 1256 | "version": "3.2.10", 1257 | "resolved": "https://registry.npmjs.org/node-fetch-cjs/-/node-fetch-cjs-3.2.10.tgz", 1258 | "integrity": "sha512-YNFkGjcTGGZKvUuYyf6Kv9yQ+UOx1Ce8doWQeqleKL4EWk1s/sYu5AAXtigRlSDpLYGnr0qk1kaADJbgCEFBEw==" 1259 | }, 1260 | "nodemon": { 1261 | "version": "2.0.20", 1262 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", 1263 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", 1264 | "dev": true, 1265 | "requires": { 1266 | "chokidar": "^3.5.2", 1267 | "debug": "^3.2.7", 1268 | "ignore-by-default": "^1.0.1", 1269 | "minimatch": "^3.1.2", 1270 | "pstree.remy": "^1.1.8", 1271 | "semver": "^5.7.1", 1272 | "simple-update-notifier": "^1.0.7", 1273 | "supports-color": "^5.5.0", 1274 | "touch": "^3.1.0", 1275 | "undefsafe": "^2.0.5" 1276 | }, 1277 | "dependencies": { 1278 | "minimatch": { 1279 | "version": "3.1.2", 1280 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1281 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1282 | "dev": true, 1283 | "requires": { 1284 | "brace-expansion": "^1.1.7" 1285 | } 1286 | } 1287 | } 1288 | }, 1289 | "nopt": { 1290 | "version": "1.0.10", 1291 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1292 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1293 | "dev": true, 1294 | "requires": { 1295 | "abbrev": "1" 1296 | } 1297 | }, 1298 | "normalize-package-data": { 1299 | "version": "2.5.0", 1300 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1301 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1302 | "dev": true, 1303 | "requires": { 1304 | "hosted-git-info": "^2.1.4", 1305 | "resolve": "^1.10.0", 1306 | "semver": "2 || 3 || 4 || 5", 1307 | "validate-npm-package-license": "^3.0.1" 1308 | } 1309 | }, 1310 | "normalize-path": { 1311 | "version": "3.0.0", 1312 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1313 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1314 | "dev": true 1315 | }, 1316 | "object-inspect": { 1317 | "version": "1.7.0", 1318 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1319 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1320 | "dev": true 1321 | }, 1322 | "object-keys": { 1323 | "version": "1.1.1", 1324 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1325 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1326 | "dev": true 1327 | }, 1328 | "object.assign": { 1329 | "version": "4.1.0", 1330 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1331 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1332 | "dev": true, 1333 | "requires": { 1334 | "define-properties": "^1.1.2", 1335 | "function-bind": "^1.1.1", 1336 | "has-symbols": "^1.0.0", 1337 | "object-keys": "^1.0.11" 1338 | } 1339 | }, 1340 | "object.entries": { 1341 | "version": "1.1.2", 1342 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", 1343 | "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", 1344 | "dev": true, 1345 | "requires": { 1346 | "define-properties": "^1.1.3", 1347 | "es-abstract": "^1.17.5", 1348 | "has": "^1.0.3" 1349 | } 1350 | }, 1351 | "object.values": { 1352 | "version": "1.1.1", 1353 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", 1354 | "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", 1355 | "dev": true, 1356 | "requires": { 1357 | "define-properties": "^1.1.3", 1358 | "es-abstract": "^1.17.0-next.1", 1359 | "function-bind": "^1.1.1", 1360 | "has": "^1.0.3" 1361 | } 1362 | }, 1363 | "once": { 1364 | "version": "1.4.0", 1365 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1366 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1367 | "dev": true, 1368 | "requires": { 1369 | "wrappy": "1" 1370 | } 1371 | }, 1372 | "onetime": { 1373 | "version": "5.1.0", 1374 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1375 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1376 | "dev": true, 1377 | "requires": { 1378 | "mimic-fn": "^2.1.0" 1379 | } 1380 | }, 1381 | "optionator": { 1382 | "version": "0.8.3", 1383 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1384 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1385 | "dev": true, 1386 | "requires": { 1387 | "deep-is": "~0.1.3", 1388 | "fast-levenshtein": "~2.0.6", 1389 | "levn": "~0.3.0", 1390 | "prelude-ls": "~1.1.2", 1391 | "type-check": "~0.3.2", 1392 | "word-wrap": "~1.2.3" 1393 | } 1394 | }, 1395 | "os-tmpdir": { 1396 | "version": "1.0.2", 1397 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1398 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1399 | }, 1400 | "p-limit": { 1401 | "version": "1.3.0", 1402 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1403 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1404 | "dev": true, 1405 | "requires": { 1406 | "p-try": "^1.0.0" 1407 | } 1408 | }, 1409 | "p-locate": { 1410 | "version": "2.0.0", 1411 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1412 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1413 | "dev": true, 1414 | "requires": { 1415 | "p-limit": "^1.1.0" 1416 | } 1417 | }, 1418 | "p-try": { 1419 | "version": "1.0.0", 1420 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1421 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1422 | "dev": true 1423 | }, 1424 | "parent-module": { 1425 | "version": "1.0.1", 1426 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1427 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1428 | "dev": true, 1429 | "requires": { 1430 | "callsites": "^3.0.0" 1431 | } 1432 | }, 1433 | "parse-json": { 1434 | "version": "2.2.0", 1435 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1436 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1437 | "dev": true, 1438 | "requires": { 1439 | "error-ex": "^1.2.0" 1440 | } 1441 | }, 1442 | "path-exists": { 1443 | "version": "3.0.0", 1444 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1445 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1446 | "dev": true 1447 | }, 1448 | "path-is-absolute": { 1449 | "version": "1.0.1", 1450 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1451 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1452 | "dev": true 1453 | }, 1454 | "path-key": { 1455 | "version": "2.0.1", 1456 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1457 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1458 | "dev": true 1459 | }, 1460 | "path-parse": { 1461 | "version": "1.0.7", 1462 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1463 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1464 | "dev": true 1465 | }, 1466 | "path-type": { 1467 | "version": "2.0.0", 1468 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1469 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1470 | "dev": true, 1471 | "requires": { 1472 | "pify": "^2.0.0" 1473 | } 1474 | }, 1475 | "pem": { 1476 | "version": "1.14.4", 1477 | "resolved": "https://registry.npmjs.org/pem/-/pem-1.14.4.tgz", 1478 | "integrity": "sha512-v8lH3NpirgiEmbOqhx0vwQTxwi0ExsiWBGYh0jYNq7K6mQuO4gI6UEFlr6fLAdv9TPXRt6GqiwE37puQdIDS8g==", 1479 | "requires": { 1480 | "es6-promisify": "^6.0.0", 1481 | "md5": "^2.2.1", 1482 | "os-tmpdir": "^1.0.1", 1483 | "which": "^2.0.2" 1484 | } 1485 | }, 1486 | "picomatch": { 1487 | "version": "2.3.1", 1488 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1489 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1490 | "dev": true 1491 | }, 1492 | "pify": { 1493 | "version": "2.3.0", 1494 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1495 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1496 | "dev": true 1497 | }, 1498 | "pkg-dir": { 1499 | "version": "2.0.0", 1500 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1501 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1502 | "dev": true, 1503 | "requires": { 1504 | "find-up": "^2.1.0" 1505 | } 1506 | }, 1507 | "prelude-ls": { 1508 | "version": "1.1.2", 1509 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1510 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1511 | "dev": true 1512 | }, 1513 | "progress": { 1514 | "version": "2.0.3", 1515 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1516 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1517 | "dev": true 1518 | }, 1519 | "pstree.remy": { 1520 | "version": "1.1.8", 1521 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1522 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1523 | "dev": true 1524 | }, 1525 | "punycode": { 1526 | "version": "2.1.1", 1527 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1528 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1529 | "dev": true 1530 | }, 1531 | "read-pkg": { 1532 | "version": "2.0.0", 1533 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1534 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1535 | "dev": true, 1536 | "requires": { 1537 | "load-json-file": "^2.0.0", 1538 | "normalize-package-data": "^2.3.2", 1539 | "path-type": "^2.0.0" 1540 | } 1541 | }, 1542 | "read-pkg-up": { 1543 | "version": "2.0.0", 1544 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1545 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1546 | "dev": true, 1547 | "requires": { 1548 | "find-up": "^2.0.0", 1549 | "read-pkg": "^2.0.0" 1550 | } 1551 | }, 1552 | "readdirp": { 1553 | "version": "3.6.0", 1554 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1555 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1556 | "dev": true, 1557 | "requires": { 1558 | "picomatch": "^2.2.1" 1559 | } 1560 | }, 1561 | "regexpp": { 1562 | "version": "2.0.1", 1563 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1564 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1565 | "dev": true 1566 | }, 1567 | "requires-port": { 1568 | "version": "1.0.0", 1569 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1570 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" 1571 | }, 1572 | "resolve": { 1573 | "version": "1.17.0", 1574 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1575 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1576 | "dev": true, 1577 | "requires": { 1578 | "path-parse": "^1.0.6" 1579 | } 1580 | }, 1581 | "resolve-from": { 1582 | "version": "4.0.0", 1583 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1584 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1585 | "dev": true 1586 | }, 1587 | "restore-cursor": { 1588 | "version": "3.1.0", 1589 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1590 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1591 | "dev": true, 1592 | "requires": { 1593 | "onetime": "^5.1.0", 1594 | "signal-exit": "^3.0.2" 1595 | } 1596 | }, 1597 | "rimraf": { 1598 | "version": "2.6.3", 1599 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1600 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1601 | "dev": true, 1602 | "requires": { 1603 | "glob": "^7.1.3" 1604 | } 1605 | }, 1606 | "run-async": { 1607 | "version": "2.4.1", 1608 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1609 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1610 | "dev": true 1611 | }, 1612 | "rxjs": { 1613 | "version": "6.5.5", 1614 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", 1615 | "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", 1616 | "dev": true, 1617 | "requires": { 1618 | "tslib": "^1.9.0" 1619 | } 1620 | }, 1621 | "safer-buffer": { 1622 | "version": "2.1.2", 1623 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1624 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1625 | }, 1626 | "semver": { 1627 | "version": "5.7.1", 1628 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1629 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1630 | "dev": true 1631 | }, 1632 | "shebang-command": { 1633 | "version": "1.2.0", 1634 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1635 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1636 | "dev": true, 1637 | "requires": { 1638 | "shebang-regex": "^1.0.0" 1639 | } 1640 | }, 1641 | "shebang-regex": { 1642 | "version": "1.0.0", 1643 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1644 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1645 | "dev": true 1646 | }, 1647 | "signal-exit": { 1648 | "version": "3.0.3", 1649 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1650 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1651 | "dev": true 1652 | }, 1653 | "simple-update-notifier": { 1654 | "version": "1.1.0", 1655 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", 1656 | "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", 1657 | "dev": true, 1658 | "requires": { 1659 | "semver": "~7.0.0" 1660 | }, 1661 | "dependencies": { 1662 | "semver": { 1663 | "version": "7.0.0", 1664 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1665 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1666 | "dev": true 1667 | } 1668 | } 1669 | }, 1670 | "slice-ansi": { 1671 | "version": "2.1.0", 1672 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1673 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1674 | "dev": true, 1675 | "requires": { 1676 | "ansi-styles": "^3.2.0", 1677 | "astral-regex": "^1.0.0", 1678 | "is-fullwidth-code-point": "^2.0.0" 1679 | }, 1680 | "dependencies": { 1681 | "ansi-styles": { 1682 | "version": "3.2.1", 1683 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1684 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1685 | "dev": true, 1686 | "requires": { 1687 | "color-convert": "^1.9.0" 1688 | } 1689 | }, 1690 | "color-convert": { 1691 | "version": "1.9.3", 1692 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1693 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1694 | "dev": true, 1695 | "requires": { 1696 | "color-name": "1.1.3" 1697 | } 1698 | }, 1699 | "color-name": { 1700 | "version": "1.1.3", 1701 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1702 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1703 | "dev": true 1704 | } 1705 | } 1706 | }, 1707 | "spdx-correct": { 1708 | "version": "3.1.1", 1709 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 1710 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 1711 | "dev": true, 1712 | "requires": { 1713 | "spdx-expression-parse": "^3.0.0", 1714 | "spdx-license-ids": "^3.0.0" 1715 | } 1716 | }, 1717 | "spdx-exceptions": { 1718 | "version": "2.3.0", 1719 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 1720 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 1721 | "dev": true 1722 | }, 1723 | "spdx-expression-parse": { 1724 | "version": "3.0.1", 1725 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 1726 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 1727 | "dev": true, 1728 | "requires": { 1729 | "spdx-exceptions": "^2.1.0", 1730 | "spdx-license-ids": "^3.0.0" 1731 | } 1732 | }, 1733 | "spdx-license-ids": { 1734 | "version": "3.0.5", 1735 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 1736 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 1737 | "dev": true 1738 | }, 1739 | "sprintf-js": { 1740 | "version": "1.0.3", 1741 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1742 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1743 | "dev": true 1744 | }, 1745 | "string-width": { 1746 | "version": "4.2.0", 1747 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1748 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1749 | "dev": true, 1750 | "requires": { 1751 | "emoji-regex": "^8.0.0", 1752 | "is-fullwidth-code-point": "^3.0.0", 1753 | "strip-ansi": "^6.0.0" 1754 | }, 1755 | "dependencies": { 1756 | "emoji-regex": { 1757 | "version": "8.0.0", 1758 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1759 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1760 | "dev": true 1761 | }, 1762 | "is-fullwidth-code-point": { 1763 | "version": "3.0.0", 1764 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1765 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1766 | "dev": true 1767 | }, 1768 | "strip-ansi": { 1769 | "version": "6.0.0", 1770 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1771 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1772 | "dev": true, 1773 | "requires": { 1774 | "ansi-regex": "^5.0.0" 1775 | } 1776 | } 1777 | } 1778 | }, 1779 | "string.prototype.trimend": { 1780 | "version": "1.0.1", 1781 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1782 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1783 | "dev": true, 1784 | "requires": { 1785 | "define-properties": "^1.1.3", 1786 | "es-abstract": "^1.17.5" 1787 | } 1788 | }, 1789 | "string.prototype.trimleft": { 1790 | "version": "2.1.2", 1791 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 1792 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 1793 | "dev": true, 1794 | "requires": { 1795 | "define-properties": "^1.1.3", 1796 | "es-abstract": "^1.17.5", 1797 | "string.prototype.trimstart": "^1.0.0" 1798 | } 1799 | }, 1800 | "string.prototype.trimright": { 1801 | "version": "2.1.2", 1802 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 1803 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 1804 | "dev": true, 1805 | "requires": { 1806 | "define-properties": "^1.1.3", 1807 | "es-abstract": "^1.17.5", 1808 | "string.prototype.trimend": "^1.0.0" 1809 | } 1810 | }, 1811 | "string.prototype.trimstart": { 1812 | "version": "1.0.1", 1813 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1814 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1815 | "dev": true, 1816 | "requires": { 1817 | "define-properties": "^1.1.3", 1818 | "es-abstract": "^1.17.5" 1819 | } 1820 | }, 1821 | "strip-ansi": { 1822 | "version": "5.2.0", 1823 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1824 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1825 | "dev": true, 1826 | "requires": { 1827 | "ansi-regex": "^4.1.0" 1828 | }, 1829 | "dependencies": { 1830 | "ansi-regex": { 1831 | "version": "4.1.1", 1832 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 1833 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 1834 | "dev": true 1835 | } 1836 | } 1837 | }, 1838 | "strip-bom": { 1839 | "version": "3.0.0", 1840 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1841 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1842 | "dev": true 1843 | }, 1844 | "supports-color": { 1845 | "version": "5.5.0", 1846 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1847 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1848 | "dev": true, 1849 | "requires": { 1850 | "has-flag": "^3.0.0" 1851 | } 1852 | }, 1853 | "table": { 1854 | "version": "5.4.6", 1855 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1856 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1857 | "dev": true, 1858 | "requires": { 1859 | "ajv": "^6.10.2", 1860 | "lodash": "^4.17.14", 1861 | "slice-ansi": "^2.1.0", 1862 | "string-width": "^3.0.0" 1863 | }, 1864 | "dependencies": { 1865 | "string-width": { 1866 | "version": "3.1.0", 1867 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1868 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1869 | "dev": true, 1870 | "requires": { 1871 | "emoji-regex": "^7.0.1", 1872 | "is-fullwidth-code-point": "^2.0.0", 1873 | "strip-ansi": "^5.1.0" 1874 | } 1875 | } 1876 | } 1877 | }, 1878 | "text-table": { 1879 | "version": "0.2.0", 1880 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1881 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1882 | "dev": true 1883 | }, 1884 | "through": { 1885 | "version": "2.3.8", 1886 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1887 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1888 | "dev": true 1889 | }, 1890 | "tmp": { 1891 | "version": "0.0.33", 1892 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1893 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1894 | "dev": true, 1895 | "requires": { 1896 | "os-tmpdir": "~1.0.2" 1897 | } 1898 | }, 1899 | "to-regex-range": { 1900 | "version": "5.0.1", 1901 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1902 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1903 | "dev": true, 1904 | "requires": { 1905 | "is-number": "^7.0.0" 1906 | } 1907 | }, 1908 | "touch": { 1909 | "version": "3.1.0", 1910 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1911 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1912 | "dev": true, 1913 | "requires": { 1914 | "nopt": "~1.0.10" 1915 | } 1916 | }, 1917 | "tslib": { 1918 | "version": "1.13.0", 1919 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1920 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1921 | "dev": true 1922 | }, 1923 | "type-check": { 1924 | "version": "0.3.2", 1925 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1926 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1927 | "dev": true, 1928 | "requires": { 1929 | "prelude-ls": "~1.1.2" 1930 | } 1931 | }, 1932 | "type-fest": { 1933 | "version": "0.8.1", 1934 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1935 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1936 | "dev": true 1937 | }, 1938 | "undefsafe": { 1939 | "version": "2.0.5", 1940 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1941 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1942 | "dev": true 1943 | }, 1944 | "uri-js": { 1945 | "version": "4.2.2", 1946 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1947 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1948 | "dev": true, 1949 | "requires": { 1950 | "punycode": "^2.1.0" 1951 | } 1952 | }, 1953 | "v8-compile-cache": { 1954 | "version": "2.1.0", 1955 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1956 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1957 | "dev": true 1958 | }, 1959 | "validate-npm-package-license": { 1960 | "version": "3.0.4", 1961 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1962 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1963 | "dev": true, 1964 | "requires": { 1965 | "spdx-correct": "^3.0.0", 1966 | "spdx-expression-parse": "^3.0.0" 1967 | } 1968 | }, 1969 | "which": { 1970 | "version": "2.0.2", 1971 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1972 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1973 | "requires": { 1974 | "isexe": "^2.0.0" 1975 | } 1976 | }, 1977 | "word-wrap": { 1978 | "version": "1.2.4", 1979 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", 1980 | "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", 1981 | "dev": true 1982 | }, 1983 | "wrappy": { 1984 | "version": "1.0.2", 1985 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1986 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1987 | "dev": true 1988 | }, 1989 | "write": { 1990 | "version": "1.0.3", 1991 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1992 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1993 | "dev": true, 1994 | "requires": { 1995 | "mkdirp": "^0.5.1" 1996 | } 1997 | } 1998 | } 1999 | } 2000 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "timeprox", 3 | "version": "0.4.0", 4 | "homepage": "https://github.com/remino/timeprox#readme", 5 | "description": "HTTP proxy to the Wayback Machine (web.archive.org) for retro browsers", 6 | "author": "Rémi (https://remino.net)", 7 | "license": "ISC", 8 | "private": true, 9 | "main": "server.js", 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1", 12 | "start": "node app.js" 13 | }, 14 | "devDependencies": { 15 | "eslint": "^6.8.0", 16 | "eslint-config-airbnb-base": "^14.1.0", 17 | "eslint-plugin-import": "^2.20.2", 18 | "nodemon": "^2.0.20" 19 | }, 20 | "dependencies": { 21 | "charset": "^1.0.1", 22 | "http-proxy": "^1.18.1", 23 | "iconv-lite": "^0.5.1", 24 | "node-fetch-cjs": "^3.2.10", 25 | "pem": "^1.14.4" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/remino/timeprox/0bf018aa62316d2b84b1550b72a72e4ca3172ae2/screenshot.png -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const charset = require('charset') 2 | const fetch = require('node-fetch-cjs') 3 | const http = require('http') 4 | const { decode, encode } = require('iconv-lite') 5 | 6 | const port = 3000 7 | const year = 1998 8 | const proxyName = 'timeprox' 9 | 10 | process.on('uncaughtException', e => { console.error(e) }) 11 | process.on('unhandledRejection', e => { throw e }) 12 | 13 | const pad = v => `${v.toString().length === 1 ? '0' : ''}${v}` 14 | 15 | const formatOffset = date => { 16 | const offset = date.getTimezoneOffset() 17 | const p = offset < 0 ? '+' : '-' 18 | const h = pad(Math.floor(Math.abs(offset) / 60)) 19 | const m = pad(Math.abs(offset) % 60) 20 | return `${p}${h}:${m}` 21 | } 22 | 23 | const formatDate = (date = new Date()) => { 24 | const y = date.getFullYear() 25 | const m = pad(date.getMonth() + 1) 26 | const d = pad(date.getDate()) 27 | const h = pad(date.getHours()) 28 | const n = pad(date.getMinutes()) 29 | const s = pad(date.getSeconds()) 30 | const z = `${formatOffset(date)}` 31 | return `${y}-${m}-${d}T${h}:${n}:${s}${z}` 32 | } 33 | 34 | const log = msg => { 35 | console.log(`[${formatDate()}] ${msg}`) 36 | } 37 | 38 | const arcUrl = url => { 39 | const { pathname } = new URL(url) 40 | return /^\/web\/\d+(im_)?\//.test(pathname) 41 | ? `https://web.archive.org${pathname}` 42 | : `https://web.archive.org/web/${year}0101/${url}` 43 | } 44 | 45 | const filterBody = body => body 46 | .replace(/https?:\/\/web\.archive\.org/g, '') 47 | .replace(/\/web\/\d+(im_|fw_)?\/?/g, '') 48 | .replace(/^[\s\t\r\n]+]*>)(.|[\r\n])*/i, '$1') 50 | .replace(/(]*>)(.|[\r\n])*/i, '$1') 51 | 52 | const isStartOf = (substr, str) => str.toString().slice(0, substr.length) === substr 53 | 54 | const isFetchResText = fetchRes => { 55 | const contentType = fetchRes.headers.raw()['content-type'] 56 | return !!['text/html', 'text/plain'] 57 | .find(type => isStartOf(type, contentType)) 58 | } 59 | 60 | const isFetchResTs404 = fetchRes => fetchRes.headers.get('x-ts') === '404' 61 | 62 | const isFetchResYear = (setYear, fetchRes) => isStartOf( 63 | `/web/${setYear}`, (new URL(fetchRes.url)).pathname, 64 | ) 65 | 66 | const setContentType = (fetchRes, res) => { 67 | const { headers } = fetchRes 68 | const contentType = headers.get('content-type') 69 | 70 | if (!contentType) { 71 | const guessedContentType = headers.get('x-archive-guessed-content-type') 72 | const guessedCharset = headers.get('x-archive-guessed-charset') 73 | const mimeCharset = guessedCharset ? `; charset=${guessedCharset}` : '' 74 | 75 | if (guessedContentType && guessedCharset) { 76 | res.setHeader('content-type', `${guessedContentType}${mimeCharset}`) 77 | } 78 | } 79 | 80 | res.setHeader('content-type', res.getHeader('content-type')[0].replace('_', '-')) 81 | } 82 | 83 | const setHeaders = (fetchRes, req, res) => { 84 | const headers = fetchRes.headers.raw() 85 | 86 | Object.keys(headers).forEach(name => { 87 | if (['content-encoding', 'link', 'transfer-encoding'].includes(name)) return 88 | if ([/^x-archive-(?!orig)/].find(r => r.test(name))) return 89 | res.setHeader(name.replace(/^x-archive-orig-/, ''), headers[name]) 90 | }) 91 | 92 | res.setHeader(`x-${proxyName}-archive-url`, fetchRes.url) 93 | res.setHeader(`x-${proxyName}-request-time`, formatDate()) 94 | res.setHeader(`x-${proxyName}-request-url`, req.url) 95 | setContentType(fetchRes, res) 96 | } 97 | 98 | const sendBody = (fetchRes, res) => { 99 | fetchRes.buffer().then(body => { 100 | if (!isFetchResText(fetchRes)) { 101 | res.end(body) 102 | return 103 | } 104 | 105 | const contentType = res.getHeader('content-type') 106 | const bodyCharset = charset(contentType) || 'utf8' 107 | const src = decode(body, bodyCharset) 108 | const filtered = filterBody(src) 109 | const resBody = encode(filtered, bodyCharset) 110 | res.end(resBody, bodyCharset) 111 | }) 112 | } 113 | 114 | const notFound = res => res.writeHead(404).end(`${proxyName}: Not Found`) 115 | const serverError = (res, e) => res.writeHead(500).end(`${proxyName}: Server Error\n\n${e}`) 116 | 117 | const server = http.createServer((req, res) => { 118 | fetch(arcUrl(req.url)).then(fetchRes => { 119 | log(`${req.url} => ${fetchRes.url}`) 120 | if (isFetchResTs404(fetchRes)) return notFound(res) 121 | // if (!isFetchResYear(year, fetchRes)) return notFound(res) 122 | setHeaders(fetchRes, req, res) 123 | return sendBody(fetchRes, res) 124 | }).catch(e => serverError(res, e)) 125 | }) 126 | 127 | log(`HTTP Proxy: http://localhost:${port}`) 128 | server.listen(port) 129 | --------------------------------------------------------------------------------