├── .gitignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── save.json ├── screenshots ├── ssone.png └── sstwo.png └── src ├── main.js └── render ├── menu ├── index.html └── menu.js ├── session ├── index.html └── session.js ├── style.css └── util.js /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Spaced Repetition Software 2 | 3 | This is a desktop application that allows the users to create flash cards, that are shown at a software-determined time. 4 | 5 | Every time the user gets a question wrong, the question will appear one minute later until the question is correct. The first time a question is right, the user gets shown in a day, then a week, then a month, and then a year - and once a year from that point onwards. 6 | 7 | ## Installation 8 | 9 | - Clone repository 10 | - `npm i` 11 | - `npm i -D` 12 | - `npm start` 13 | 14 | ## Screenshots 15 | 16 | ![Menu](/screenshots/ssone.png?raw=true "Menu") 17 | ![Session](/screenshots/sstwo.png?raw=true "Session") 18 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spaced-repetition", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "spaced-repetition", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "boolean": "^3.2.0", 13 | "buffer-crc32": "^0.2.13", 14 | "buffer-from": "^1.1.2", 15 | "cacheable-request": "^6.1.0", 16 | "clone-response": "^1.0.2", 17 | "concat-stream": "^1.6.2", 18 | "config-chain": "^1.1.13", 19 | "core-util-is": "^1.0.3", 20 | "debug": "^4.3.4", 21 | "decompress-response": "^3.3.0", 22 | "defer-to-connect": "^1.1.3", 23 | "define-properties": "^1.1.3", 24 | "detect-node": "^2.1.0", 25 | "duplexer3": "^0.1.4", 26 | "encodeurl": "^1.0.2", 27 | "end-of-stream": "^1.4.4", 28 | "env-paths": "^2.2.1", 29 | "es6-error": "^4.1.1", 30 | "escape-string-regexp": "^4.0.0", 31 | "extract-zip": "^1.7.0", 32 | "fd-slicer": "^1.1.0", 33 | "fs-extra": "^8.1.0", 34 | "get-stream": "^4.1.0", 35 | "global-agent": "^3.0.0", 36 | "global-tunnel-ng": "^2.7.1", 37 | "globalthis": "^1.0.2", 38 | "got": "^9.6.0", 39 | "graceful-fs": "^4.2.10", 40 | "http-cache-semantics": "^4.1.0", 41 | "inherits": "^2.0.4", 42 | "ini": "^1.3.8", 43 | "isarray": "^1.0.0", 44 | "json-buffer": "^3.0.0", 45 | "json-stringify-safe": "^5.0.1", 46 | "jsonfile": "^4.0.0", 47 | "keyv": "^3.1.0", 48 | "lodash": "^4.17.21", 49 | "lowercase-keys": "^1.0.1", 50 | "lru-cache": "^7.8.0", 51 | "matcher": "^3.0.0", 52 | "mimic-response": "^1.0.1", 53 | "minimist": "^1.2.6", 54 | "mkdirp": "^0.5.6", 55 | "ms": "^2.1.2", 56 | "normalize-url": "^4.5.1", 57 | "npm-conf": "^1.1.3", 58 | "object-keys": "^1.1.1", 59 | "once": "^1.4.0", 60 | "p-cancelable": "^1.1.0", 61 | "pend": "^1.2.0", 62 | "pify": "^3.0.0", 63 | "prepend-http": "^2.0.0", 64 | "process-nextick-args": "^2.0.1", 65 | "progress": "^2.0.3", 66 | "proto-list": "^1.2.4", 67 | "pump": "^3.0.0", 68 | "readable-stream": "^2.3.7", 69 | "responselike": "^1.0.2", 70 | "roarr": "^2.15.4", 71 | "safe-buffer": "^5.1.2", 72 | "semver": "^6.3.0", 73 | "semver-compare": "^1.0.0", 74 | "serialize-error": "^7.0.1", 75 | "sprintf-js": "^1.1.2", 76 | "string_decoder": "^1.1.1", 77 | "sumchecker": "^3.0.1", 78 | "to-readable-stream": "^1.0.0", 79 | "tunnel": "^0.0.6", 80 | "type-fest": "^0.13.1", 81 | "typedarray": "^0.0.6", 82 | "universalify": "^0.1.2", 83 | "url-parse-lax": "^3.0.0", 84 | "util-deprecate": "^1.0.2", 85 | "wrappy": "^1.0.2", 86 | "yauzl": "^2.10.0" 87 | }, 88 | "devDependencies": { 89 | "electron": "^18.0.3" 90 | } 91 | }, 92 | "node_modules/@electron/get": { 93 | "version": "1.14.1", 94 | "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", 95 | "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", 96 | "dev": true, 97 | "dependencies": { 98 | "debug": "^4.1.1", 99 | "env-paths": "^2.2.0", 100 | "fs-extra": "^8.1.0", 101 | "got": "^9.6.0", 102 | "progress": "^2.0.3", 103 | "semver": "^6.2.0", 104 | "sumchecker": "^3.0.1" 105 | }, 106 | "engines": { 107 | "node": ">=8.6" 108 | }, 109 | "optionalDependencies": { 110 | "global-agent": "^3.0.0", 111 | "global-tunnel-ng": "^2.7.1" 112 | } 113 | }, 114 | "node_modules/@sindresorhus/is": { 115 | "version": "0.14.0", 116 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 117 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", 118 | "engines": { 119 | "node": ">=6" 120 | } 121 | }, 122 | "node_modules/@szmarczak/http-timer": { 123 | "version": "1.1.2", 124 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", 125 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", 126 | "dependencies": { 127 | "defer-to-connect": "^1.0.1" 128 | }, 129 | "engines": { 130 | "node": ">=6" 131 | } 132 | }, 133 | "node_modules/@types/node": { 134 | "version": "16.11.26", 135 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz", 136 | "integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==", 137 | "dev": true 138 | }, 139 | "node_modules/boolean": { 140 | "version": "3.2.0", 141 | "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", 142 | "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" 143 | }, 144 | "node_modules/buffer-crc32": { 145 | "version": "0.2.13", 146 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 147 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 148 | "engines": { 149 | "node": "*" 150 | } 151 | }, 152 | "node_modules/buffer-from": { 153 | "version": "1.1.2", 154 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 155 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 156 | }, 157 | "node_modules/cacheable-request": { 158 | "version": "6.1.0", 159 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 160 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", 161 | "dependencies": { 162 | "clone-response": "^1.0.2", 163 | "get-stream": "^5.1.0", 164 | "http-cache-semantics": "^4.0.0", 165 | "keyv": "^3.0.0", 166 | "lowercase-keys": "^2.0.0", 167 | "normalize-url": "^4.1.0", 168 | "responselike": "^1.0.2" 169 | }, 170 | "engines": { 171 | "node": ">=8" 172 | } 173 | }, 174 | "node_modules/cacheable-request/node_modules/get-stream": { 175 | "version": "5.2.0", 176 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 177 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 178 | "dependencies": { 179 | "pump": "^3.0.0" 180 | }, 181 | "engines": { 182 | "node": ">=8" 183 | }, 184 | "funding": { 185 | "url": "https://github.com/sponsors/sindresorhus" 186 | } 187 | }, 188 | "node_modules/cacheable-request/node_modules/lowercase-keys": { 189 | "version": "2.0.0", 190 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 191 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 192 | "engines": { 193 | "node": ">=8" 194 | } 195 | }, 196 | "node_modules/clone-response": { 197 | "version": "1.0.2", 198 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 199 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 200 | "dependencies": { 201 | "mimic-response": "^1.0.0" 202 | } 203 | }, 204 | "node_modules/concat-stream": { 205 | "version": "1.6.2", 206 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 207 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 208 | "engines": [ 209 | "node >= 0.8" 210 | ], 211 | "dependencies": { 212 | "buffer-from": "^1.0.0", 213 | "inherits": "^2.0.3", 214 | "readable-stream": "^2.2.2", 215 | "typedarray": "^0.0.6" 216 | } 217 | }, 218 | "node_modules/config-chain": { 219 | "version": "1.1.13", 220 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", 221 | "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", 222 | "dependencies": { 223 | "ini": "^1.3.4", 224 | "proto-list": "~1.2.1" 225 | } 226 | }, 227 | "node_modules/core-util-is": { 228 | "version": "1.0.3", 229 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 230 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 231 | }, 232 | "node_modules/debug": { 233 | "version": "4.3.4", 234 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 235 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 236 | "dependencies": { 237 | "ms": "2.1.2" 238 | }, 239 | "engines": { 240 | "node": ">=6.0" 241 | }, 242 | "peerDependenciesMeta": { 243 | "supports-color": { 244 | "optional": true 245 | } 246 | } 247 | }, 248 | "node_modules/decompress-response": { 249 | "version": "3.3.0", 250 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 251 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 252 | "dependencies": { 253 | "mimic-response": "^1.0.0" 254 | }, 255 | "engines": { 256 | "node": ">=4" 257 | } 258 | }, 259 | "node_modules/defer-to-connect": { 260 | "version": "1.1.3", 261 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 262 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 263 | }, 264 | "node_modules/define-properties": { 265 | "version": "1.1.3", 266 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 267 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 268 | "dependencies": { 269 | "object-keys": "^1.0.12" 270 | }, 271 | "engines": { 272 | "node": ">= 0.4" 273 | } 274 | }, 275 | "node_modules/detect-node": { 276 | "version": "2.1.0", 277 | "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", 278 | "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" 279 | }, 280 | "node_modules/duplexer3": { 281 | "version": "0.1.4", 282 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 283 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 284 | }, 285 | "node_modules/electron": { 286 | "version": "18.0.3", 287 | "resolved": "https://registry.npmjs.org/electron/-/electron-18.0.3.tgz", 288 | "integrity": "sha512-QRUZkGL8O/8CyDmTLSjBeRsZmGTPlPVeWnnpkdNqgHYYaOc/A881FKMiNzvQ9Cj0a+rUavDdwBUfUL82U3Ay7w==", 289 | "dev": true, 290 | "hasInstallScript": true, 291 | "dependencies": { 292 | "@electron/get": "^1.13.0", 293 | "@types/node": "^16.11.26", 294 | "extract-zip": "^1.0.3" 295 | }, 296 | "bin": { 297 | "electron": "cli.js" 298 | }, 299 | "engines": { 300 | "node": ">= 8.6" 301 | } 302 | }, 303 | "node_modules/encodeurl": { 304 | "version": "1.0.2", 305 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 306 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 307 | "engines": { 308 | "node": ">= 0.8" 309 | } 310 | }, 311 | "node_modules/end-of-stream": { 312 | "version": "1.4.4", 313 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 314 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 315 | "dependencies": { 316 | "once": "^1.4.0" 317 | } 318 | }, 319 | "node_modules/env-paths": { 320 | "version": "2.2.1", 321 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 322 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 323 | "engines": { 324 | "node": ">=6" 325 | } 326 | }, 327 | "node_modules/es6-error": { 328 | "version": "4.1.1", 329 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 330 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" 331 | }, 332 | "node_modules/escape-string-regexp": { 333 | "version": "4.0.0", 334 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 335 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 336 | "engines": { 337 | "node": ">=10" 338 | }, 339 | "funding": { 340 | "url": "https://github.com/sponsors/sindresorhus" 341 | } 342 | }, 343 | "node_modules/extract-zip": { 344 | "version": "1.7.0", 345 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", 346 | "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", 347 | "dependencies": { 348 | "concat-stream": "^1.6.2", 349 | "debug": "^2.6.9", 350 | "mkdirp": "^0.5.4", 351 | "yauzl": "^2.10.0" 352 | }, 353 | "bin": { 354 | "extract-zip": "cli.js" 355 | } 356 | }, 357 | "node_modules/extract-zip/node_modules/debug": { 358 | "version": "2.6.9", 359 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 360 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 361 | "dependencies": { 362 | "ms": "2.0.0" 363 | } 364 | }, 365 | "node_modules/extract-zip/node_modules/ms": { 366 | "version": "2.0.0", 367 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 368 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 369 | }, 370 | "node_modules/fd-slicer": { 371 | "version": "1.1.0", 372 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 373 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 374 | "dependencies": { 375 | "pend": "~1.2.0" 376 | } 377 | }, 378 | "node_modules/fs-extra": { 379 | "version": "8.1.0", 380 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 381 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 382 | "dependencies": { 383 | "graceful-fs": "^4.2.0", 384 | "jsonfile": "^4.0.0", 385 | "universalify": "^0.1.0" 386 | }, 387 | "engines": { 388 | "node": ">=6 <7 || >=8" 389 | } 390 | }, 391 | "node_modules/get-stream": { 392 | "version": "4.1.0", 393 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 394 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 395 | "dependencies": { 396 | "pump": "^3.0.0" 397 | }, 398 | "engines": { 399 | "node": ">=6" 400 | } 401 | }, 402 | "node_modules/global-agent": { 403 | "version": "3.0.0", 404 | "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", 405 | "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", 406 | "dependencies": { 407 | "boolean": "^3.0.1", 408 | "es6-error": "^4.1.1", 409 | "matcher": "^3.0.0", 410 | "roarr": "^2.15.3", 411 | "semver": "^7.3.2", 412 | "serialize-error": "^7.0.1" 413 | }, 414 | "engines": { 415 | "node": ">=10.0" 416 | } 417 | }, 418 | "node_modules/global-agent/node_modules/semver": { 419 | "version": "7.3.6", 420 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", 421 | "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", 422 | "dependencies": { 423 | "lru-cache": "^7.4.0" 424 | }, 425 | "bin": { 426 | "semver": "bin/semver.js" 427 | }, 428 | "engines": { 429 | "node": "^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0" 430 | } 431 | }, 432 | "node_modules/global-tunnel-ng": { 433 | "version": "2.7.1", 434 | "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", 435 | "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", 436 | "dependencies": { 437 | "encodeurl": "^1.0.2", 438 | "lodash": "^4.17.10", 439 | "npm-conf": "^1.1.3", 440 | "tunnel": "^0.0.6" 441 | }, 442 | "engines": { 443 | "node": ">=0.10" 444 | } 445 | }, 446 | "node_modules/globalthis": { 447 | "version": "1.0.2", 448 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", 449 | "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", 450 | "dependencies": { 451 | "define-properties": "^1.1.3" 452 | }, 453 | "engines": { 454 | "node": ">= 0.4" 455 | }, 456 | "funding": { 457 | "url": "https://github.com/sponsors/ljharb" 458 | } 459 | }, 460 | "node_modules/got": { 461 | "version": "9.6.0", 462 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", 463 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", 464 | "dependencies": { 465 | "@sindresorhus/is": "^0.14.0", 466 | "@szmarczak/http-timer": "^1.1.2", 467 | "cacheable-request": "^6.0.0", 468 | "decompress-response": "^3.3.0", 469 | "duplexer3": "^0.1.4", 470 | "get-stream": "^4.1.0", 471 | "lowercase-keys": "^1.0.1", 472 | "mimic-response": "^1.0.1", 473 | "p-cancelable": "^1.0.0", 474 | "to-readable-stream": "^1.0.0", 475 | "url-parse-lax": "^3.0.0" 476 | }, 477 | "engines": { 478 | "node": ">=8.6" 479 | } 480 | }, 481 | "node_modules/graceful-fs": { 482 | "version": "4.2.10", 483 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 484 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" 485 | }, 486 | "node_modules/http-cache-semantics": { 487 | "version": "4.1.0", 488 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 489 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" 490 | }, 491 | "node_modules/inherits": { 492 | "version": "2.0.4", 493 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 494 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 495 | }, 496 | "node_modules/ini": { 497 | "version": "1.3.8", 498 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 499 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 500 | }, 501 | "node_modules/isarray": { 502 | "version": "1.0.0", 503 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 504 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 505 | }, 506 | "node_modules/json-buffer": { 507 | "version": "3.0.0", 508 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 509 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 510 | }, 511 | "node_modules/json-stringify-safe": { 512 | "version": "5.0.1", 513 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 514 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 515 | }, 516 | "node_modules/jsonfile": { 517 | "version": "4.0.0", 518 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 519 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 520 | "optionalDependencies": { 521 | "graceful-fs": "^4.1.6" 522 | } 523 | }, 524 | "node_modules/keyv": { 525 | "version": "3.1.0", 526 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 527 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 528 | "dependencies": { 529 | "json-buffer": "3.0.0" 530 | } 531 | }, 532 | "node_modules/lodash": { 533 | "version": "4.17.21", 534 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 535 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 536 | }, 537 | "node_modules/lowercase-keys": { 538 | "version": "1.0.1", 539 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 540 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 541 | "engines": { 542 | "node": ">=0.10.0" 543 | } 544 | }, 545 | "node_modules/lru-cache": { 546 | "version": "7.8.0", 547 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", 548 | "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", 549 | "engines": { 550 | "node": ">=12" 551 | } 552 | }, 553 | "node_modules/matcher": { 554 | "version": "3.0.0", 555 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", 556 | "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", 557 | "dependencies": { 558 | "escape-string-regexp": "^4.0.0" 559 | }, 560 | "engines": { 561 | "node": ">=10" 562 | } 563 | }, 564 | "node_modules/mimic-response": { 565 | "version": "1.0.1", 566 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 567 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 568 | "engines": { 569 | "node": ">=4" 570 | } 571 | }, 572 | "node_modules/minimist": { 573 | "version": "1.2.6", 574 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 575 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 576 | }, 577 | "node_modules/mkdirp": { 578 | "version": "0.5.6", 579 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 580 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 581 | "dependencies": { 582 | "minimist": "^1.2.6" 583 | }, 584 | "bin": { 585 | "mkdirp": "bin/cmd.js" 586 | } 587 | }, 588 | "node_modules/ms": { 589 | "version": "2.1.2", 590 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 591 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 592 | }, 593 | "node_modules/normalize-url": { 594 | "version": "4.5.1", 595 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", 596 | "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", 597 | "engines": { 598 | "node": ">=8" 599 | } 600 | }, 601 | "node_modules/npm-conf": { 602 | "version": "1.1.3", 603 | "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", 604 | "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", 605 | "dependencies": { 606 | "config-chain": "^1.1.11", 607 | "pify": "^3.0.0" 608 | }, 609 | "engines": { 610 | "node": ">=4" 611 | } 612 | }, 613 | "node_modules/object-keys": { 614 | "version": "1.1.1", 615 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 616 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 617 | "engines": { 618 | "node": ">= 0.4" 619 | } 620 | }, 621 | "node_modules/once": { 622 | "version": "1.4.0", 623 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 624 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 625 | "dependencies": { 626 | "wrappy": "1" 627 | } 628 | }, 629 | "node_modules/p-cancelable": { 630 | "version": "1.1.0", 631 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 632 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", 633 | "engines": { 634 | "node": ">=6" 635 | } 636 | }, 637 | "node_modules/pend": { 638 | "version": "1.2.0", 639 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 640 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 641 | }, 642 | "node_modules/pify": { 643 | "version": "3.0.0", 644 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 645 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 646 | "engines": { 647 | "node": ">=4" 648 | } 649 | }, 650 | "node_modules/prepend-http": { 651 | "version": "2.0.0", 652 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 653 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", 654 | "engines": { 655 | "node": ">=4" 656 | } 657 | }, 658 | "node_modules/process-nextick-args": { 659 | "version": "2.0.1", 660 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 661 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 662 | }, 663 | "node_modules/progress": { 664 | "version": "2.0.3", 665 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 666 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 667 | "engines": { 668 | "node": ">=0.4.0" 669 | } 670 | }, 671 | "node_modules/proto-list": { 672 | "version": "1.2.4", 673 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 674 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" 675 | }, 676 | "node_modules/pump": { 677 | "version": "3.0.0", 678 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 679 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 680 | "dependencies": { 681 | "end-of-stream": "^1.1.0", 682 | "once": "^1.3.1" 683 | } 684 | }, 685 | "node_modules/readable-stream": { 686 | "version": "2.3.7", 687 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 688 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 689 | "dependencies": { 690 | "core-util-is": "~1.0.0", 691 | "inherits": "~2.0.3", 692 | "isarray": "~1.0.0", 693 | "process-nextick-args": "~2.0.0", 694 | "safe-buffer": "~5.1.1", 695 | "string_decoder": "~1.1.1", 696 | "util-deprecate": "~1.0.1" 697 | } 698 | }, 699 | "node_modules/responselike": { 700 | "version": "1.0.2", 701 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 702 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 703 | "dependencies": { 704 | "lowercase-keys": "^1.0.0" 705 | } 706 | }, 707 | "node_modules/roarr": { 708 | "version": "2.15.4", 709 | "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", 710 | "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", 711 | "dependencies": { 712 | "boolean": "^3.0.1", 713 | "detect-node": "^2.0.4", 714 | "globalthis": "^1.0.1", 715 | "json-stringify-safe": "^5.0.1", 716 | "semver-compare": "^1.0.0", 717 | "sprintf-js": "^1.1.2" 718 | }, 719 | "engines": { 720 | "node": ">=8.0" 721 | } 722 | }, 723 | "node_modules/safe-buffer": { 724 | "version": "5.1.2", 725 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 726 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 727 | }, 728 | "node_modules/semver": { 729 | "version": "6.3.0", 730 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 731 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 732 | "bin": { 733 | "semver": "bin/semver.js" 734 | } 735 | }, 736 | "node_modules/semver-compare": { 737 | "version": "1.0.0", 738 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 739 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" 740 | }, 741 | "node_modules/serialize-error": { 742 | "version": "7.0.1", 743 | "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", 744 | "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", 745 | "dependencies": { 746 | "type-fest": "^0.13.1" 747 | }, 748 | "engines": { 749 | "node": ">=10" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/sindresorhus" 753 | } 754 | }, 755 | "node_modules/sprintf-js": { 756 | "version": "1.1.2", 757 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 758 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" 759 | }, 760 | "node_modules/string_decoder": { 761 | "version": "1.1.1", 762 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 763 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 764 | "dependencies": { 765 | "safe-buffer": "~5.1.0" 766 | } 767 | }, 768 | "node_modules/sumchecker": { 769 | "version": "3.0.1", 770 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", 771 | "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", 772 | "dependencies": { 773 | "debug": "^4.1.0" 774 | }, 775 | "engines": { 776 | "node": ">= 8.0" 777 | } 778 | }, 779 | "node_modules/to-readable-stream": { 780 | "version": "1.0.0", 781 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 782 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", 783 | "engines": { 784 | "node": ">=6" 785 | } 786 | }, 787 | "node_modules/tunnel": { 788 | "version": "0.0.6", 789 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 790 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 791 | "engines": { 792 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 793 | } 794 | }, 795 | "node_modules/type-fest": { 796 | "version": "0.13.1", 797 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", 798 | "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", 799 | "engines": { 800 | "node": ">=10" 801 | }, 802 | "funding": { 803 | "url": "https://github.com/sponsors/sindresorhus" 804 | } 805 | }, 806 | "node_modules/typedarray": { 807 | "version": "0.0.6", 808 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 809 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 810 | }, 811 | "node_modules/universalify": { 812 | "version": "0.1.2", 813 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 814 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 815 | "engines": { 816 | "node": ">= 4.0.0" 817 | } 818 | }, 819 | "node_modules/url-parse-lax": { 820 | "version": "3.0.0", 821 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 822 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 823 | "dependencies": { 824 | "prepend-http": "^2.0.0" 825 | }, 826 | "engines": { 827 | "node": ">=4" 828 | } 829 | }, 830 | "node_modules/util-deprecate": { 831 | "version": "1.0.2", 832 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 833 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 834 | }, 835 | "node_modules/wrappy": { 836 | "version": "1.0.2", 837 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 838 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 839 | }, 840 | "node_modules/yauzl": { 841 | "version": "2.10.0", 842 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 843 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 844 | "dependencies": { 845 | "buffer-crc32": "~0.2.3", 846 | "fd-slicer": "~1.1.0" 847 | } 848 | } 849 | }, 850 | "dependencies": { 851 | "@electron/get": { 852 | "version": "1.14.1", 853 | "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", 854 | "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", 855 | "dev": true, 856 | "requires": { 857 | "debug": "^4.1.1", 858 | "env-paths": "^2.2.0", 859 | "fs-extra": "^8.1.0", 860 | "global-agent": "^3.0.0", 861 | "global-tunnel-ng": "^2.7.1", 862 | "got": "^9.6.0", 863 | "progress": "^2.0.3", 864 | "semver": "^6.2.0", 865 | "sumchecker": "^3.0.1" 866 | } 867 | }, 868 | "@sindresorhus/is": { 869 | "version": "0.14.0", 870 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 871 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" 872 | }, 873 | "@szmarczak/http-timer": { 874 | "version": "1.1.2", 875 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", 876 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", 877 | "requires": { 878 | "defer-to-connect": "^1.0.1" 879 | } 880 | }, 881 | "@types/node": { 882 | "version": "16.11.26", 883 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.26.tgz", 884 | "integrity": "sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==", 885 | "dev": true 886 | }, 887 | "boolean": { 888 | "version": "3.2.0", 889 | "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", 890 | "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" 891 | }, 892 | "buffer-crc32": { 893 | "version": "0.2.13", 894 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 895 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 896 | }, 897 | "buffer-from": { 898 | "version": "1.1.2", 899 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 900 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 901 | }, 902 | "cacheable-request": { 903 | "version": "6.1.0", 904 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 905 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", 906 | "requires": { 907 | "clone-response": "^1.0.2", 908 | "get-stream": "^5.1.0", 909 | "http-cache-semantics": "^4.0.0", 910 | "keyv": "^3.0.0", 911 | "lowercase-keys": "^2.0.0", 912 | "normalize-url": "^4.1.0", 913 | "responselike": "^1.0.2" 914 | }, 915 | "dependencies": { 916 | "get-stream": { 917 | "version": "5.2.0", 918 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 919 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 920 | "requires": { 921 | "pump": "^3.0.0" 922 | } 923 | }, 924 | "lowercase-keys": { 925 | "version": "2.0.0", 926 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 927 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" 928 | } 929 | } 930 | }, 931 | "clone-response": { 932 | "version": "1.0.2", 933 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 934 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 935 | "requires": { 936 | "mimic-response": "^1.0.0" 937 | } 938 | }, 939 | "concat-stream": { 940 | "version": "1.6.2", 941 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 942 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 943 | "requires": { 944 | "buffer-from": "^1.0.0", 945 | "inherits": "^2.0.3", 946 | "readable-stream": "^2.2.2", 947 | "typedarray": "^0.0.6" 948 | } 949 | }, 950 | "config-chain": { 951 | "version": "1.1.13", 952 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", 953 | "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", 954 | "requires": { 955 | "ini": "^1.3.4", 956 | "proto-list": "~1.2.1" 957 | } 958 | }, 959 | "core-util-is": { 960 | "version": "1.0.3", 961 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 962 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 963 | }, 964 | "debug": { 965 | "version": "4.3.4", 966 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 967 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 968 | "requires": { 969 | "ms": "2.1.2" 970 | } 971 | }, 972 | "decompress-response": { 973 | "version": "3.3.0", 974 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 975 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 976 | "requires": { 977 | "mimic-response": "^1.0.0" 978 | } 979 | }, 980 | "defer-to-connect": { 981 | "version": "1.1.3", 982 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 983 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 984 | }, 985 | "define-properties": { 986 | "version": "1.1.3", 987 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 988 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 989 | "requires": { 990 | "object-keys": "^1.0.12" 991 | } 992 | }, 993 | "detect-node": { 994 | "version": "2.1.0", 995 | "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", 996 | "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" 997 | }, 998 | "duplexer3": { 999 | "version": "0.1.4", 1000 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 1001 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 1002 | }, 1003 | "electron": { 1004 | "version": "18.0.3", 1005 | "resolved": "https://registry.npmjs.org/electron/-/electron-18.0.3.tgz", 1006 | "integrity": "sha512-QRUZkGL8O/8CyDmTLSjBeRsZmGTPlPVeWnnpkdNqgHYYaOc/A881FKMiNzvQ9Cj0a+rUavDdwBUfUL82U3Ay7w==", 1007 | "dev": true, 1008 | "requires": { 1009 | "@electron/get": "^1.13.0", 1010 | "@types/node": "^16.11.26", 1011 | "extract-zip": "^1.0.3" 1012 | } 1013 | }, 1014 | "encodeurl": { 1015 | "version": "1.0.2", 1016 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1017 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1018 | }, 1019 | "end-of-stream": { 1020 | "version": "1.4.4", 1021 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1022 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1023 | "requires": { 1024 | "once": "^1.4.0" 1025 | } 1026 | }, 1027 | "env-paths": { 1028 | "version": "2.2.1", 1029 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 1030 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" 1031 | }, 1032 | "es6-error": { 1033 | "version": "4.1.1", 1034 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 1035 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" 1036 | }, 1037 | "escape-string-regexp": { 1038 | "version": "4.0.0", 1039 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1040 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 1041 | }, 1042 | "extract-zip": { 1043 | "version": "1.7.0", 1044 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", 1045 | "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", 1046 | "requires": { 1047 | "concat-stream": "^1.6.2", 1048 | "debug": "^2.6.9", 1049 | "mkdirp": "^0.5.4", 1050 | "yauzl": "^2.10.0" 1051 | }, 1052 | "dependencies": { 1053 | "debug": { 1054 | "version": "2.6.9", 1055 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1056 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1057 | "requires": { 1058 | "ms": "2.0.0" 1059 | } 1060 | }, 1061 | "ms": { 1062 | "version": "2.0.0", 1063 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1064 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1065 | } 1066 | } 1067 | }, 1068 | "fd-slicer": { 1069 | "version": "1.1.0", 1070 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 1071 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 1072 | "requires": { 1073 | "pend": "~1.2.0" 1074 | } 1075 | }, 1076 | "fs-extra": { 1077 | "version": "8.1.0", 1078 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 1079 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 1080 | "requires": { 1081 | "graceful-fs": "^4.2.0", 1082 | "jsonfile": "^4.0.0", 1083 | "universalify": "^0.1.0" 1084 | } 1085 | }, 1086 | "get-stream": { 1087 | "version": "4.1.0", 1088 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 1089 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 1090 | "requires": { 1091 | "pump": "^3.0.0" 1092 | } 1093 | }, 1094 | "global-agent": { 1095 | "version": "3.0.0", 1096 | "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", 1097 | "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", 1098 | "requires": { 1099 | "boolean": "^3.0.1", 1100 | "es6-error": "^4.1.1", 1101 | "matcher": "^3.0.0", 1102 | "roarr": "^2.15.3", 1103 | "semver": "^7.3.2", 1104 | "serialize-error": "^7.0.1" 1105 | }, 1106 | "dependencies": { 1107 | "semver": { 1108 | "version": "7.3.6", 1109 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", 1110 | "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", 1111 | "requires": { 1112 | "lru-cache": "^7.4.0" 1113 | } 1114 | } 1115 | } 1116 | }, 1117 | "global-tunnel-ng": { 1118 | "version": "2.7.1", 1119 | "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", 1120 | "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", 1121 | "requires": { 1122 | "encodeurl": "^1.0.2", 1123 | "lodash": "^4.17.10", 1124 | "npm-conf": "^1.1.3", 1125 | "tunnel": "^0.0.6" 1126 | } 1127 | }, 1128 | "globalthis": { 1129 | "version": "1.0.2", 1130 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", 1131 | "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", 1132 | "requires": { 1133 | "define-properties": "^1.1.3" 1134 | } 1135 | }, 1136 | "got": { 1137 | "version": "9.6.0", 1138 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", 1139 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", 1140 | "requires": { 1141 | "@sindresorhus/is": "^0.14.0", 1142 | "@szmarczak/http-timer": "^1.1.2", 1143 | "cacheable-request": "^6.0.0", 1144 | "decompress-response": "^3.3.0", 1145 | "duplexer3": "^0.1.4", 1146 | "get-stream": "^4.1.0", 1147 | "lowercase-keys": "^1.0.1", 1148 | "mimic-response": "^1.0.1", 1149 | "p-cancelable": "^1.0.0", 1150 | "to-readable-stream": "^1.0.0", 1151 | "url-parse-lax": "^3.0.0" 1152 | } 1153 | }, 1154 | "graceful-fs": { 1155 | "version": "4.2.10", 1156 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 1157 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" 1158 | }, 1159 | "http-cache-semantics": { 1160 | "version": "4.1.0", 1161 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 1162 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" 1163 | }, 1164 | "inherits": { 1165 | "version": "2.0.4", 1166 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1167 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1168 | }, 1169 | "ini": { 1170 | "version": "1.3.8", 1171 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1172 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1173 | }, 1174 | "isarray": { 1175 | "version": "1.0.0", 1176 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1177 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1178 | }, 1179 | "json-buffer": { 1180 | "version": "3.0.0", 1181 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 1182 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 1183 | }, 1184 | "json-stringify-safe": { 1185 | "version": "5.0.1", 1186 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1187 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1188 | }, 1189 | "jsonfile": { 1190 | "version": "4.0.0", 1191 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1192 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1193 | "requires": { 1194 | "graceful-fs": "^4.1.6" 1195 | } 1196 | }, 1197 | "keyv": { 1198 | "version": "3.1.0", 1199 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 1200 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 1201 | "requires": { 1202 | "json-buffer": "3.0.0" 1203 | } 1204 | }, 1205 | "lodash": { 1206 | "version": "4.17.21", 1207 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1208 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1209 | }, 1210 | "lowercase-keys": { 1211 | "version": "1.0.1", 1212 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 1213 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 1214 | }, 1215 | "lru-cache": { 1216 | "version": "7.8.0", 1217 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", 1218 | "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==" 1219 | }, 1220 | "matcher": { 1221 | "version": "3.0.0", 1222 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", 1223 | "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", 1224 | "requires": { 1225 | "escape-string-regexp": "^4.0.0" 1226 | } 1227 | }, 1228 | "mimic-response": { 1229 | "version": "1.0.1", 1230 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 1231 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 1232 | }, 1233 | "minimist": { 1234 | "version": "1.2.6", 1235 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1236 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 1237 | }, 1238 | "mkdirp": { 1239 | "version": "0.5.6", 1240 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1241 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1242 | "requires": { 1243 | "minimist": "^1.2.6" 1244 | } 1245 | }, 1246 | "ms": { 1247 | "version": "2.1.2", 1248 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1249 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1250 | }, 1251 | "normalize-url": { 1252 | "version": "4.5.1", 1253 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", 1254 | "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" 1255 | }, 1256 | "npm-conf": { 1257 | "version": "1.1.3", 1258 | "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", 1259 | "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", 1260 | "requires": { 1261 | "config-chain": "^1.1.11", 1262 | "pify": "^3.0.0" 1263 | } 1264 | }, 1265 | "object-keys": { 1266 | "version": "1.1.1", 1267 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1268 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1269 | }, 1270 | "once": { 1271 | "version": "1.4.0", 1272 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1273 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1274 | "requires": { 1275 | "wrappy": "1" 1276 | } 1277 | }, 1278 | "p-cancelable": { 1279 | "version": "1.1.0", 1280 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 1281 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" 1282 | }, 1283 | "pend": { 1284 | "version": "1.2.0", 1285 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1286 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 1287 | }, 1288 | "pify": { 1289 | "version": "3.0.0", 1290 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1291 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 1292 | }, 1293 | "prepend-http": { 1294 | "version": "2.0.0", 1295 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 1296 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" 1297 | }, 1298 | "process-nextick-args": { 1299 | "version": "2.0.1", 1300 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1301 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1302 | }, 1303 | "progress": { 1304 | "version": "2.0.3", 1305 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1306 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 1307 | }, 1308 | "proto-list": { 1309 | "version": "1.2.4", 1310 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 1311 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" 1312 | }, 1313 | "pump": { 1314 | "version": "3.0.0", 1315 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1316 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1317 | "requires": { 1318 | "end-of-stream": "^1.1.0", 1319 | "once": "^1.3.1" 1320 | } 1321 | }, 1322 | "readable-stream": { 1323 | "version": "2.3.7", 1324 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1325 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1326 | "requires": { 1327 | "core-util-is": "~1.0.0", 1328 | "inherits": "~2.0.3", 1329 | "isarray": "~1.0.0", 1330 | "process-nextick-args": "~2.0.0", 1331 | "safe-buffer": "~5.1.1", 1332 | "string_decoder": "~1.1.1", 1333 | "util-deprecate": "~1.0.1" 1334 | } 1335 | }, 1336 | "responselike": { 1337 | "version": "1.0.2", 1338 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1339 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 1340 | "requires": { 1341 | "lowercase-keys": "^1.0.0" 1342 | } 1343 | }, 1344 | "roarr": { 1345 | "version": "2.15.4", 1346 | "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", 1347 | "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", 1348 | "requires": { 1349 | "boolean": "^3.0.1", 1350 | "detect-node": "^2.0.4", 1351 | "globalthis": "^1.0.1", 1352 | "json-stringify-safe": "^5.0.1", 1353 | "semver-compare": "^1.0.0", 1354 | "sprintf-js": "^1.1.2" 1355 | } 1356 | }, 1357 | "safe-buffer": { 1358 | "version": "5.1.2", 1359 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1360 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1361 | }, 1362 | "semver": { 1363 | "version": "6.3.0", 1364 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1365 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1366 | }, 1367 | "semver-compare": { 1368 | "version": "1.0.0", 1369 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 1370 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" 1371 | }, 1372 | "serialize-error": { 1373 | "version": "7.0.1", 1374 | "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", 1375 | "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", 1376 | "requires": { 1377 | "type-fest": "^0.13.1" 1378 | } 1379 | }, 1380 | "sprintf-js": { 1381 | "version": "1.1.2", 1382 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 1383 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" 1384 | }, 1385 | "string_decoder": { 1386 | "version": "1.1.1", 1387 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1388 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1389 | "requires": { 1390 | "safe-buffer": "~5.1.0" 1391 | } 1392 | }, 1393 | "sumchecker": { 1394 | "version": "3.0.1", 1395 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", 1396 | "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", 1397 | "requires": { 1398 | "debug": "^4.1.0" 1399 | } 1400 | }, 1401 | "to-readable-stream": { 1402 | "version": "1.0.0", 1403 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 1404 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" 1405 | }, 1406 | "tunnel": { 1407 | "version": "0.0.6", 1408 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 1409 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" 1410 | }, 1411 | "type-fest": { 1412 | "version": "0.13.1", 1413 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", 1414 | "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" 1415 | }, 1416 | "typedarray": { 1417 | "version": "0.0.6", 1418 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1419 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1420 | }, 1421 | "universalify": { 1422 | "version": "0.1.2", 1423 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1424 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 1425 | }, 1426 | "url-parse-lax": { 1427 | "version": "3.0.0", 1428 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1429 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 1430 | "requires": { 1431 | "prepend-http": "^2.0.0" 1432 | } 1433 | }, 1434 | "util-deprecate": { 1435 | "version": "1.0.2", 1436 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1437 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1438 | }, 1439 | "wrappy": { 1440 | "version": "1.0.2", 1441 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1442 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1443 | }, 1444 | "yauzl": { 1445 | "version": "2.10.0", 1446 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1447 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1448 | "requires": { 1449 | "buffer-crc32": "~0.2.3", 1450 | "fd-slicer": "~1.1.0" 1451 | } 1452 | } 1453 | } 1454 | } 1455 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "electron": "^18.0.3" 4 | }, 5 | "name": "spaced-repetition", 6 | "version": "1.0.0", 7 | "main": "index.js", 8 | "dependencies": { 9 | "boolean": "^3.2.0", 10 | "buffer-crc32": "^0.2.13", 11 | "buffer-from": "^1.1.2", 12 | "cacheable-request": "^6.1.0", 13 | "clone-response": "^1.0.2", 14 | "concat-stream": "^1.6.2", 15 | "config-chain": "^1.1.13", 16 | "core-util-is": "^1.0.3", 17 | "debug": "^4.3.4", 18 | "decompress-response": "^3.3.0", 19 | "defer-to-connect": "^1.1.3", 20 | "define-properties": "^1.1.3", 21 | "detect-node": "^2.1.0", 22 | "duplexer3": "^0.1.4", 23 | "encodeurl": "^1.0.2", 24 | "end-of-stream": "^1.4.4", 25 | "env-paths": "^2.2.1", 26 | "es6-error": "^4.1.1", 27 | "escape-string-regexp": "^4.0.0", 28 | "extract-zip": "^1.7.0", 29 | "fd-slicer": "^1.1.0", 30 | "fs-extra": "^8.1.0", 31 | "get-stream": "^4.1.0", 32 | "global-agent": "^3.0.0", 33 | "global-tunnel-ng": "^2.7.1", 34 | "globalthis": "^1.0.2", 35 | "got": "^9.6.0", 36 | "graceful-fs": "^4.2.10", 37 | "http-cache-semantics": "^4.1.0", 38 | "inherits": "^2.0.4", 39 | "ini": "^1.3.8", 40 | "isarray": "^1.0.0", 41 | "json-buffer": "^3.0.0", 42 | "json-stringify-safe": "^5.0.1", 43 | "jsonfile": "^4.0.0", 44 | "keyv": "^3.1.0", 45 | "lodash": "^4.17.21", 46 | "lowercase-keys": "^1.0.1", 47 | "lru-cache": "^7.8.0", 48 | "matcher": "^3.0.0", 49 | "mimic-response": "^1.0.1", 50 | "minimist": "^1.2.6", 51 | "mkdirp": "^0.5.6", 52 | "ms": "^2.1.2", 53 | "normalize-url": "^4.5.1", 54 | "npm-conf": "^1.1.3", 55 | "object-keys": "^1.1.1", 56 | "once": "^1.4.0", 57 | "p-cancelable": "^1.1.0", 58 | "pend": "^1.2.0", 59 | "pify": "^3.0.0", 60 | "prepend-http": "^2.0.0", 61 | "process-nextick-args": "^2.0.1", 62 | "progress": "^2.0.3", 63 | "proto-list": "^1.2.4", 64 | "pump": "^3.0.0", 65 | "readable-stream": "^2.3.7", 66 | "responselike": "^1.0.2", 67 | "roarr": "^2.15.4", 68 | "safe-buffer": "^5.1.2", 69 | "semver": "^6.3.0", 70 | "semver-compare": "^1.0.0", 71 | "serialize-error": "^7.0.1", 72 | "sprintf-js": "^1.1.2", 73 | "string_decoder": "^1.1.1", 74 | "sumchecker": "^3.0.1", 75 | "to-readable-stream": "^1.0.0", 76 | "tunnel": "^0.0.6", 77 | "type-fest": "^0.13.1", 78 | "typedarray": "^0.0.6", 79 | "universalify": "^0.1.2", 80 | "url-parse-lax": "^3.0.0", 81 | "util-deprecate": "^1.0.2", 82 | "wrappy": "^1.0.2", 83 | "yauzl": "^2.10.0" 84 | }, 85 | "scripts": { 86 | "start": "electron ./src/main.js" 87 | }, 88 | "keywords": [], 89 | "author": "", 90 | "license": "ISC", 91 | "description": "" 92 | } 93 | -------------------------------------------------------------------------------- /save.json: -------------------------------------------------------------------------------- 1 | { "cards": [] } 2 | -------------------------------------------------------------------------------- /screenshots/ssone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conaticus/spaced-repetition/8ac713ca3e5af0f9cb1a5979360ae96861369093/screenshots/ssone.png -------------------------------------------------------------------------------- /screenshots/sstwo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conaticus/spaced-repetition/8ac713ca3e5af0f9cb1a5979360ae96861369093/screenshots/sstwo.png -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | const { app, BrowserWindow } = require("electron"); 2 | const path = require("path"); 3 | 4 | const createWindow = () => { 5 | const win = new BrowserWindow({ 6 | width: 800, 7 | height: 600, 8 | webPreferences: { 9 | nodeIntegration: true, 10 | contextIsolation: false, 11 | }, 12 | fullscreen: true, 13 | }); 14 | 15 | win.loadFile("./render/menu/index.html"); 16 | }; 17 | 18 | app.once("ready", () => { 19 | createWindow(); 20 | 21 | app.on("activate", () => { 22 | if (BrowserWindow.getAllWindows().length === 0) createWindow(); 23 | }); 24 | }); 25 | 26 | app.on("window-all-closed", () => { 27 | if (process.platform !== "darwin") app.quit(); 28 | }); 29 | -------------------------------------------------------------------------------- /src/render/menu/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Spaced Repitition - Menu 8 | 9 | 10 | 11 | 15 | 16 | 17 |
18 |

