├── .gitignore ├── img └── example.png ├── package.json ├── README.md ├── index.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /out-* 2 | *.txt 3 | node_modules 4 | -------------------------------------------------------------------------------- /img/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atymic/mylot-article-scraper/HEAD/img/example.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mylot-scrape", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "async": "^3.2.0", 8 | "axios": "^0.21.1", 9 | "cheerio": "^1.0.0-rc.5", 10 | "luxon": "^1.26.0", 11 | "puppeteer": "^8.0.0", 12 | "slugify": "^1.4.7" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mylot -> PDF Scraper 2 | 3 | Inspired by [this reddit post](https://www.reddit.com/r/DataHoarder/comments/m3c0c2/my_mother_just_passed_away_she_wrote_extensively/) I wrote a scraper to save all of his mum's mylot posts to PDFs, including images and comments. 4 | 5 | Apologies in advance for the messy code, I wrote it in about half an hour. Feel free to PR fix. 6 | 7 | ![example](./img/example.png) 8 | 9 | 10 | ## Running 11 | 12 | Run in like so, supplying the username of the person your wish to archive. 13 | 14 | ```bash 15 | node ./index.js ridingbet 16 | ``` 17 | 18 | ## How it works 19 | 20 | First is paginates all the articles to get a complete list. Once that's done, using 5 instances of puppeteer (headless browser) it creates PDF copies of each article. There's a little bit of trickery to get it looking good (hiding elements/etc). 21 | 22 | The PDFs are named with the ISO timestamp first, so they sort nicely in the folder from oldest to newest 23 | 24 | ## Licence 25 | 26 | MIT, do you want want :) 27 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer') 2 | const axios = require('axios') 3 | const cheerio = require('cheerio') 4 | const async = require('async') 5 | const fs = require('fs') 6 | const slugify = require('slugify') 7 | const { DateTime } = require('luxon') 8 | 9 | class Mylot { 10 | static async generatePagePDF(article, username, force = false) { 11 | const browser = await puppeteer.launch({ headless: true }) 12 | const page = await browser.newPage() 13 | await page.goto(article.url, { waitUntil: 'networkidle0' }) 14 | 15 | const name = await page.$eval('#discTit', el => el.innerText) 16 | const slug = slugify(name) 17 | 18 | const dateRaw = await page.$eval('#discDat', el => el.innerText) 19 | const dateFormatted = DateTime.fromFormat(dateRaw.replace(' CST', ''), 'MMMM d, yyyy h:ma').toISODate() 20 | 21 | const dir = `out-${username}`; 22 | 23 | if (!fs.existsSync(dir)) { 24 | fs.mkdirSync(dir); 25 | } 26 | 27 | const filename = `${dir}/${dateFormatted}-${slug}.pdf` 28 | 29 | if (fs.existsSync(filename) && !force) { 30 | console.info(`PDF for article ${article.url} already exists, skipping`) 31 | return 32 | } 33 | 34 | // Cheat the ajax comment loading to load everything in one go 35 | await page.evaluate(() => { 36 | window.discussionResponseCount = 1000 && 37 | window.getDiscussionFull(window.discussionId, window.responseId, window.commentId, window.responseStartRow) 38 | }) 39 | 40 | // Hide annoying UI bits 41 | await page.evaluate(() => { 42 | document.querySelector('#top-container').style.display = 'none' 43 | document.querySelector('#discSoc').style.display = 'none' 44 | }) 45 | 46 | await page.waitForTimeout(3000) 47 | 48 | const pdfConfig = { 49 | path: filename, 50 | format: 'A4', 51 | printBackground: true, 52 | margin: { 53 | top: '1cm', 54 | bottom: '1cm', 55 | left: '1cm', 56 | right: '1cm', 57 | }, 58 | } 59 | await page.emulateMediaType('screen') 60 | await page.pdf(pdfConfig) 61 | 62 | await browser.close() 63 | } 64 | } 65 | 66 | const extractArticles = r$ => { 67 | let urls = [] 68 | 69 | const articles = r$('.atvDiscTit a').each(function () { 70 | urls.push({ url: 'https://www.mylot.com' + r$(this).attr('href'), name: r$(this).text().trim() }) 71 | }) 72 | 73 | return urls 74 | } 75 | 76 | const getStartAction = html => { 77 | const match = html.match(/startActionId = "(\d+)"/) 78 | 79 | if (match) { 80 | return match[1] 81 | } 82 | 83 | return null 84 | } 85 | 86 | (async () => { 87 | const args = process.argv.slice(2) 88 | 89 | let articles = [] 90 | 91 | const res = await axios.get(`https://www.mylot.com/${args[0]}/posts`) 92 | const r$ = cheerio.load(res.data) 93 | 94 | let startAction = getStartAction(res.data) 95 | articles = articles.concat(extractArticles(r$)) 96 | 97 | do { 98 | const url = `https://www.mylot.com/atv/more?activityTypeId=103&startActionId=${startAction}&tagname=&username=${args[0]}&_=${(new Date()).getTime()}` 99 | console.log(`Getting URL ${url}, Articles Count: ${articles.length}`) 100 | 101 | const res = await axios.get(url) 102 | const r$ = cheerio.load(res.data) 103 | 104 | startAction = getStartAction(res.data) 105 | articles = articles.concat(extractArticles(r$)) 106 | } while (startAction) 107 | 108 | await async.mapLimit(articles, 5, async article => { 109 | console.info(`PDFing URL ${article.url}`) 110 | try { 111 | await Mylot.generatePagePDF(article, args[0]) 112 | } catch (e) { 113 | console.error(`Error PDFing with URL ${article.url}, ${e.toString()}`) 114 | } 115 | }) 116 | })() 117 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@*": 6 | version "14.14.33" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.33.tgz#9e4f8c64345522e4e8ce77b334a8aaa64e2b6c78" 8 | integrity sha512-oJqcTrgPUF29oUP8AsUqbXGJNuPutsetaa9kTQAQce5Lx5dTYWV02ScBiT/k1BX/Z7pKeqedmvp39Wu4zR7N7g== 9 | 10 | "@types/yauzl@^2.9.1": 11 | version "2.9.1" 12 | resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" 13 | integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== 14 | dependencies: 15 | "@types/node" "*" 16 | 17 | agent-base@6: 18 | version "6.0.2" 19 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 20 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 21 | dependencies: 22 | debug "4" 23 | 24 | async@^3.2.0: 25 | version "3.2.0" 26 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" 27 | integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== 28 | 29 | axios@^0.21.1: 30 | version "0.21.1" 31 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" 32 | integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== 33 | dependencies: 34 | follow-redirects "^1.10.0" 35 | 36 | balanced-match@^1.0.0: 37 | version "1.0.0" 38 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 39 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 40 | 41 | base64-js@^1.3.1: 42 | version "1.5.1" 43 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 44 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 45 | 46 | bl@^4.0.3: 47 | version "4.1.0" 48 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 49 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 50 | dependencies: 51 | buffer "^5.5.0" 52 | inherits "^2.0.4" 53 | readable-stream "^3.4.0" 54 | 55 | boolbase@^1.0.0: 56 | version "1.0.0" 57 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 58 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 59 | 60 | brace-expansion@^1.1.7: 61 | version "1.1.11" 62 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 63 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 64 | dependencies: 65 | balanced-match "^1.0.0" 66 | concat-map "0.0.1" 67 | 68 | buffer-crc32@~0.2.3: 69 | version "0.2.13" 70 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 71 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 72 | 73 | buffer@^5.2.1, buffer@^5.5.0: 74 | version "5.7.1" 75 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 76 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 77 | dependencies: 78 | base64-js "^1.3.1" 79 | ieee754 "^1.1.13" 80 | 81 | cheerio-select-tmp@^0.1.0: 82 | version "0.1.1" 83 | resolved "https://registry.yarnpkg.com/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz#55bbef02a4771710195ad736d5e346763ca4e646" 84 | integrity sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ== 85 | dependencies: 86 | css-select "^3.1.2" 87 | css-what "^4.0.0" 88 | domelementtype "^2.1.0" 89 | domhandler "^4.0.0" 90 | domutils "^2.4.4" 91 | 92 | cheerio@^1.0.0-rc.5: 93 | version "1.0.0-rc.5" 94 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.5.tgz#88907e1828674e8f9fee375188b27dadd4f0fa2f" 95 | integrity sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw== 96 | dependencies: 97 | cheerio-select-tmp "^0.1.0" 98 | dom-serializer "~1.2.0" 99 | domhandler "^4.0.0" 100 | entities "~2.1.0" 101 | htmlparser2 "^6.0.0" 102 | parse5 "^6.0.0" 103 | parse5-htmlparser2-tree-adapter "^6.0.0" 104 | 105 | chownr@^1.1.1: 106 | version "1.1.4" 107 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 108 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 109 | 110 | concat-map@0.0.1: 111 | version "0.0.1" 112 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 113 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 114 | 115 | css-select@^3.1.2: 116 | version "3.1.2" 117 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8" 118 | integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== 119 | dependencies: 120 | boolbase "^1.0.0" 121 | css-what "^4.0.0" 122 | domhandler "^4.0.0" 123 | domutils "^2.4.3" 124 | nth-check "^2.0.0" 125 | 126 | css-what@^4.0.0: 127 | version "4.0.0" 128 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" 129 | integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== 130 | 131 | debug@4, debug@^4.1.0, debug@^4.1.1: 132 | version "4.3.1" 133 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" 134 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 135 | dependencies: 136 | ms "2.1.2" 137 | 138 | devtools-protocol@0.0.854822: 139 | version "0.0.854822" 140 | resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.854822.tgz#eac3a5260a6b3b4e729a09fdc0c77b0d322e777b" 141 | integrity sha512-xd4D8kHQtB0KtWW0c9xBZD5LVtm9chkMOfs/3Yn01RhT/sFIsVtzTtypfKoFfWBaL+7xCYLxjOLkhwPXaX/Kcg== 142 | 143 | dom-serializer@^1.0.1, dom-serializer@~1.2.0: 144 | version "1.2.0" 145 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" 146 | integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== 147 | dependencies: 148 | domelementtype "^2.0.1" 149 | domhandler "^4.0.0" 150 | entities "^2.0.0" 151 | 152 | domelementtype@^2.0.1, domelementtype@^2.1.0: 153 | version "2.1.0" 154 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" 155 | integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== 156 | 157 | domhandler@^4.0.0: 158 | version "4.0.0" 159 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.0.0.tgz#01ea7821de996d85f69029e81fa873c21833098e" 160 | integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA== 161 | dependencies: 162 | domelementtype "^2.1.0" 163 | 164 | domutils@^2.4.3, domutils@^2.4.4: 165 | version "2.5.0" 166 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.5.0.tgz#42f49cffdabb92ad243278b331fd761c1c2d3039" 167 | integrity sha512-Ho16rzNMOFk2fPwChGh3D2D9OEHAfG19HgmRR2l+WLSsIstNsAYBzePH412bL0y5T44ejABIVfTHQ8nqi/tBCg== 168 | dependencies: 169 | dom-serializer "^1.0.1" 170 | domelementtype "^2.0.1" 171 | domhandler "^4.0.0" 172 | 173 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 174 | version "1.4.4" 175 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 176 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 177 | dependencies: 178 | once "^1.4.0" 179 | 180 | entities@^2.0.0: 181 | version "2.2.0" 182 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 183 | integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== 184 | 185 | entities@~2.1.0: 186 | version "2.1.0" 187 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" 188 | integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== 189 | 190 | extract-zip@^2.0.0: 191 | version "2.0.1" 192 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" 193 | integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== 194 | dependencies: 195 | debug "^4.1.1" 196 | get-stream "^5.1.0" 197 | yauzl "^2.10.0" 198 | optionalDependencies: 199 | "@types/yauzl" "^2.9.1" 200 | 201 | fd-slicer@~1.1.0: 202 | version "1.1.0" 203 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 204 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 205 | dependencies: 206 | pend "~1.2.0" 207 | 208 | find-up@^4.0.0: 209 | version "4.1.0" 210 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 211 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 212 | dependencies: 213 | locate-path "^5.0.0" 214 | path-exists "^4.0.0" 215 | 216 | follow-redirects@^1.10.0: 217 | version "1.13.3" 218 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" 219 | integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== 220 | 221 | fs-constants@^1.0.0: 222 | version "1.0.0" 223 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 224 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 225 | 226 | fs.realpath@^1.0.0: 227 | version "1.0.0" 228 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 229 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 230 | 231 | get-stream@^5.1.0: 232 | version "5.2.0" 233 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 234 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 235 | dependencies: 236 | pump "^3.0.0" 237 | 238 | glob@^7.1.3: 239 | version "7.1.6" 240 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 241 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 242 | dependencies: 243 | fs.realpath "^1.0.0" 244 | inflight "^1.0.4" 245 | inherits "2" 246 | minimatch "^3.0.4" 247 | once "^1.3.0" 248 | path-is-absolute "^1.0.0" 249 | 250 | htmlparser2@^6.0.0: 251 | version "6.0.1" 252 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.1.tgz#422521231ef6d42e56bd411da8ba40aa36e91446" 253 | integrity sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w== 254 | dependencies: 255 | domelementtype "^2.0.1" 256 | domhandler "^4.0.0" 257 | domutils "^2.4.4" 258 | entities "^2.0.0" 259 | 260 | https-proxy-agent@^5.0.0: 261 | version "5.0.0" 262 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 263 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 264 | dependencies: 265 | agent-base "6" 266 | debug "4" 267 | 268 | ieee754@^1.1.13: 269 | version "1.2.1" 270 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 271 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 272 | 273 | inflight@^1.0.4: 274 | version "1.0.6" 275 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 276 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 277 | dependencies: 278 | once "^1.3.0" 279 | wrappy "1" 280 | 281 | inherits@2, inherits@^2.0.3, inherits@^2.0.4: 282 | version "2.0.4" 283 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 284 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 285 | 286 | locate-path@^5.0.0: 287 | version "5.0.0" 288 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 289 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 290 | dependencies: 291 | p-locate "^4.1.0" 292 | 293 | luxon@^1.26.0: 294 | version "1.26.0" 295 | resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.26.0.tgz#d3692361fda51473948252061d0f8561df02b578" 296 | integrity sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A== 297 | 298 | minimatch@^3.0.4: 299 | version "3.0.4" 300 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 301 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 302 | dependencies: 303 | brace-expansion "^1.1.7" 304 | 305 | mkdirp-classic@^0.5.2: 306 | version "0.5.3" 307 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 308 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 309 | 310 | moment@^2.29.1: 311 | version "2.29.1" 312 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" 313 | integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== 314 | 315 | ms@2.1.2: 316 | version "2.1.2" 317 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 318 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 319 | 320 | node-fetch@^2.6.1: 321 | version "2.6.1" 322 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 323 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 324 | 325 | nth-check@^2.0.0: 326 | version "2.0.0" 327 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" 328 | integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== 329 | dependencies: 330 | boolbase "^1.0.0" 331 | 332 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 333 | version "1.4.0" 334 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 335 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 336 | dependencies: 337 | wrappy "1" 338 | 339 | p-limit@^2.2.0: 340 | version "2.3.0" 341 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 342 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 343 | dependencies: 344 | p-try "^2.0.0" 345 | 346 | p-locate@^4.1.0: 347 | version "4.1.0" 348 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 349 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 350 | dependencies: 351 | p-limit "^2.2.0" 352 | 353 | p-try@^2.0.0: 354 | version "2.2.0" 355 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 356 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 357 | 358 | parse5-htmlparser2-tree-adapter@^6.0.0: 359 | version "6.0.1" 360 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" 361 | integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== 362 | dependencies: 363 | parse5 "^6.0.1" 364 | 365 | parse5@^6.0.0, parse5@^6.0.1: 366 | version "6.0.1" 367 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" 368 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 369 | 370 | path-exists@^4.0.0: 371 | version "4.0.0" 372 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 373 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 374 | 375 | path-is-absolute@^1.0.0: 376 | version "1.0.1" 377 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 378 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 379 | 380 | pend@~1.2.0: 381 | version "1.2.0" 382 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 383 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 384 | 385 | pkg-dir@^4.2.0: 386 | version "4.2.0" 387 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 388 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 389 | dependencies: 390 | find-up "^4.0.0" 391 | 392 | progress@^2.0.1: 393 | version "2.0.3" 394 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 395 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 396 | 397 | proxy-from-env@^1.1.0: 398 | version "1.1.0" 399 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 400 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 401 | 402 | pump@^3.0.0: 403 | version "3.0.0" 404 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 405 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 406 | dependencies: 407 | end-of-stream "^1.1.0" 408 | once "^1.3.1" 409 | 410 | puppeteer@^8.0.0: 411 | version "8.0.0" 412 | resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-8.0.0.tgz#a236669118aa795331c2d0ca19877159e7664705" 413 | integrity sha512-D0RzSWlepeWkxPPdK3xhTcefj8rjah1791GE82Pdjsri49sy11ci/JQsAO8K2NRukqvwEtcI+ImP5F4ZiMvtIQ== 414 | dependencies: 415 | debug "^4.1.0" 416 | devtools-protocol "0.0.854822" 417 | extract-zip "^2.0.0" 418 | https-proxy-agent "^5.0.0" 419 | node-fetch "^2.6.1" 420 | pkg-dir "^4.2.0" 421 | progress "^2.0.1" 422 | proxy-from-env "^1.1.0" 423 | rimraf "^3.0.2" 424 | tar-fs "^2.0.0" 425 | unbzip2-stream "^1.3.3" 426 | ws "^7.2.3" 427 | 428 | readable-stream@^3.1.1, readable-stream@^3.4.0: 429 | version "3.6.0" 430 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 431 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 432 | dependencies: 433 | inherits "^2.0.3" 434 | string_decoder "^1.1.1" 435 | util-deprecate "^1.0.1" 436 | 437 | rimraf@^3.0.2: 438 | version "3.0.2" 439 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 440 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 441 | dependencies: 442 | glob "^7.1.3" 443 | 444 | safe-buffer@~5.2.0: 445 | version "5.2.1" 446 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 447 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 448 | 449 | slugify@^1.4.7: 450 | version "1.4.7" 451 | resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.7.tgz#e42359d505afd84a44513280868e31202a79a628" 452 | integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg== 453 | 454 | string_decoder@^1.1.1: 455 | version "1.3.0" 456 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 457 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 458 | dependencies: 459 | safe-buffer "~5.2.0" 460 | 461 | tar-fs@^2.0.0: 462 | version "2.1.1" 463 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" 464 | integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== 465 | dependencies: 466 | chownr "^1.1.1" 467 | mkdirp-classic "^0.5.2" 468 | pump "^3.0.0" 469 | tar-stream "^2.1.4" 470 | 471 | tar-stream@^2.1.4: 472 | version "2.2.0" 473 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" 474 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 475 | dependencies: 476 | bl "^4.0.3" 477 | end-of-stream "^1.4.1" 478 | fs-constants "^1.0.0" 479 | inherits "^2.0.3" 480 | readable-stream "^3.1.1" 481 | 482 | through@^2.3.8: 483 | version "2.3.8" 484 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 485 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 486 | 487 | unbzip2-stream@^1.3.3: 488 | version "1.4.3" 489 | resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" 490 | integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== 491 | dependencies: 492 | buffer "^5.2.1" 493 | through "^2.3.8" 494 | 495 | util-deprecate@^1.0.1: 496 | version "1.0.2" 497 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 498 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 499 | 500 | wrappy@1: 501 | version "1.0.2" 502 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 503 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 504 | 505 | ws@^7.2.3: 506 | version "7.4.4" 507 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" 508 | integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== 509 | 510 | yauzl@^2.10.0: 511 | version "2.10.0" 512 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 513 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 514 | dependencies: 515 | buffer-crc32 "~0.2.3" 516 | fd-slicer "~1.1.0" 517 | --------------------------------------------------------------------------------