Menu

19 | 20 |

Create Card

21 |
22 | 28 |
29 | 34 |
35 | 36 |
37 |
38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/render/menu/menu.js: -------------------------------------------------------------------------------- 1 | import { showAlert } from "../util.js"; 2 | 3 | const fs = require("fs/promises"); 4 | 5 | const cardForm = document.getElementById("card-form"); 6 | const questionInput = document.getElementById("question-input"); 7 | const answerInput = document.getElementById("answer-input"); 8 | const mainButton = document.getElementById("main-btn"); 9 | 10 | let saveData; 11 | const getSaveData = async () => { 12 | try { 13 | await fs.access("./save.json"); 14 | } catch { 15 | saveData = { cards: [] }; 16 | } 17 | 18 | if (!saveData) { 19 | saveData = JSON.parse(await fs.readFile("./save.json", "utf8")); 20 | } 21 | }; 22 | 23 | getSaveData(); 24 | 25 | mainButton.addEventListener("click", () => { 26 | if (saveData.cards.length === 0) { 27 | showAlert("There are no cards, create some to start a session."); 28 | return; 29 | } 30 | 31 | location.href = "../session/index.html"; 32 | }); 33 | 34 | cardForm.addEventListener("submit", async (e) => { 35 | e.preventDefault(); 36 | 37 | saveData.cards.push({ 38 | question: questionInput.value, 39 | answer: answerInput.value, 40 | canShowAt: null, 41 | correctCount: 0, 42 | }); 43 | await fs.writeFile("./save.json", JSON.stringify(saveData)); 44 | 45 | questionInput.value = ""; 46 | answerInput.value = ""; 47 | 48 | showAlert("Card created."); 49 | }); 50 | -------------------------------------------------------------------------------- /src/render/session/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Spaced Repetition - Session 8 | 9 | 10 | 11 |
12 |

13 |

14 | 18 |
19 | 22 |
23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /src/render/session/session.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs/promises"); 2 | import { showAlert } from "../util.js"; 3 | 4 | const cardQuestionEl = document.getElementById("card-question"); 5 | const cardAnswerEl = document.getElementById("card-answer"); 6 | const showAnswerBtn = document.getElementById("show-answer-btn"); 7 | const answerStatusContainer = document.getElementById( 8 | "answer-status-container" 9 | ); 10 | const correctStatusBtn = document.getElementById("correct-btn"); 11 | const incorrectStatusBtn = document.getElementById("incorrect-btn"); 12 | 13 | const dateHasPast = (date) => { 14 | return date < new Date(); 15 | }; 16 | 17 | let saveData; 18 | 19 | const getSaveData = async () => { 20 | saveData = JSON.parse(await fs.readFile("./save.json", "utf8")); 21 | }; 22 | 23 | const createCard = async () => { 24 | cardQuestionEl.innerText = ""; 25 | cardAnswerEl.innerText = ""; 26 | answerStatusContainer.style.display = "none"; 27 | 28 | if (!saveData) { 29 | await getSaveData(); 30 | } 31 | 32 | const showableCards = saveData.cards.filter((card) => { 33 | if (card.canShowAt === null) return true; 34 | return dateHasPast(new Date(card.canShowAt)); 35 | }); 36 | 37 | if (showableCards.length === 0) { 38 | showAnswerBtn.remove(); 39 | showAlert("No more cards left, come back later!"); 40 | return; 41 | } 42 | 43 | const prioritisedCards = saveData.cards.filter((card) => { 44 | if (card.canShowAt === null) return false; 45 | return dateHasPast(new Date(card.canShowAt)); 46 | }); 47 | 48 | let card; 49 | let cardIdx; 50 | 51 | if (prioritisedCards.length === 0) { 52 | cardIdx = Math.floor(Math.random() * showableCards.length); 53 | card = showableCards[cardIdx]; 54 | } else { 55 | cardIdx = Math.floor(Math.random() * prioritisedCards.length); 56 | card = prioritisedCards[cardIdx]; 57 | } 58 | 59 | cardQuestionEl.innerText = card.question; 60 | 61 | showAnswerBtn.onclick = () => { 62 | cardAnswerEl.innerText = card.answer; 63 | answerStatusContainer.style.display = "block"; 64 | const idx = saveData.cards.indexOf(card); 65 | 66 | correctStatusBtn.onclick = async () => { 67 | saveData.cards[idx].correctCount++; 68 | const card = saveData.cards[idx]; 69 | card.correctCount++; 70 | 71 | let showAtDate = new Date(); 72 | 73 | switch (card.correctCount) { 74 | case 1: 75 | showAtDate.setDate(showAtDate.getDate() + 1); 76 | break; 77 | case 2: 78 | showAtDate.setDate(showAtDate.getDate() + 7); 79 | break; 80 | case 3: 81 | showAtDate.setDate(showAtDate.getMonth() + 1); 82 | break; 83 | case 4: 84 | showAtDate.setDate(showAtDate.getFullYear() + 1); 85 | break; 86 | default: 87 | showAtDate.setDate(showAtDate.getFullYear() + 1); 88 | break; 89 | } 90 | 91 | card.canShowAt = showAtDate.getTime(); 92 | saveData.cards[idx] = card; 93 | 94 | showableCards.splice(cardIdx, 1); 95 | if (prioritisedCards.length > 0) { 96 | prioritisedCards.splice(cardIdx, 1); 97 | } 98 | createCard(); 99 | 100 | await fs.writeFile("./save.json", JSON.stringify(saveData)); 101 | }; 102 | 103 | incorrectStatusBtn.onclick = async () => { 104 | card.canShowAt = new Date( 105 | new Date().getTime() + 60000 106 | ).getTime(); 107 | 108 | card.correctCount = 0; 109 | 110 | saveData.cards[idx] = card; 111 | 112 | showableCards.splice(cardIdx, 1); 113 | if (prioritisedCards.length > 0) { 114 | prioritisedCards.splice(cardIdx, 1); 115 | } 116 | createCard(); 117 | 118 | await fs.writeFile("./save.json", JSON.stringify(saveData)); 119 | }; 120 | }; 121 | }; 122 | 123 | createCard(); 124 | -------------------------------------------------------------------------------- /src/render/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | font-family: "Ubuntu", sans-serif; 6 | background-color: rgb(45, 45, 45); 7 | color: white; 8 | } 9 | 10 | h1 { 11 | font-weight: 800; 12 | font-size: 60px; 13 | margin: 0; 14 | } 15 | 16 | h2 { 17 | font-weight: 700; 18 | font-size: 40px; 19 | margin: 0; 20 | margin-bottom: 20px; 21 | } 22 | 23 | h3 { 24 | font-weight: 700; 25 | font-size: 50px; 26 | margin: 0; 27 | margin-bottom: 30px; 28 | } 29 | 30 | p { 31 | font-weight: 400; 32 | font-size: 35px; 33 | margin: 0; 34 | margin-bottom: 30px; 35 | } 36 | 37 | button { 38 | outline: none; 39 | border: none; 40 | border-radius: 5px; 41 | font-size: 20px; 42 | font-weight: bold; 43 | background-color: rgb(0, 119, 255); 44 | color: white; 45 | cursor: pointer; 46 | transition: all 0.2s ease; 47 | } 48 | 49 | button:hover { 50 | background-color: rgb(0, 70, 150); 51 | } 52 | 53 | .main-btn { 54 | padding: 15px 200px; 55 | margin: 30px; 56 | } 57 | 58 | .small-btn { 59 | padding: 10px 100px; 60 | } 61 | 62 | .container { 63 | text-align: center; 64 | } 65 | 66 | input, 67 | textarea, 68 | button { 69 | font-family: "Ubuntu", sans-serif; 70 | } 71 | 72 | textarea { 73 | resize: none; 74 | } 75 | 76 | input, 77 | textarea { 78 | padding: 10px; 79 | font-size: 20px; 80 | width: 600px; 81 | margin: 10px 0; 82 | border-radius: 5px; 83 | outline: none; 84 | border: none; 85 | } 86 | 87 | textarea { 88 | height: 100px; 89 | } 90 | 91 | @keyframes slidein { 92 | from { 93 | bottom: -80px; 94 | } 95 | to { 96 | bottom: 20px; 97 | } 98 | } 99 | 100 | @keyframes slideout { 101 | from { 102 | bottom: 20px; 103 | } 104 | tp { 105 | bottom: -80px; 106 | } 107 | } 108 | 109 | .alert { 110 | background-color: white; 111 | width: 600px; 112 | padding: 20px 200px; 113 | border-radius: 5px; 114 | border: solid 3px rgb(0, 70, 150); 115 | outline: none; 116 | position: absolute; 117 | transform: translateX(50%); 118 | color: black; 119 | text-align: center; 120 | font-size: 22px; 121 | } 122 | 123 | .slide-in { 124 | animation-name: slidein; 125 | animation-duration: 0.4s; 126 | animation-timing-function: ease; 127 | bottom: 20px; 128 | } 129 | 130 | .slide-out { 131 | animation-name: slideout; 132 | animation-duration: 0.4s; 133 | animation-timing-function: ease; 134 | bottom: -80px; 135 | } 136 | 137 | footer { 138 | bottom: 0; 139 | position: absolute; 140 | width: 100%; 141 | } 142 | -------------------------------------------------------------------------------- /src/render/util.js: -------------------------------------------------------------------------------- 1 | export const showAlert = (text) => { 2 | const alertEl = document.createElement("div"); 3 | alertEl.innerText = text; 4 | alertEl.className = "alert slide-in"; 5 | document.body.appendChild(alertEl); 6 | 7 | setTimeout(() => { 8 | alertEl.className = "alert slide-out"; 9 | setTimeout(() => { 10 | alertEl.remove(); 11 | }, 400); 12 | }, 3000); 13 | }; 14 | --------------------------------------------------------------------------------