diff --git a/.eslintrc.json b/.eslintrc.json index 205a94e..b7348b0 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,259 +1,10 @@ { "root": true, + "extends": "@domenic", "env": { - "node": true, - "es6": true - }, - "parserOptions": { - "ecmaVersion": 2017 + "node": true }, "rules": { - // Possible errors - "no-await-in-loop": "off", - "comma-dangle": ["error", "never"], - "no-cond-assign": ["error", "except-parens"], - "no-console": "off", - "no-constant-condition": "error", - "no-control-regex": "error", - "no-debugger": "error", - "no-dupe-args": "error", - "no-dupe-keys": "error", - "no-duplicate-case": "error", - "no-empty": "error", - "no-empty-character-class": "error", - "no-ex-assign": "error", - "no-extra-boolean-cast": "error", - "no-extra-parens": ["error", "all", { "conditionalAssign": false, "nestedBinaryExpressions": false }], - "no-extra-semi": "error", - "no-func-assign": "error", - "no-inner-declarations": "off", - "no-invalid-regexp": "error", - "no-irregular-whitespace": "error", - "no-obj-calls": "error", - "no-prototype-builtins": "error", - "no-regex-spaces": "error", - "no-sparse-arrays": "error", - "no-template-curly-in-string": "error", - "no-unexpected-multiline": "error", - "no-unreachable": "error", - "no-unsafe-finally": "off", - "no-unsafe-negation": "error", - "use-isnan": "error", - "valid-jsdoc": "off", - "valid-typeof": "error", - - // Best practices - "accessor-pairs": "error", - "array-callback-return": "error", - "block-scoped-var": "off", - "class-methods-use-this": "error", - "complexity": "off", - "consistent-return": "error", - "curly": ["error", "all"], - "default-case": "off", - "dot-location": ["error", "property"], - "dot-notation": "error", - "eqeqeq": "error", - "guard-for-in": "off", - "no-alert": "error", - "no-caller": "error", - "no-case-declarations": "error", - "no-div-regex": "off", - "no-else-return": "error", - "no-empty-function": "error", - "no-empty-pattern": "error", - "no-eq-null": "error", - "no-eval": "error", - "no-extend-native": "error", - "no-extra-bind": "error", - "no-extra-label": "error", - "no-fallthrough": "error", - "no-floating-decimal": "error", - "no-global-assign": "error", - "no-implicit-coercion": "error", - "no-implicit-globals": "error", - "no-implied-eval": "off", - "no-invalid-this": "error", - "no-iterator": "error", - "no-labels": ["error", { "allowLoop": true }], - "no-lone-blocks": "error", - "no-loop-func": "off", - "no-magic-numbers": "off", - "no-multi-spaces": "error", - "no-multi-str": "error", - "no-new": "error", - "no-new-func": "error", - "no-new-wrappers": "error", - "no-octal": "error", - "no-octal-escape": "error", - "no-param-reassign": "off", - "no-process-env": "error", - "no-proto": "error", - "no-redeclare": "error", - "no-restricted-properties": "off", - "no-return-assign": ["error", "except-parens"], - "no-return-await": "error", - "no-script-url": "off", - "no-self-assign": "error", - "no-self-compare": "error", - "no-sequences": "error", - "no-throw-literal": "error", - "no-unmodified-loop-condition": "error", - "no-unused-expressions": "error", - "no-unused-labels": "error", - "no-useless-call": "error", - "no-useless-concat": "error", - "no-useless-escape": "error", - "no-useless-return": "error", - "no-void": "error", - "no-warning-comments": "off", - "no-with": "error", - "radix": ["error", "as-needed"], - "require-await": "error", - "vars-on-top": "off", - "wrap-iife": ["error", "outside"], - "yoda": ["error", "never"], - - // Strict Mode - "strict": ["error", "global"], - - // Variables - "init-declarations": "off", - "no-catch-shadow": "error", - "no-delete-var": "error", - "no-label-var": "error", - "no-restricted-globals": "off", - "no-shadow": "error", - "no-shadow-restricted-names": "error", - "no-undef": "error", - "no-undef-init": "error", - "no-undefined": "off", - "no-unused-vars": "error", - "no-use-before-define": ["error", "nofunc"], - - // Node.js and CommonJS - "callback-return": "off", - "global-require": "error", - "handle-callback-err": "error", - "no-mixed-requires": ["error", true], - "no-new-require": "error", - "no-path-concat": "error", - "no-process-exit": "error", - "no-restricted-imports": "off", - "no-restricted-modules": "off", - "no-sync": "off", - - // Stylistic Issues - "array-bracket-spacing": ["error", "never"], - "block-spacing": ["error", "always"], - "brace-style": ["error", "1tbs", { "allowSingleLine": false }], - "camelcase": ["error", { "properties": "always" }], - "capitalized-comments": ["error", "always", { "ignoreConsecutiveComments": true }], - "comma-spacing": ["error", { "before": false, "after": true }], - "comma-style": ["error", "last"], - "computed-property-spacing": ["error", "never"], - "consistent-this": "off", - "eol-last": "error", - "func-call-spacing": ["error", "never"], - "func-name-matching": ["error", "always"], - "func-names": ["error", "never"], - "func-style": ["error", "declaration"], - "id-blacklist": "off", - "id-length": "off", - "id-match": "off", - "indent": ["error", 2, { "SwitchCase": 1 }], - "jsx-quotes": "off", - "key-spacing": ["error", { "beforeColon": false, "afterColon": true, "mode": "strict" }], - "keyword-spacing": ["error", { "before": true, "after": true }], - "line-comment-position": "off", - "linebreak-style": ["error", "unix"], - "lines-around-comment": "off", - "lines-around-directive": "off", - "max-depth": "off", - "max-len": ["error", 120, { "ignoreUrls": true }], - "max-lines": "off", - "max-nested-callbacks": "off", - "max-params": "off", - "max-statements": "off", - "max-statements-per-line": ["error", { "max": 1 }], - "multiline-ternary": "off", - "new-cap": "error", - "new-parens": "error", - "newline-after-var": "off", - "newline-before-return": "off", - "newline-per-chained-call": "off", - "no-array-constructor": "error", - "no-bitwise": "off", - "no-continue": "off", - "no-inline-comments": "off", - "no-lonely-if": "error", - "no-mixed-operators": "error", - "no-mixed-spaces-and-tabs": "error", - "no-multiple-empty-lines": "error", - "no-negated-condition": "off", - "no-nested-ternary": "error", - "no-new-object": "error", - "no-plusplus": "off", - "no-restricted-syntax": "off", - "no-tabs": "error", - "no-ternary": "off", - "no-trailing-spaces": "error", - "no-underscore-dangle": "off", - "no-unneeded-ternary": "error", - "no-whitespace-before-property": "error", - "object-curly-newline": ["error", { "multiline": true }], - "object-curly-spacing": ["error", "always"], - "object-property-newline": "off", - "one-var": ["error", "never"], - "one-var-declaration-per-line": ["error", "initializations"], - "operator-assignment": ["error", "always"], - "operator-linebreak": ["error", "after"], - "padded-blocks": ["error", "never"], - "quote-props": ["error", "as-needed"], - "quotes": ["error", "double", { "avoidEscape": true, "allowTemplateLiterals": true }], - "require-jsdoc": "off", - "semi": ["error", "always"], - "semi-spacing": "error", - "sort-keys": "off", - "sort-vars": "off", - "space-before-blocks": ["error", "always"], - "space-before-function-paren": ["error", { "anonymous": "always", "named": "never" }], - "space-in-parens": ["error", "never"], - "space-infix-ops": "error", - "space-unary-ops": ["error", { "words": true, "nonwords": false }], - "spaced-comment": ["error", "always", { "markers": ["///"] }], - "unicode-bom": ["error", "never"], - "wrap-regex": "off", - - // ECMAScript 6 - "arrow-body-style": "off", // meh - "arrow-parens": ["error", "as-needed"], - "arrow-spacing": "error", - "constructor-super": "error", - "generator-star-spacing": ["error", "after"], - "no-class-assign": "error", - "no-confusing-arrow": "off", - "no-const-assign": "error", - "no-dupe-class-members": "error", - "no-duplicate-imports": "error", - "no-new-symbol": "error", - "no-this-before-super": "error", - "no-useless-computed-key": "error", - "no-useless-constructor": "error", - "no-useless-rename": "error", - "no-var": "error", - "object-shorthand": "error", - "prefer-arrow-callback": "error", - "prefer-const": "error", - "prefer-numeric-literals": "error", - "prefer-rest-params": "error", - "prefer-spread": "error", - "prefer-template": "off", - "require-yield": "error", - "rest-spread-spacing": ["error", "never"], - "sort-imports": "off", - "symbol-description": "error", - "template-curly-spacing": ["error", "never"], - "yield-star-spacing": ["error", "after"] + "no-console": "off" } } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..a801689 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,50 @@ +name: Test +on: + pull_request: + branches: + - master + push: + branches: + - master +jobs: + test: + name: Test + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v2 + with: + node-version: 16 + + - run: npm install + + - run: npm run lint + + # CI would take too long if we did the download every time too. So, we cache it. This does mean we're vulnerable to + # source changes exposing problems in our code, but those are pretty infrequent. If they occur, we need to bump the + # cache key. + - uses: actions/cache@v2 + with: + key: worm-ward-cache-2021-01-17 + path: ./cache + + - run: node ./lib/worm-scraper.js --book=worm + + - run: node ./lib/worm-scraper.js --book=ward + + - uses: actions/setup-java@v1 + with: + java-version: 15 + java-package: jre + + - name: Get EPUBCheck + run: | + curl https://github.com/w3c/epubcheck/releases/download/v4.2.4/epubcheck-4.2.4.zip --location --output epubcheck.zip + unzip epubcheck.zip + + - name: Check Worm.epub + run: java -jar epubcheck-4.2.4/epubcheck.jar --failonwarnings Worm.epub + + - name: Check Ward.epub + run: java -jar epubcheck-4.2.4/epubcheck.jar --failonwarnings Ward.epub diff --git a/.gitignore b/.gitignore index 29d3eed..a08e728 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ /npm-debug.log cache/ -book/ -Worm.epub +staging/ +*.epub diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1dcb0d1..0000000 --- a/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - stable -script: - npm run lint diff --git a/LICENSE.txt b/LICENSE.txt index 1437a54..88f3e30 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright © 2015 Domenic Denicola +Copyright © Domenic Denicola This work is free. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, diff --git a/README.md b/README.md index 19ed9f2..56aff60 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,45 @@ # _Worm_ Scraper -Scrapes the web serial [_Worm_](https://parahumans.wordpress.com/) into an eBook format. +Scrapes the web serial [_Worm_](https://parahumans.wordpress.com/) and its sequel [_Ward_](https://www.parahumans.net/) into an eBook format. ## How to use -First you'll need a modern version of [Node.js](https://nodejs.org/en/). Install whatever is current (not LTS); at least v8.x is necessary. +First you'll need a modern version of [Node.js](https://nodejs.org/en/). At least v16.13.2 is necessary. Then, open a terminal ([Mac documentation](http://blog.teamtreehouse.com/introduction-to-the-mac-os-x-command-line), [Windows documentation](http://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/)) and install the program by typing -``` +```bash npm install -g worm-scraper ``` This will take a while as it downloads this program and its dependencies from the internet. Once it's done, try to run it, by typing: -``` +```bash worm-scraper --help ``` If this outputs some help documentation, then the installation process went smoothly. You can move on to assemble the eBook by typing -``` -worm-scraper download convert scaffold zip +```bash +worm-scraper ``` This will take a while, but will eventually produce a `Worm.epub` file! +If you'd like to get _Ward_ instead of _Worm_, use `--book=ward`, e.g. + +```bash +worm-scraper --book=ward +``` + ## EPUB vs. other formats EPUB is one of the primary eBook formats, but it is not recognized by all readers, including most Amazon Kindle devices. You can use an online converter or other tool to convert EPUB to Kindle MOBI, or any other format. Alternately, if you are a developer, a pull request adding support for MOBI output would be appreciated; please open an issue to discuss how you plan to proceed. + +## Text fixups + +This project makes a lot of fixups to the original text, mostly around typos, punctuation, capitalization, and consistency. You can get a more specific idea of what these are via the code; there's [`convert-worker.js`](https://github.com/domenic/worm-scraper/blob/master/lib/convert-worker.js), where some things are handled generally, and [`substitutions.json`](https://github.com/domenic/worm-scraper/blob/master/lib/substitutions.json), for one-off fixes. + +This process is designed to be extensible, so if you notice any problems with the original text that you think should be fixed, file an issue to let me know, and we can update the fixup code so that the resulting eBook is improved. (Or better yet, send a pull request!) diff --git a/covers/README.md b/covers/README.md new file mode 100644 index 0000000..bced1af --- /dev/null +++ b/covers/README.md @@ -0,0 +1,11 @@ +# Cover credits + +The _Worm_ cover is assembled from: + +- [Ari Ibarra's fanart](https://www.instagram.com/p/B1wSi1Ynaze/) on Instagram +- The "Wildbow's Past Works" image for _Worm_ on [parahumans.net](https://www.parahumans.net/) + +The _Ward_ cover is assembled from: + +- [zearoe's fanart](https://www.reddit.com/r/Parahumans/comments/b8n7o0/fanartrepost_antares/) on Reddit +- The header image on [parahumans.net](https://www.parahumans.net/) diff --git a/covers/ward/cover.jpg b/covers/ward/cover.jpg new file mode 100644 index 0000000..5899667 Binary files /dev/null and b/covers/ward/cover.jpg differ diff --git a/scaffolding/OEBPS/cover.xhtml b/covers/ward/cover.xhtml similarity index 76% rename from scaffolding/OEBPS/cover.xhtml rename to covers/ward/cover.xhtml index 2ae5042..b1affee 100644 --- a/scaffolding/OEBPS/cover.xhtml +++ b/covers/ward/cover.xhtml @@ -3,9 +3,11 @@ Cover - - Worm +
+ +
diff --git a/covers/worm/cover.jpg b/covers/worm/cover.jpg new file mode 100644 index 0000000..f4c7042 Binary files /dev/null and b/covers/worm/cover.jpg differ diff --git a/covers/worm/cover.xhtml b/covers/worm/cover.xhtml new file mode 100644 index 0000000..b1affee --- /dev/null +++ b/covers/worm/cover.xhtml @@ -0,0 +1,24 @@ + + + + + Cover + + + +
+ +
+ + diff --git a/lib/books.js b/lib/books.js new file mode 100644 index 0000000..cc31223 --- /dev/null +++ b/lib/books.js @@ -0,0 +1,24 @@ +"use strict"; + +exports.worm = { + startURL: "https://parahumans.wordpress.com/2011/06/11/1-1/", + title: "Worm", + id: "e7f3532d-8db6-4888-be80-1976166b7059", + + // First paragraph of https://parahumans.wordpress.com/about/ + // eslint-disable-next-line max-len + description: `An introverted teenage girl with an unconventional superpower, Taylor goes out in costume to find escape from a deeply unhappy and frustrated civilian life. Her first attempt at taking down a supervillain sees her mistaken for one, thrusting her into the midst of the local ‘cape’ scene’s politics, unwritten rules, and ambiguous morals. As she risks life and limb, Taylor faces the dilemma of having to do the wrong things for the right reasons.` +}; + +exports.ward = { + startURL: "https://www.parahumans.net/2017/09/11/daybreak-1-1/", + title: "Ward", + id: "a6b6b156-2f17-43c0-8bb1-bfa91f3ef62a", + + // Synposis from https://www.parahumans.net/ + /* eslint-disable max-len */ + description: `The unwritten rules that govern the fights and outright wars between ‘capes’ have been amended: everyone gets their second chance. It’s an uneasy thing to come to terms with when notorious supervillains and even monsters are playing at being hero. The world ended two years ago, and as humanity straddles the old world and the new, there aren’t records, witnesses, or facilities to answer the villains’ past actions in the present. One of many compromises, uneasy truces and deceptions that are starting to splinter as humanity rebuilds. + +None feel the injustice of this new status quo or the lack of established footing more than the past residents of the parahuman asylums. The facilities hosted parahumans and their victims, but the facilities are ruined or gone; one of many fragile ex-patients is left to find a place in a fractured world. She’s perhaps the person least suited to have anything to do with this tenuous peace or to stand alongside these false heroes. She’s put in a position to make the decision: will she compromise to help forge what they call, with dark sentiment, a second golden age? Or will she stand tall as a gilded dark age dawns?` + /* eslint-enable max-len */ +}; diff --git a/lib/convert-worker.js b/lib/convert-worker.js new file mode 100644 index 0000000..f9f2b5f --- /dev/null +++ b/lib/convert-worker.js @@ -0,0 +1,833 @@ +"use strict"; +const workerpool = require("workerpool"); +const fs = require("fs"); +const { JSDOM } = require("jsdom"); +const substitutions = require("./substitutions.json"); + +workerpool.worker({ convertChapter }); + +function convertChapter(chapter, book, inputPath, outputPath) { + const contents = fs.readFileSync(inputPath, { encoding: "utf-8" }); + + const rawChapterJSDOM = new JSDOM(contents); + const { output, warnings } = getChapterString(chapter, book, rawChapterJSDOM.window.document); + + // TODO: this should probably not be necessary... jsdom bug I guess!? + rawChapterJSDOM.window.close(); + + fs.writeFileSync(outputPath, output); + return warnings; +} + +function getChapterString(chapter, book, rawChapterDoc) { + const { xml, warnings } = + getBodyXML(chapter, book, rawChapterDoc.querySelector(".entry-content")); + + const output = ` + + + + + ${chapter.title} + +${xml} +`; + + return { output, warnings }; +} + +function getBodyXML(chapter, book, contentEl) { + const warnings = []; + + // Remove initial Next Chapter and Previous Chapter

+ contentEl.firstElementChild.remove(); + + // Remove everything after the last

(e.g. analytics

s) + const lastP = contentEl.querySelector("p:last-of-type"); + while (contentEl.lastElementChild !== lastP) { + contentEl.lastElementChild.remove(); + } + + // Remove empty

s or Last Chapter/Next Chapter

s + while (isEmptyOrGarbage(contentEl.lastElementChild)) { + contentEl.lastElementChild.remove(); + } + + // Remove redundant attributes and style + for (const child of contentEl.children) { + if (child.getAttribute("dir") === "ltr") { + child.removeAttribute("dir"); + } + + // Only ever appears with align="LEFT" (useless) or align="CENTER" overridden by style="text-align: left;" (also + // useless) + child.removeAttribute("align"); + + const style = child.getAttribute("style"); + if (style === "text-align:left;" || style === "text-align: left;") { + child.removeAttribute("style"); + } + + // Worm uses 30px; Ward mostly uses 40px but sometimes uses 30px/60px. Let's standardize on 30px. + if (style === "text-align:left;padding-left:30px;" || + style === "text-align: left;padding-left: 40px;" || + style === "text-align: left; padding-left: 40px;" || + style === "padding-left: 40px;") { + child.setAttribute("style", "padding-left: 30px;"); + } + } + + // Remove empty inline elements. + // Remove style attributes from inline elements, as they're always messed up. + for (const el of contentEl.querySelectorAll("em, i, strong, b")) { + const { textContent } = el; + + if (textContent === "") { + el.remove(); + } else if (textContent.trim() === "") { + if (el.childElementCount === 0) { + el.replaceWith(" "); + } else if (el.childElementCount === 1 && el.children[0].localName === "br") { + el.outerHTML = "
\n"; + } + } else { + el.removeAttribute("style"); + } + } + + // In https://parahumans.wordpress.com/2013/01/05/monarch-16-13/ there are some

s that should be

s O_o + for (const address of contentEl.querySelectorAll("address")) { + const p = contentEl.ownerDocument.createElement("p"); + p.innerHTML = address.innerHTML; + address.replaceWith(p); + } + + // Every except underline ones is pointless at best and frequently messed up. (Weird font size, line spacing, + // etc.) + for (const span of contentEl.querySelectorAll("span")) { + if (span.getAttribute("style") === "text-decoration:underline;") { + continue; + } + + if (span.textContent.trim() === "") { + span.remove(); + } else { + const docFrag = contentEl.ownerDocument.createDocumentFragment(); + while (span.firstChild) { + docFrag.appendChild(span.firstChild); + } + span.replaceWith(docFrag); + } + } + + // In Ward, CloudFlare email protection obfuscates the email addresses: + // https://usamaejaz.com/cloudflare-email-decoding/ + for (const emailEl of contentEl.querySelectorAll("[data-cfemail]")) { + const decoded = decodeCloudFlareEmail(emailEl.dataset.cfemail); + emailEl.replaceWith(contentEl.ownerDocument.createTextNode(decoded)); + } + + // Synthesize a tag to serialize + const bodyEl = contentEl.ownerDocument.createElement("body"); + + const h1El = contentEl.ownerDocument.createElement("h1"); + h1El.textContent = chapter.title; + bodyEl.appendChild(h1El); + + while (contentEl.firstChild) { + bodyEl.appendChild(contentEl.firstChild); + } + + const xmlSerializer = new contentEl.ownerDocument.defaultView.XMLSerializer(); + let xml = xmlSerializer.serializeToString(bodyEl); + + // Fix recurring strange pattern of extra
in

......
\n

+ xml = xml.replace(/
\s*<\/em><\/p>/ug, "

"); + + // Replace single-word s with s. Other s are probably erroneous too, but these are known-bad. + xml = xml.replace(/([^ ]+)<\/i>/ug, "$1"); + xml = xml.replace(/([^ ]+)( +)<\/i>/ug, "$1$2"); + + // There are way too many nonbreaking spaces where they don't belong. If they show up three in a row, then let them + // live; they're maybe being used for alignment or something. Otherwise, they die. + // + // Also, normalize spaces after a period/quote mark to two (normal) spaces. The second one is invisible when + // rendered, but it helps future heuristics detect end of sentences. + xml = xml.replace(/\xA0{1,2}(?!\x20\xA0)/ug, " "); + xml = xml.replace(/([.”])\x20*\xA0[\xA0\x20]*/ug, "$1 "); + xml = xml.replace(/([.”])\x20{3,}/ug, "$1 "); + + function fixEms() { + // Fix recurring broken-up or erroneous s + xml = xml.replace(/<\/em>‘s/ug, "’s"); + xml = xml.replace(/<\/em>/ug, ""); + xml = xml.replace(/<\/em>/ug, ""); + xml = xml.replace(/(\s?\s?[^A-Za-z]\s?\s?)<\/em>/ug, "$1"); + xml = xml.replace(/<\/em>(\s?\s?[^A-Za-z]\s?\s?)/ug, "$1"); + xml = xml.replace(/“([^>]+)<\/em>(!|\?|\.)”/ug, "“$1$2”"); + xml = xml.replace(/

([^>]+)<\/em>(!|\?|\.)<\/p>/ug, "

$1$2

"); + xml = xml.replace(/(!|\?|\.)\s{2}<\/em><\/p>/ug, "$1

"); + xml = xml.replace(/([a-z]+)(\?|\.)<\/em>/ug, "$1$2"); + xml = xml.replace(/([^>]+?)( +)<\/em>/ug, "$1$2"); + xml = xml.replace(/ ([a-zA-Z]+)<\/em>/ug, " $1"); + xml = xml.replace(/‘\s*([^<]+)\s*’<\/em>/ug, "‘$1’"); + xml = xml.replace(/‘\s*([^<]+)\s*<\/em>\s*’/ug, "‘$1’"); + xml = xml.replace(/‘\s*\s*([^<]+)\s*’<\/em>/ug, "‘$1’"); + xml = xml.replace(/“\s*([^<”]+)\s*”<\/em>/ug, "“$1”"); + xml = xml.replace(/“\s*([^<”]+)\s*<\/em>\s*”/ug, "“$1”"); + xml = xml.replace(/“\s*\s*([^<”]+)\s*”<\/em>/ug, "“$1”"); + xml = xml.replace(/([^\n>]) ?/ug, "$1 "); + xml = xml.replace(/ ?<\/em>/ug, " "); + xml = xml.replace(/]+)> /ug, ""); + xml = xml.replace(/<\/em> <\/p>/ug, "

"); + xml = xml.replace(/([a-z]+),<\/em>/ug, "$1,"); + } + + // These quote/apostrophe/em fixes interact with each other. TODO: try to disentangle so we don't repeat all of + // fixEms. + xml = xml.replace(/,” <\/em>/ug, ",” "); + fixEms(); + xml = xml.replace(/

”/ug, "

“"); + xml = xml.replace(/“\s*<\/p>/ug, "”

"); + xml = xml.replace(/“\s*<\/em><\/p>/ug, "

"); + xml = xml.replace(/‘\s*<\/p>/ug, "’

"); + xml = xml.replace(/‘\s*<\/em><\/p>/ug, "’

"); + xml = xml.replace(/,” <\/em>/ug, ",” "); + xml = xml.replace(/′/ug, "’"); + xml = xml.replace(/″/ug, "”"); + xml = xml.replace(/([A-Za-z])‘s(\s?)/ug, "$1’s$2"); + xml = xml.replace(/I‘m/ug, "I’m"); + xml = xml.replace(/

“\s+/ug, "

“"); + xml = xml.replace(/\s+”/ug, "”"); + xml = xml.replace(/'/ug, "’"); + xml = xml.replace(/’([A-Za-z]+)’/ug, "‘$1’"); + xml = xml.replace(/([a-z])”<\/p>/ug, "$1.”

"); + fixEms(); + xml = xml.replace(/‘([^<]+)<\/em>‘/ug, "‘$1’"); + xml = xml.replace(/([a-z]+)!<\/em>/ug, "$1!"); + xml = xml.replace(/(?([\w ’]+)([!.?])”<\/em>/ug, "$1$2”"); + xml = xml.replace(/([\w ’]+[!.?])”<\/em>/ug, "$1”"); + xml = xml.replace(/I”(m|ll)/ug, "I’$1"); + xml = xml.replace(/””<\/p>/ug, "”

"); + xml = xml.replace(/^([^“]+?) ?”(?![ —<])/ugm, "$1 “"); + xml = xml.replace(/(?([A-Za-z]+),<\/em>(?!”| +[A-Za-z]+ thought)/u, "$1,"); + xml = xml.replace(/‘([Kk])ay(?!’)/ug, "’$1ay"); + xml = xml.replace(/(Why|What|Who|How|Where|When)<\/em>\?/ug, "$1?"); + xml = xml.replace(/,<\/em>/ug, ","); + xml = xml.replace(/,”<\/p>/ug, ".”

"); + xml = xml.replace(/

(.*),<\/p>/ug, "

$1.

"); + xml = xml.replace(/‘(\w+)‘(\w+)’/ug, "‘$1’$2’"); + xml = xml.replace(/([a-z]+), ([a-z]+)<\/em>/ug, "$1, $2"); + + // Similar problems occur in Ward with and as do in Worm with s + xml = xml.replace(//ug, ""); + xml = xml.replace(/(\s*
\s*)<\/b>/ug, "$1"); + xml = xml.replace(/(\s*
\s*)<\/strong>/ug, "$1"); + xml = xml.replace(/<\/strong>(\s*)/ug, "$1"); + xml = xml.replace(/@<\/strong>/ug, "@"); + xml = xml.replace(/
(\s*)<\/strong>/ug, "

$1"); + xml = xml.replace(/(\s*)<\/strong>/ug, "
$1"); + xml = xml.replace(/>(.*)<\/strong>:$1:<"); + + // No need for line breaks before paragraph ends or after paragraph starts + // These often occur with the
s inside /// fixed above. + xml = xml.replace(/
\s*<\/p>/ug, "

"); + xml = xml.replace(/


\s*/ug, "

"); + + // This is another quote fix but it needs to happen after the line break deletion... so entangled, ugh. + xml = xml.replace(/<\/em>\s*“\s*<\/p>/ug, "

"); + + // Fix missing spaces after commas + xml = xml.replace(/([a-zA-Z]+),([a-zA-Z]+)/ug, "$1, $2"); + + // Fix bad periods and spacing/markup surrounding them + xml = xml.replace(/\.\.<\/p>/ug, ".

"); + xml = xml.replace(/\.\.”<\/p>/ug, ".”

"); + xml = xml.replace(/ \. /ug, ". "); + xml = xml.replace(/ \.<\/p>/ug, ".

"); + xml = xml.replace(/\.\.\./ug, "…"); + xml = xml.replace(/\.\. {2}/ug, ". "); + xml = xml.replace(/\.\./ug, "…"); + xml = xml.replace(/(?/ug, "

"); + xml = xml.replace(/([a-z]) ,/ug, "$1,"); + + // Use actual emojis instead of images + xml = xml.replace( + // eslint-disable-next-line max-len + /O_o/ug, + "🤨" + ); + + xml = fixTruncatedWords(xml); + xml = fixDialogueTags(xml); + xml = fixForeignNames(xml); + xml = standardizeNames(xml); + xml = fixEmDashes(xml); + xml = enDashJointNames(xml); + xml = fixPossessives(xml); + xml = cleanSceneBreaks(xml); + xml = fixCapitalization(xml, book); + xml = fixMispellings(xml); + xml = fixHyphens(xml); + xml = standardizeSpellings(xml); + xml = fixCaseNumbers(xml); + + // One-off fixes + for (const substitution of substitutions[chapter.url] || []) { + if (substitution.before) { + const indexOf = xml.indexOf(substitution.before); + if (indexOf === -1) { + warnings.push(`Could not find text "${substitution.before}" in ${chapter.url}. The chapter may have been ` + + `updated at the source, in which case, you should edit substitutions.json.`); + } + if (indexOf !== xml.lastIndexOf(substitution.before)) { + warnings.push(`The text "${substitution.before}" occurred twice, and so the substitution was ambiguous. ` + + `Update substitutions.json for a more precise substitution.`); + } + + xml = xml.replace(new RegExp(escapeRegExp(substitution.before), "u"), substitution.after); + } else if (substitution.regExp) { + xml = xml.replace(new RegExp(substitution.regExp, "ug"), substitution.replacement); + } else { + warnings.push(`Invalid substitution specified for ${chapter.url}`); + } + } + + // Serializer inserts extra xmlns for us since it doesn't know we're going to put this into a . + // Use this opportunity to insert a comment pointing to the original URL, for reference. + xml = xml.replace( + //u, + `\n\n` + ); + + return { xml, warnings }; +} + +function fixTruncatedWords(xml) { + xml = xml.replace(/‘Sup/ug, "’Sup"); + xml = xml.replace(/‘cuz/ug, "’cuz"); + + // Short for "Sidepeace" + xml = xml.replace(/[‘’][Pp]iece(?![a-z])/ug, "’Piece"); + + // Short for "Disjoint" + xml = xml.replace(/[‘’][Jj]oint(?![a-z])/ug, "’Joint"); + + // Short for "Contender" + xml = xml.replace(/[‘’][Tt]end(?![a-z])/ug, "’Tend"); + + // Short for "Anelace" + xml = xml.replace(/[‘’][Ll]ace(?![a-z])/ug, "’Lace"); + + // Short for "Birdcage" + xml = xml.replace(/[‘’][Cc]age(?![a-z])/ug, "’Cage"); + + // We can't do "’Clear" (short for Crystalclear) here because it appears too much as a normal word preceded by an + // open quote, so we do that in substitutions.json. + + return xml; +} + +function fixDialogueTags(xml) { + // Fix recurring miscapitalization with questions + xml = xml.replace(/\?”\s\s?She asked/ug, "?” she asked"); + xml = xml.replace(/\?”\s\s?He asked/ug, "?” he asked"); + + // The author often fails to terminate a sentence, instead using a comma after a dialogue tag. For example, + // > “I didn’t get much done,” Greg said, “I got distracted by... + // This should instead be + // > “I didn’t get much done,” Greg said. “I got distracted by... + // + // Our heuristic is to try to automatically fix this if the dialogue tag is two words (X said/admitted/sighed/etc.). + // + // This sometimes overcorrects, as in the following example: + // > “Basically,” Alec said, “For your powers to manifest, ... + // Here instead we should lowercase the "f". We handle that via one-offs in substitutions.json. + // + // This applies to ~800 instances, so although we have to correct back in substitutions.json a decent number of + // times, it definitely pays for itself. Most of the instances we have to correct back we also need to fix the + // capitalization anyway, and that's harder to do automatically, since proper names/"I"/etc. stay capitalized. + xml = xml.replace(/,” ([A-Za-z]+ [A-Za-z]+), “([A-Z])/ug, ",” $1. “$2"); + + return xml; +} + +function fixForeignNames(xml) { + // This is consistently missing diacritics + xml = xml.replace(/Yangban/ug, "Yàngbǎn"); + + // These are usually not italicized, but sometimes are. Other foreign-language names (like Yàngbǎn) are not + // italicized, so we go in the direction of removing the italics. + xml = xml.replace(/Garama<\/em>/ug, "Garama"); + xml = xml.replace(/Thanda<\/em>/ug, "Thanda"); + xml = xml.replace(/Sifara([^<]*)<\/em>/ug, "Sifara$1"); + xml = xml.replace(/Moord Nag([^<]*)<\/em>/ug, "Moord Nag$1"); + xml = xml.replace(/Califa de Perro([^<]*)<\/em>/ug, "Califa de Perro$1"); + xml = xml.replace(/Turanta([^<]*)<\/em>/ug, "Turanta$1"); + + return xml; +} + +function standardizeNames(xml) { + // 197 instances of "Mrs." to 21 of "Ms." + xml = xml.replace(/Ms\. Yamada/ug, "Mrs. Yamada"); + + // 25 instances of "Amias" to 3 of "Amais" + xml = xml.replace(/Amais/ug, "Amias"); + + // 185 instances of Juliette to 4 of Juliet + xml = xml.replace(/Juliet(?=\b)/ug, "Juliette"); + + // Earlier chapters have a space; later ones do not. They're separate words, so side with the earlier chapters. + // One location is missing the "k". + xml = xml.replace(/Crock? o[‘’]Shit/ug, "Crock o’ Shit"); + + // 5 instances of "Jotun" to 2 of "Jotunn" + xml = xml.replace(/Jotunn/ug, "Jotun"); + + // 13 instances of Elman to 1 of Elmann + xml = xml.replace(/Elmann/ug, "Elman"); + + // Thousands of instances of Tattletale to 4 instances of Tatteltale + xml = xml.replace(/Tatteltale/ug, "Tattletale"); + + // 73 instances of Über to 2 of Uber + xml = xml.replace(/Uber/ug, "Über"); + + return xml; +} + +function fixEmDashes(xml) { + xml = xml.replace(/ – /ug, "—"); + xml = xml.replace(/“((?:)?)-/ug, "“$1—"); + xml = xml.replace(/-[,.]?”/ug, "—”"); + xml = xml.replace(/-(!|\?)”/ug, "—$1”"); + xml = xml.replace(/-[,.]?<\/([a-z]+)>”/ug, "—”"); + xml = xml.replace(/-“/ug, "—”"); + xml = xml.replace(/

-/ug, "

—"); + xml = xml.replace(/-<\/p>/ug, "—

"); + xml = xml.replace(/-
/ug, "—
"); + xml = xml.replace(/-<\/([a-z]+)><\/p>/ug, "—

"); + xml = xml.replace(/\s?\s?–\s?\s?/ug, "—"); + xml = xml.replace(/-\s\s?/ug, "—"); + xml = xml.replace(/\s?\s-/ug, "—"); + xml = xml.replace(/\s+—”/ug, "—”"); + xml = xml.replace(/I-I/ug, "I—I"); + xml = xml.replace(/I-uh/ug, "I—uh"); + xml = xml.replace(/-\?/ug, "—?"); + + return xml; +} + +function enDashJointNames(xml) { + // Joint names should use en dashes + xml = xml.replace(/Dallon-Pelham/ug, "Dallon–Pelham"); + xml = xml.replace(/Bet-Gimel/ug, "Bet–Gimel"); + xml = xml.replace(/Cheit-Gimel/ug, "Bet–Gimel"); + xml = xml.replace(/Tristan-Capricorn/ug, "Tristan–Capricorn"); + xml = xml.replace(/Capricorn-Byron/ug, "Capricorn–Byron"); + xml = xml.replace(/Tristan-Byron/ug, "Tristan–Byron"); + xml = xml.replace(/Gimel-Europe/ug, "Gimel–Europe"); + xml = xml.replace(/G-N/ug, "G–N"); + xml = xml.replace(/Imp-Damsel/ug, "Imp–Damsel"); + xml = xml.replace(/Damsel-Ashley/ug, "Damsel–Ashley"); + xml = xml.replace(/Antares-Anelace/ug, "Antares–Anelace"); + xml = xml.replace(/Challenger-Gallant/ug, "Challenger–Gallant"); + xml = xml.replace(/Undersider(s?)-(Breakthrough|Ambassador)/ug, "Undersider$1–$2"); + xml = xml.replace(/Norwalk-Fairfield/ug, "Norwalk–Fairfield"); + xml = xml.replace(/East-West/ug, "east–west"); + xml = xml.replace(/Creutzfeldt-Jakob/ug, "Creutzfeldt–Jakob"); + xml = xml.replace(/Astaroth-Nidhug/ug, "Astaroth–Nidhug"); + xml = xml.replace(/Capulet-Montague/ug, "Capulet–Montague"); + xml = xml.replace(/Weaver-Clockblocker/ug, "Weaver–Clockblocker"); + xml = xml.replace(/Alexandria-Pretender/ug, "Alexandria–Pretender"); + xml = xml.replace(/Night Hag-Nyx/ug, "Night Hag–Nyx"); + xml = xml.replace(/Crawler-Breed/ug, "Crawler–Breed"); + xml = xml.replace(/Simurgh-Myrddin-plant/ug, "Simurgh–Myrddin–plant"); + xml = xml.replace(/Armsmaster-Defiant/ug, "Armsmaster–Defiant"); + xml = xml.replace(/Matryoshka-Valentin/ug, "Matryoshka–Valentin"); + xml = xml.replace(/Gaea-Eden/ug, "Gaea–Eden"); + xml = xml.replace(/([Aa])gent-parahuman/ug, "$1gent–parahuman"); + xml = xml.replace(/([Pp])arahuman-agent/ug, "$1arahuman–agent"); + + return xml; +} + +function fixPossessives(xml) { + // Fix possessive of names ending in "s". + xml = xml.replace( + // eslint-disable-next-line max-len + /(? would be more semantically appropriate, but loses the author's intent. This is + // especially the case in Ward, which uses a variety of different scene breaks. + + xml = xml.replace(/]*)>■<\/p>/ug, `

`); + + xml = xml.replace( + /

⊙<\/strong><\/p>/ug, + `

` + ); + xml = xml.replace( + /

⊙<\/strong><\/em><\/p>/ug, + `

` + ); + xml = xml.replace( + /

⊙⊙<\/strong><\/p>/ug, + `

` + ); + + xml = xml.replace( + /

⊙ *⊙ *⊙ *⊙ *⊙<\/strong><\/p>/ug, + `

⊙ ⊙ ⊙ ⊙ ⊙

` + ); + + return xml; +} + +function fixCapitalization(xml, book) { + // This occurs enough times it's better to do here than in one-off fixes. We correct the single instance where + // it's incorrect to capitalize in the one-off fixes. + // Note that Ward contains much talk of "the clairvoyants", so we don't want to capitalize plurals. + xml = xml.replace(/([Tt])he clairvoyant(?!s)/ug, "$1he Clairvoyant"); + + // ReSound's name is sometimes miscapitalized. The word is never used in a non-name context. + xml = xml.replace(/Resound/ug, "ReSound"); + + // The Speedrunners team name is missing its capitalization a couple times. + xml = xml.replace(/speedrunners/ug, "Speedrunners"); + + // The Machine Army is missing its capitalization a couple times. + xml = xml.replace(/machine army/ug, "Machine Army"); + + // "patrol block" is capitalized three different ways: "patrol block", "Patrol block", and "Patrol Block". "patrol + // group" is always lowercased. It seems like "Patrol" is a proper name, and is used as a capitalized modifier in + // other contexts (e.g. Patrol leader). So let's standardize on "Patrol ". + xml = xml.replace( + /patrol (block|group|leader|guard|student|uniform|squad|soldier|officer|crew|girl|bus|training)/uig, + (_, $1) => `Patrol ${$1.toLowerCase()}` + ); + // This usually works in Ward (some instances corrected back in substitutions.json), and has a few false positives in + // Worm, where it is never needed: + if (book === "ward") { + xml = xml.replace(/the patrol(?!s|ling)/ug, "the Patrol"); + } + + // This is sometimes missing its capitalization. + xml = xml.replace(/the birdcage/ug, "the Birdcage"); + + // There's no reason why these should be capitalized. + xml = xml.replace(/(?)Halberd/ug, "halberd"); + xml = xml.replace(/(?)Loft/ug, "loft"); + + // These are treated as common nouns and not traditionally capitalized. "Krav Maga" remains capitalized, + // interestingly (according to dictionaries and Wikipedia). + xml = xml.replace(/(?)Judo/ug, "judo"); + xml = xml.replace(/(?)Aikido/ug, "aikido"); + xml = xml.replace(/(?)Karate/ug, "karate"); + xml = xml.replace(/(?)Tae Kwon Do/ug, "tae kwon do"); + + // There's no reason why university should be capitalized in most contexts, although sometimes it's used as part of + // a compound noun or at the beginning of a sentence. + xml = xml.replace(/(?|Cornell |Nilles )University(?! Road)/ug, "university"); + + // Organ names (e.g. brain, arm) or scientific names are not capitalized, so the "corona pollentia" and friends should + // not be either. The books are inconsistent. + xml = xml.replace(/(?|-)Corona/ug, "corona"); + xml = xml.replace(/Pollentia/ug, "pollentia"); + xml = xml.replace(/Radiata/ug, "radiata"); + xml = xml.replace(/Gemma/ug, "gemma"); + + // We de-capitalize Valkyrie's "flock", since most uses are de-capitalized (e.g. the many instances in Gleaming + // Interlude 9, or Dying 15.z). This is a bit surprising; it seems like an organization name. But I guess it's + // informal. + xml = xml.replace(/(?)Flock/ug, "flock"); + + // Especially early in Worm, PRT designations are capitalized; they should not be. This fixes the cases where we + // can be reasonably sure they don't start a sentence, although more specific instances are done in + // substitutions.json, and some need to be back-corrected. + // + // Note: "Master" is specifically omitted because it fails poorly on Worm Interlude 4. Other instances need to be + // corrected via substitutions.json. + // + // This also over-de-capitalizes "The Stranger" in Ward (a titan name). Those also get fixed in substitutions.json. + xml = xml.replace( + // eslint-disable-next-line max-len + /(?|\n|: )(Mover|Shaker|Brute|Breaker|Tinker|Blaster|Thinker|Striker|Changer|Trump|Stranger|Shifter|Shaper)(?! [A-Z])/ug, + (_, designation) => designation.toLowerCase() + ); + xml = xml.replace( + /(mover|shaker|brute|breaker|tinker|blaster|thinker|master|striker|changer|trump|stranger|shifter|shaper)-(\d+)/ugi, + "$1 $2" + ); + xml = xml.replace( + // eslint-disable-next-line max-len + /(mover|shaker|brute|breaker|tinker|blaster|thinker|master|striker|changer|trump|stranger|shifter|shaper)[ -/](mover|shaker|brute|breaker|tinker|blaster|thinker|master|striker|changer|trump|stranger|shifter|shaper)/ugi, + "$1–$2" + ); + + // Capitalization is inconsistent, but shard names seems to usually be capitalized. + xml = xml.replace(/Grasping self/ug, "Grasping Self"); + xml = xml.replace(/Cloven stranger/ug, "Cloven Stranger"); + xml = xml.replace(/Princess shaper/ug, "Princess Shaper"); + xml = xml.replace(/Fragile one/ug, "Fragile One"); + + // Place names need to always be capitalized + xml = xml.replace(/North end/ug, "North End"); + xml = xml.replace(/(Stonemast|Shale) avenue/ug, "$1 Avenue"); + xml = xml.replace(/(Lord|Slater) street/ug, "$1 Street"); + xml = xml.replace(/(Hollow|Cedar) point/ug, "$1 Point"); + xml = xml.replace(/(Norwalk|Fenway|Stratford) station/ug, "$1 Station"); + xml = xml.replace(/the megalopolis/ug, "the Megalopolis"); + xml = xml.replace(/earths(?![a-z])/ug, "Earths"); + if (book === "ward") { + xml = xml.replace(/the bunker/ug, "the Bunker"); + xml = xml.replace(/‘bunker’/ug, "‘Bunker’"); + } + + // "Mom" and "Dad" should be capitalized when used as a proper name. These regexps are tuned to catch a good amount of + // instances, without over-correcting for non-proper-name-like cases. Many other instances are handled in + // substitutions.json. + xml = xml.replace(/(?)Giants/ug, "giants"); + + return xml; +} + +function fixMispellings(xml) { + // This is commonly misspelled. + xml = xml.replace(/([Ss])houlderblade/ug, "$1houlder blade"); + + // All dictionaries agree this is capitalized. + xml = xml.replace(/u-turn/ug, "U-turn"); + + // https://www.dictionary.com/browse/scot-free + xml = xml.replace(/scott(?: |-)free/ug, "scot-free"); + + // https://ugrammarist.com/idiom/change-tack/ + xml = xml.replace(/changed tacks/ug, "changed tack"); + + return xml; +} + +function fixHyphens(xml) { + // "X-year-old" should use hyphens; all grammar guides agree. The books are very inconsistent but most often omit + // them. + xml = xml.replace(/(\w+)[ -]year[ -]old(s?)(?!\w)/ug, "$1-year-old$2"); + xml = xml.replace(/(\w+) or (\w+)-year-old/ug, "$1- or $2-year-old"); + + // Compound numbers from 11 through 99 must be hyphenated, but others should not be. + xml = xml.replace( + /(? `Case ${caseNumber[0].toUpperCase()}${caseNumber.substring(1)}` + ); + + return xml; +} + +function isEmptyOrGarbage(el) { + const text = el.textContent.trim(); + return text === "" || + text.startsWith("Last Chapter") || + text.startsWith("Previous Chapter") || + text.startsWith("Next Chapter"); +} + +function escapeRegExp(str) { + return str.replace(/[[\]/{}()*+?.\\^$|]/ug, "\\$&"); +} + +function decodeCloudFlareEmail(hash) { + let email = ""; + const xorWithThis = parseInt(hash.substring(0, 2), 16); + for (let i = 2; i < hash.length; i += 2) { + const charCode = parseInt(hash.substring(i, i + 2), 16) ^ xorWithThis; + email += String.fromCharCode(charCode); + } + + return email; +} diff --git a/lib/convert.js b/lib/convert.js index 5233518..3a7ff9c 100644 --- a/lib/convert.js +++ b/lib/convert.js @@ -1,386 +1,48 @@ "use strict"; const path = require("path"); -const fs = require("mz/fs"); -const throat = require("throat"); -const serializeToXML = require("xmlserializer").serializeToString; -const { JSDOM } = require("jsdom"); -const substitutions = require("./substitutions.json"); +const fs = require("fs").promises; +const { performance } = require("perf_hooks"); +const workerpool = require("workerpool"); +const cliProgress = require("cli-progress"); -module.exports = async (cachePath, manifestPath, contentPath) => { +module.exports = async (cachePath, manifestPath, contentPath, book, concurrentJobs) => { const manifestContents = await fs.readFile(manifestPath, { encoding: "utf-8" }); const chapters = JSON.parse(manifestContents); - console.log("All chapters downloaded; beginning conversion to EPUB chapters"); - const mapper = throat(10, chapter => convertChapter(chapter, cachePath, contentPath)); - await Promise.all(chapters.map(mapper)); + console.log("Converting raw downloaded HTML to EPUB chapters"); + const progress = new cliProgress.SingleBar({ + stopOnComplete: true, + clearOnComplete: true, + format: " {bar} {percentage}% | {time} | {value}/{total}" + }, cliProgress.Presets.shades_classic); - console.log("All chapters converted"); + const start = performance.now(); + progress.start(chapters.length, 0, { time: " " }); + + const poolOptions = {}; + if (concurrentJobs !== undefined) { + poolOptions.maxWorkers = concurrentJobs; + } + const pool = workerpool.pool(path.resolve(__dirname, "convert-worker.js"), poolOptions); + + const warnings = []; + await Promise.all(chapters.map(async chapter => { + const inputPath = path.resolve(cachePath, chapter.filename); + + const destFileName = `${path.basename(chapter.filename, ".html")}.xhtml`; + const outputPath = path.resolve(contentPath, destFileName); + + warnings.push(...await pool.exec("convertChapter", [chapter, book, inputPath, outputPath])); + + const seconds = String(Math.round((performance.now() - start) / 1000)).padStart(3); + progress.increment({ time: `${seconds} s` }); + })); + + pool.terminate(); + + for (const warning of warnings) { + console.warn(warning); + } + + console.log(`All chapters converted in ${Math.round((performance.now() - start) / 100) / 10} seconds`); }; - -async function convertChapter(chapter, cachePath, contentPath) { - const filename = chapter.filename; - const filePath = path.resolve(cachePath, filename); - - const contents = await fs.readFile(filePath, { encoding: "utf-8" }); - - const rawChapterJSDOM = new JSDOM(contents); - const output = getChapterString(chapter, rawChapterJSDOM.window.document); - - // TODO: this should probably not be necessary... jsdom bug I guess!? - rawChapterJSDOM.window.close(); - - const destFileName = `${path.basename(filename, ".html")}.xhtml`; - const destFilePath = path.resolve(contentPath, destFileName); - - await fs.writeFile(destFilePath, output); - console.log(`- Finished converting ${filename}`); -} - -function getChapterString(chapter, rawChapterDoc) { - const body = getBodyXML(chapter, rawChapterDoc.querySelector(".entry-content")); - - return ` - - - - - ${chapter.title} - -${body} -`; -} - -function getBodyXML(chapter, contentEl) { - // Remove initial Next Chapter and Previous Chapter

- contentEl.removeChild(contentEl.firstElementChild); - - // Remove everything after the last

(e.g. analytics

s) - const lastP = contentEl.querySelector("p:last-of-type"); - while (contentEl.lastElementChild !== lastP) { - contentEl.removeChild(contentEl.lastElementChild); - } - - // Remove empty

s or Last Chapter/Next Chapter

s - while (isEmptyOrGarbage(contentEl.lastElementChild)) { - contentEl.removeChild(contentEl.lastElementChild); - } - - // Remove redundant attributes and style - Array.prototype.forEach.call(contentEl.children, child => { - if (child.getAttribute("dir") === "ltr") { - child.removeAttribute("dir"); - } - - // Only ever appears with align="LEFT" (useless) or align="CENTER" overridden by style="text-align: left;" (also - // useless) - child.removeAttribute("align"); - - if (child.getAttribute("style") === "text-align:left;") { - child.removeAttribute("style"); - } - if (child.getAttribute("style") === "text-align:left;padding-left:30px;") { - child.setAttribute("style", "padding-left:30px;"); - } - }); - - // Remove empty s and s - // Remove style attributes from them, as they're always messed up. - const ems = contentEl.querySelectorAll("em, i"); - Array.prototype.forEach.call(ems, em => { - if (em.textContent.trim() === "") { - const replacement = contentEl.ownerDocument.createTextNode(" "); - em.parentNode.replaceChild(replacement, em); - } else { - em.removeAttribute("style"); - } - }); - - // In https://parahumans.wordpress.com/2013/01/05/monarch-16-13/ there are some

s that should be

s O_o - const addresses = contentEl.querySelectorAll("address"); - Array.prototype.forEach.call(addresses, address => { - const p = contentEl.ownerDocument.createElement("p"); - p.innerHTML = address.innerHTML; - address.parentNode.replaceChild(p, address); - }); - - // Every except underline ones is pointless at best and frequently messed up. (Weird font size, line spacing, - // etc.) - const spans = contentEl.querySelectorAll("span"); - Array.prototype.forEach.call(spans, span => { - if (span.getAttribute("style") === "text-decoration:underline;") { - return; - } - - if (span.textContent.trim() === "") { - span.parentNode.removeChild(span); - } else { - const docFrag = contentEl.ownerDocument.createDocumentFragment(); - while (span.firstChild) { - docFrag.appendChild(span.firstChild); - } - span.parentNode.replaceChild(docFrag, span); - } - }); - - - // Synthesize a tag to serialize - const bodyEl = contentEl.ownerDocument.createElement("body"); - const h1El = contentEl.ownerDocument.createElement("h1"); - h1El.textContent = chapter.title; - - bodyEl.appendChild(h1El); - while (contentEl.firstChild) { - bodyEl.appendChild(contentEl.firstChild); - } - - let xml = serializeToXML(bodyEl); - - // Fix recurring strange pattern of extra
in

......
\n

- xml = xml.replace(/\s*<\/em><\/p>/g, "

"); - - // There are way too many nonbreaking spaces where they don't belong. - // If they show up three in a row, then let them live. Otherwise, they die. - xml = xml.replace(/([^\xA0])\xA0\xA0?([^\xA0])/g, "$1 $2"); - - function fixEms() { - // Fix recurring broken-up or erroneous s - xml = xml.replace(/<\/em>‘s/g, "’s"); - xml = xml.replace(/<\/em>/g, ""); - xml = xml.replace(/<\/em>/g, ""); - xml = xml.replace(/(\s?\s?[^A-Za-z]\s?\s?)<\/em>/g, "$1"); - xml = xml.replace(/<\/em>(\s?\s?[^A-Za-z]\s?\s?)/g, "$1"); - xml = xml.replace(/“([^>]+)<\/em>(!|\?|\.)”/g, "“$1$2”"); - xml = xml.replace(/

([^>]+)<\/em>(!|\?|\.)<\/p>/g, "

$1$2

"); - xml = xml.replace(/(!|\?|\.)\s{2}<\/em><\/p>/g, "$1

"); - xml = xml.replace(/([a-z]+)\?<\/em>/g, "$1?"); - xml = xml.replace(/([^>]+?)( +)<\/em>/g, "$1$2"); - xml = xml.replace(/ ([a-zA-Z]+)<\/em>/g, " $1"); - xml = xml.replace(/‘\s*([^<]+)\s*’<\/em>/g, "‘$1’"); - xml = xml.replace(/‘\s*([^<]+)\s*<\/em>\s*’/g, "‘$1’"); - xml = xml.replace(/‘\s*\s*([^<]+)\s*’<\/em>/g, "‘$1’"); - xml = xml.replace(/“\s*([^<]+)\s*”<\/em>/g, "“$1”"); - xml = xml.replace(/“\s*([^<]+)\s*<\/em>\s*”/g, "“$1”"); - xml = xml.replace(/“\s*\s*([^<]+)\s*”<\/em>/g, "“$1”"); - xml = xml.replace(/([^\n>]) ?/g, "$1 "); - xml = xml.replace(/ ?<\/em>/g, " "); - xml = xml.replace(/]+)> /g, ""); - xml = xml.replace(/<\/em> <\/p>/g, "

"); - xml = xml.replace(/([a-z]+),<\/em>/g, "$1,"); - } - - function fixQuotesAndApostrophes() { - // Fix recurring poor quotes and apostrophes - xml = xml.replace(/

”/g, "

“"); - xml = xml.replace(/“\s*<\/p>/g, "”

"); - xml = xml.replace(/“\s*<\/em><\/p>/g, "

"); - xml = xml.replace(/‘\s*<\/p>/g, "’

"); - xml = xml.replace(/‘\s*<\/em><\/p>/g, "’

"); - xml = xml.replace(/,” <\/em>/g, ",” "); - xml = xml.replace(/′/g, "’"); - xml = xml.replace(/″/g, "”"); - xml = xml.replace(/([A-Za-z])‘s(\s?)/g, "$1’s$2"); - xml = xml.replace(/I‘m/g, "I’m"); - xml = xml.replace(/

“\s+/g, "

“"); - xml = xml.replace(/'/g, "’"); - xml = xml.replace(/’([A-Za-z]+)’/g, "‘$1’"); - xml = xml.replace(/‘Sup/g, "’Sup"); - } - - // These interact with each other, so do them a few times. - xml = xml.replace(/,” <\/em>/g, ",” "); - fixEms(); - fixQuotesAndApostrophes(); - fixEms(); - fixQuotesAndApostrophes(); - fixEms(); - - // Fix possessive of names ending in "s" - // Note: if the "s" is unvoiced, as in Marquis, then it doesn't get the second "s". - xml = xml.replace(/([^‘])Judas’([^s])/g, "$1Judas’s$2"); - xml = xml.replace(/([^‘])Brutus’([^s])/g, "$1Brutus’s$2"); - xml = xml.replace(/([^‘])Jess’([^s])/g, "$1Jess’s$2"); - xml = xml.replace(/([^‘])Aegis’([^s])/g, "$1Aegis’s$2"); - xml = xml.replace(/([^‘])Dauntless’([^s])/g, "$1Dauntless’s$2"); - xml = xml.replace(/([^‘])Circus’([^s])/g, "$1Circus’s$2"); - xml = xml.replace(/([^‘])Sirius’([^s])/g, "$1Sirius’s$2"); - xml = xml.replace(/([^‘])Brooks’([^s])/g, "$1Brooks’s$2"); - xml = xml.replace(/([^‘])Genesis’([^s])/g, "$1Genesis’s$2"); - xml = xml.replace(/([^‘])Atlas’([^s])/g, "$1Atlas’s$2"); - xml = xml.replace(/([^‘])Lucas’([^s])/g, "$1Lucas’s$2"); - xml = xml.replace(/([^‘])Gwerrus’([^s])/g, "$1Gwerrus’s$2"); - xml = xml.replace(/([^‘])Chris’([^s])/g, "$1Chris’s$2"); - xml = xml.replace(/([^‘])Eligos’([^s])/g, "$1Eligos’s$2"); - xml = xml.replace(/([^‘])Animos’([^s])/g, "$1Animos’s$2"); - xml = xml.replace(/([^‘])Mags’([^s])/g, "$1Mags’s$2"); - xml = xml.replace(/([^‘])Huntress’([^s])/g, "$1Huntress’s$2"); - xml = xml.replace(/([^‘])Hephaestus’([^s])/g, "$1Hephaestus’s$2"); - - // Fixes dashes - xml = xml.replace(/ – /g, "—"); - xml = xml.replace(/“-/g, "“—"); - xml = xml.replace(/-[,.]?”/g, "—”"); - xml = xml.replace(/-(!|\?)”/g, "—$1”"); - xml = xml.replace(/-[,.]?<\/em>”/g, "—”"); - xml = xml.replace(/-“/g, "—”"); - xml = xml.replace(/

-/g, "

—"); - xml = xml.replace(/-<\/p>/g, "—

"); - xml = xml.replace(/-<\/em><\/p>/g, "—

"); - xml = xml.replace(/\s?\s?–\s?\s?/g, "—"); - xml = xml.replace(/-\s\s?/g, "—"); - xml = xml.replace(/\s?\s-/g, "—"); - xml = xml.replace(/\s+—”/g, "—”"); - xml = xml.replace(/I-I/g, "I—I"); - xml = xml.replace(/I-uh/g, "I—uh"); - - // Use
for separators - xml = xml.replace(/

■<\/p>/g, "


"); - xml = xml.replace(/

■<\/p>/g, "


"); - - // Fix recurring miscapitalization with questions - xml = xml.replace(/\?”\s\s?She asked/g, "?” she asked"); - xml = xml.replace(/\?”\s\s?He asked/g, "?” he asked"); - - // Fix bad periods and spacing/markup surrounding them - xml = xml.replace(/\.\.<\/p>/g, ".

"); - xml = xml.replace(/\.\.”<\/p>/g, ".”

"); - xml = xml.replace(/ \. /g, ". "); - xml = xml.replace(/ \.<\/p>/g, ".

"); - xml = xml.replace(/\.\.\./g, "…"); - - // Fix extra spaces - xml = xml.replace(/ ? <\/p>/g, "

"); - xml = xml.replace(/([a-z]) ,/g, "$1,"); - - // The author often fails to terminate a sentence, instead using a comma after a dialogue tag. For example, - // > “I didn’t get much done,” Greg said, “I got distracted by... - // This should instead be - // > “I didn’t get much done,” Greg said. “I got distracted by... - // - // Our heuristic is to try to automatically fix this if the dialogue tag is two words (X said/admitted/sighed/etc.). - // - // This sometimes overcorrects, as in the following example: - // > “Basically,” Alec said, “For your powers to manifest, ... - // Here instead we should lowercase the "f". We handle that via one-offs in substitutions.json. - // - // This applies to ~800 instances, so although we have to correct back in substitutions.json a decent number of - // times, it definitely pays for itself. Most of the instances we have to correct back we also need to fix the - // capitalization anyway, and that's harder to do automatically, since proper names/"I"/etc. stay capitalized. - xml = xml.replace(/,” ([A-Za-z]+ [A-Za-z]+), “([A-Z])/g, ",” $1. “$2"); - - // Replace single-word s with s. Other s are probably erroneous too, but these are known-bad. - xml = xml.replace(/([A-Za-z]+)<\/i>/g, "$1"); - - // This occurs enough times it's better to do here than in one-off fixes. We correct the single instance where - // it's incorrect to capitalize in the one-off fixes. - xml = xml.replace(/the clairvoyant/g, "the Clairvoyant"); - - // This is sometimes missing its capitalization. - xml = xml.replace(/the birdcage/g, "the Birdcage"); - - // This is usually spelled "TV" but sometimes the other ways. Normalize. - xml = xml.replace(/tv/g, "TV"); - xml = xml.replace(/T\.V\./g, "TV"); - - // There's no reason why these should be capitalized. (Note that they never appear at the beginning of any sentences.) - xml = xml.replace(/Halberd/g, "halberd"); - xml = xml.replace(/Loft/g, "loft"); - - // Especially early in the story, PRT designations are capitalized; they should not be. This fixes the cases where we - // can be reasonably sure they don't start a sentence, although more specific instances are done in - // substitutions.json, and some need to be back-corrected. - // - // Note: "Master" is specifically omitted because it fails poorly on Interlude 4. Other instances need to be - // corrected via substitutions.json. - xml = xml.replace( - /([a-zA-Z,] |\/)(Mover|Shaker|Brute|Breaker|Tinker|Blaster|Thinker|Striker|Changer|Trump|Stranger|Shifter|Shaper)/g, - (_, prefix, designation) => prefix + designation.toLowerCase() - ); - xml = xml.replace( - /(mover|shaker|brute|breaker|tinker|blaster|thinker|master|striker|changer|trump|stranger|shifter|shaper)-(\d+)/gi, - "$1 $2" - ); - xml = xml.replace( - // eslint-disable-next-line max-len - /(mover|shaker|brute|breaker|tinker|blaster|thinker|master|striker|changer|trump|stranger|shifter|shaper)[ -/](mover|shaker|brute|breaker|tinker|blaster|thinker|master|striker|changer|trump|stranger|shifter|shaper)/gi, - "$1–$2" - ); - - // This is consistently missing accents - xml = xml.replace(/Yangban/g, "Yàngbǎn"); - - // Place names need to always be capitalized - xml = xml.replace(/North end/g, "North End"); - xml = xml.replace(/Stonemast avenue/g, "Stonemast Avenue"); - xml = xml.replace(/Shale avenue/g, "Shale Avenue"); - xml = xml.replace(/Lord street/g, "Lord Street"); - xml = xml.replace(/Slater street/g, "Slater Street"); - - // These are usually not italicized, but sometimes are. Other foreign-language names (like Yàngbǎn) are not - // italicized, so we go in the direction of removing the italics. - xml = xml.replace(/Garama<\/em>/g, "Garama"); - xml = xml.replace(/Thanda<\/em>/g, "Thanda"); - xml = xml.replace(/Sifara([^<]*)<\/em>/g, "Sifara$1"); - xml = xml.replace(/Moord Nag([^<]*)<\/em>/g, "Moord Nag$1"); - xml = xml.replace(/Califa de Perro([^<]*)<\/em>/g, "Califa de Perro$1"); - xml = xml.replace(/Turanta([^<]*)<\/em>/g, "Turanta$1"); - - // "okay" is preferred to "ok". This sometimes gets changed back via substitutions.json when people are writing notes - // and thus probably the intention was to be less formal. Also it seems per https://en.wikipedia.org/wiki/A-ok the - // "A" in "A-okay" should be capitalized. - xml = xml.replace(/Ok([,. ])/g, "Okay$1"); - xml = xml.replace(/([^a-zA-Z])ok([^a])/g, "$1okay$2"); - xml = xml.replace(/a-okay/g, "A-okay"); - - // Signal(l)ing/signal(l)ed are spelled both ways. Both are acceptable in English. Let's standardize on single-L. - xml = xml.replace(/(S|s)ignall/g, "$1ignal"); - - // Clich(e|é) is spelled both ways. Let's standardize on including the accent. - xml = xml.replace(/cliche/g, "cliché"); - - // "gray" is the majority spelling, except for "greyhound" - xml = xml.replace(/(G|g)rey(?!hound)/g, "$1ray"); - - // These are consistently missing hyphens. - xml = xml.replace(/self destruct/g, "self-destruct"); - xml = xml.replace(/life threatening/g, "life-threatening"); - xml = xml.replace(/hard headed/g, "hard-headed"); - xml = xml.replace(/shoulder mounted/g, "shoulder-mounted"); - xml = xml.replace(/golden skinned/g, "golden-skinned"); - xml = xml.replace(/creepy crawl/g, "creepy-crawl"); - xml = xml.replace(/well armed/g, "well-armed"); - - // One-off fixes - (substitutions[chapter.url] || []).forEach(substitution => { - if (substitution.before) { - const indexOf = xml.indexOf(substitution.before); - if (indexOf === -1) { - console.warn(`Could not find text "${substitution.before}" in ${chapter.url}. The chapter may have been ` + - `updated at the source, in which case, you should edit substitutions.json.`); - } - if (indexOf !== xml.lastIndexOf(substitution.before)) { - console.warn(`The text "${substitution.before}" occurred twice, and so the substitution was ambiguous. ` + - `Update substitutions.json for a more precise substitution.`); - } - - xml = xml.replace(new RegExp(escapeRegExp(substitution.before)), substitution.after); - } else if (substitution.regExp) { - xml = xml.replace(new RegExp(substitution.regExp, "g"), substitution.replacement); - } else { - console.warn(`Invalid substitution specified for ${chapter.url}`); - } - }); - - // Serializer inserts extra xmlns for us since it doesn't know we're going to put this into a - xml = xml.replace(//, ""); - - return xml; -} - -function isEmptyOrGarbage(el) { - const text = el.textContent.trim(); - return text === "" || text.startsWith("Last Chapter") || text.startsWith("Next Chapter"); -} - -function escapeRegExp(str) { - return str.replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&"); -} diff --git a/lib/download.js b/lib/download.js index eb1d89a..da438bc 100644 --- a/lib/download.js +++ b/lib/download.js @@ -1,8 +1,7 @@ "use strict"; const path = require("path"); -const fs = require("mz/fs"); -const mkdirp = require("mkdirp-then"); -const request = require("requisition"); +const fs = require("fs").promises; +const fetch = require("minipass-fetch"); const { JSDOM } = require("jsdom"); const FILENAME_PREFIX = "chapter"; @@ -35,39 +34,26 @@ async function downloadAllChapters(manifest, startChapterURL, cachePath, manifes manifest = []; } - await mkdirp(cachePath); + await fs.mkdir(cachePath, { recursive: true }); while (currentChapter !== null) { const filename = `${FILENAME_PREFIX}${chapterIndex.toString().padStart(3, "0")}.html`; - console.log(`Downloading ${currentChapter}`); + process.stdout.write(`Downloading ${currentChapter}... `); - const response = await downloadChapter(currentChapter); - const contents = await response.text(); - console.log("- Response body received"); - const rawChapterJSDOM = new JSDOM(contents, { url: currentChapter }); - console.log("- Response body parsed into DOM"); + const { contents, dom, url } = await downloadChapter(currentChapter); + const title = getChapterTitle(dom.window.document); + currentChapter = getNextChapterURL(dom.window.document); - const chapterURLToSave = currentChapter; - const chapterTitle = getChapterTitle(rawChapterJSDOM.window.document); - currentChapter = getNextChapterURL(rawChapterJSDOM.window.document); - - // TODO: this should probably not be necessary... jsdom bug I guess!? - rawChapterJSDOM.window.close(); - - manifest.push({ - url: chapterURLToSave, - title: chapterTitle, - filename - }); + dom.window.close(); + manifest.push({ url, title, filename }); await fs.writeFile(path.resolve(cachePath, filename), contents); - console.log("- Response text saved to cache file"); // Incrementally update the manifest after every successful download, instead of waiting until the end. const newManifestContents = JSON.stringify(manifest, undefined, 2); await fs.writeFile(manifestPath, newManifestContents); - console.log("- Manifest updated"); + process.stdout.write("done\n"); ++chapterIndex; } @@ -79,18 +65,29 @@ function getNextChapterURL(rawChapterDoc) { // - https://parahumans.wordpress.com/2012/04/21/sentinel-9-6/ // So instead search for the first within the main content area starting with "Next", trimmed. + let result = null; const aEls = rawChapterDoc.querySelectorAll(".entry-content a"); for (let i = 0; i < aEls.length; ++i) { if (aEls[i].textContent.trim().startsWith("Next")) { - return aEls[i].href; + result = aEls[i].href; + break; } } - return null; + // Except, this doesn't always work, because the "Next Chapter" link in + // https://www.parahumans.net/2020/04/28/last-20-e6/ is just broken for some reason. We hard-code that. + if (result === "https://www.parahumans.net/?p=3365&preview=true") { + return "https://www.parahumans.net/2020/05/02/last-20-end/"; + } + return result; } function getChapterTitle(rawChapterDoc) { - return rawChapterDoc.querySelector("h1.entry-title").textContent; + // Remove " – " because it's present in Ward but not in Worm, which is inconsistent. (And leaving it in causes slight + // issues down the line where we remove spaces around em dashes during conversion.) In the future it might be nice to + // have proper chapter titles, e.g. sections per arc with title pages and then just "1" or similar for the chapter. + // Until then this is reasonable and uniform. + return rawChapterDoc.querySelector("h1.entry-title").textContent.replace(/ – /u, " "); } function retry(times, fn) { @@ -103,9 +100,33 @@ function retry(times, fn) { }); } -function downloadChapter(url) { +async function downloadChapter(startingURL) { + let urlToFollow = startingURL; + + let url, contents, dom; + while (urlToFollow !== null) { + const response = await downloadWithRetry(urlToFollow); + + url = urlToFollow; + contents = await response.text(); + dom = new JSDOM(contents, { url }); + + const refreshMeta = dom.window.document.querySelector("meta[http-equiv=refresh]"); + if (refreshMeta) { + [, urlToFollow] = /\d+;url=(.*)/ui.exec(refreshMeta.content); + process.stdout.write(`\n Redirected to ${urlToFollow}... `); + dom.window.close(); + } else { + urlToFollow = null; + } + } + + return { url, contents, dom }; +} + +function downloadWithRetry(url) { return retry(3, async () => { - const response = await request(url).redirects(10); + const response = await fetch(url); if (response.status !== 200) { throw new Error(`Response status for ${url} was ${response.status}`); } diff --git a/lib/scaffold.js b/lib/scaffold.js index e748acf..dda16b0 100644 --- a/lib/scaffold.js +++ b/lib/scaffold.js @@ -1,36 +1,29 @@ "use strict"; -const fs = require("mz/fs"); +const fs = require("fs").promises; const path = require("path"); -const cpr = require("thenify")(require("cpr")); +const cpr = require("util").promisify(require("cpr")); -const BOOK_TITLE = "Worm"; -const BOOK_AUTHOR = "wildbow"; const BOOK_PUBLISHER = "Domenic Denicola"; -const BOOK_ID = "urn:uuid:e7f3532d-8db6-4888-be80-1976166b7059"; - -// First paragraph of https://parahumans.wordpress.com/about/ -const BOOK_DESCRIPTION = ` -An introverted teenage girl with an unconventional superpower, Taylor goes out in costume to find escape from a deeply -unhappy and frustrated civilian life. Her first attempt at taking down a supervillain sees her mistaken for one, -thrusting her into the midst of the local ‘cape’ scene’s politics, unwritten rules, and ambiguous morals. As she risks -life and limb, Taylor faces the dilemma of having to do the wrong things for the right reasons.`; +const BOOK_AUTHOR = "Wildbow"; const NCX_FILENAME = "toc.ncx"; -const COVER_IMG_FILENAME = "cover.png"; -const COVER_XHTML_FILENAME = "cover.xhtml"; -const COVER_MIMETYPE = "image/png"; - -module.exports = async (scaffoldingPath, bookPath, contentPath, chaptersPath, manifestPath) => { +module.exports = async (scaffoldingPath, coverPath, bookPath, contentPath, chaptersPath, manifestPath, bookInfo) => { await Promise.all([ cpr(scaffoldingPath, bookPath, { overwrite: true, confirm: true, filter: noThumbs }), - getChapters(contentPath, chaptersPath, manifestPath).then(chapters => { + cpr(coverPath, path.resolve(bookPath, "OEBPS"), { overwrite: true, confirm: true, filter: noThumbs }), + Promise.all([ + getChapters(contentPath, chaptersPath, manifestPath), + getCoverFiles(coverPath) + ]).then(([chapters, coverFiles]) => { return Promise.all([ - writeOPF(chapters, contentPath), - writeNcx(chapters, contentPath) + writeOPF(chapters, contentPath, coverFiles, bookInfo), + writeNcx(chapters, contentPath, bookInfo) ]); }) ]); + + console.log(`EPUB contents assembled into ${scaffoldingPath}`); }; function noThumbs(filePath) { @@ -38,7 +31,7 @@ function noThumbs(filePath) { return path.basename(filePath) !== "Thumbs.db"; } -function writeOPF(chapters, contentPath) { +function writeOPF(chapters, contentPath, coverFiles, bookInfo) { const manifestChapters = chapters.map(c => { return ``; }).join("\n"); @@ -51,19 +44,19 @@ function writeOPF(chapters, contentPath) { - ${BOOK_TITLE} + ${bookInfo.title} en - ${BOOK_ID} + urn:uuid:${bookInfo.id} ${BOOK_AUTHOR} ${BOOK_PUBLISHER} - ${BOOK_DESCRIPTION} + ${bookInfo.description} - - + + ${manifestChapters} @@ -73,14 +66,14 @@ ${spineChapters} - + `; return fs.writeFile(path.resolve(contentPath, "content.opf"), contents); } -function writeNcx(chapters, contentPath) { +function writeNcx(chapters, contentPath, bookInfo) { const navPoints = chapters.map((c, i) => { return ` ${c.title} @@ -92,14 +85,14 @@ function writeNcx(chapters, contentPath) { - + - ${BOOK_TITLE} + ${bookInfo.title} @@ -133,3 +126,15 @@ async function getChapters(contentPath, chaptersPath, manifestPath) { }; }); } + +async function getCoverFiles(coverPath) { + const filenames = await fs.readdir(coverPath); + + const images = filenames.filter(f => [".png", ".jpg"].includes(path.extname(f))); + if (images.length !== 1) { + throw new Error(`Expected one cover image in ${coverPath}; found ${images.length}`); + } + const imageMimeType = path.extname(images[0]) === ".png" ? "image/png" : "image/jpeg"; + + return { xhtml: "cover.xhtml", imageMimeType, image: images[0] }; +} diff --git a/lib/substitutions.json b/lib/substitutions.json index 1e4995c..b73f8c2 100644 --- a/lib/substitutions.json +++ b/lib/substitutions.json @@ -5,7 +5,7 @@ "after": "bugs: flies, ants" }, { - "before": "

Brief note from the author: This story isn’t intended for young or sensitive readers. Readers who are on the lookout for trigger warnings are advised to give Worm a pass.

\n
\n", + "before": "

Brief note from the author: This story isn’t intended for young or sensitive readers. Readers who are on the lookout for trigger warnings are advised to give Worm a pass.

\n

\n", "after": "", "_comment": "The pseudo-trigger warning is out of place in an eBook." } @@ -30,6 +30,12 @@ "after": "east end" } ], + "https://parahumans.wordpress.com/2011/06/21/gestation-1-4/": [ + { + "before": "gang colors got out and and joined", + "after": "gang colors got out and joined" + } + ], "https://parahumans.wordpress.com/2011/06/28/gestation-1-6/": [ { "before": "That a girl", @@ -68,7 +74,7 @@ ], "https://parahumans.wordpress.com/2011/07/09/insinuation-2-2/": [ { - "before": "simply, “Bug”", + "before": "simply, “Bug.”", "after": "simply, ‘Bug’." }, { @@ -80,6 +86,10 @@ { "before": "He said, when he was", "after": "he said, when he was" + }, + { + "before": "attempt at trying to to salvage things", + "after": "attempt at trying to salvage things" } ], "https://parahumans.wordpress.com/2011/07/23/insinuation-2-6/": [ @@ -91,6 +101,10 @@ "before": "I felt painfully conspicuous", "after": "I felt painfully conspicuous." }, + { + "before": "Justin Beiber", + "after": "Justin Bieber" + }, { "before": "Lisa said. “Entire", "after": "Lisa said, “entire" @@ -106,6 +120,20 @@ "after": "explained, “here’s" } ], + "https://parahumans.wordpress.com/2011/08/02/insinuation-2-9/": [ + { + "before": "Hey dad", + "after": "Hey Dad" + }, + { + "before": "Really dad", + "after": "Really Dad" + }, + { + "before": "The Parahumans wiki", + "after": "The parahumans wiki" + } + ], "https://parahumans.wordpress.com/2011/08/09/agitation-3-1/": [ { "before": "Along the boardwalk", @@ -114,6 +142,10 @@ { "before": "night” Brian said, “I", "after": "night,” Brian said. “I" + }, + { + "before": "follow where my my index finger", + "after": "follow where my index finger" } ], "https://parahumans.wordpress.com/2011/08/16/agitation-3-3/": [ @@ -125,10 +157,6 @@ "before": "Brian said. “But", "after": "Brian said, “but" }, - { - "before": "better.", - "after": "better." - }, { "before": "he said. “So let’s", "after": "he said, “so let’s" @@ -146,6 +174,14 @@ { "before": "out?” My", "after": "out?” my" + }, + { + "before": "gangbangers easy access to to the rest of the city", + "after": "gangbangers easy access to the rest of the city" + }, + { + "before": "be, tonight, If that’s", + "after": "be, tonight, if that’s" } ], "https://parahumans.wordpress.com/2011/08/23/agitation-3-5/": [ @@ -168,18 +204,30 @@ { "before": "direction

", "after": "direction.

" + }, + { + "before": "had in her and and stood up", + "after": "had in her hand and stood up" } ], "https://parahumans.wordpress.com/2011/09/06/agitation-3-9/": [ { "before": "Aegis’s must have felt", "after": "Aegis must have felt" + }, + { + "before": "before she made made her way back", + "after": "before she made her way back" } ], "https://parahumans.wordpress.com/2011/09/10/agitation-3-10/": [ { "before": "meaning his aim was", "after": "his aim was" + }, + { + "before": "The scant few that that remained", + "after": "The scant few that remained" } ], "https://parahumans.wordpress.com/2011/09/13/agitation-3-11/": [ @@ -216,6 +264,10 @@ { "before": ",” I looked up from my work again, “", "after": ".” I looked up from my work again. “" + }, + { + "before": "make sense for him to to pull a fast one", + "after": "make sense for him to pull a fast one" } ], "https://parahumans.wordpress.com/2011/09/27/shell-4-2/": [ @@ -306,7 +358,7 @@ "after": "in point: shazam" }, { - "before": "‘Kay", + "before": "’Kay", "after": "’kay" } ], @@ -321,10 +373,6 @@ } ], "https://parahumans.wordpress.com/2011/10/29/shell-4-11/": [ - { - "before": "eyes, I see”", - "after": "eyes, I see.”" - }, { "before": "bugging the f-, uh", "after": "bugging the f—, uh" @@ -336,6 +384,10 @@ { "before": "so to speak, they", "after": "so to speak; they" + }, + { + "before": "Brian looked across the room,” We’ve", + "after": "Brian looked across the room. “We’ve" } ], "https://parahumans.wordpress.com/2011/11/12/hive-5-3/": [ @@ -346,6 +398,10 @@ { "before": "Terrifying.” Alan told my dad, “When", "after": "Terrifying,” Alan told my dad. “When" + }, + { + "before": "day to day basis", + "after": "day-to-day basis" } ], "https://parahumans.wordpress.com/2011/11/15/hive-5-4/": [ @@ -369,10 +425,6 @@ "before": "guardian spoke, “You’d", "after": "guardian spoke. “You’d" }, - { - "before": "‘Kay", - "after": "’Kay" - }, { "before": "‘specially with", "after": "’Specially with" @@ -400,6 +452,18 @@ { "before": "Bitch,” I murmured. “If you", "after": "Bitch,” I murmured, “if you" + }, + { + "before": "what I could see of the the second floor", + "after": "what I could see of the second floor" + }, + { + "before": "down the stairs. then as carefully as we could", + "after": "down the stairs. Then, as carefully as we could" + }, + { + "before": "I took his feet With agonizing slowness", + "after": "I took his feet. With agonizing slowness" } ], "https://parahumans.wordpress.com/2011/12/03/hive-5-9/": [ @@ -420,6 +484,14 @@ { "before": "East", "after": "east" + }, + { + "before": "“Yeah,” Newter grinned,” You can tell", + "after": "“Yeah,” Newter grinned. “You can tell" + }, + { + "before": "day to day interactions", + "after": "day-to-day interactions" } ], "https://parahumans.wordpress.com/2011/12/10/interlude-5/": [ @@ -440,6 +512,14 @@ { "before": "me,” she", "after": "me.” She" + }, + { + "before": "Hi dad", + "after": "Hi Dad" + }, + { + "before": "After mom died", + "after": "After Mom died" } ], "https://parahumans.wordpress.com/2011/12/17/tangle-6-2/": [ @@ -623,10 +703,6 @@ } ], "https://parahumans.wordpress.com/2012/01/28/buzz-7-4/": [ - { - "before": "on the way”", - "after": "on the way.”" - }, { "before": "better I’ll feel,” he was", "after": "better I’ll feel.” He was" @@ -634,13 +710,13 @@ { "before": "In short, It", "after": "In short, it" + }, + { + "before": "phone, Alec” Brian spoke", + "after": "phone, Alec,” Brian spoke" } ], "https://parahumans.wordpress.com/2012/01/31/buzz-7-5/": [ - { - "before": "in force”", - "after": "in force.”" - }, { "before": "realized,” Brian spoke. “I", "after": "realized,” Brian spoke, “I" @@ -696,10 +772,20 @@ "after": "wounds.

" } ], + "https://parahumans.wordpress.com/2012/02/14/buzz-7-9/": [ + { + "before": "with enough force to to bowl us", + "after": "with enough force to bowl us" + } + ], "https://parahumans.wordpress.com/2012/02/18/buzz-7-10/": [ { "before": "Coil,” I spoke. “It’s", "after": "Coil,” I spoke, “it’s" + }, + { + "before": "trying to convince me The question", + "after": "trying to convince me. The question" } ], "https://parahumans.wordpress.com/2012/02/25/buzz-7-12/": [ @@ -729,13 +815,13 @@ "before": "Walk or-", "after": "Walk or—" }, - { - "before": "twenty six years", - "after": "twenty-six years" - }, { "before": "here? Now?", "after": "here? Now?" + }, + { + "before": "one image came in contact with with something that", + "after": "one image came in contact with something that" } ], "https://parahumans.wordpress.com/2012/03/03/extermination-8-1/": [ @@ -748,8 +834,12 @@ "after": "east" }, { - "before": "listened to,", + "before": "listened to,", "after": "listened to." + }, + { + "before": "make out over the the wailing air raid", + "after": "make out over the wailing air raid" } ], "https://parahumans.wordpress.com/2012/03/06/extermination-8-2/": [ @@ -768,9 +858,21 @@ { "before": "featureless plain", "after": "featureless plane" + }, + { + "before": "majority of him was was muscled", + "after": "majority of him was muscled" } ], "https://parahumans.wordpress.com/2012/03/08/interlude-7%C2%BD-bonus/": [ + { + "before": "she been blossoming", + "after": "she had been blossoming" + }, + { + "before": "Get Ready!", + "after": "Get ready!" + }, { "before": "‘boyfriend’; Not", "after": "‘boyfriend’; not" @@ -828,16 +930,22 @@ "after": "A third person was gravely injured" }, { - "regExp": "\n ?\\s*([^<]+)(
|

)", - "replacement": "\n

$1

" + "before": "hunkered down to to watch", + "after": "hunkered down to watch" }, { - "regExp": "\n

([^<]+)(
|

)", - "replacement": "\n

$1

" + "before": "crash when when the wave rolled", + "after": "crash when the wave rolled" }, { - "regExp": "\n

([^<\n]+)
\n([^>\n]+)

\n", - "replacement": "\n

$1

\n

$2

\n" + "regExp": "

\n\\s*", + "replacement": "

\n

", + "_comment": "These are clearly paragraphs. Also the leading space is strange." + }, + { + "before": "Word choice, ‘too’: haunted by demons.
\nSwearing: antisocial.
", + "after": "Word choice, ‘too’: haunted by demons.

\n

Swearing: antisocial.", + "_comment": "This one has the surrounding the
, unlike the others." } ], "https://parahumans.wordpress.com/2012/03/10/extermination-8-3/": [ @@ -858,11 +966,11 @@ "after": "

Brigandine deceased, CD-5.

" }, { - "before": "deceased, CD-6.", + "before": "deceased
, CD-6.", "after": "deceased, CD-6.
" }, { - "before": "CD-6,
The armbands", + "before": "CD-6
, The armbands", "after": "CD-6
, the armbands" }, { @@ -874,11 +982,7 @@ "after": "CD-6.

" }, { - "before": "pushing.", - "after": "pushing." - }, - { - "before": "Narwhal,", + "before": "Narwhal,", "after": "Narwhal," }, { @@ -888,6 +992,10 @@ { "before": "reeled—He", "after": "reeled—he" + }, + { + "before": "Shielder’s bubble. water in front of", + "after": "Shielder’s bubble. Water in front of" } ], "https://parahumans.wordpress.com/2012/03/13/extermination-8-4/": [ @@ -932,7 +1040,7 @@ "after": "Aegis deceased, CD-6" }, { - "before": "down, CC-6.", + "before": "down, CC-6.", "after": "down, CC-6." }, { @@ -946,10 +1054,6 @@ { "before": "Negative.", "after": "Negative." - }, - { - "before": "up.", - "after": "up." } ], "https://parahumans.wordpress.com/2012/03/17/extermination-8-5/": [ @@ -974,17 +1078,13 @@ "after": "deceased, BW-8." }, { - "before": "deceased, CB-10.", + "before": "deceased, CB-10.", "after": "deceased, CB-10." }, { "before": "Defensive perimeter, report.", "after": "Defensive perimeter, report." }, - { - "before": "Enemy location unknown,", - "after": "Enemy location unknown," - }, { "before": "Dad.", "after": "Dad." @@ -1004,6 +1104,22 @@ { "before": "collapse

", "after": "collapse.

" + }, + { + "before": "diverted by the the PHQ’s", + "after": "diverted by the PHQ’s" + }, + { + "before": "Much as I’d like to to be", + "after": "Much as I’d like it to be" + }, + { + "before": "the blur of the halberd to to cut lines", + "after": "the blur of the halberd to cut lines" + }, + { + "before": "broken up by the the wall above the door", + "after": "broken up by the wall above the door" } ], "https://parahumans.wordpress.com/2012/03/20/extermination-8-6/": [ @@ -1080,6 +1196,10 @@ { "before": "hand at me, “She’s", "after": "hand at me, “she’s" + }, + { + "before": ", kay", + "after": ", ’kay" } ], "https://parahumans.wordpress.com/2012/03/27/extermination-8-8/": [ @@ -1094,6 +1214,11 @@ { "before": "of her head, “And my", "after": "of her head. “And my" + }, + { + "before": "KOOROW BULLIT
\nMILK         STUMPY
\nBROOTUS JOODUS
\nAXIL GINGIR", + "after": "KOOROW\u00A0\u00A0\u00A0BULLIT
\nMILK\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0STUMPY
\nBROOTUS\u00A0\u00A0JOODUS
\nAXIL\u00A0\u00A0\u00A0\u00A0\u00A0GINGIR", + "_comment": "This section plays poorly with our space-normalizing heuristic." } ], "https://parahumans.wordpress.com/2012/03/31/interlude-8/": [ @@ -1312,6 +1437,10 @@ { "before": "scratched-up hands, “No", "after": "scratched-up hands. “No" + }, + { + "before": "If mom pushes", + "after": "If Mom pushes" } ], "https://parahumans.wordpress.com/2012/04/17/sentinel-9-5/": [ @@ -1360,6 +1489,10 @@ { "before": "“…Things are", "after": "“…things are" + }, + { + "before": "swarm had gone Had the girl’s armor", + "after": "swarm had gone. Had the girl’s armor" } ], "https://parahumans.wordpress.com/2012/04/24/parasite-10-1/": [ @@ -1433,10 +1566,6 @@ "before": "Brian, “You’re", "after": "Brian. “You’re" }, - { - "before": "Why? Why come", - "after": "Why? Why come" - }, { "before": "‘Sides", "after": "’Sides" @@ -1542,6 +1671,10 @@ { "before": "“Mom!” He", "after": "“Mom!” he" + }, + { + "before": "So what did he do do you?", + "after": "So what did he do to you?" } ], "https://parahumans.wordpress.com/2012/05/17/interlude-10-5-bonus/": [ @@ -1583,21 +1716,11 @@ } ], "https://parahumans.wordpress.com/2012/05/19/infestation-11-1/": [ - { - "before": "was.. how", - "after": "was… how" - }, { "before": "Dinah being kidnapped and leaving", "after": "Dinah being kidnapped, and leaving" } ], - "https://parahumans.wordpress.com/2012/05/22/infestation-11-2/": [ - { - "before": "attentio n", - "after": "attention" - } - ], "https://parahumans.wordpress.com/2012/05/26/infestation-11-3/": [ { "before": "intimidating: A sea", @@ -1649,10 +1772,6 @@ } ], "https://parahumans.wordpress.com/2012/06/05/infestation-11-6/": [ - { - "before": "we do here”", - "after": "we do here.”" - }, { "before": "&", "after": "and" @@ -1676,15 +1795,15 @@ "replacement": "

" }, { - "before": "agreed-upon confidentiality.
\n■ ", + "before": "agreed-upon confidentiality.
\n■ ", "after": "agreed-upon confidentiality.

\n
    \n
  • " }, { - "regExp": "
    \n■ ", + "regExp": "
    \n■ ", "replacement": "
  • \n
  • " }, { - "before": "three, male.
    \nBoth vials", + "before": "three, male.
    \nBoth vials", "after": "three, male.
  • \n
\n

Both vials" }, { @@ -1697,6 +1816,10 @@ "before": "Charlotte,” I frowned. “Look", "after": "Charlotte,” I frowned, “look" }, + { + "before": "non-sequitor", + "after": "non-sequitur" + }, { "before": "Did they… was he", "after": "Did they… Was he" @@ -1704,16 +1827,20 @@ { "before": "see the Doctor", "after": "see the doctor", - "comment": "Unlike the Cauldron Doctor, this is not used as a proper noun" + "_comment": "Unlike the Cauldron Doctor, this is not used as a proper noun" }, { "before": "the Doctor spoke", "after": "the doctor spoke", - "comment": "Unlike the Cauldron Doctor, this is not used as a proper noun" + "_comment": "Unlike the Cauldron Doctor, this is not used as a proper noun" }, { "before": "asinine confession again, “It’s", "after": "asinine confession again. “It’s" + }, + { + "before": "people from the Church", + "after": "people from the church" } ], "https://parahumans.wordpress.com/2012/06/16/interlude-11a/": [ @@ -1736,10 +1863,6 @@ { "before": "“I—” Bitch paused, “Don’t", "after": "“I—” Bitch paused. “Don’t" - }, - { - "before": "Bitch,”", - "after": "Bitch,”" } ], "https://parahumans.wordpress.com/2012/06/17/interlude-11b/": [ @@ -1788,7 +1911,7 @@ "after": "my ‘candy’" }, { - "before": "Thirty Nine point", + "before": "Thirty-Nine point", "after": "Thirty-nine point" }, { @@ -1810,24 +1933,24 @@ "after": "

Sweet Honey—

" }, { - "before": "

Love me, love me, you know you wanna love me…
\nLove me, love me, you know you wanna love me…

", - "after": "

Love me, love me, you know you wanna love me…
\nLove me, love me, you know you wanna love me…

" + "before": "

Love me, love me, you know you wanna love me…
\nLove me, love me, you know you wanna love me…

", + "after": "

Love me, love me, you know you wanna love me…
\nLove me, love me, you know you wanna love me…

" }, { - "before": "

Love me, you?
\nLove me, true?

", - "after": "

Love me, you?
\nLove me, true?

" + "before": "

Love me, you?
\nLove me, true?

", + "after": "

Love me, you?
\nLove me, true?

" }, { - "before": "

Crazed, kooky, cracked, crazy,
\nNutty, barmy, mad for me…

", - "after": "

Crazed, kooky, cracked, crazy,
\nNutty, barmy, mad for me…

" + "before": "

Crazed, kooky, cracked, crazy,
\nNutty, barmy, mad for me…

", + "after": "

Crazed, kooky, cracked, crazy,
\nNutty, barmy, mad for me…

" }, { - "before": "

Crazed, kooky, cracked, crazy,
\nMental, dotty, whacked, loopy…

", - "after": "

Crazed, kooky, cracked, crazy,
\nMental, dotty, whacked, loopy…

" + "before": "

Crazed, kooky, cracked, crazy,
\nMental, dotty, whacked, loopy…

", + "after": "

Crazed, kooky, cracked, crazy,
\nMental, dotty, whacked, loopy…

" }, { - "before": "

Crazed, kooky, cracked, crazy,
\nNutty, screwy, mentally diseased…
\n
She ", - "after": "

Crazed, kooky, cracked, crazy,
\nNutty, screwy, mentally diseased…

\n

She " + "before": "

Crazed, kooky, cracked, crazy,
\nNutty, screwy, mentally diseased…
\n
\n
She ", + "after": "

Crazed, kooky, cracked, crazy,
\nNutty, screwy, mentally diseased…

\n

She " }, { "before": "Ça va?", @@ -1846,6 +1969,18 @@ { "before": "I… a therapist", "after": "I… A therapist" + }, + { + "before": "look after dad", + "after": "look after Dad" + }, + { + "before": "Why heal dad now", + "after": "Why heal Dad now" + }, + { + "before": "you just leave dad to suffer", + "after": "you just leave Dad to suffer" } ], "https://parahumans.wordpress.com/2012/06/26/plague-12-1/": [ @@ -1932,6 +2067,10 @@ { "before": "He smiled, “This is", "after": "He smiled. “This is" + }, + { + "before": "and his his eyes drifted", + "after": "and his eyes drifted" } ], "https://parahumans.wordpress.com/2012/07/07/plague-12-4/": [ @@ -1964,6 +2103,24 @@ { "before": "The Slaughterhouse Nine are here?", "after": "The Slaughterhouse Nine are here?" + }, + { + "before": "getting my costume off and getting dad somewhere safe", + "after": "getting my costume off and getting Dad somewhere safe" + }, + { + "before": "I love you dad", + "after": "I love you Dad" + }, + { + "before": "leaving the space that mom had once occupied", + "after": "leaving the space that Mom had once occupied" + } + ], + "https://parahumans.wordpress.com/2012/07/14/plague-12-6/": [ + { + "before": "had their shots” I said", + "after": "had their shots,” I said" } ], "https://parahumans.wordpress.com/2012/07/17/plague-12-7/": [ @@ -1983,6 +2140,10 @@ } ], "https://parahumans.wordpress.com/2012/07/26/interlude-12%C2%BD/": [ + { + "before": "implode, it has created a powerful vacuum in someone’s mouth, that", + "after": "implode, and it has created a powerful vacuum in someone’s mouth that" + }, { "before": "doesn’t,” Madcap said. “But", "after": "doesn’t,” Madcap said, “but" @@ -2024,16 +2185,15 @@ "after": "hon,” Celia said, “we’ve" } ], - "https://parahumans.wordpress.com/2012/08/11/snare-13-5/": [ - { - "before": "similar.", - "after": "similar." - } - ], "https://parahumans.wordpress.com/2012/08/14/snare-13-6/": [ { "before": "Grue,” Trickster said. “Get", "after": "Grue,” Trickster said, “get" + }, + { + "before": "Nothing she can’t do outside the bubble", + "after": "Nothing she can do outside the bubble", + "_comment": "This doesn't make sense logically with 'can’t'." } ], "https://parahumans.wordpress.com/2012/08/18/snare-13-7/": [ @@ -2076,6 +2236,10 @@ { "before": ", like", "after": ", like" + }, + { + "before": "Then dad ordered you to kill him", + "after": "Then Dad ordered you to kill him" } ], "https://parahumans.wordpress.com/2012/09/08/prey-14-2/": [ @@ -2086,18 +2250,22 @@ ], "https://parahumans.wordpress.com/2012/09/11/prey-14-3/": [ { - "before": "truck reached
\nthe other Nine", + "before": "truck reached
\nthe other Nine", "after": "truck reached the other Nine" }, { "before": "to,” Grue said. “But", "after": "to,” Grue said, “but" + }, + { + "before": "through.We crossed", + "after": "through. We crossed" } ], "https://parahumans.wordpress.com/2012/09/15/prey-14-4/": [ { - "before": "a ‘No, you just told me.‘, but", - "after": "a “No, you just told me,” but" + "before": "a ‘No, you just told me.’, but", + "after": "a ‘No, you just told me,’ but" }, { "before": "Amy,” Tattletale said. “But", @@ -2142,12 +2310,12 @@ ], "https://parahumans.wordpress.com/2012/10/18/interlude-15-donation-bonus/": [ { - "before": "volunteered, asked
\n
to", + "before": "volunteered, asked
\n
to", "after": "volunteered, asked to" }, { - "before": "her father’s abilities”", - "after": "her father’s abilities.”" + "before": "happened to my daughter!?", + "after": "happened to my daughter!?" } ], "https://parahumans.wordpress.com/2012/10/25/interlude-15-donation-bonus-2/": [ @@ -2157,6 +2325,11 @@ } ], "https://parahumans.wordpress.com/2012/10/20/colony-15-2/": [ + { + "before": "turned something", + "after": "taken something", + "_comment": "'turned' is repeated later in the sentence." + }, { "before": "on,” Tattletale said. “Let’s", "after": "on,” Tattletale said, “let’s" @@ -2167,6 +2340,11 @@ } ], "https://parahumans.wordpress.com/2012/10/23/colony-15-3/": [ + { + "before": "whether or not I agreed or not", + "after": "whether I agreed or not", + "_comment": "Alternatively, the second 'or not' could be deleted instead of the first." + }, { "before": "Woah,” Regent said. “Relax", "after": "Woah,” Regent said, “relax" @@ -2178,6 +2356,11 @@ { "before": "the street

", "after": "the street.

" + }, + { + "before": "dishonest members", + "after": "dishonest member", + "_comment": "He's talking only about Skitter here." } ], "https://parahumans.wordpress.com/2012/10/27/colony-15-4/": [ @@ -2200,16 +2383,6 @@ "after": "this,” Regent said, “I" } ], - "https://parahumans.wordpress.com/2012/11/03/colony-15-6/": [ - { - "before": "M.O..", - "after": "M.O." - }, - { - "before": "tearing flesh..", - "after": "tearing flesh." - } - ], "https://parahumans.wordpress.com/2012/11/06/colony-15-7/": [ { "before": "this sort of resistance.", @@ -2228,6 +2401,18 @@ { "before": "to,” Alexandria spoke. “Is", "after": "to,” Alexandria spoke, “is" + }, + { + "before": "leave?” Hero asked.”Why", + "after": "leave?” Hero asked. “Why" + }, + { + "before": "Alexandria said.”Why", + "after": "Alexandria said. “Why" + }, + { + "before": "voice as quiet.”We’ve got teams", + "after": "voice as quiet. “We’ve got teams" } ], "https://parahumans.wordpress.com/2012/11/10/colony-15-8/": [ @@ -2246,23 +2431,35 @@ { "before": "was: Multitasking", "after": "was: multitasking" + }, + { + "before": "of you and mom", + "after": "of you and Mom" + }, + { + "before": "better pictures of mom", + "after": "better pictures of Mom" } ], "https://parahumans.wordpress.com/2012/11/20/interlude-15/": [ { "before": "before,” Dragon replied. “Is", "after": "before,” Dragon replied, “is" + }, + { + "before": "Once dad and the sibs realized", + "after": "Once Dad and the sibs realized" } ], "https://parahumans.wordpress.com/2012/11/24/monarch-16-1/": [ - { - "before": "A.I..", - "after": "A.I." - }, { "before": "; Nobody", "after": "; nobody" }, + { + "before": "version on", + "after": "version of" + }, { "before": "is,” Tattletale said. “They’ve", "after": "is,” Tattletale said, “they’ve" @@ -2274,12 +2471,6 @@ "after": "that,” Grue said, “is" } ], - "https://parahumans.wordpress.com/2012/11/29/interlude-16-donation-bonus/": [ - { - "before": "in the darkness”", - "after": "in the darkness.”" - } - ], "https://parahumans.wordpress.com/2012/12/01/monarch-16-3/": [ { "before": "two teams” I said", @@ -2299,19 +2490,13 @@ } ], "https://parahumans.wordpress.com/2012/12/11/monarch-16-6/": [ - { - "before": "Lost in thought”", - "after": "Lost in thought.”" - }, { "before": "—But we definitely", "after": "—but we definitely" - } - ], - "https://parahumans.wordpress.com/2012/12/13/interlude-16-donation-bonus-2/": [ + }, { - "before": "", - "after": "”" + "before": "all the way up to the the nape of my neck", + "after": "all the way up to the nape of my neck" } ], "https://parahumans.wordpress.com/2012/12/15/monarch-16-7/": [ @@ -2332,6 +2517,11 @@ { "before": "decisions: Holding back", "after": "decisions: holding back" + }, + { + "before": "their positioning, they had planned this", + "after": "their positioning… They had planned this", + "_comment": "A comma seems like the wrong choice here." } ], "https://parahumans.wordpress.com/2012/12/22/monarch-16-9/": [ @@ -2365,10 +2555,6 @@ } ], "https://parahumans.wordpress.com/2013/01/05/monarch-16-13/": [ - { - "before": "word on both points”", - "after": "word on both points.”" - }, { "before": "doubts,” I said. “You", "after": "doubts,” I said, “you" @@ -2380,6 +2566,14 @@ { "before": "ten,” I asked. “Just", "after": "ten,” I asked, “just" + }, + { + "before": "weeks, months. Anticipating", + "after": "weeks, months. Anticipating" + }, + { + "before": "as much or more about Parahumans than", + "after": "as much or more about parahumans than" } ], "https://parahumans.wordpress.com/2013/01/08/migration-17-1/": [ @@ -2408,6 +2602,10 @@ { "before": "city,” Jess said. “And", "after": "city,” Jess said, “and" + }, + { + "before": "“No!”", + "after": "“No!”" } ], "https://parahumans.wordpress.com/2013/01/10/migration-17-3/": [ @@ -2422,12 +2620,21 @@ { "before": "other,” Krouse said. “We’ll", "after": "other,” Krouse said, “we’ll" + }, + { + "before": "to the point that she was pushing pushing past", + "after": "to the point that she was pushing past" } ], "https://parahumans.wordpress.com/2013/01/11/migration-17-4/": [ { "before": "GWER-.

", "after": "GWER—.

" + }, + { + "before": "the Birdcage", + "after": "the birdcage", + "_comment": "A literal birdcage, not the parahuman prison." } ], "https://parahumans.wordpress.com/2013/01/12/migration-17-5/": [ @@ -2450,6 +2657,10 @@ { "before": "side,” Luke said. “But", "after": "side,” Luke said, “but" + }, + { + "before": "ninety percent or more of the the city", + "after": "ninety percent or more of the city" } ], "https://parahumans.wordpress.com/2013/01/13/migration-17-6/": [ @@ -2472,6 +2683,10 @@ { "before": "the glass vial

", "after": "the glass vial.

" + }, + { + "before": "discovering that mom was right", + "after": "discovering that Mom was right" } ], "https://parahumans.wordpress.com/2013/01/14/migration-17-7/": [ @@ -2494,23 +2709,35 @@ { "before": "exaggerated shrug

", "after": "exaggerated shrug.

" + }, + { + "before": "the P.R.T. uniforms", + "after": "the PRT uniforms" + }, + { + "before": "injured P.R.T. soldier", + "after": "injured PRT soldier" } ], "https://parahumans.wordpress.com/2013/01/15/migration-17-8/": [ { - "before": "replied. Need to talk about being more secure with our names. “What’s going on?", + "before": "replied. Need to talk about being more secure with our names. “What’s going on?”", "after": "replied. Need to talk about being more secure with our names. “What’s going on?”" }, { "before": "Krouse,” Luke said. “We", "after": "Krouse,” Luke said, “we" + }, + { + "before": "on his knees. he held the cigarette", + "after": "on his knees. He held the cigarette" + }, + { + "before": "‘hief!", + "after": "’hief!" } ], "https://parahumans.wordpress.com/2013/01/19/queen-18-1/": [ - { - "before": "untrustworthy.", - "after": "untrustworthy." - }, { "before": "know,” Tattletale said. “But", "after": "know,” Tattletale said, “but" @@ -2574,8 +2801,8 @@ ], "https://parahumans.wordpress.com/2013/02/05/monarch-18-6/": [ { - "before": "M.M..", - "after": "M.M." + "before": "he encouragement", + "after": "the encouragement" }, { "before": "‘okay’", @@ -2595,6 +2822,18 @@ { "before": "Kayden,” Theo said. “You’re", "after": "Kayden,” Theo said, “you’re" + }, + { + "before": "about how Masters tend to have", + "after": "about how masters tend to have" + }, + { + "before": "that was why Masters tend to be", + "after": "that was why masters tend to be" + }, + { + "before": "the top researchers on Parahumans", + "after": "the top researchers on parahumans" } ], "https://parahumans.wordpress.com/2013/02/07/interlude-18-donation-bonus-3/": [ @@ -2602,10 +2841,6 @@ "before": "fighting. But.", "after": "fighting. But…" }, - { - "before": "r,s", - "after": "r, s" - }, { "before": "—But I have", "after": "—but I have" @@ -2645,6 +2880,10 @@ { "before": "priest,” he said. “I", "after": "priest,” he said, “I" + }, + { + "before": "Jessica observed She looked like", + "after": "Jessica observed. She looked like" } ], "https://parahumans.wordpress.com/2013/02/09/queen-18-7/": [ @@ -2655,6 +2894,10 @@ { "before": "fight,” Tattletale said. “And", "after": "fight,” Tattletale said, “and" + }, + { + "before": "earth-shaking", + "after": "earthshaking" } ], "https://parahumans.wordpress.com/2013/02/12/queen-18-8/": [ @@ -2669,10 +2912,6 @@ { "before": "better,” I said. “Eidolon", "after": "better,” I said, “Eidolon" - }, - { - "before": "giving her us.", - "after": "giving her us." } ], "https://parahumans.wordpress.com/2013/02/14/interlude-18-donation-bonus-4/": [ @@ -2713,6 +2952,12 @@ "after": "the phone.

" } ], + "https://parahumans.wordpress.com/2013/02/16/interlude-18/": [ + { + "before": "her feet.”We’re", + "after": "her feet. “We’re" + } + ], "https://parahumans.wordpress.com/2013/02/19/scourge-19-1/": [ { "before": "Rachel,” Tattletale said. “Come", @@ -2743,6 +2988,10 @@ { "before": "and be brought it", "after": "and he brought it" + }, + { + "before": "propellers  One caught her", + "after": "propellers. One caught her" } ], "https://parahumans.wordpress.com/2013/03/02/scourge-19-4/": [ @@ -2763,6 +3012,12 @@ "after": "noting,” Legend said, “that" } ], + "https://parahumans.wordpress.com/2013/03/05/scourge-19-5/": [ + { + "before": "returned to a standing position Her face was softer", + "after": "returned to a standing position. Her face was softer" + } + ], "https://parahumans.wordpress.com/2013/03/09/scourge-19-6/": [ { "before": "heailng", @@ -2799,7 +3054,17 @@ { "before": "Unfortunate tinker", "after": "Unfortunate tinker", - "_comment": "See convert.js; this corrects an over-correction" + "_comment": "See convert-worker.js; this corrects an over-correction" + } + ], + "https://parahumans.wordpress.com/2013/03/19/interlude-19/": [ + { + "before": "white noise that had subsumed her her thoughts when", + "after": "white noise that had subsumed her thoughts when" + }, + { + "before": "Hey dad", + "after": "Hey Dad" } ], "https://parahumans.wordpress.com/2013/03/21/chrysalis-20-1/": [ @@ -2813,6 +3078,10 @@ } ], "https://parahumans.wordpress.com/2013/03/23/chrysalis-20-2/": [ + { + "before": "something together something", + "after": "something together" + }, { "before": "of anxiety.", "after": "of anxiety." @@ -2822,6 +3091,10 @@ { "before": "attacked the boardwalk", "after": "attacked the Boardwalk" + }, + { + "before": "Hi dad", + "after": "Hi Dad" } ], "https://parahumans.wordpress.com/2013/03/30/chrysalis-20-4/": [ @@ -2866,7 +3139,11 @@ { "before": "the Clairvoyant", "after": "the clairvoyant", - "_comment": "see convert.js; this corrects an over-correction" + "_comment": "See convert-worker.js; this corrects an over-correction" + }, + { + "before": "maintain eye contact. he could feel the warmth", + "after": "maintain eye contact. He could feel the warmth" } ], "https://parahumans.wordpress.com/2013/04/09/imago-21-1/": [ @@ -2891,6 +3168,30 @@ { "before": "—But they’re only", "after": "—but they’re only" + }, + { + "before": "harder than it’d be to explain to dad", + "after": "harder than it’d be to explain to Dad" + }, + { + "before": "all of the stuff that dad’s probably finding", + "after": "all of the stuff that Dad’s probably finding" + }, + { + "before": "telling you or dad about it", + "after": "telling you or Dad about it" + }, + { + "before": "I didn’t leave dad", + "after": "I didn’t leave Dad" + }, + { + "before": "I know you and dad won’t approve", + "after": "I know you and Dad won’t approve" + }, + { + "before": "hundred and ten-percent", + "after": "hundred and ten percent" } ], "https://parahumans.wordpress.com/2013/04/16/imago-21-3/": [ @@ -2925,6 +3226,15 @@ { "before": "to,” I said. “Is", "after": "to,” I said, “is" + }, + { + "before": "are sorry your", + "after": "are sorry your", + "_comment": "All the other 'sorry's are emphasized in this paragraph" + }, + { + "before": "sorry that", + "after": "sorry that" } ], "https://parahumans.wordpress.com/2013/04/25/imago-21-7/": [ @@ -2935,6 +3245,10 @@ { "before": "Ironic,” she mumbled. “Coming", "after": "Ironic,” she mumbled, “coming" + }, + { + "before": "to looked around", + "after": "to look around" } ], "https://parahumans.wordpress.com/2013/04/27/interlude-21-donation-bonus-1/": [ @@ -2983,6 +3297,10 @@ { "before": "But.“ He", "after": "But.” He" + }, + { + "before": "is led by non-capes", + "after": "is led by non-capes" } ], "https://parahumans.wordpress.com/2013/05/09/cell-22-3/": [ @@ -3001,10 +3319,6 @@ { "before": "in,” I said. “Could", "after": "in,” I said, “could" - }, - { - "before": " “ We’re", - "after": "“We’re" } ], "https://parahumans.wordpress.com/2013/05/16/cell-22-6/": [ @@ -3034,10 +3348,6 @@ "before": "it,” he said. “She", "after": "it,” he said, “she" }, - { - "before": "“ I don’t", - "after": "“I don’t" - }, { "before": "confirmed okay", "after": "confirmed ok", @@ -3045,6 +3355,10 @@ } ], "https://parahumans.wordpress.com/2013/05/21/interlude-22-donation-bonus-1/": [ + { + "before": "Sumimasen deshita", + "after": "Sumimasen deshita" + }, { "before": "“is it reassuring", "after": "“Is it reassuring" @@ -3056,6 +3370,10 @@ { "before": "their ears

", "after": "their ears.

" + }, + { + "before": "it’s import", + "after": "its import" } ], "https://parahumans.wordpress.com/2013/05/25/drone-23-1/": [ @@ -3073,6 +3391,10 @@ "before": "of the ship. It’s", "after": "of the ship.’ It’s" }, + { + "before": "supervillain-turned hero", + "after": "supervillain-turned-hero" + }, { "before": "Las Vegas Rogue", "after": "Las Vegas rogue" @@ -3095,6 +3417,10 @@ } ], "https://parahumans.wordpress.com/2013/05/30/drone-23-3/": [ + { + "before": "nerf", + "after": "Nerf" + }, { "before": "Nine,” Glenn said. “I", "after": "Nine,” Glenn said, “I" @@ -3106,6 +3432,10 @@ } ], "https://parahumans.wordpress.com/2013/06/01/drone-23-4/": [ + { + "before": "FIrst", + "after": "First" + }, { "before": "said. Someone", "after": "said. “Someone" @@ -3115,9 +3445,17 @@ { "before": "it,” Imp said. “She’s", "after": "it,” Imp said, “she’s" + }, + { + "before": "electorcuted", + "after": "electrocuted" } ], "https://parahumans.wordpress.com/2013/06/06/interlude-23/": [ + { + "before": "one—or two-word", + "after": "one- or two-word" + }, { "before": "her mouth: A click", "after": "her mouth: a click" @@ -3139,8 +3477,8 @@ ], "https://parahumans.wordpress.com/2013/06/11/crushed-24-2/": [ { - "before": "To Behemoth”", - "after": "To Behemoth.”" + "before": "They destroying", + "after": "They were destroying" } ], "https://parahumans.wordpress.com/2013/06/15/crushed-24-3/": [ @@ -3158,6 +3496,10 @@ { "before": "aren’t allies.", "after": "aren’t allies.”" + }, + { + "before": "Blameful? “Guilty", + "after": "Blameful? “Guilty" } ], "https://parahumans.wordpress.com/2013/06/20/crushed-24-5/": [ @@ -3187,11 +3529,15 @@ "https://parahumans.wordpress.com/2013/06/25/interlude-24-donation-bonus-1/": [ { "before": "silence like this. Divide: They", - "after": "silence like this.
Divide: They" + "after": "silence like this.
Divide: They" }, { "before": "Bay,” Wanton said. “Not", "after": "Bay,” Wanton said, “not" + }, + { + "before": "Connecting to “agChat.ParahumansOnline016.par:6667” (Attempt 1 of 55)
\nResolving Host Name
\nConnecting…
\nConnected.
\nUsing identityIblis”, nick “Iblis”
\nWelcome to Parahumans Online Chatroom #116, ‘The Holdout’. Rules Here. Behave. Obey the @s.
", + "after": "Connecting to “agChat.ParahumansOnline016.par:6667” (Attempt 1 of 55)
\nResolving Host Name
\nConnecting…
\nConnected.
\nUsing identity “Iblis”, nick “Iblis”
\nWelcome to Parahumans Online Chatroom #116, ‘The Holdout’. Rules Here. Behave. Obey the @s.
" } ], "https://parahumans.wordpress.com/2013/06/29/scarab-25-1/": [ @@ -3209,9 +3555,22 @@ } ], "https://parahumans.wordpress.com/2013/07/02/scarab-25-2/": [ + { + "before": "Enough or three", + "after": "Enough for three" + }, + { + "before": "—3", + "after": "-3", + "_comment": "This is a computer display and thus probably uses a regular hyphen for the minus sign." + }, { "before": "said. Except without", "after": "said. “Except without" + }, + { + "before": "line, t had", + "after": "line, it had" } ], "https://parahumans.wordpress.com/2013/07/06/scarab-25-3/": [ @@ -3222,6 +3581,14 @@ { "before": "There’ more", "after": "There’s more" + }, + { + "before": "White capped", + "after": "White-capped" + }, + { + "before": ". “Bosses are worried.”", + "after": ". “Bosses are worried.”" } ], "https://parahumans.wordpress.com/2013/07/09/scarab-25-4/": [ @@ -3263,17 +3630,20 @@ }, { "before": "SimurghNotes", - "after": "Simurgh
Notes" + "after": "Simurgh
Notes" }, { "before": "avoided-", "after": "avoided" - } - ], - "https://parahumans.wordpress.com/2013/07/16/interlude-25/": [ + }, { - "before": "your manners?”", - "after": "your manners?”" + "before": "Lord Walston", + "after": "Lord Walston" + }, + { + "before": "—16", + "after": "-16", + "_comment": "This is a computer display and thus probably uses a regular hyphen for the minus sign." } ], "https://parahumans.wordpress.com/2013/07/18/sting-26-1/": [ @@ -3284,9 +3654,18 @@ { "before": "Master and stranger", "after": "master and stranger" + }, + { + "before": "nearly-three-hundred", + "after": "nearly three hundred" } ], "https://parahumans.wordpress.com/2013/07/20/sting-26-2/": [ + { + "before": "It didn’t hurt that", + "after": "It didn’t help that", + "_comment": "This makes more sense with 'help'" + }, { "before": "And gauntlet
, to reply to the last one", "after": "And gauntlet, to reply to the last one
" @@ -3294,6 +3673,10 @@ { "before": "a burst of alarm.", "after": "a burst of alarm." + }, + { + "before": "Up from Eighty-three point four percent", + "after": "Up from eighty-three point four percent" } ], "https://parahumans.wordpress.com/2013/07/23/sting-26-3/": [ @@ -3301,10 +3684,6 @@ "before": "the other-.", "after": "the other—" }, - { - "before": "“Yeah”", - "after": "“Yeah.”" - }, { "before": "Vista,” he said. “Another", "after": "Vista,” he said, “another" @@ -3312,12 +3691,20 @@ { "before": "me,” I said. “Is", "after": "me,” I said, “is" + }, + { + "before": "

“Help’s on the way.”

", + "after": "

Help’s on the way.

" } ], "https://parahumans.wordpress.com/2013/07/25/interlude-26-donation-bonus-1/": [ { "before": "think,” Dobrynja said. “You’ve", "after": "think,” Dobrynja said, “you’ve" + }, + { + "before": "particular type out there Eight Cherishes are dead", + "after": "particular type out there. Eight Cherishes are dead" } ], "https://parahumans.wordpress.com/2013/07/27/sting-26-4/": [ @@ -3332,18 +3719,33 @@ ], "https://parahumans.wordpress.com/2013/07/30/sting-26-5/": [ { - "before": " Wait…", - "after": " Wait…" + "before": " Wait…“

", + "after": " Wait…”

" }, { "before": "This,” Imp said. “Is", "after": "This,” Imp said, “is" - } - ], - "https://parahumans.wordpress.com/2013/08/03/sting-26-6/": [ + }, { - "before": "canals..", - "after": "canals." + "before": "kill all of the Masters that are generating", + "after": "kill all of the masters that are generating" + }, + { + "before": "—break up the fog!", + "after": "—break up the fog!" + }, + { + "before": "The Nyx were women", + "after": "The Nyxes were women" + }, + { + "before": "Psychosomas were men,", + "after": "Psychosomas were men:", + "_comment": "This is a strange sentence, but these changes make it flow better" + }, + { + "before": "Night hags", + "after": "Night Hags" } ], "https://parahumans.wordpress.com/2013/08/06/interlude-26a/": [ @@ -3372,7 +3774,7 @@ ], "https://parahumans.wordpress.com/2013/08/10/interlude-26/": [ { - "before": "variation...", + "before": "variation…. ", "after": "variation…" }, { @@ -3390,6 +3792,14 @@ { "before": "these past few years

", "after": "these past few years.

" + }, + { + "before": "Focus Memorize.", + "after": "Focus. Memorize." + }, + { + "before": "The Entity slowed", + "after": "The entity slowed" } ], "https://parahumans.wordpress.com/2013/08/13/extinction-27-1/": [ @@ -3418,10 +3828,6 @@ { "before": "shift position

", "after": "shift position.

" - }, - { - "before": "“ Convenient.", - "after": "“Convenient." } ], "https://parahumans.wordpress.com/2013/08/20/extinction-27-3/": [ @@ -3430,14 +3836,8 @@ "after": "guess,” Sophia said, “you" }, { - "before": "said “ But", - "after": "said. “But" - } - ], - "https://parahumans.wordpress.com/2013/08/22/extinction-27-4/": [ - { - "before": "pattern..", - "after": "pattern." + "before": "“Maybe,” I said “But", + "after": "“Maybe,” I said. “But" } ], "https://parahumans.wordpress.com/2013/08/24/extinction-27-5/": [ @@ -3456,6 +3856,10 @@ { "before": "surface Just the", "after": "surface. Just the" + }, + { + "before": "three birdcage capes", + "after": "three Birdcage capes" } ], "https://parahumans.wordpress.com/2013/08/27/interlude-27/": [ @@ -3474,8 +3878,8 @@ ], "https://parahumans.wordpress.com/2013/08/31/cockroaches-28-1/": [ { - "before": "lot of supplies in”", - "after": "lot of supplies in.”" + "before": "“No, I said.", + "after": "“No,” I said." }, { "before": "could save issue", @@ -3488,8 +3892,8 @@ ], "https://parahumans.wordpress.com/2013/09/03/cockroaches-28-2/": [ { - "before": "Next", - "after": "Next" + "before": "Next 12 of 32 additional windows.", + "after": "Next 12 of 32 additional windows." }, { "before": "—But no", @@ -3546,21 +3950,13 @@ "after": "I’m not? Fuck. There’s" }, { - "before": "‘Freud‘, and", - "after": "‘Freud’, and" - }, - { - "before": "‘who knows?‘", - "after": "‘who knows?’" + "before": "‘I don’t know,”", + "after": "“I don’t know,”" }, { "before": "I suspect It’s a", "after": "I suspect it’s a" }, - { - "before": "Case Fifty-three", - "after": "case fifty-three" - }, { "before": "reality,” Tattletale said. “What’s", "after": "reality,” Tattletale said, “what’s" @@ -3578,17 +3974,13 @@ { "before": "be,” Glenn said. “Accept", "after": "be,” Glenn said, “accept" + }, + { + "before": "beginning of the movie, or or says", + "after": "beginning of the movie, or says" } ], "https://parahumans.wordpress.com/2013/09/17/interlude-28/": [ - { - "before": "“Password protected”", - "after": "“Password protected.”" - }, - { - "before": "Case fifty-threes", - "after": "case fifty-threes" - }, { "before": "than,” Revel paused. “Six", "after": "than,” Revel paused, “six" @@ -3596,6 +3988,10 @@ { "before": "willingly,” Weld said. “Before", "after": "willingly,” Weld said, “before" + }, + { + "before": "onto the phone. seven point font", + "after": "onto the phone. Seven point font" } ], "https://parahumans.wordpress.com/2013/09/19/venom-29-1/": [ @@ -3632,10 +4028,6 @@ { "before": "Once the bead was in place, every bullet hit.", "after": "Once the bead was in place, every bullet hit." - }, - { - "before": "I ‘m", - "after": "I’m" } ], "https://parahumans.wordpress.com/2013/09/24/venom-29-3/": [ @@ -3690,6 +4082,10 @@ { "before": "this,” I said. “I", "after": "this,” I said, “I" + }, + { + "before": "Second Triggers", + "after": "Second triggers" } ], "https://parahumans.wordpress.com/2013/10/05/venom-29-8/": [ @@ -3710,12 +4106,24 @@ { "before": "by Golem’s bindings

", "after": "by Golem’s bindings.

" + }, + { + "before": "have time to react. the light detonated", + "after": "have time to react. The light detonated" } ], "https://parahumans.wordpress.com/2013/10/12/interlude-29/": [ { "before": "the host’s natures", "after": "the hosts’ natures" + }, + { + "before": "panting for breath. the wound at his", + "after": "panting for breath. The wound at his" + }, + { + "before": "appeared behind her A man with yellow skin", + "after": "appeared behind her. A man with yellow skin" } ], "https://parahumans.wordpress.com/2013/10/15/speck-30-1/": [ @@ -3729,10 +4137,6 @@ "before": "‘lowed to do that, ‘miright", "after": "’lowed to do that, ’miright" }, - { - "before": "path was clear,", - "after": "path was clear." - }, { "before": "hard, don’t you
?", "after": "hard, don’t you?" @@ -3758,6 +4162,10 @@ { "before": "coordinating two teams.", "after": "coordinating two teams." + }, + { + "before": "undecision", + "after": "indecision" } ], "https://parahumans.wordpress.com/2013/10/22/speck-30-4/": [ @@ -3868,12 +4276,12 @@ "after": "gun built" }, { - "before": "hunchbacked Case fifty-three", - "after": "hunchbacked case fifty-three" + "before": "I revoked my control over her, leaving in in the middle", + "after": "I revoked my control over her, leaving her in the middle" }, { - "before": "moved Case fifty-threes", - "after": "moved case fifty-threes" + "before": "suffered for", + "after": "suffered from" } ], "https://parahumans.wordpress.com/2013/10/26/speck-30-6/": [ @@ -3916,6 +4324,14 @@ { "before": "resulting crater that compared with", "after": "resulting crater compared with" + }, + { + "before": "on the other earth", + "after": "on the other Earth" + }, + { + "before": "name? did it start", + "after": "name? Did it start" } ], "https://parahumans.wordpress.com/2013/10/29/30-7/": [ @@ -3958,12 +4374,24 @@ { "before": "“Yes,’ I", "after": "“Yes,” I" + }, + { + "before": "against me. it would be idiotic", + "after": "against me. It would be idiotic" + }, + { + "before": "hand as he talked. he pointed to me", + "after": "hand as he talked. He pointed to me" } ], "https://parahumans.wordpress.com/2013/11/02/teneral-e-1/": [ { "before": "stories,” Riley said. “The", "after": "stories,” Riley said, “the" + }, + { + "before": "day to day, minute-to-minute existence", + "after": "day-to-day, minute-to-minute existence" } ], "https://parahumans.wordpress.com/2013/11/05/teneral-e-2/": [ @@ -3971,10 +4399,6 @@ "before": "property of Nero", "after": "property of Nero" }, - { - "before": "“Stay, Hooligan”", - "after": "“Stay, Hooligan.”" - }, { "before": "Nero, Why don’t we get", "after": "Nero, why don’t we get" @@ -4002,8 +4426,16 @@ "after": "vaguely" }, { - "before": "standby”", - "after": "standby.”" + "before": "minutes passed. the chance rose", + "after": "minutes passed. The chance rose" + }, + { + "before": "Collin", + "after": "Colin" + }, + { + "before": "systems teacher had", + "after": "systems Teacher had" } ], "https://parahumans.wordpress.com/2013/11/12/teneral-e-4/": [ @@ -4022,6 +4454,14 @@ { "before": "—Problematic", "after": "—problematic" + }, + { + "before": "balconies and rooftops. hazards", + "after": "balconies and rooftops. Hazards" + }, + { + "before": "another tree stood. with a glimpse", + "after": "another tree stood, with a glimpse" } ], "https://parahumans.wordpress.com/2013/11/16/teneral-e-5/": [ @@ -4029,17 +4469,17 @@ "before": "and His flesh began", "after": "and his flesh began" }, - { - "before": "the ‘cage", - "after": "the ’cage" - }, - { - "before": "camera follows”", - "after": "camera follows.”" - }, { "before": "background of his mind

", "after": "background of his mind.

" + }, + { + "before": "boyfriends are my ex-boyfriends", + "after": "boyfriends are my ex-boyfriends" + }, + { + "before": "that ‘because I can’t isn’t an", + "after": "that ‘because I can’ isn’t an" } ], "https://parahumans.wordpress.com/2013/11/19/interlude-end/": [ @@ -4048,13 +4488,9 @@ "after": "Imp: I’ve" }, { - "before": "Tattletale:
\nwaiting?", + "before": "Tattletale:
\nwaiting?", "after": "Tattletale: waiting?" }, - { - "before": "yes!", - "after": "yes!" - }, { "before": "Please, If you", "after": "Please, if you" @@ -4115,5 +4551,4720 @@ "before": "so,” Annette said. “I", "after": "so,” Annette said, “I" } + ], + "https://www.parahumans.net/2017/09/11/daybreak-1-1/": [ + { + "before": "

Ward is the second work in the Parahumans series, and reading Worm first is strongly recommended. A lot of this won’t make sense otherwise and if you do find yourself a fan of the universe, the spoilers in Ward will affect the reading of the other work.

\n

Ward is not recommended for young or sensitive readers.

\n

\n", + "after": "", + "_comment": "This is out of place in an eBook." + } + ], + "https://www.parahumans.net/2017/11/21/daybreak-1-4/": [ + { + "before": "blunt instrument-I saw the", + "after": "blunt instrument—I saw the" + } + ], + "https://www.parahumans.net/2017/11/28/daybreak-1-6/": [ + { + "before": "To dad being", + "after": "To Dad being" + }, + { + "before": "and mom being business", + "after": "and Mom being business" + } + ], + "https://www.parahumans.net/2017/11/30/daybreak-1-7/": [ + { + "before": "How do you even think rec—how do you think", + "after": "How do you even think rec— How do you think" + }, + { + "before": "built in protections", + "after": "built-in protections" + } + ], + "https://www.parahumans.net/2017/12/01/daybreak-1-8/": [ + { + "before": "

\n

", + "after": "

" + }, + { + "before": "parahumans online", + "after": "Parahumans Online" + }, + { + "before": "Glitzglam *New Message*: I", + "after": "Glitzglam *New Message*: I" + }, + { + "before": "day to day life", + "after": "day-to-day life" + } + ], + "https://www.parahumans.net/2017/12/09/flare-2-1/": [ + { + "before": "Some is mom and dad’s", + "after": "Some is Mom and Dad’s" + } + ], + "https://www.parahumans.net/2017/12/12/flare-2-2/": [ + { + "before": "-Victoria", + "after": "—Victoria" + } + ], + "https://www.parahumans.net/2017/12/16/flare-2-3/": [ + { + "before": "two—piece", + "after": "two-piece" + }, + { + "before": "want to think about mom", + "after": "want to think about Mom" + }, + { + "before": "the floor. the armband landed", + "after": "the floor. The armband landed" + } + ], + "https://www.parahumans.net/2017/12/23/flare-2-5/": [ + { + "before": "Swearing is fine In moderation", + "after": "Swearing is fine in moderation" + }, + { + "before": "If you study Parahumans", + "after": "If you study parahumans" + }, + { + "before": "—And a few interesting and", + "after": "—and a few interesting and" + }, + { + "before": "make it it feel any less painful", + "after": "make it feel any less painful" + } + ], + "https://www.parahumans.net/2017/12/26/flare-2-6/": [ + { + "before": "—Then maybe we avoid having", + "after": "—then maybe we avoid having" + }, + { + "before": "She huffed out out a small", + "after": "She huffed out a small" + }, + { + "before": "a built in glare", + "after": "a built-in glare" + } + ], + "https://www.parahumans.net/2017/12/30/flare-2-7/": [ + { + "before": "hooked on the the stacked plastic", + "after": "hooked on the stacked plastic" + }, + { + "before": "time with the the", + "after": "time with the" + } + ], + "https://www.parahumans.net/2018/01/02/flare-interlude-2/": [ + { + "before": "saying all of that that, he would", + "after": "saying all of that, he would" + } + ], + "https://www.parahumans.net/2018/01/09/glare-3-2/": [ + { + "before": "under—and over-growth", + "after": "under- and overgrowth" + }, + { + "before": "Tristan, “You should take", + "after": "Tristan, “you should take" + }, + { + "before": "to start with. it’s delicate enough", + "after": "to start with. It’s delicate enough" + } + ], + "https://www.parahumans.net/2018/01/13/glare-3-3/": [ + { + "before": "my flight toward toward Tristan", + "after": "my flight toward Tristan" + }, + { + "before": "“Spooky,” Sveta said.”I expected", + "after": "“Spooky,” Sveta said. “I expected" + } + ], + "https://www.parahumans.net/2018/01/16/glare-3-4/": [ + { + "before": "“Absolutely,’ I said", + "after": "“Absolutely,” I said" + } + ], + "https://www.parahumans.net/2018/01/20/glare-3-5/": [ + { + "before": "What mom did, I was pretty", + "after": "What Mom did, I was pretty" + }, + { + "before": "you let yourself believe mom’s words", + "after": "you let yourself believe Mom’s words" + }, + { + "before": "You mean mom", + "after": "You mean Mom" + }, + { + "before": "say I’m just like mom again", + "after": "say I’m just like Mom again" + } + ], + "https://www.parahumans.net/2018/01/23/glare-3-6/": [ + { + "before": "I had a conversation with dad last night", + "after": "I had a conversation with Dad last night" + }, + { + "before": "Bye mom", + "after": "Bye Mom" + } + ], + "https://www.parahumans.net/2018/01/25/glare-interlude-3/": [ + { + "before": "much like the the machines", + "after": "much like the machines" + } + ], + "https://www.parahumans.net/2018/01/30/shade-4-2/": [ + { + "before": "one earth", + "after": "one Earth" + } + ], + "https://www.parahumans.net/2018/02/03/shade-4-3/": [ + { + "before": "ex-birdcage", + "after": "ex-Birdcage" + }, + { + "before": "Just—I need this,", + "after": "Just— I need this," + } + ], + "https://www.parahumans.net/2018/02/06/shade-interlude-4a/": [ + { + "before": "You know ‘em", + "after": "You know ’em" + }, + { + "before": "dangerous?” The recluse asked", + "after": "dangerous?” the recluse asked" + }, + { + "before": "Stop. Please.", + "after": "Stop. Please." + }, + { + "before": "his Aunt would say", + "after": "his aunt would say" + } + ], + "https://www.parahumans.net/2018/02/08/shade-4-4/": [ + { + "before": "build Teleporters", + "after": "build teleporters" + } + ], + "https://www.parahumans.net/2018/02/10/shade-4-5/": [ + { + "before": "Average Ash Walk Time:—1:13", + "after": "Average Ash Walk Time: −1:13" + } + ], + "https://www.parahumans.net/2018/02/13/shade-interlude-4b/": [ + { + "before": "it was just dad and me", + "after": "it was just Dad and me" + }, + { + "before": "that’s who mom and dad are", + "after": "that’s who Mom and Dad are" + }, + { + "before": "but when mom had cancer", + "after": "but when Mom had cancer" + } + ], + "https://www.parahumans.net/2018/02/17/shade-4-6/": [ + { + "before": "mom’s verdict was", + "after": "Mom’s verdict was" + }, + { + "before": "as you walk. or blurry light", + "after": "as you walk. Or blurry light" + } + ], + "https://www.parahumans.net/2018/02/20/shade-4-7/": [ + { + "before": "Mom and dad were looking", + "after": "Mom and Dad were looking" + }, + { + "before": "‘Won’t", + "after": "‘Won’t" + } + ], + "https://www.parahumans.net/2018/02/22/shade-interlude-4c/": [ + { + "before": "Yes mom", + "after": "Yes Mom" + }, + { + "before": "last four years and seven months, She’s learned to", + "after": "last four years and seven months, she’s learned to" + }, + { + "before": "It—kind of", + "after": "It— Kind of" + }, + { + "before": "“Cozy,” The side of the", + "after": "“Cozy.” The side of the" + }, + { + "before": "hair he had. it was long", + "after": "hair he had. It was long" + }, + { + "before": "about you and Church", + "after": "about you and church" + } + ], + "https://www.parahumans.net/2018/02/24/shadow-5-1/": [ + { + "before": "thermos of regular tap water

", + "after": "thermos of regular tap water.

" + } + ], + "https://www.parahumans.net/2018/03/06/shadow-5-4/": [ + { + "before": "It’s—My forcefield moves", + "after": "It’s— My forcefield moves" + } + ], + "https://www.parahumans.net/2018/03/10/shadow-5-5/": [ + { + "before": "out of the back, “She still would have", + "after": "out of the back, “she still would have" + } + ], + "https://www.parahumans.net/2018/03/17/shadow-5-6/": [ + { + "before": "have a a specter", + "after": "have a specter" + }, + { + "before": "Spare stuff from dad", + "after": "Spare stuff from Dad" + }, + { + "before": "Peaches and—You mean peachy", + "after": "Peaches and— You mean peachy" + }, + { + "before": "Victoria” she", + "after": "Victoria,” she" + } + ], + "https://www.parahumans.net/2018/03/20/shadow-5-7/": [ + { + "before": "her order.Two boxes", + "after": "her order. Two boxes" + }, + { + "before": "You and dad", + "after": "You and Dad" + }, + { + "before": "Enjoy time with dad", + "after": "Enjoy time with Dad" + }, + { + "before": "it with Kenzie’ stuff", + "after": "it with Kenzie’s stuff" + }, + { + "before": "The convoy continued to disintegrate. The road as the road made its gradual turn", + "after": "The convoy continued to disintegrate as the road made its gradual turn" + } + ], + "https://www.parahumans.net/2018/03/27/shadow-5-10/": [ + { + "before": "our heads. the pupil", + "after": "our heads. The pupil" + }, + { + "before": "forearm and her fingertips. and she stumbled into", + "after": "forearm and her fingertips, and she stumbled into" + }, + { + "before": "and nearby bowled over", + "after": "and nearly bowled over" + }, + { + "before": "There’s—Careful, Victoria.", + "after": "There’s— Careful, Victoria." + }, + { + "before": "Hypnotist Master", + "after": "Hypnotist master" + }, + { + "before": "with Masters in mind", + "after": "with masters in mind" + }, + { + "before": "paralyzed started moving

", + "after": "paralyzed started moving.

" + } + ], + "https://www.parahumans.net/2018/03/31/shadow-5-11/": [ + { + "before": "side of her her chin", + "after": "side of her chin" + }, + { + "before": "Plus my walkman and pocket atari", + "after": "Plus my Walkman and Pocket Atari" + }, + { + "before": "The woman—I turned to look and saw", + "after": "The woman— I turned to look and saw" + }, + { + "before": "Tristan asked.”", + "after": "Tristan asked." + } + ], + "https://www.parahumans.net/2018/04/03/shadow-5-12/": [ + { + "before": "lost my grip on him. and my hand", + "after": "lost my grip on him, and my hand" + }, + { + "before": "Tristan-as Capricorn", + "after": "Tristan-as-Capricorn" + }, + { + "before": "were Masters and strangers", + "after": "were masters and strangers" + }, + { + "before": "or if he said something like ‘You’ or “Everyone’, I could", + "after": "or if he said something like ‘You’ or ‘Everyone’, I could" + }, + { + "before": "rain. and I saw", + "after": "rain. And I saw" + } + ], + "https://www.parahumans.net/2018/04/07/shadow-interlude-5-x/": [ + { + "before": "objectvity", + "after": "objectivity" + }, + { + "before": "“Are the production rates", + "after": "“—are the production rates" + }, + { + "before": "millions—tens of millions- is", + "after": "millions—tens of millions—is" + }, + { + "before": "“—And frankly,” Mr. Nieves said", + "after": "“—and frankly,” Mr. Nieves said" + }, + { + "before": "Because, Balminder,” Kurt said. “You were plausible", + "after": "Because, Balminder,” Kurt said, “you were plausible" + }, + { + "before": "she aid", + "after": "she said" + } + ], + "https://www.parahumans.net/2018/04/10/shadow-interlude-5-y/": [ + { + "before": "Hopefully—I’m hoping she figures out", + "after": "Hopefully— I’m hoping she figures out" + }, + { + "before": "…It’s not so important when", + "after": "…it’s not so important when" + }, + { + "before": "Kiss and Kill.", + "after": "Kiss and kill." + } + ], + "https://www.parahumans.net/2018/04/17/pitch-6-2/": [ + { + "before": "very clear words, only ‘ERIN’ and ‘NO-‘.", + "after": "very clear words, only ‘ERIN’ and ‘NO—’." + }, + { + "before": "The Mcveay’s", + "after": "The McVeays" + } + ], + "https://www.parahumans.net/2018/04/21/pitch-6-3/": [ + { + "before": "wall of bodies. the woman behind", + "after": "wall of bodies. The woman behind" + }, + { + "before": "dying, motherfuckers” the bearded", + "after": "dying, motherfuckers,” the bearded" + } + ], + "https://www.parahumans.net/2018/04/24/pitch-6-4/": [ + { + "before": "glanced back. the others had", + "after": "glanced back. The others had" + }, + { + "before": "Animal Master, likely", + "after": "Animal master, likely" + } + ], + "https://www.parahumans.net/2018/04/28/pitch-6-5/": [ + { + "before": "of material to to bandage", + "after": "of material to bandage" + }, + { + "before": "Cradle said. his tone was", + "after": "Cradle said. His tone was" + }, + { + "before": "“…Multiply the grudge,”", + "after": "“…multiply the grudge,”" + }, + { + "before": "used flight to stead myself", + "after": "used flight to steady myself" + }, + { + "before": "Capes converged, ready to guard

", + "after": "Capes converged, ready to guard.

" + } + ], + "https://www.parahumans.net/2018/05/05/pitch-6-7/": [ + { + "before": "“—And we wanted to ask for your", + "after": "“—and we wanted to ask for your" + }, + { + "before": "while you were bloody—I shouldn’t be", + "after": "while you were bloody— I shouldn’t be" + } + ], + "https://www.parahumans.net/2018/05/08/pitch-6-8/": [ + { + "before": "check in on on Ashley and Rain", + "after": "check in on Ashley and Rain" + }, + { + "before": "earth Shin", + "after": "Earth Shin" + }, + { + "before": "one Jackass said", + "after": "one jackass said" + }, + { + "before": "an Über-neighborhood", + "after": "an uber-neighborhood", + "_comment": "This seems to lose its umlaut in English; see e.g. https://www.dictionary.com/browse/uber. It's certainly not capitalized." + } + ], + "https://www.parahumans.net/2018/05/11/pitch-6-9/": [ + { + "before": "bunch of Jackasses that", + "after": "bunch of jackasses that" + }, + { + "before": "some of the Jackasses", + "after": "some of the jackasses" + }, + { + "before": "one of the Jackasses turned", + "after": "one of the jackasses turned" + }, + { + "before": "The Jackass next to Vince", + "after": "The jackass next to Vince" + }, + { + "before": "couple of the Jackasses’", + "after": "couple of the jackasses" + }, + { + "before": "I could hear her, “I’m trying", + "after": "I could hear her. “I’m trying" + }, + { + "before": "all-hands on deck", + "after": "all-hands-on-deck" + }, + { + "before": "the Junior Captain said", + "after": "the junior captain said" + } + ], + "https://www.parahumans.net/2018/05/15/torch-7-1/": [ + { + "before": "got to go to Church", + "after": "got to go to church" + } + ], + "https://www.parahumans.net/2018/05/19/torch-7-2/": [ + { + "before": "you had to deal with with could have", + "after": "you had to deal with could have" + }, + { + "before": "—And from other horrors.", + "after": "—and from other horrors." + } + ], + "https://www.parahumans.net/2018/05/22/torch-7-3/": [ + { + "before": "by saying,”Isn’t it a rule", + "after": "by saying, “Isn’t it a rule" + } + ], + "https://www.parahumans.net/2018/05/26/torch-7-4/": [ + { + "before": "

", + "after": "", + "_comment": "This appears to be intentional, but it just duplicates the Next Chapter link (i.e. turning the page in the eBook), so we remove it" + }, + { + "before": "those hectic days after dad’s head injury", + "after": "those hectic days after Dad’s head injury" + }, + { + "before": "no Master pets", + "after": "no master pets" + }, + { + "before": "day to day basis", + "after": "day-to-day basis" + } + ], + "https://www.parahumans.net/2018/05/26/eclipse-x-1/": [ + { + "before": "the hole in the floor and the pieces of dad", + "after": "the hole in the floor and the pieces of Dad" + }, + { + "before": "Past what was left of mom", + "after": "Past what was left of Mom" + } + ], + "https://www.parahumans.net/2018/05/27/eclipse-x-2/": [ + { + "before": "because she she was caught", + "after": "because she was caught" + }, + { + "before": "answer the the second question", + "after": "answer the second question" + }, + { + "before": "discuss goals,” Jessica said. “We think", + "after": "discuss goals,” Jessica said, “we think" + } + ], + "https://www.parahumans.net/2018/05/30/eclipse-x-5/": [ + { + "before": "no words. and there", + "after": "no words. And there" + }, + { + "before": "hesitated to long", + "after": "hesitated too long" + }, + { + "before": "back.,", + "after": "back," + }, + { + "before": "Wardens’ ID badges", + "after": "Wardens ID badges" + } + ], + "https://www.parahumans.net/2018/05/31/eclipse-x-6/": [ + { + "before": "a desperate edge to her feelings

", + "after": "a desperate edge to her feelings.

" + }, + { + "before": "—To need at least three if", + "after": "—to need at least three if" + }, + { + "before": "We—if you stop and", + "after": "We— If you stop and" + }, + { + "before": "…We’re not especially", + "after": "…we’re not especially" + } + ], + "https://www.parahumans.net/2018/06/01/eclipse-x-7/": [ + { + "before": "dotting the ‘i’s and slashing the ‘Q’s

", + "after": "dotting the ‘i’s and slashing the ‘Q’s.

" + }, + { + "before": "—And they have thinkers", + "after": "—and they have thinkers" + }, + { + "before": "You’re leaving Boston?", + "after": "You’re leaving Boston?" + }, + { + "before": "—Assign her house arrest", + "after": "—assign her house arrest" + }, + { + "before": "Mr… Chief Armstrong", + "after": "Mr.… Chief Armstrong" + }, + { + "before": "The there were monsters out there", + "after": "That there were monsters out there" + }, + { + "before": "“I’m not—I wasn’t—”", + "after": "“I’m not— I wasn’t—”" + } + ], + "https://www.parahumans.net/2018/06/02/eclipse-x-8/": [ + { + "before": "Bonesaw” Blasto said", + "after": "Bonesaw,” Blasto said" + }, + { + "before": "“Well,” Fappy said. “You know Stan,", + "after": "“Well,” Fappy said, “you know Stan," + }, + { + "before": "it or not,” Jack said. “I want", + "after": "it or not,” Jack said, “I want" + } + ], + "https://www.parahumans.net/2018/06/05/torch-7-5/": [ + { + "before": "

\n

I don’t", + "after": "

I don’t" + }, + { + "before": "Chris snorted, “Count yourself lucky.", + "after": "Chris snorted. “Count yourself lucky." + }, + { + "before": "was your crush Jhett Marion?", + "after": "was your crush Jhett Marion?" + }, + { + "before": "thing aside,” I said. “I mean", + "after": "thing aside,” I said, “I mean" + }, + { + "before": "Fifty…seven", + "after": "Fifty… seven" + }, + { + "before": "brass capped", + "after": "brass-capped" + } + ], + "https://www.parahumans.net/2018/06/09/torch-7-6/": [ + { + "before": "I saw. the scans of the woman", + "after": "I saw. The scans of the woman" + }, + { + "before": "the woman withw the sunglasses", + "after": "the woman with the sunglasses" + } + ], + "https://www.parahumans.net/2018/06/12/torch-7-7/": [ + { + "before": "and I can call dad", + "after": "and I can call Dad" + }, + { + "before": "five by three inch", + "after": "five-by-three inch" + }, + { + "before": "staying calm, her voice quieter, “Said your", + "after": "staying calm, her voice quieter, “said your" + } + ], + "https://www.parahumans.net/2018/06/16/torch-7-8/": [ + { + "before": "you asked him,” Sveta said. “He’d say", + "after": "you asked him,” Sveta said, “he’d say" + }, + { + "before": "Looksee, You mentioned", + "after": "Looksee, you mentioned" + } + ], + "https://www.parahumans.net/2018/06/19/torch-7-9/": [ + { + "before": "abused by the the transition", + "after": "abused by the transition" + }, + { + "before": "poking around” I said", + "after": "poking around,” I said" + }, + { + "before": "Loss as he said it, “Because", + "after": "Loss as he said it, “because" + } + ], + "https://www.parahumans.net/2018/06/23/torch-7-10/": [ + { + "before": "black with a a shaved", + "after": "black with a shaved" + }, + { + "before": "Kenzie almost yipped out out a, “No.”", + "after": "Kenzie almost yipped out, a “No.”" + }, + { + "before": "thought things through mid-sentence, “Is that for", + "after": "thought things through mid-sentence, “is that for" + }, + { + "before": "he goes to Church with them", + "after": "he goes to church with them" + }, + { + "before": "maybe,” She said, smiling", + "after": "maybe,” she said, smiling" + }, + { + "before": "fighting, ‘rene", + "after": "fighting, ’rene" + }, + { + "before": "I studied Parahumans before", + "after": "I studied parahumans before" + } + ], + "https://www.parahumans.net/2018/06/26/torch-interlude-7-x/": [ + { + "before": "Mom and dad were still at the table", + "after": "Mom and Dad were still at the table" + }, + { + "before": "new counter and sink mom and dad had put in", + "after": "new counter and sink Mom and Dad had put in" + }, + { + "before": "mom set down the plates for dad and then herself", + "after": "Mom set down the plates for Dad and then herself" + }, + { + "before": "“Eat,” dad said", + "after": "“Eat,” Dad said" + }, + { + "before": "she gave the bathroom what mom called a once-over", + "after": "she gave the bathroom what Mom called a once-over" + }, + { + "before": "say or do when mom got like this", + "after": "say or do when Mom got like this" + }, + { + "before": "cooked for me,” mom said", + "after": "cooked for me,” Mom said" + }, + { + "before": "of her bag. only one temporary tattoo", + "after": "of her bag. Only one temporary tattoo" + }, + { + "before": "loved—loved- for my", + "after": "loved—loved—for my" + }, + { + "before": "pitched to be heard, “But her antics", + "after": "pitched to be heard, “but her antics" + }, + { + "before": "—Really truly, I hope", + "after": "—really truly, I hope" + }, + { + "before": "big guy said, “Is our mood", + "after": "big guy said, “is our mood" + }, + { + "before": "thing we try to do,” he said. “Is we ask", + "after": "thing we try to do,” he said, “is we ask" + }, + { + "before": "Keith said. “You decide", + "after": "Keith said, “you decide" + } + ], + "https://www.parahumans.net/2018/07/03/beacon-8-1/": [ + { + "before": "a group of minors,” Dragon said. “Allow others", + "after": "a group of minors,” Dragon said, “allow others" + }, + { + "before": "day to day basis", + "after": "day-to-day basis" + } + ], + "https://www.parahumans.net/2018/07/07/beacon-8-2/": [ + { + "before": "

Mom and dad.

", + "after": "

Mom and Dad.

" + }, + { + "before": "Missisipi", + "after": "Mississippi" + }, + { + "before": "dragoncraft", + "after": "Dragon-craft" + } + ], + "https://www.parahumans.net/2018/07/10/beacon-8-3/": [ + { + "before": "It’s—I can’t talk to Byron", + "after": "It’s— I can’t talk to Byron" + }, + { + "before": "emergency, we’re capes, Cryptid said", + "after": "emergency, we’re capes,” Cryptid said" + }, + { + "before": "one or two more fallen", + "after": "one or two more Fallen" + } + ], + "https://www.parahumans.net/2018/07/14/beacon-8-4/": [ + { + "before": "use their surveillance” Kenzie said", + "after": "use their surveillance,” Kenzie said" + }, + { + "before": "and then hit buttons

", + "after": "and then hit buttons.

" + }, + { + "before": "I think it’s done", + "after": "I think it’s done" + } + ], + "https://www.parahumans.net/2018/07/17/beacon-8-5/": [ + { + "before": "on the offensive. chains whirled", + "after": "on the offensive. Chains whirled" + }, + { + "before": "a bit hit to morale", + "after": "a big hit to morale" + }, + { + "before": "mask was only a B-", + "after": "mask was only a B−" + }, + { + "before": "Nothing about it was even B-.", + "after": "Nothing about it was even B−." + } + ], + "https://www.parahumans.net/2018/07/21/beacon-8-6/": [ + { + "before": "unfolded umbrella.A metal", + "after": "unfolded umbrella. A metal" + }, + { + "before": "above me. the sky was dark", + "after": "above me. The sky was dark" + }, + { + "before": "she thrwe out a hand", + "after": "she threw out a hand" + }, + { + "before": "corner them,” I said. “They’ll threaten civilians", + "after": "corner them,” I said, “they’ll threaten civilians" + }, + { + "before": "reminiscent of a certain teenage boy-was cast in", + "after": "reminiscent of a certain teenage boy—was cast in" + }, + { + "before": "Errors influence", + "after": "Error’s influence" + } + ], + "https://www.parahumans.net/2018/07/24/beacon-8-7/": [ + { + "before": "Ashley’s activities therin", + "after": "Ashley’s activities therein" + } + ], + "https://www.parahumans.net/2018/07/28/beacon-8-8/": [ + { + "before": "“Yeah, that’s breaker” I said.", + "after": "“Yeah, that’s breaker,” I said." + } + ], + "https://www.parahumans.net/2018/07/31/beacon-8-9/": [ + { + "before": "you know that dad and I saying", + "after": "you know that Dad and I saying" + }, + { + "before": "was impatient. it was hard to tell", + "after": "was impatient. It was hard to tell" + }, + { + "before": "“Is—Yes,” I finished", + "after": "“Is— Yes,” I finished" + } + ], + "https://www.parahumans.net/2018/08/04/beacon-8-10/": [ + { + "before": "I’m supposed to be you?", + "after": "I’m supposed to be you?" + }, + { + "before": "She had her Eyehook", + "after": "She had her eyehook" + }, + { + "before": "You—I have to imagine you were", + "after": "You— I have to imagine you were" + }, + { + "before": "I don’t—I can hear your mother", + "after": "I don’t— I can hear your mother" + }, + { + "before": "my A—costume with my makeup at an A", + "after": "my A− costume with my makeup at an A" + }, + { + "before": "now my apartment-, three or four minutes", + "after": "now my apartment—three or four minutes" + } + ], + "https://www.parahumans.net/2018/08/07/beacon-8-11/": [ + { + "before": "easy to understand story", + "after": "easy-to-understand story" + } + ], + "https://www.parahumans.net/2018/08/11/beacon-8-12/": [ + { + "before": "who are free now. they’re out there", + "after": "who are free now. They’re out there" + }, + { + "before": "dare you? Hamza barked, again", + "after": "dare you?” Hamza barked, again" + } + ], + "https://www.parahumans.net/2018/08/14/beacon-interlude-8-x/": [ + { + "before": "attention on Natalie, “this is", + "after": "attention on Natalie. “This is" + }, + { + "before": "Natalie’s beetle", + "after": "Natalie’s Beetle" + }, + { + "before": "adam’s apple", + "after": "Adam’s apple" + }, + { + "before": "Time-time for Kenzie", + "after": "Time—time for Kenzie" + } + ], + "https://www.parahumans.net/2018/08/18/beacon-interlude-8-y/": [ + { + "before": "A sufficient impact or distraction

", + "after": "A sufficient impact or distraction.

" + }, + { + "before": "‘Hard Boil.’", + "after": "‘Hard Boil’." + }, + { + "before": "tee-vee", + "after": "TV" + }, + { + "before": "teacher’s power", + "after": "Teacher’s power" + } + ], + "https://www.parahumans.net/2018/08/21/gleaming-9-1/": [ + { + "before": "Probably teacher", + "after": "Probably Teacher" + }, + { + "before": "b-list", + "after": "B-list" + } + ], + "https://www.parahumans.net/2018/08/28/gleaming-9-3/": [ + { + "before": "Chris in the process. stretched on his way", + "after": "Chris in the process. He stretched on his way" + }, + { + "before": "with a strong Master", + "after": "with a strong master" + }, + { + "before": "—But I can’t make concessions", + "after": "—but I can’t make concessions" + }, + { + "before": "too impatient and angry It was worse because", + "after": "too impatient and angry. It was worse because" + }, + { + "before": "what it’s worth,” Tristan said. “Thanks for", + "after": "what it’s worth,” Tristan said, “thanks for" + } + ], + "https://www.parahumans.net/2018/09/01/gleaming-9-4/": [ + { + "before": "Power related", + "after": "Power-related" + } + ], + "https://www.parahumans.net/2018/09/04/gleaming-9-5/": [ + { + "before": "still a voice without confidence", + "after": "Still a voice without confidence" + }, + { + "before": "The only thing that hold him back", + "after": "The only things that hold him back" + } + ], + "https://www.parahumans.net/2018/09/08/gleaming-9-6/": [ + { + "before": "The patrol had done its work", + "after": "The Patrol had done its work" + }, + { + "before": "guard confirmed as Thralls", + "after": "guard confirmed as thralls" + } + ], + "https://www.parahumans.net/2018/09/11/gleaming-9-7/": [ + { + "before": "Byron said. he was at", + "after": "Byron said. He was at" + }, + { + "before": "then teacher can’t", + "after": "then Teacher can’t" + }, + { + "before": "“Who is this?”a strange voice asked", + "after": "“Who is this?” a strange voice asked" + } + ], + "https://www.parahumans.net/2018/09/13/gleaming-interlude-9-x/": [ + { + "before": "he bottles it up. then the bottle cracks", + "after": "he bottles it up. Then the bottle cracks" + }, + { + "before": "that made her her- the shock of white", + "after": "that made her her—the shock of white" + }, + { + "regExp": "their Papa", + "replacement": "their papa" + }, + { + "before": "Mama and papa talk", + "after": "Mama and Papa talk" + }, + { + "before": "injuries,” papa said", + "after": "injuries,” Papa said" + }, + { + "before": "papa’s face", + "after": "Papa’s face" + }, + { + "before": "Selfless?” papa asked", + "after": "Selfless?” Papa asked" + }, + { + "before": "kind of selfie, papa", + "after": "kind of selfie, Papa" + }, + { + "before": "part of that,” papa said", + "after": "part of that,” Papa said" + }, + { + "before": "you,” papa said", + "after": "you,” Papa said" + }, + { + "before": "too, papa,” Tristan said", + "after": "too, Papa,” Tristan said" + }, + { + "before": "worked in rigid. the armor’s", + "after": "worked in rigid. The armor’s" + }, + { + "before": "moving and across to", + "after": "moving across to" + }, + { + "before": "fucking sense!
”", + "after": "fucking sense
!”" + }, + { + "before": "that hurt! Stop!", + "after": "that hurt! Stop!" + }, + { + "before": "it was one thing!", + "after": "It was one thing!" + }, + { + "before": "have backed you up!", + "after": "have backed you up!" + }, + { + "before": "mr. Vaughn", + "after": "Mr. Vaughn" + } + ], + "https://www.parahumans.net/2018/09/15/gleaming-9-8/": [ + { + "before": "

For those who missed it, there was a Thursday update. See the prior chapter.

\n

\n", + "after": "" + }, + { + "before": "Capricorn blue", + "after": "Capricorn Blue" + }, + { + "before": "everything ended, Several of my", + "after": "everything ended, several of my" + }, + { + "before": "you can! You", + "after": "you can! You" + } + ], + "https://www.parahumans.net/2018/09/18/gleaming-9-9/": [ + { + "before": "teacher thrall", + "after": "Teacher thrall" + }, + { + "before": "need to,” I said, because I’m", + "after": "need to,” I said, “because I’m" + }, + { + "before": "keeping the Warden and his deputy", + "after": "keeping the warden and his deputy" + } + ], + "https://www.parahumans.net/2018/09/22/gleaming-interlude-9-y/": [ + { + "before": "you up where you’re weak? You’re", + "after": "you up where you’re weak? You’re" + }, + { + "before": "for you.", + "after": "for you." + } + ], + "https://www.parahumans.net/2018/09/25/gleaming-9-10/": [ + { + "before": "and mom and dad’s rules", + "after": "and Mom and Dad’s rules" + }, + { + "before": "at the balcony. both wore", + "after": "at the balcony. Both wore" + }, + { + "before": "—But Rain and Sveta", + "after": "—but Rain and Sveta" + }, + { + "before": "Cyrstalclear", + "after": "Crystalclear" + }, + { + "before": "He stopped here he was", + "after": "He stopped where he was" + }, + { + "regExp": "Warden", + "replacement": "warden", + "_comment": "This is discussing prison wardens, which is a normal job title" + } + ], + "https://www.parahumans.net/2018/09/29/gleaming-9-11/": [ + { + "before": "two people died. the forcefield went", + "after": "two people died. The forcefield went" + }, + { + "before": "Maybe wrong to think that within", + "after": "Maybe wrong to think that, within" + }, + { + "regExp": "Crock o Shit", + "after": "Crock o’ Shit" + }, + { + "regExp": "the pharmacist", + "replacement": "the Pharmacist", + "_comment": "in the previous chapter, 'the Pharmacist' starts getting capitalized consistently, as if it's a name instead of a profession. Carry it forward." + }, + { + "before": "one hundred and ten-percent", + "after": "one hundred and ten percent" + } + ], + "https://www.parahumans.net/2018/10/02/gleaming-9-12/": [ + { + "before": "teacher hit squad", + "after": "Teacher hit squad" + }, + { + "before": "—You gotta give something", + "after": "—you gotta give something" + }, + { + "before": "the pharmacist", + "after": "the Pharmacist", + "_comment": "See comment in https://www.parahumans.net/2018/09/29/gleaming-9-11/" + } + ], + "https://www.parahumans.net/2018/10/09/gleaming-9-14/": [ + { + "before": "in a fireman carry. with my free hand", + "after": "in a fireman carry. With my free hand" + }, + { + "before": "fucking teacher wouldn’t", + "after": "fucking Teacher wouldn’t" + }, + { + "before": "That the Parahumans were taking over", + "after": "That the parahumans were taking over" + } + ], + "https://www.parahumans.net/2018/10/13/gleaming-9-15/": [ + { + "before": "-fucked in the head.", + "after": "—fucked in the head." + }, + { + "before": "some of the creases. and from the", + "after": "some of the creases, and from the" + }, + { + "before": "Disappointed?", + "after": "Disappointed?" + } + ], + "https://www.parahumans.net/2018/10/16/gleaming-interlude-9-z/": [ + { + "before": "cliff he was was expected", + "after": "cliff he was expected" + }, + { + "before": "told the Warden differed", + "after": "told the warden differed" + }, + { + "before": "assistant Warden", + "after": "assistant warden" + }, + { + "before": "What got into you?", + "after": "What got into you?" + }, + { + "before": "what happens to anyone with powers is near anyone", + "after": "what happens when anyone with powers is near anyone" + } + ], + "https://www.parahumans.net/2018/10/20/gleaming-interlude-9/": [ + { + "before": "Guarderò", + "after": "Guarderò." + }, + { + "before": "one earth’s worth", + "after": "one Earth’s worth" + }, + { + "before": "the adjacent earth", + "after": "the adjacent Earth" + }, + { + "before": "closest earth", + "after": "closest Earth" + }, + { + "before": "of them, “Would be", + "after": "of them, “would be" + }, + { + "before": "finds it’s root", + "after": "finds its root" + } + ], + "https://www.parahumans.net/2018/10/23/polarize-10-1/": [ + { + "before": "You let mom talk and", + "after": "You let Mom talk and" + }, + { + "before": "post-Prison", + "after": "post-prison" + }, + { + "before": "I’m sorry, what? What?", + "after": "I’m sorry, what? What?" + } + ], + "https://www.parahumans.net/2018/10/27/polarize-10-2/": [ + { + "before": "Sveta said, leaning on me

", + "after": "Sveta said, leaning on me.

" + }, + { + "before": "and that part of me is really disappointed", + "after": "And that part of me is really disappointed" + } + ], + "https://www.parahumans.net/2018/10/30/polarize-10-3/": [ + { + "before": "betray-y", + "after": "betray-ey" + } + ], + "https://www.parahumans.net/2018/11/03/polarize-10-4/": [ + { + "before": "services of mercenaries. depending on timing", + "after": "services of mercenaries. Depending on timing" + }, + { + "before": "we should get going", + "after": "We should get going" + }, + { + "before": "finger—and thumb-rings", + "after": "finger- and thumb-rings" + } + ], + "https://www.parahumans.net/2018/11/06/polarize-10-5/": [ + { + "before": "because It’s pertinent to", + "after": "because it’s pertinent to" + }, + { + "before": "bangs said, “They won’t give", + "after": "bangs said, “they won’t give" + } + ], + "https://www.parahumans.net/2018/11/10/polarize-10-6/": [ + { + "before": "Caveat", + "after": "caveat" + } + ], + "https://www.parahumans.net/2018/11/13/polarize-10-7/": [ + { + "before": "your favorite top-
’", + "after": "your favorite top—
’" + }, + { + "before": "-your phone, twice, your banking card-", + "after": "—your phone, twice, your banking card—" + }, + { + "before": "-your pancreas.", + "after": "—your pancreas." + }, + { + "before": "a hair of headphones", + "after": "a pair of headphones" + }, + { + "before": "Shark girl", + "after": "shark girl" + }, + { + "before": "Be safe—Nat.", + "after": "Be safe —Nat." + } + ], + "https://www.parahumans.net/2018/11/17/polarize-10-8/": [ + { + "before": "Sveta said. her hand was removed", + "after": "Sveta said. Her hand was removed" + }, + { + "before": "There were a bag fast food", + "after": "There was a bag of fast food" + }, + { + "before": "anti parahuman", + "after": "anti-parahuman" + } + ], + "https://www.parahumans.net/2018/11/20/polarize-10-9/": [ + { + "before": "confines of the suit. and rearranged herself", + "after": "confines of the suit, and rearranged herself" + }, + { + "before": "Fuck y—of course", + "after": "Fuck y— Of course" + }, + { + "before": "they had Fallen behind", + "after": "they had fallen behind" + } + ], + "https://www.parahumans.net/2018/11/24/interlude-10-x/": [ + { + "before": "that would be in time Hopefully

", + "after": "that would be in time. Hopefully.

" + }, + { + "before": "consisting of two—and three-person", + "after": "consisting of two- and three-person" + }, + { + "before": "Garotte, Hand at one", + "after": "Garotte, hand at one" + }, + { + "before": "with that, The unfortunately named", + "after": "with that, the unfortunately-named" + }, + { + "before": "not aware of the lipstick am", + "after": "not aware of the lipstick" + } + ], + "https://www.parahumans.net/2018/11/27/polarize-10-10/": [ + { + "before": "all about how Masters have", + "after": "all about how masters have" + }, + { + "before": "Hardboil", + "after": "Hard Boil" + }, + { + "before": "Sveta added a, “No,” for good measure", + "after": "Sveta added a “no” for good measure" + }, + { + "before": "We need to figure out how—we—handle this", + "after": "We need to figure out how we handle this" + } + ], + "https://www.parahumans.net/2018/12/01/polarize-10-11/": [ + { + "before": "See dad, sleep.", + "after": "See Dad, sleep." + }, + { + "before": "T, u-.", + "after": "T, U." + }, + { + "before": "I did it with—I’ve done it before", + "after": "I did it with— I’ve done it before" + }, + { + "before": "and to be our liaisons to the Wardens", + "after": "and to be our liaison to the Wardens" + }, + { + "before": "“Twelve hours ago,” I explained. “The Navigators were sent", + "after": "“Twelve hours ago,” I explained, “the Navigators were sent" + }, + { + "before": "You said you wanted to limiting this serious step", + "after": "You said you wanted to limit this serious step" + }, + { + "before": "On any other day, objective, I would", + "after": "On any other day, objectively, I would" + }, + { + "before": "how it were more active", + "after": "how it was more active" + } + ], + "https://www.parahumans.net/2018/12/04/polarize-10-12/": [ + { + "before": "Dryad Project 3", + "after": "Dryad Project Three" + }, + { + "before": "Pollution, deforestation, ecology all things that", + "after": "Pollution, deforestation, ecology, all things that" + }, + { + "before": "dropped an expose", + "after": "dropped an exposé" + }, + { + "before": "—But the good feelings", + "after": "—but the good feelings" + }, + { + "before": "A pan—a cure all for", + "after": "A pan— A cure-all for" + }, + { + "before": "No—Yes, but that isn’t", + "after": "No— Yes, but that isn’t" + } + ], + "https://www.parahumans.net/2018/12/08/polarize-10-13/": [ + { + "before": "A ring thirty feet in diameterand past those thirty feet", + "after": "A ring thirty feet in diameter—and past those thirty feet" + }, + { + "before": "axe—arm", + "after": "axe-arm" + }, + { + "before": "hit him again He wouldn’t simply", + "after": "hit him again. He wouldn’t simply" + } + ], + "https://www.parahumans.net/2018/12/11/interlude-10-y/": [ + { + "before": "shape of the the moment", + "after": "shape of the moment" + }, + { + "before": "We have! Multiple times!", + "after": "We have! Multiple times!" + } + ], + "https://www.parahumans.net/2018/12/15/interlude-10-z/": [ + { + "before": "roman with hair on his legs", + "after": "Roman with hair on his legs" + }, + { + "before": "New Brockton primary school", + "after": "New Brockton Primary School" + }, + { + "before": "Rome-Roman’s", + "after": "Rome—Roman’s" + } + ], + "https://www.parahumans.net/2018/12/18/blinding-11-1/": [ + { + "before": "prisoner and patrol", + "after": "prisoner and Patrol" + }, + { + "before": "before they chage", + "after": "before they change" + } + ], + "https://www.parahumans.net/2018/12/22/blinding-11-2/": [ + { + "before": "—But please respect", + "after": "—but please respect" + } + ], + "https://www.parahumans.net/2018/12/25/blinding-11-3/": [ + { + "before": "the pharmacist", + "after": "the Pharmacist", + "_comment": "See comment in https://www.parahumans.net/2018/09/29/gleaming-9-11/" + }, + { + "before": "…Delivering my coup de grace", + "after": "…delivering my coup de grace" + }, + { + "before": "Flash Gun", + "after": "flash gun" + } + ], + "https://www.parahumans.net/2018/12/29/interlude-11-a/": [ + { + "before": "Chiet", + "after": "Cheit" + }, + { + "before": "day to day way", + "after": "day-to-day way" + } + ], + "https://www.parahumans.net/2019/01/01/blinding-11-4/": [ + { + "before": "—But if your head is full of noise", + "after": "—but if your head is full of noise" + }, + { + "before": "One of the Heartbroken—Candy, I was pretty sure, was sitting", + "after": "One of the Heartbroken—Candy, I was pretty sure—was sitting" + } + ], + "https://www.parahumans.net/2019/01/05/blinding-11-5/": [ + { + "before": "they‘re", + "after": "they’re" + }, + { + "before": "and piece of construction material", + "after": "and pieces of construction material" + }, + { + "before": "the chiming finding it stride", + "after": "the chiming finding its stride" + }, + { + "before": "need to step in.", + "after": "need to step in.”" + }, + { + "before": "a smell had soaked into", + "after": "a smell that had soaked into" + }, + { + "before": "result putting together", + "after": "result of putting together" + }, + { + "before": "’emergency alert’", + "after": "‘emergency alert’" + }, + { + "before": "Three heartbroken", + "after": "Three Heartbroken" + }, + { + "before": "two heartbroken", + "after": "two Heartbroken" + } + ], + "https://www.parahumans.net/2019/01/08/blinding-11-6/": [ + { + "before": "Let’s go Let’s make a hole", + "after": "Let’s go. Let’s make a hole" + }, + { + "before": "catch up with the group I saw Foil and Chastity", + "after": "catch up with the group. I saw Foil and Chastity" + } + ], + "https://www.parahumans.net/2019/01/12/blinding-11-7/": [ + { + "before": "threw the the man", + "after": "threw the man" + }, + { + "before": "Reminded me of mom", + "after": "Reminded me of Mom" + }, + { + "before": "more fragile than it should have been

", + "after": "more fragile than it should have been.

" + }, + { + "before": "too close to heartbroken", + "after": "too close to Heartbroken" + }, + { + "before": "Precipice and the heartbroken", + "after": "Precipice and the Heartbroken" + }, + { + "before": "If the heartbroken’s power", + "after": "If the Heartbroken’s power" + } + ], + "https://www.parahumans.net/2019/01/15/blinding-11-8/": [ + { + "before": "and it it pulled him", + "after": "and it pulled him" + }, + { + "before": "Victoria-flesh", + "after": "Victoria-flesh" + } + ], + "https://www.parahumans.net/2019/01/19/interlude-11-b/": [ + { + "before": "loading up trucks with basic supplies

", + "after": "loading up trucks with basic supplies.

" + }, + { + "before": "I’m sor—that fucking sucks", + "after": "I’m sor— That fucking sucks" + }, + { + "before": "two of the targets was really", + "after": "two of the targets were really" + }, + { + "before": "punch a hold into the ground", + "after": "punch a hole into the ground" + } + ], + "https://www.parahumans.net/2019/01/22/interlude-11-c/": [ + { + "before": "were a worse adult examples", + "after": "were worse adult examples" + }, + { + "before": "four-times-normal—width", + "after": "four-times-normal-width" + }, + { + "before": "accumualted", + "after": "accumulated" + }, + { + "before": "get away from one swung", + "after": "get away from one swing" + }, + { + "before": "“Cradle—the most intact part of Tattletale said", + "after": "“Cradle—” the most intact part of Tattletale said" + }, + { + "before": "backwards-high five", + "after": "backwards high five" + } + ], + "https://www.parahumans.net/2019/01/26/blinding-11-9/": [ + { + "before": "I told the mercenary.”", + "after": "I told the mercenary." + }, + { + "before": "someone had been been called at three", + "after": "someone had been called at three" + }, + { + "before": "I croaked. as she picked up", + "after": "I croaked, as she picked up" + }, + { + "before": "two heartbroken", + "after": "two Heartbroken" + }, + { + "before": "three heartbroken", + "after": "three Heartbroken" + }, + { + "before": "Do yo want me to send", + "after": "Do you want me to send" + }, + { + "before": "PRT—or SWAT-van style", + "after": "PRT- or SWAT-van style" + }, + { + "before": "apparently I", + "after": "apparently I" + }, + { + "before": "Hey Little V", + "after": "Hey little V" + } + ], + "https://www.parahumans.net/2019/01/29/blinding-11-10/": [ + { + "before": "heartbroken kid", + "after": "Heartbroken kid" + }, + { + "before": "The team, the dynamic with the Undersiders, the Heartbroken, the kids", + "after": "The team, the dynamic with the Undersiders, the Heartbroken, the kids" + } + ], + "https://www.parahumans.net/2019/02/02/blinding-11-11/": [ + { + "before": "to Capricorn. then she looked", + "after": "to Capricorn. Then she looked" + }, + { + "before": "fucking daughter!", + "after": "fucking daughter!" + }, + { + "before": "The Warrior Monk told me", + "after": "the Warrior Monk told me" + }, + { + "before": "Foil-Hookline", + "after": "Foil–Hookline" + }, + { + "before": "“Fired through a hole I made in my fist.

", + "after": "“Fired through a hole I made in my fist.”

" + } + ], + "https://www.parahumans.net/2019/02/05/blinding-11-12/": [ + { + "before": "and drawers. her legs were stacked against", + "after": "and drawers. Her legs were stacked against" + }, + { + "before": "Not when—not like this.", + "after": "Not when— Not like this." + }, + { + "before": "Go you, Little V.", + "after": "Go you, little V." + }, + { + "before": "the King on the chess board", + "after": "the king on the chess board" + }, + { + "before": "Almost Eight?", + "after": "Almost eight?" + } + ], + "https://www.parahumans.net/2019/02/09/interlude-12-z/": [ + { + "before": "mom just so happened to be busy", + "after": "Mom just so happened to be busy" + }, + { + "before": "Or when mom had", + "after": "Or when Mom had" + }, + { + "before": "mom messed up", + "after": "Mom messed up" + }, + { + "before": "You- upstairs.", + "after": "You—upstairs." + }, + { + "before": "all the Kiss and Kill things", + "after": "all the kiss and kill things" + }, + { + "before": "relatives houses", + "after": "relatives’ houses" + }, + { + "before": "Do you want to see me go all out? she thought", + "after": "Do you want to see me go all out? she thought" + }, + { + "before": "roof top", + "after": "rooftop" + } + ], + "https://www.parahumans.net/2019/02/12/heavens-12-1/": [ + { + "before": "And mom’s implying I want", + "after": "And Mom’s implying I want" + }, + { + "before": "ent North", + "after": "ent north" + }, + { + "before": "They headed North", + "after": "They headed north" + }, + { + "before": "It had been Marquis, before", + "after": "It had been Marquis’, before" + }, + { + "before": "police, patrol, or station", + "after": "police, Patrol, or station" + }, + { + "before": "earth-N", + "after": "Earth-N" + } + ], + "https://www.parahumans.net/2019/02/16/heavens-12-2/": [ + { + "before": "And you- don’t do that", + "after": "And you—don’t do that" + }, + { + "before": "Harbingers?", + "after": "Harbingers?" + }, + { + "before": "“Thing one, thing two", + "after": "“Thing One, Thing Two" + } + ], + "https://www.parahumans.net/2019/02/19/interlude-12-e/": [ + { + "before": "I want dad", + "after": "I want Dad" + }, + { + "before": "I need dad", + "after": "I need Dad" + }, + { + "before": "going to mars or some", + "after": "going to Mars or some" + } + ], + "https://www.parahumans.net/2019/02/23/heavens-12-3/": [ + { + "before": "had shaken them good- but I could", + "after": "had shaken them good—but I could" + }, + { + "before": "Harbinger one was down, and two was wounded", + "after": "Harbinger One was down, and Two was wounded" + } + ], + "https://www.parahumans.net/2019/02/26/heavens-12-4/": [ + { + "before": "but the Harbinger said, “yes,” and I took", + "after": "but the Harbinger said “yes,” and I took" + }, + { + "before": "closer to haunting, “Think you can", + "after": "closer to haunting, “think you can" + } + ], + "https://www.parahumans.net/2019/03/02/heavens-12-all/": [ + { + "before": "bounce off of the the people", + "after": "bounce off of the people" + }, + { + "before": "a ‘us’", + "after": "an ‘us’" + }, + { + "before": "keep going,” Their March says", + "after": "keep going,” their March says" + }, + { + "before": "move, but Vista was, at least a little", + "after": "move, but Vista could, at least a little" + }, + { + "before": "a fraction of a second her more time", + "after": "a fraction of a second more time" + }, + { + "before": "let the charge grow", + "after": "lets the charge grow" + }, + { + "before": "She imagines It would", + "after": "She imagines it would" + } + ], + "https://www.parahumans.net/2019/03/05/heavens-12-5/": [ + { + "before": "mom, are you okay being", + "after": "Mom, are you okay being" + }, + { + "before": "we didn’t resume the discussion

", + "after": "we didn’t resume the discussion.

" + }, + { + "before": "flashlight of the Patrol", + "after": "flashlight of the patrol" + }, + { + "before": "ID’s", + "after": "IDs" + }, + { + "before": "My mom asked", + "after": "my mom asked" + } + ], + "https://www.parahumans.net/2019/03/09/heavens-12-6/": [ + { + "before": "wrists behind them around around the stomach", + "after": "wrists behind them around the stomach" + }, + { + "before": "back pouch” my mom said", + "after": "back pouch,” my mom said" + }, + { + "before": "protest—Two people held hostage", + "after": "protest—two people held hostage" + } + ], + "https://www.parahumans.net/2019/03/12/heavens-12-f/": [ + { + "before": ", kay", + "after": ", ’kay" + }, + { + "before": "thinking, the he brushed", + "after": "thinking, then he brushed" + } + ], + "https://www.parahumans.net/2019/03/16/heavens-12-7/": [ + { + "before": "without knowing. by Love Lost", + "after": "without knowing. By Love Lost" + }, + { + "before": "The man-though he", + "after": "The man—though he" + }, + { + "before": "a chance it might never.", + "after":"a chance it might never stop." + }, + { + "before": "wrench a weapon free, Curved blades that", + "after": "wrench a weapon free. Curved blades that" + }, + { + "before": "saw the group that standing tallest", + "after": "saw the group that was standing tallest" + }, + { + "before": "T’was", + "after": "’Twas" + } + ], + "https://www.parahumans.net/2019/03/19/heavens-12-8/": [ + { + "before": "created glowing orbs. he threw one to my", + "after": "created glowing orbs. He threw one to my" + } + ], + "https://www.parahumans.net/2019/03/23/heavens-12-9/": [ + { + "before": "Harbinger two was out and Harbinger one", + "after": "Harbinger Two was out and Harbinger One" + }, + { + "before": "pizz dispenser", + "after": "Pez dispenser" + }, + { + "before": "background keeping Crete", + "after": "background keeping Cretan" + }, + { + "regExp": " Mech", + "replacement": " mech" + } + ], + "https://www.parahumans.net/2019/03/26/heavens-12-none/": [ + { + "before": "if I inherit mom’s whole", + "after": "if I inherit Mom’s whole" + }, + { + "before": "wasn’t mom’s whole", + "after": "wasn’t Mom’s whole" + }, + { + "before": "“Fuck,”Capricorn said again", + "after": "“Fuck,” Capricorn said again" + }, + { + "before": "With your friends, your teachers the places you love", + "after": "With your friends, your teachers, the places you love" + }, + { + "before": "every earth", + "after": "every Earth" + } + ], + "https://www.parahumans.net/2019/03/29/heavens-12-x/": [ + { + "before": "go to sleep,” Her mother said", + "after": "go to sleep,” her mother said" + }, + { + "before": "Night mom", + "after": "Night Mom" + }, + { + "before": "was distorted. if it wasn’t for the fact", + "after": "was distorted. If it wasn’t for the fact" + }, + { + "before": "March said. she flourished her", + "after": "March said. She flourished her" + }, + { + "before": "morning breath—more than morning breath-, but there", + "after": "morning breath—more than morning breath—but there" + }, + { + "before": "

Previous Chapter                                                                               Next Chapter

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

", + "after": "
 
\n
 
", + "_comment": "This is the best way I can think of to emulate the end of chapter 'fake out' in an ebook format" + }, + { + "before": "Can we—Can we do my thing", + "after": "Can we— Can we do my thing" + }, + { + "before": "Let me through!", + "after": "Let me through!" + }, + { + "before": "This? That?", + "after": "This? That?" + }, + { + "before": "more saccharine, “You don’t", + "after": "more saccharine, “you don’t" + }, + { + "before": "Damsel told Antares, “Think again", + "after": "Damsel told Antares, “think again" + } + ], + "https://www.parahumans.net/2019/04/02/black-13-1/": [ + { + "before": "

\n

Previous Chapter                                                                               Next Chapter

\n", + "after": "", + "_comment": "Our usual heuristics of removing the first paragraph to remove the previous/next chapter links are broken here because of the 'go back and look at the fake out' comment at the top" + }, + { + "before": "walls stone and wood. the building", + "after": "walls stone and wood. The building" + }, + { + "before": "he asked

", + "after": "he asked.

" + }, + { + "before": "—and my costume leggings", + "after": "—And my costume leggings" + }, + { + "before": "I told Rain, “Is a goodbye.", + "after": "I told Rain, “is a goodbye." + }, + { + "before": "fiancee", + "after": "fiancée" + }, + { + "before": "Signal fire", + "after": "Signal Fire" + }, + { + "before": "“It’s winter,’", + "after": "“It’s winter,”" + } + ], + "https://www.parahumans.net/2019/04/05/black-13-2/": [ + { + "before": "built in protection", + "after": "built-in protection" + } + ], + "https://www.parahumans.net/2019/04/09/black-13-3/": [ + { + "before": "you have have surmised", + "after": "you have surmised" + }, + { + "before": "pound of flesh, at least—!”", + "after": "pound of flesh, at least—!”" + }, + { + "before": "…Kind of hate hospitals", + "after": "…kind of hate hospitals" + }, + { + "before": "—For them!", + "after": "—for them!" + } + ], + "https://www.parahumans.net/2019/04/13/black-13-4/": [ + { + "before": "wiped—or perhaps struck- clean.", + "after": "wiped—or perhaps struck—clean." + }, + { + "before": "—Because it’s a dress", + "after": "—because it’s a dress" + }, + { + "before": "Bam!", + "after": "Bam!" + } + ], + "https://www.parahumans.net/2019/04/16/black-13-5/": [ + { + "before": "For some of the heartbroken", + "after": "For some of the Heartbroken" + } + ], + "https://www.parahumans.net/2019/04/20/black-13-6/": [ + { + "before": "I’m a Master, right, you", + "after": "I’m a master, right, you" + }, + { + "before": "been studying, woo
!", + "after": "been studying, woo!" + }, + { + "before": "Kenz-Lookout", + "after": "Kenz—Lookout" + } + ], + "https://www.parahumans.net/2019/04/23/black-13-7/": [ + { + "before": "looked like they were were painted on", + "after": "looked like they were painted on" + }, + { + "before": "—My friend", + "after": "—my friend" + }, + { + "before": "Fucking what? When? How bad", + "after": "Fucking what? When? How bad" + } + ], + "https://www.parahumans.net/2019/04/27/black-13-8/": [ + { + "before": "cash are involved. there’s a reason", + "after": "cash are involved. There’s a reason" + }, + { + "before": "zero—a circle made with her full hand-, three", + "after": "zero—a circle made with her full hand—three" + }, + { + "before": "what the Wedge is or where", + "after": "what the wedge is or where" + } + ], + "https://www.parahumans.net/2019/04/30/black-13-x/": [ + { + "before": "technology from another earth", + "after": "technology from another Earth" + }, + { + "before": "from yet another earth", + "after": "from yet another Earth" + }, + { + "before": "in that a sea of yellow", + "after": "in that sea of yellow" + }, + { + "regExp": "cell five", + "replacement": "Cell Five" + }, + { + "regExp": "cell eleven", + "replacement": "Cell Eleven" + }, + { + "regExp": "cell nineteen", + "replacement": "Cell Nineteen" + }, + { + "before": "there were always some overhead", + "after": "there were always some over head" + }, + { + "before": "one of the Theocrats", + "after": "one of the theocrats" + } + ], + "https://www.parahumans.net/2019/05/04/black-13-9/": [ + { + "before": "thing is,” Tattletale said. “What did", + "after": "thing is,” Tattletale said, “what did" + }, + { + "before": "jacakss", + "after": "jackass" + }, + { + "before": "whether you invite me or not, it’s understandable if you don’t you’re going to want", + "after": "whether you invite me or not, it’s understandable if you don’t, you’re going to want" + } + ], + "https://www.parahumans.net/2019/05/07/black-13-10/": [ + { + "before": "the interior of this one was quiet-, I could", + "after": "the interior of this one was quiet—I could" + }, + { + "before": "‘why didn’t Imp back us up’?", + "after": "‘why didn’t Imp back us up?’" + }, + { + "before": "panic inducing memories", + "after": "panic-inducing memories" + } + ], + "https://www.parahumans.net/2019/05/11/black-13-11/": [ + { + "before": "been scummy and and tried", + "after": "been scummy and tried" + }, + { + "before": "—And I wanted to bring it up", + "after": "—and I wanted to bring it up" + }, + { + "before": "—Because I could have pushed harder", + "after": "—because I could have pushed harder" + }, + { + "before": "the Wardens’ bunker", + "after": "the Wardens’ Bunker" + }, + { + "before": "the more distant bunker itself", + "after": "the more distant Bunker itself" + } + ], + "https://www.parahumans.net/2019/05/14/13-z/": [ + { + "before": "and they were pro-irregular", + "after": "and they were pro-Irregular" + } + ], + "https://www.parahumans.net/2019/05/18/breaking-14-1/": [ + { + "before": "face—ridiculous notion but still-, if I wrote him a note or sent him a text—less ridiculous notion-, saying", + "after": "face—ridiculous notion but still—if I wrote him a note or sent him a text—less ridiculous notion—saying" + }, + { + "before": "Instead a 1,—2, 4", + "after": "Instead a 1, −2, 4" + } + ], + "https://www.parahumans.net/2019/05/21/breaking-14-2/": [ + { + "before": "if Parahumans like Swansong", + "after": "if parahumans like Swansong" + } + ], + "https://www.parahumans.net/2019/05/25/breaking-14-3/": [ + { + "before": "actively tamper with it it", + "after": "actively tamper with it" + }, + { + "before": "to reclaim her throne, and I.”", + "after": "to reclaim her throne, and I—”" + }, + { + "before": "A teacher plot", + "after": "A Teacher plot" + }, + { + "before": "Your own mother just went", + "after": "your own mother just went" + }, + { + "before": "Ashley stared int the", + "after": "Ashley stared into the" + } + ], + "https://www.parahumans.net/2019/05/28/breaking-14-4/": [ + { + "before": "Once Goddess’s earth", + "after": "Once Goddess’s Earth" + } + ], + "https://www.parahumans.net/2019/06/01/breaking-14-5/": [ + { + "before": "his wife was dressed in patching colors", + "after": "his wife was dressed in matching colors" + }, + { + "before": "Luis said. “he saw a lot of", + "after": "Luis said. “He saw a lot of" + } + ], + "https://www.parahumans.net/2019/06/04/breaking-14-6/": [ + { + "before": "and the the undo button", + "after": "and the undo button" + }, + { + "before": "progress with mom is slow", + "after": "progress with Mom is slow" + }, + { + "before": "Promises to mom and dad", + "after": "Promises to Mom and Dad" + }, + { + "before": "or innovators—scientists-, they say", + "after": "or innovators—scientists—they say" + }, + { + "before": "PHD", + "after": "PhD" + }, + { + "before": "If I’m asking?", + "after": "If I’m asking?" + }, + { + "before": "Isn’t it?", + "after": "Isn’t it?" + } + ], + "https://www.parahumans.net/2019/06/08/breaking-14-7/": [ + { + "before": "Regretting sending mom here", + "after": "Regretting sending Mom here" + }, + { + "before": "you’re talking syncope—fainting-, arrythmia,", + "after": "you’re talking syncope—fainting, arrythmia," + }, + { + "before": "inter-earth", + "after": "inter-Earth" + }, + { + "before": "The Western of the two half-castles", + "after": "The western of the two half-castles" + } + ], + "https://www.parahumans.net/2019/06/11/breaking-14-8/": [ + { + "before": "the conditions weren’t great-it was cold enough", + "after": "the conditions weren’t great—it was cold enough" + }, + { + "before": "pick up line", + "after": "pickup line" + }, + { + "before": "got me,” Rain said. “Was that", + "after": "got me,” Rain said, “was that" + }, + { + "before": "—Ask for some strings", + "after": "—ask for some strings" + }, + { + "before": "for the needy for Church events", + "after": "for the needy for church events" + } + ], + "https://www.parahumans.net/2019/06/15/breaking-14-9/": [ + { + "before": "You stay away from mom, you stay away from dad", + "after": "You stay away from Mom, you stay away from Dad" + }, + { + "before": "‘fuck this, not hitching a ride with—this-‘", + "after": "‘fuck this, not hitching a ride with this’" + } + ], + "https://www.parahumans.net/2019/06/18/breaking-14-10/": [ + { + "before": "in a real fight-, but in", + "after": "in a real fight—but in" + }, + { + "before": "fall to the mattress, “Let", + "after": "fall to the mattress, “let" + }, + { + "before": "I—Only if you hold onto it.", + "after": "I— Only if you hold onto it." + } + ], + "https://www.parahumans.net/2019/06/22/breaking-14-11/": [ + { + "before": "-He’s changing-", + "after": "-He’s changing-" + } + ], + "https://www.parahumans.net/2019/06/25/breaking-14-12/": [ + { + "before": "-Her phone?—", + "after": "-Her phone?-" + }, + { + "before": "-Have to ask her.—", + "after": "-Have to ask her.-" + }, + { + "before": "-down hall with gate. basement of that part of complx—", + "after": "-down hall with gate. basement of that part of complx-" + }, + { + "before": "-That was us—the message on my display read.—cuz guards—", + "after": "-That was us- the message on my display read. -cuz guards-" + }, + { + "before": "blinfd", + "after": "blind" + }, + { + "before": "This? It’s stupid politics", + "after": "This? It’s stupid politics" + } + ], + "https://www.parahumans.net/2019/06/29/breaking-14-z/": [ + { + "before": "smirked, leering. her face was stretching", + "after": "smirked, leering. Her face was stretching" + }, + { + "before": "But Master–stranger protocols", + "after": "But master–stranger protocols" + }, + { + "before": "allusion to Master–stranger protocols", + "after": "allusion to master–stranger protocols" + }, + { + "before": "I dealt with ‘m", + "after": "I dealt with ’m" + } + ], + "https://www.parahumans.net/2019/07/02/dying-15-a/": [ + { + "before": "this sad old man made her think of dad", + "after": "this sad old man made her think of Dad" + }, + { + "before": "scary. that’s all", + "after": "scary. That’s all" + }, + { + "before": "At Anita’s assistance", + "after": "At Anita’s insistence" + }, + { + "before": "kanji for ‘Shi’", + "after": "kanji for ‘shi’" + }, + { + "before": "re-learning day to day life", + "after": "relearning day-to-day life" + } + ], + "https://www.parahumans.net/2019/07/06/dying-15-1/": [ + { + "before": "wall met ceiling. the wall was smooth", + "after": "wall met ceiling. The wall was smooth" + }, + { + "before": "The blond heartbroken", + "after": "The blond Heartbroken" + }, + { + "before": "straight A’s", + "after": "straight As" + } + ], + "https://www.parahumans.net/2019/07/09/dying-15-2/": [ + { + "before": "I told Precipice

", + "after": "I told Precipice.

" + }, + { + "before": "Guys’ gotta be a thirteen", + "after": "Guy’s gotta be a thirteen" + }, + { + "before": "been sitting her for", + "after": "been sitting here for" + }, + { + "before": "a body torn two", + "after": "a body torn in two" + }, + { + "before": "it had eben damaged", + "after": "it had been damaged" + }, + { + "before": "dodge that was fast moving", + "after": "dodge something that fast-moving" + }, + { + "before": "done so far, and crippling", + "after": "done so far, crippling" + }, + { + "before": "‘hedrons", + "after": "’hedrons" + }, + { + "before": "post its", + "after": "Post-its" + }, + { + "before": "travelled", + "after": "traveled" + } + ], + "https://www.parahumans.net/2019/07/13/dying-15-3/": [ + { + "before": "Didn’t ask about mom, dad, or", + "after": "Didn’t ask about Mom, Dad, or" + }, + { + "before": "—And we’re heading upstairs", + "after": "—and we’re heading upstairs" + } + ], + "https://www.parahumans.net/2019/07/16/dying-15-4/": [ + { + "before": "There was was no ‘good’", + "after": "There was no ‘good’" + }, + { + "before": "was a H turned", + "after": "was an H turned" + }, + { + "before": "Needles receded as the entered", + "after": "Needles receded as they entered" + }, + { + "before": "flanking help other teams", + "after": "flanking to help other teams" + }, + { + "before": "water off a ducks’ back", + "after": "water off a duck’s back" + }, + { + "before": "the damage segments around", + "after": "the damaged segments around" + }, + { + "before": "when we’re done this mission", + "after": "when we’re done with this mission" + }, + { + "before": "If you take the current device with you can use it again", + "after": "If you take the current device with, you can use it again" + }, + { + "before": "one remaining Thrall", + "after": "one remaining thrall" + }, + { + "before": "Team copper-white", + "after": "Team Copper-White" + }, + { + "before": "Caraytid", + "after": "Caryatid" + } + ], + "https://www.parahumans.net/2019/07/20/dying-15-5/": [ + { + "before": "worth of of water", + "after": "worth of water" + }, + { + "before": "mind controlling", + "after": "mind-controlling" + }, + { + "before": "range of the Halo", + "after": "range of the halo" + }, + { + "before": "tear up the Haloed angel", + "after": "tear up the haloed angel" + }, + { + "before": "her power helping, to keep her there instead of falling", + "after": "her power helping to keep her there instead of falling" + }, + { + "before": "the time manipulating tinkers", + "after": "the time-manipulating tinkers" + } + ], + "https://www.parahumans.net/2019/07/23/dying-15-6/": [ + { + "before": "The teams had finished picking

", + "after": "The teams had finished picking.

" + }, + { + "before": "no wifi", + "after": "no Wi-Fi" + }, + { + "before": "a of linked metal segments", + "after": "a ??? of linked metal segments" + }, + { + "before": "Things one through whatever", + "after": "Things One through whatever" + }, + { + "before": "close to identical powersets", + "after": "close-to-identical powersets" + }, + { + "before": "The second they were out jailer’s door", + "after": "The second they were out of the jailer’s door" + }, + { + "before": "my Aunt’s", + "after": "my aunt’s" + } + ], + "https://www.parahumans.net/2019/07/27/dying-15-7/": [ + { + "before": "stranger or Master in", + "after": "stranger or master in" + }, + { + "before": "d—! _ ! d—", + "after": "d- ! _ ! d-" + } + ], + "https://www.parahumans.net/2019/07/30/dying-15-8/": [ + { + "before": "I thought. the dosage was supposed", + "after": "I thought. The dosage was supposed" + }, + { + "before": "I got a glimpse. it’s fucking with me", + "after": "I got a glimpse. It’s fucking with me" + }, + { + "before": "‘aunt Rachel‘s’", + "after": "‘Aunt Rachel’s’" + }, + { + "before": "Letting teacher go, knowing two members", + "after": "Letting Teacher go, knowing two members" + }, + { + "before": "using then to help hold up", + "after": "using them to help hold up" + } + ], + "https://www.parahumans.net/2019/08/03/dying-15-x/": [ + { + "before": "The Halo protected against", + "after": "The halo protected against" + }, + { + "before": "Normally teacher granted something", + "after": "Normally Teacher granted something" + }, + { + "before": "Carbon Dioxide bubbles manifesting", + "after": "Carbon dioxide bubbles manifesting" + }, + { + "before": "got the Thrall Commander, right", + "after": "got the thrall commander, right" + }, + { + "before": "the Yàngbǎn supported squad", + "after": "the Yàngbǎn-supported squad" + }, + { + "before": "radius in you systems", + "after": "radius in your systems" + } + ], + "https://www.parahumans.net/2019/08/06/dying-15-y/": [ + { + "before": "little miss Webb’s way", + "after": "little Miss Webb’s way" + } + ], + "https://www.parahumans.net/2019/08/10/dying-15-z/": [ + { + "before": "All around her, Thralls paid her their worship", + "after": "All around her, thralls paid her their worship" + }, + { + "before": "almost floated almost three hundred thousand", + "after": "almost floated amongst three hundred thousand" + }, + { + "before": "parahuman’s hackers", + "after": "parahumans’ hackers" + }, + { + "before": "the room, and them him", + "after": "the room, and then him" + }, + { + "before": "transcendant", + "after": "transcendent" + }, + { + "before": "The one who was slicing up the supporting walls ground rumbled, the floor twisted, the house-sized turbine in the center of the room lost some of its foundation", + "after": "The one who was slicing up the supporting walls—

\n

The ground rumbled, the floor twisted, the house-sized turbine in the center of the room lost some of its foundation", + "_comment": "This paragraph break probably wasn't what was intended, but a good chunk of the sentence is missing, so this is the best fix I can think of." + } + ], + "https://www.parahumans.net/2019/08/13/from-within-16-1/": [ + { + "before": "wasn’t A.I. it was just a picture", + "after": "wasn’t A.I. It was just a picture" + }, + { + "before": "end of Summer that", + "after": "end of summer that" + }, + { + "before": "or get back to where you", + "after": "or to get back to where you" + } + ], + "https://www.parahumans.net/2019/08/17/from-within-16-2/": [ + { + "before": "a small part of that was being being grumpy", + "after": "a small part of that was being grumpy" + }, + { + "before": "Hardboil", + "after": "Hard Boil" + }, + { + "before": "after class in Math, my", + "after": "after class in math, my" + }, + { + "before": "My point is, If you", + "after": "My point is, if you" + }, + { + "before": "loyalty inducing Goddesses", + "after": "loyalty-inducing Goddesses" + }, + { + "before": "Did you get an impression about her character, or anything weird.", + "after": "Did you get an impression about her character, or anything weird?" + } + ], + "https://www.parahumans.net/2019/08/20/from-within-16-3/": [ + { + "before": "small face on on a fifteen inch", + "after": "small face on a fifteen inch" + }, + { + "before": "for the recording.”", + "after": "for the recording." + }, + { + "before": "—But one of us could still", + "after": "—but one of us could still" + } + ], + "https://www.parahumans.net/2019/08/24/from-within-16-4/": [ + { + "before": "the rest black and slim. with doodle-like drawings", + "after": "the rest black and slim, with doodle-like drawings" + }, + { + "before": "trophy wrack", + "after": "trophy rack" + }, + { + "before": "hopped onto his back for the extra eight", + "after": "hopped onto his back for the extra height" + } + ], + "https://www.parahumans.net/2019/08/27/from-within-16-5/": [ + { + "before": "thing number one. it’s not a lot", + "after": "thing number one. It’s not a lot" + }, + { + "before": "French toast", + "after": "french toast" + }, + { + "before": "put into Neutral out of", + "after": "put into neutral out of" + }, + { + "before": "after Mockument’s had hatched that", + "after": "after Mockument had hatched that" + } + ], + "https://www.parahumans.net/2019/08/31/from-within-16-6/": [ + { + "before": "letters I wrote to dad’s friends", + "after": "letters I wrote to Dad’s friends" + }, + { + "before": "—But that might be intentional", + "after": "—but that might be intentional" + } + ], + "https://www.parahumans.net/2019/09/03/from-within-16-7/": [ + { + "before": "aunt Rachel", + "after": "Aunt Rachel" + }, + { + "before": "for Kenzie to high five", + "after": "for Kenzie to high-five", + "_comment": "Here it's a verb" + } + ], + "https://www.parahumans.net/2019/09/07/from-within-16-8/": [ + { + "before": "Giant lightning man guard dog", + "after": "Giant lightning-man guard dog" + }, + { + "before": "35: 10", + "after": "35:10" + }, + { + "before": "pluckign", + "after": "plucking" + }, + { + "before": "special event space", + "after": "Special event space" + } + ], + "https://www.parahumans.net/2019/09/10/from-within-16-9/": [ + { + "before": "changers and and shakers", + "after": "changers and shakers" + }, + { + "before": "the Twins’ portion of the room", + "after": "the twins’ portion of the room" + }, + { + "before": "one central area—No weapon—and swung backhanded", + "after": "one central area—no weapon—and swung backhanded" + }, + { + "before": "shifted course to favor the smallest portion of the gap leaped the ditch", + "after": "shifted course to favor the smallest portion of the gap and leaped the ditch" + }, + { + "before": "—It’s not three-dimensional", + "after": "—it’s not three-dimensional" + }, + { + "before": "a work bench", + "after": "a workbench" + }, + { + "before": "—Don’t shoot it!", + "after": "—don’t shoot it!" + } + ], + "https://www.parahumans.net/2019/09/14/from-within-16-10/": [ + { + "before": "carried on. out of", + "after": "carried on, out of" + }, + { + "before": "That-. Okay.", + "after": "That— Okay." + }, + { + "before": "combat trained", + "after": "combat-trained" + } + ], + "https://www.parahumans.net/2019/09/17/from-within-16-11/": [ + { + "before": "Warrior monk", + "after": "Warrior Monk" + }, + { + "before": "Empire Eighty-eight", + "after": "Empire Eighty-Eight" + } + ], + "https://www.parahumans.net/2019/09/21/from-within-16-12/": [ + { + "before": "harder than normal exhalation", + "after": "harder-than-normal exhalation" + }, + { + "before": "maybe a bit to the right. “There’s probably a", + "after": "maybe a bit to the right, “there’s probably a" + }, + { + "before": "—We need to do this fast", + "after": "—we need to do this fast" + } + ], + "https://www.parahumans.net/2019/09/24/from-within-16-y/": [ + { + "before": "…She was my first kiss", + "after": "…she was my first kiss" + }, + { + "before": "another on the railing. “I’m not", + "after": "another on the railing, “I’m not" + }, + { + "before": "that out loud, “—But you’re a therapist", + "after": "that out loud, “—but you’re a therapist" + }, + { + "before": "monster slaying", + "after": "monster-slaying" + }, + { + "before": "so important they’d focus on you’?”", + "after": "so important they’d focus on you?’”" + }, + { + "before": "Than in B—In B, the woman", + "after": "Than in B—in B, the woman" + }, + { + "before": "insistent, annoyed. “I could", + "after": "insistent, annoyed, “I could" + }, + { + "before": "Listen!", + "after": "Listen!" + }, + { + "before": "“—But when I shook your hand", + "after": "“—but when I shook your hand" + }, + { + "before": "That,” Chris said. “Is what", + "after": "That,” Chris said, “is what" + }, + { + "before": "transcending earth and humanity", + "after": "transcending Earth and humanity" + }, + { + "before": "day to day stuff", + "after": "day-to-day stuff" + }, + { + "before": "day to day work", + "after": "day-to-day work" + } + ], + "https://www.parahumans.net/2019/09/28/from-within-16-z/": [ + { + "before": "ducked their heads down and hurried

", + "after": "ducked their heads down and hurried.

" + }, + { + "before": "in the way,”she said", + "after": "in the way,” she said" + }, + { + "before": "his voice just for her. “I’ll be", + "after": "his voice just for her, “I’ll be" + }, + { + "before": "through the threshold to the.", + "after": "through the threshold." + }, + { + "regExp": "capitol", + "replacement": "capital" + }, + { + "before": "—But none of that would", + "after": "—but none of that would" + }, + { + "before": "the Doctor replied", + "after": "the doctor replied" + }, + { + "before": "…It’d be exactly the same", + "after": "…it’d be exactly the same" + }, + { + "before": "This—This had been just for her.", + "after": "This—this had been just for her." + } + ], + "https://www.parahumans.net/2019/10/01/sundown-17-1/": [ + { + "before": "mind of dad after his head injury", + "after": "mind of Dad after his head injury" + }, + { + "before": "Some—many- were unwillingly", + "after": "Some—many—were unwillingly" + }, + { + "before": "looking down at my hand at her arm and my hand", + "after": "looking down at her arm and my hand" + }, + { + "before": "more more thing hanging over our heads", + "after": "one more thing hanging over our heads" + }, + { + "before": "my mothers cheeks", + "after": "my mother’s cheeks" + }, + { + "before": "—Understand, please", + "after": "—understand, please" + }, + { + "before": "“Victoria,” Crystal’s voice was gentle", + "after": "“Victoria.” Crystal’s voice was gentle" + } + ], + "https://www.parahumans.net/2019/10/05/sundown-17-2/": [ + { + "before": "egg for Crystal and mom", + "after": "egg for Crystal and Mom" + }, + { + "before": "

Me:
", + "after": "

Me:
" + }, + { + "before": "

Vista (Little V):
", + "after": "

Vista (Little V):
" + }, + { + "before": "few minutes of peace, damn it.—", + "after": "few minutes of peace, damn it—" + }, + { + "regExp": "‘Clear", + "replacement": "’Clear" + } + ], + "https://www.parahumans.net/2019/10/08/sundown-17-3/": [ + { + "before": "say, Math class", + "after": "say, math class" + }, + { + "before": "hang outs", + "after": "hangouts" + }, + { + "before": "", + "after": "’" + }, + { + "before": "“—Which I’m not.”", + "after": "“—which I’m not.”" + }, + { + "before": "Vista for the kid’s sake", + "after": "Vista for the kids’ sake" + }, + { + "before": "Day to day activities", + "after": "Day-to-day activities" + }, + { + "before": "tower crescent avenue", + "after": "Tower Crescent Avenue" + }, + { + "before": "all had to deal with ‘heavy’.", + "after": "all had to deal with ‘heavy’.”" + }, + { + "before": "stuff?” I spoke up, “it get into that control", + "after": "stuff?” I spoke up. “It gets into that control" + }, + { + "before": "talked to me a like", + "after": "talked to me like" + }, + { + "before": "call me Big V", + "after": "call me big V" + } + ], + "https://www.parahumans.net/2019/10/12/sundown-17-4/": [ + { + "before": "on resisting Master influence", + "after": "on resisting master influence" + }, + { + "before": "CDs and Vinyls", + "after": "CDs and vinyls" + }, + { + "before": "“P.R.T.”", + "after": "“PRT.”" + }, + { + "before": "second or third string Wardens", + "after": "second- or third-string Wardens" + }, + { + "before": "intern level clerks", + "after": "intern-level clerks" + }, + { + "before": "half way", + "after": "halfway" + }, + { + "before": "her tone didn’t soft", + "after": "her tone didn’t soften" + }, + { + "before": "Jessica, Mr…", + "after": "Jessica, Mr.…" + }, + { + "before": "—Captive", + "after": "—captive" + }, + { + "before": "come from? what language", + "after": "come from? What language" + } + ], + "https://www.parahumans.net/2019/10/15/sundown-17-5/": [ + { + "before": "Is mom walking without difficulty", + "after": "Is Mom walking without difficulty" + }, + { + "before": "Through valkyrie", + "after": "Through Valkyrie" + }, + { + "before": "“‘Lo.”", + "after": "“’Lo.”" + } + ], + "https://www.parahumans.net/2019/10/19/sundown-17-6/": [ + { + "before": "Probably dad", + "after": "Probably Dad" + }, + { + "before": "and no and no rejiggered rat", + "after": "and no rejiggered rat" + }, + { + "before": "Harder headed", + "after": "Harder-headed" + }, + { + "before": "you proved my sister right? Tired,", + "after": "you proved my sister right? Tired," + }, + { + "before": "boundary,” He whispered", + "after": "boundary,” he whispered" + } + ], + "https://www.parahumans.net/2019/10/22/sundown-17-7/": [ + { + "before": "art good enough to to keep forever", + "after": "art good enough to keep forever" + }, + { + "before": "Golem explained

", + "after": "Golem explained.

" + }, + { + "before": "see the Lab", + "after": "see the lab" + } + ], + "https://www.parahumans.net/2019/10/26/sundown-17-8/": [ + { + "before": "one primary goal—me-, and who", + "after": "one primary goal—me—and who" + }, + { + "before": "She’s aggressive If anyone makes", + "after": "She’s aggressive. If anyone makes" + }, + { + "before": "—They mobbed Lookout", + "after": "—they mobbed Lookout" + }, + { + "before": "Of Course Kenzie", + "after": "Of course Kenzie" + }, + { + "before": "Rain about Girls", + "after": "Rain about girls" + }, + { + "before": "I typed: The one", + "after": "I typed: The one" + }, + { + "before": "realize,” Seir called out. “If a fight", + "after": "realize,” Seir called out, “if a fight" + }, + { + "before": "was emotion resistant", + "after": "was emotion-resistant" + }, + { + "before": "Thank you, fragile one", + "after": "Thank you, Fragile One" + } + ], + "https://www.parahumans.net/2019/10/29/sundown-17-9/": [ + { + "before": "—Are you going to be wishing", + "after": "—are you going to be wishing" + }, + { + "before": "Asking question?", + "after": "Asking a question?" + } + ], + "https://www.parahumans.net/2019/11/02/sundown-17-10/": [ + { + "before": "wanted you to go to mom if you", + "after": "wanted you to go to Mom if you" + }, + { + "before": "that didn’t betray too much

", + "after": "that didn’t betray too much.

" + }, + { + "before": "say Molasses", + "after": "say molasses" + }, + { + "before": "‘nother", + "after": "’nother" + }, + { + "before": "‘she peed on me!’", + "after": "‘she peed on me!’." + }, + { + "before": "madam Mayor", + "after": "Madam Mayor" + } + ], + "https://www.parahumans.net/2019/11/05/interlude-17-x-sundown/": [ + { + "before": "five-o’clock shadow", + "after": "five o’clock shadow" + }, + { + "before": "nervous looking guy", + "after": "nervous-looking guy" + }, + { + "before": "you have drugs? Alcohol? Cigarettes? I have", + "after": "you have drugs? Alcohol? Cigarettes? I have" + }, + { + "before": "Not by mom or dad", + "after": "Not by Mom or Dad" + } + ], + "https://www.parahumans.net/2019/11/09/interlude-17-y-sundown/": [ + { + "before": "Because it made mom come", + "after": "Because it made Mom come" + }, + { + "before": "new titan", + "after": "new Titan" + }, + { + "before": "anti parahumans", + "after": "anti-parahumans" + }, + { + "before": "hit the Anti-parahumans", + "after": "hit the anti-parahumans" + } + ], + "https://www.parahumans.net/2019/11/12/interlude-17-z-sundown/": [ + { + "before": "had his powers. the forcefield above", + "after": "had his powers. The forcefield above" + }, + { + "regExp": "titan(?![a-z])", + "replacement": "Titan" + }, + { + "before": "What if you weren’t?", + "after": "What if you weren’t?" + }, + { + "before": "Victor, Can you go join Tribute", + "after": "Victor, can you go join Tribute" + }, + { + "before": "The forcefield above him elaborate and getting", + "after": "The forcefield above him was elaborate and getting" + }, + { + "before": "Their faculties were diminished, but

", + "after": "Their faculties were diminished, but—

" + }, + { + "before": "Flashbang, he saw was one of the", + "after": "Flashbang, he saw, was one of the" + }, + { + "before": "the palm, Out each foot, and out of the mouth.lifting one", + "after": "the palm. Out each foot, and out of the mouth. Lifting one" + }, + { + "before": "no eyes; only a blindfold", + "after": "no eyes, only a blindfold" + }, + { + "before": "lightness of a feather landing, came to perch", + "after": "lightness of a feather landing, it came to perch" + }, + { + "before": "…The only things that are", + "after": "…the only things that are" + } + ], + "https://www.parahumans.net/2019/11/16/radiation-18-1/": [ + { + "before": "worked for the P.R.T.", + "after": "worked for the PRT." + }, + { + "regExp": "titan(?![a-z])", + "replacement": "Titan" + }, + { + "before": "the Fallen Raid or the Prison?", + "after": "the Fallen raid or the prison?" + } + ], + "https://www.parahumans.net/2019/11/19/radiation-18-2/": [ + { + "before": "looking for mom in the crowd", + "after": "looking for Mom in the crowd" + }, + { + "before": "“Entrapment.”", + "after": "“Entrapment.”" + }, + { + "before": "tents last Winter or Spring", + "after": "tents last winter or spring" + }, + { + "regExp": "titan(?![a-z])", + "replacement": "Titan" + }, + { + "before": "condemnation free", + "after": "condemnation-free" + }, + { + "before": "eyes heavily decorate with gray", + "after": "eyes heavily decorated with gray" + }, + { + "before": "Yuh!", + "after": "Yuh!" + }, + { + "before": "cultured accent, “Is that us", + "after": "cultured accent, “is that us" + }, + { + "before": "to force one.”", + "after": "to force one’.”" + }, + { + "before": "between the Titans Pull", + "after": "between the Titans. Pull" + } + ], + "https://www.parahumans.net/2019/11/23/radiation-18-3/": [ + { + "before": "in the eyes. they were a", + "after": "in the eyes. They were a" + }, + { + "before": "first look at a titan", + "after": "first look at a Titan" + }, + { + "before": "too much fo a retreat", + "after": "too much of a retreat" + }, + { + "before": "said, “after we were all", + "after": "said, “After we were all" + }, + { + "before": "reconicle", + "after": "reconcile" + } + ], + "https://www.parahumans.net/2019/11/26/radiation-18-4/": [ + { + "before": "bucked a little with the the impact", + "after": "bucked a little with the impact" + }, + { + "before": "you go. no joke, no wiggle", + "after": "you go. No joke, no wiggle" + }, + { + "before": "some business headquarters I was in

", + "after": "some business headquarters I was in.

" + }, + { + "before": "hunched-over titan", + "after": "hunched-over Titan" + }, + { + "before": "experience the world, fragile one", + "after": "experience the world, Fragile One" + }, + { + "before": "chime in, fragile one", + "after": "chime in, Fragile One" + }, + { + "before": "syndicate-awareness", + "after": "Syndicate-awareness" + }, + { + "before": "gray Jester Mockument was like", + "after": "gray jester Mockument like" + }, + { + "before": "he halfway back", + "after": "he was halfway back" + }, + { + "before": "master of biology", + "after": "mastery of biology" + }, + { + "before": "for most move, or raise", + "after": "for most moves, or raise" + }, + { + "before": "wasn’t hookline’s", + "after": "wasn’t Hookline’s" + }, + { + "before": "Chicken little", + "after": "Chicken Little" + } + ], + "https://www.parahumans.net/2019/11/30/radiation-18-5/": [ + { + "before": "jumping of a cardboard", + "after": "jumping off a cardboard" + }, + { + "before": "Tattletale said. “That breastplate", + "after": "Tattletale said, “that breastplate" + }, + { + "before": "they were gas damaged", + "after": "they were gas-damaged" + }, + { + "before": "“skewer them to", + "after": "“Skewer them to" + }, + { + "before": "…You have to conserve", + "after": "…you have to conserve" + }, + { + "before": "Shorcut", + "after": "Shortcut" + } + ], + "https://www.parahumans.net/2019/12/03/radiation-18-6/": [ + { + "before": "Some Master minions", + "after": "Some master minions" + }, + { + "before": "bomb to a titan", + "after": "bomb to a Titan" + }, + { + "before": "military inspired", + "after": "military-inspired" + }, + { + "before": "a rough fight", + "after": "a rough flight" + } + ], + "https://www.parahumans.net/2019/12/07/radiation-18-7/": [ + { + "before": "Couple of of times a month", + "after": "Couple of times a month" + }, + { + "before": "This would be the Church.", + "after": "This would be the church." + }, + { + "before": "my Uncle said", + "after": "my uncle said" + }, + { + "before": "my Uncle asked", + "after": "my uncle asked" + }, + { + "before": "Only Jester and my Uncle were", + "after": "Only Jester and my uncle were" + }, + { + "before": "Victoria?” My Uncle asked", + "after": "Victoria?” my uncle asked" + }, + { + "before": "end of the Summer", + "after": "end of the summer" + }, + { + "before": "five pound phone", + "after": "five-pound phone" + }, + { + "before": "He was slowly knitting itself together", + "after": "He was slowly knitting himself together" + }, + { + "before": "and uh, Stables", + "after": "and uh, stables" + }, + { + "before": "feel the meta tines", + "after": "feel the metal tines" + }, + { + "before": "back at the Workshop", + "after": "back at the workshop" + }, + { + "before": "Victoria,” My uncle", + "after": "Victoria,” my uncle" + } + ], + "https://www.parahumans.net/2019/12/10/radiation-18-8/": [ + { + "before": "Parahuman Sciences", + "after": "parahuman sciences" + }, + { + "before": "protocols in action.’", + "after": "protocols in action’." + }, + { + "before": "“—Too close", + "after": "“—too close" + }, + { + "before": "Ten-thirty-six", + "after": "Ten thirty-six" + }, + { + "before": "“—He was warm and safe", + "after": "“—he was warm and safe" + } + ], + "https://www.parahumans.net/2019/12/14/radiation-18-9/": [ + { + "before": "the next titan", + "after": "the next Titan" + }, + { + "before": "Kenzie said. Give me a minute.", + "after": "Kenzie said. “Give me a minute." + }, + { + "before": "Sveta said. Especially if we", + "after": "Sveta said. “Especially if we" + }, + { + "before": "from the cold, though his face", + "after": "from the cold; though his face" + } + ], + "https://www.parahumans.net/2019/12/17/radiation-18-10/": [ + { + "before": "one titan dogging me", + "after": "one Titan dogging me" + }, + { + "before": "Capes on two rises", + "after": "Capes on two risers" + } + ], + "https://www.parahumans.net/2019/12/21/interlude-18-z-radiation/": [ + { + "before": "face where her Uncle would see", + "after": "face where her uncle would see" + }, + { + "before": "Her Uncle put his hand", + "after": "Her uncle put his hand" + }, + { + "before": "and saw her Aunt and Uncle approaching", + "after": "and saw her aunt and uncle approaching" + }, + { + "regExp": "([Tt]he) Giantess", + "replacement": "$1 giantess", + "_comment": "14 other instances in this chapter are not capitalized" + }, + { + "before": "had allies. connections.", + "after": "had allies. Connections." + } + ], + "https://www.parahumans.net/2019/12/24/infrared-19-1/": [ + { + "before": "Victoria,” my Aunt said", + "after": "Victoria,” my aunt said" + }, + { + "regExp": "([Tt]he) stranger", + "replacement": "$1 Stranger", + "_comment": "See convert-worker.js; this corrects an over-correction" + }, + { + "before": "doing the damage herself", + "after": "doing the damage themselves" + }, + { + "before": "This? This", + "after": "This? This" + } + ], + "https://www.parahumans.net/2019/12/28/infrared-19-2/": [ + { + "before": "a violent exclamation

", + "after": "a violent exclamation.

" + }, + { + "before": "

Three seconds

", + "after": "

Three seconds.

" + }, + { + "before": "scream—no sound when viewing crystal-pictures, of course-, and", + "after": "scream—no sound when viewing crystal-pictures, of course—and" + }, + { + "regExp": "([Tt]he) stranger", + "replacement": "$1 Stranger", + "_comment": "See convert-worker.js; this corrects an over-correction" + }, + { + "before": "because the titan was", + "after": "because the Titan was" + }, + { + "before": "endless flesh monster were", + "after": "endless flesh monsters were" + }, + { + "before": "putting it of balance", + "after": "putting it off balance" + }, + { + "before": "What lay us below", + "after": "What lay below us" + }, + { + "before": "Do you have any regrets now?", + "after": "Do you have any regrets now?" + }, + { + "before": "Stygean Blue", + "after": "stygian blue" + }, + { + "before": "Except the feeling of breached", + "after": "Except the feeling of being breached" + }, + { + "before": "best guess of it’s location", + "after": "best guess of its location" + }, + { + "before": "Dream Room", + "after": "dream room" + }, + { + "before": "‘EM", + "after": "’EM" + }, + { + "before": "In effect, Powers were different", + "after": "In effect, powers were different" + } + ], + "https://www.parahumans.net/2020/01/01/interlude-19-a/": [ + { + "before": "“I’m fine” Egg said", + "after": "“I’m fine,” Egg said" + }, + { + "before": "can’t induce triggers There were parahumans", + "after": "can’t induce triggers. There were parahumans" + }, + { + "before": "into the conversation, “You do some", + "after": "into the conversation, “you do some" + }, + { + "before": "None of us do, Egg thought", + "after": "None of us do, Egg thought" + }, + { + "before": "Our ‘number zero’s wife", + "after": "Our ‘number zero’s’ wife" + }, + { + "before": "his voice was hard, “You took", + "after": "his voice was hard, “you took" + }, + { + "before": "You don’t get to do that!", + "after": "You don’t get to do that!" + }, + { + "before": "Almost a Figurehead", + "after": "Almost a figurehead" + }, + { + "before": "Can’t fist bump", + "after": "Can’t fist-bump", + "_comment": "Here it's a verb" + }, + { + "before": "that other Parahumans are", + "after": "that other parahumans are" + } + ], + "https://www.parahumans.net/2020/01/04/infrared-19-3/": [ + { + "before": "I thought of dad, seeing him hug my mother", + "after": "I thought of Dad, seeing him hug my mother" + }, + { + "before": "One titan mobilizing", + "after": "One Titan mobilizing" + }, + { + "before": "the horrifying titan", + "after": "the horrifying Titan" + }, + { + "before": "that stranger", + "after": "that Stranger" + }, + { + "before": "I could Strands worked to braid together", + "after": "I could see strands working to braid together" + }, + { + "before": "any of the Master Protocols", + "after": "any of the master protocols" + } + ], + "https://www.parahumans.net/2020/01/07/infrared-19-4/": [ + { + "before": "talked to them? or done", + "after": "talked to them? Or done" + }, + { + "before": "all nighters", + "after": "all-nighters" + }, + { + "before": "the other cases", + "after": "the other Cases" + } + ], + "https://www.parahumans.net/2020/01/11/infrared-19-b/": [ + { + "before": "or when you divorce dad", + "after": "or when you divorce Dad" + }, + { + "before": "Hey mom? Mom", + "after": "Hey Mom? Mom" + }, + { + "before": "or heard of the Master who had created", + "after": "or heard of the master who had created" + }, + { + "before": "pretty sure it’s Master", + "after": "pretty sure it’s master" + }, + { + "before": "Love Lost is Master-class", + "after": "Love Lost is master-class" + }, + { + "before": "opportunity to handpick people

", + "after": "opportunity to handpick people.

" + }, + { + "before": "pause, drew its attention

", + "after": "pause, drew its attention.

" + }, + { + "before": "someone my Aunt and Uncle deemed subversive", + "after": "someone my aunt and uncle deemed subversive" + }, + { + "before": "Looks after my Aunt while my Uncle", + "after": "Looks after my aunt while my uncle" + }, + { + "before": "can understand your Aunt and Uncle", + "after": "can understand your aunt and uncle" + }, + { + "before": "—And I think I have a grasp", + "after": "—and I think I have a grasp" + }, + { + "before": "emotion driven", + "after": "emotion-driven" + } + ], + "https://www.parahumans.net/2020/01/14/infrared-19-c/": [ + { + "before": "-maim, destroy, tear it all down—", + "after": "—maim, destroy, tear it all down—" + }, + { + "before": "-make it hurt, torture, butcher, kill—", + "after": "—make it hurt, torture, butcher, kill—" + }, + { + "before": "—Retaliate—", + "after": "—Retaliate—" + }, + { + "before": "—die quickly, if he has to die.", + "after": "—die quickly, if he has to die." + }, + { + "before": "close mouthed", + "after": "close-mouthed" + }, + { + "before": "“…Don’t really trust", + "after": "“…don’t really trust" + } + ], + "https://www.parahumans.net/2020/01/18/infrared-19-5/": [ + { + "before": "liqud Titan", + "after": "liquid Titan" + }, + { + "before": "done at the Prison", + "after": "done at the prison" + } + ], + "https://www.parahumans.net/2020/01/21/infrared-19-6/": [ + { + "before": "-through the emotion. Emote through the emotion. Emote—", + "after": "—through the emotion. Emote through the emotion. Emote—" + }, + { + "before": "titan Ophion’s", + "after": "Titan Ophion’s" + }, + { + "before": "Work with me, fragile one", + "after": "Work with me, Fragile One" + }, + { + "before": "‘fragile one’", + "after": "‘Fragile One’" + }, + { + "before": "“—But there won’t be any effects", + "after": "“—but there won’t be any effects" + }, + { + "before": "One of his Titans lurked", + "after": "One of his giants lurked" + }, + { + "before": "furously", + "after": "furiously" + }, + { + "before": "what I’d looked, hadn’t registered", + "after": "what I’d looked at, hadn’t registered" + }, + { + "before": "Mother Titan", + "after": "Mother Giant" + }, + { + "before": "Adrenline", + "after": "Adrenaline" + }, + { + "before": "ex-Prison", + "after": "ex-prison" + }, + { + "before": "Chris and the Syringe", + "after": "Chris and the syringe" + }, + { + "before": "“…She might have gotten", + "after": "“…she might have gotten" + }, + { + "before": "“—It was Jessica accepting", + "after": "“—it was Jessica accepting" + }, + { + "before": "We saw people running around.

", + "after": "We saw people running around.”

" + } + ], + "https://www.parahumans.net/2020/01/25/infrared-19-d/": [ + { + "before": "look after mom", + "after": "look after Mom" + }, + { + "before": "pink-a line of red-pink", + "after": "pink—a line of red—pink" + }, + { + "before": "recruited for busy work", + "after": "recruited for busywork" + }, + { + "before": "Steamwheel went Rogue", + "after": "Steamwheel went rogue" + }, + { + "before": "mother said. Such a horrible", + "after": "mother said. “Such a horrible" + } + ], + "https://www.parahumans.net/2020/01/28/infrared-19-e/": [ + { + "before": "so mom doesn’t end up alone", + "after": "so Mom doesn’t end up alone" + }, + { + "before": "“No!” she was almost drowned out", + "after": "“No!” She was almost drowned out" + } + ], + "https://www.parahumans.net/2020/02/02/infrared-19-7/": [ + { + "before": "I really wasn’t. really", + "after": "I really wasn’t. Really" + }, + { + "before": "‘I have that and ‘I don’t want it’", + "after": "‘I have that and I don’t want it’" + }, + { + "before": "number boy", + "after": "Number Boy" + } + ], + "https://www.parahumans.net/2020/02/04/infrared-19-8/": [ + { + "before": "Lessons from mom, age thirteen", + "after": "Lessons from Mom, age thirteen" + }, + { + "before": "relatively speaking” Number Five", + "after": "relatively speaking,” Number Five" + }, + { + "before": "Skitter, Khepri", + "after": "Skitter, Khepri" + }, + { + "before": "built in spears", + "after": "built-in spears" + } + ], + "https://www.parahumans.net/2020/02/08/infrared-19-9/": [ + { + "before": "had insisted she or dad drive us", + "after": "had insisted she or Dad drive us" + }, + { + "before": "you know about” my Aunt Sarah said", + "after": "you know about,” my Aunt Sarah said" + }, + { + "before": "so they grow in…”", + "after": "so they grow in…”" + }, + { + "before": "my Uncle said", + "after": "my uncle said" + }, + { + "before": "Anywhere else?", + "after": "Anywhere else?" + }, + { + "before": "do you understand about Trigger events", + "after": "do you understand about trigger events" + }, + { + "before": "good day,” my mother said, “The best", + "after": "good day,” my mother said, “the best" + }, + { + "before": "happen to you,” My mother said", + "after": "happen to you,” my mother said" + } + ], + "https://www.parahumans.net/2020/02/11/infrared-19-f/": [ + { + "before": "while Aisha stuck with mom", + "after": "while Aisha stuck with Mom" + }, + { + "before": "while mom did her own thing", + "after": "while Mom did her own thing" + }, + { + "before": "still hadn’t been repeated from the fights", + "after": "still hadn’t been repaired from the fights" + }, + { + "before": "“Hey!” the girl turned", + "after": "“Hey!” The girl turned" + }, + { + "before": "Lookout, How long do you need", + "after": "Lookout, how long do you need" + }, + { + "before": "You guy should know", + "after": "You guys should know" + }, + { + "before": "he’d gotten more of dad", + "after": "he’d gotten more of Dad" + }, + { + "before": "Its Capricorn", + "after": "It’s Capricorn" + } + ], + "https://www.parahumans.net/2020/02/15/infrared-19-10/": [ + { + "before": "Stuff to do with mom", + "after": "Stuff to do with Mom" + }, + { + "before": "thinking about mom getting on my case", + "after": "thinking about Mom getting on my case" + }, + { + "before": "figure out while she was gone. we’ll see who", + "after": "figure out while she was gone. We’ll see who" + }, + { + "before": "miligram", + "after": "milligram" + }, + { + "before": "same clothes that had been issues to the refugees", + "after": "same clothes that had been issued to the refugees" + } + ], + "https://www.parahumans.net/2020/02/18/infrared-19-g/": [ + { + "before": "Imp and the heartbroken", + "after": "Imp and the Heartbroken" + }, + { + "before": "That’s the way it always goes I get close to people", + "after": "That’s the way it always goes—I get close to people" + }, + { + "before": "The voices, a veritable crowd, was audible now", + "after": "The voices, a veritable crowd, were audible now" + } + ], + "https://www.parahumans.net/2020/02/23/infrared-19-z/": [ + { + "before": "5’1 “", + "after": "5′1″" + }, + { + "before": "pink and black titan", + "after": "pink and black Titan" + }, + { + "before": "throguh", + "after": "through" + } + ], + "https://www.parahumans.net/2020/02/25/last-20-1/": [ + { + "before": "across this clearing. eyes, cameras", + "after": "across this clearing. Eyes, cameras" + }, + { + "before": "monsters, and to use the phrasing he liked", + "after": "monsters, to use the phrasing he liked" + }, + { + "before": "about giving short speeches. I couldn’t help", + "after": "about giving short speeches, I couldn’t help" + }, + { + "before": "this Endbringer that wasn’t brutish and noisy", + "after": "this Endbringer wasn’t brutish and noisy" + }, + { + "before": "like a dance with wings", + "after": "like a dancer with wings" + }, + { + "before": "a gravely sound", + "after": "a gravelly sound" + }, + { + "before": "trying to remain peripherally aware of.", + "after": "trying to remain peripherally aware." + }, + { + "before": "The scream, the fact was", + "after": "The scream, the fact we" + }, + { + "before": "The water receded before tsunami", + "after": "The water receded before a tsunami" + }, + { + "before": "Stay the course!

", + "after": "Stay the course!”

" + } + ], + "https://www.parahumans.net/2020/02/29/last-20-2/": [ + { + "before": "Go!", + "after": "Go!" + } + ], + "https://www.parahumans.net/2020/03/03/last-20-3/": [ + { + "before": "Get-between the words", + "after": "Get——between the words" + } + ], + "https://www.parahumans.net/2020/03/07/last-20-4/": [ + { + "before": "peace!” Cryptid growled", + "after": "peace!” Cryptid growled" + }, + { + "before": "I’m going crazy,” Sveta remarked. “It’s you", + "after": "I’m going crazy,” Sveta remarked, “it’s you" + } + ], + "https://www.parahumans.net/2020/03/10/last-20-5/": [ + { + "before": "“…It’s slipping through our", + "after": "“…it’s slipping through our" + } + ], + "https://www.parahumans.net/2020/03/15/last-20-6/": [ + { + "before": "Strikes, brutes, breakers", + "after": "Strikers, brutes, breakers" + } + ], + "https://www.parahumans.net/2020/03/17/last-20-7/": [ + { + "before": "the pain in the ass heroine", + "after": "the pain-in-the-ass heroine" + }, + { + "before": "manton limit", + "after": "Manton limit" + } + ], + "https://www.parahumans.net/2020/03/21/last-20-8/": [ + { + "before": "For Humanity?", + "after": "For humanity?" + }, + { + "before": "a plan for Endgame", + "after": "a plan for endgame" + }, + { + "before": "Saturday Morning cartoon", + "after": "Saturday-morning cartoon", + "_comment": "https://en.wikipedia.org/wiki/Saturday-morning_cartoon" + }, + { + "before": "Simurgh driven future", + "after": "Simurgh-driven future" + }, + { + "before": "the Entities", + "after": "the entities" + } + ], + "https://www.parahumans.net/2020/03/24/last-20-9/": [ + { + "before": "you could help miss—help Antares", + "after": "you could help Miss—help Antares" + }, + { + "before": "Did I scare him?", + "after": "Did I scare him?" + }, + { + "regExp": "nurse Leah", + "replacement": "Nurse Leah" + }, + { + "before": "“…But I have to draw", + "after": "“…but I have to draw" + }, + { + "before": "break Capricorn’s parents hearts", + "after": "break Capricorn’s parents’ hearts" + } + ], + "https://www.parahumans.net/2020/03/31/last-20-10/": [ + { + "before": "shaping it as it rolled out. it became a circular", + "after": "shaping it as it rolled out. It became a circular" + } + ], + "https://www.parahumans.net/2020/04/04/last-20-b/": [ + { + "before": "Aurora Borealis", + "after": "aurora borealis" + }, + { + "before": "the snow fall and", + "after": "the snowfall and" + }, + { + "before": "the more boy crazy girls", + "after": "the more boy-crazy girls" + }, + { + "before": "hostage with us, too!", + "after": "hostage with us, too!" + }, + { + "before": "done, prez", + "after": "done, Prez" + }, + { + "before": "The—-bye.", + "after": "The——bye." + }, + { + "before": "who would gave gone after", + "after": "who would have gone after" + }, + { + "before": "a problem?” Her dad asked", + "after": "a problem?” her dad asked" + }, + { + "before": "her fathers hand", + "after": "her father’s hand" + } + ], + "https://www.parahumans.net/2020/04/07/last-20-11/": [ + { + "before": "had harangued the P.R.T., even though the Patrol had", + "after": "had harangued the PRT, even though the patrol had" + }, + { + "before": "“Actually,” Tattletale said. “I’ve been going", + "after": "“Actually,” Tattletale said, “I’ve been going" + }, + { + "before": "It’s not hell either", + "after": "It’s not Hell either" + }, + { + "before": "damocles", + "after": "Damocles" + } + ], + "https://www.parahumans.net/2020/04/11/last-20-e1/": [ + { + "before": "newly formed Protectorate", + "after": "newly-formed Protectorate" + }, + { + "before": "looked out over the city, and feeling shock", + "after": "looked out over the city, and felt shock" + } + ], + "https://www.parahumans.net/2020/04/14/last-20-e2/": [ + { + "before": "a few years where father felt like", + "after": "a few years where Father felt like" + }, + { + "before": "“—And the escaped prisoners", + "after": "“—and the escaped prisoners" + }, + { + "before": "case by case basis", + "after": "case-by-case basis" + } + ], + "https://www.parahumans.net/2020/04/18/last-20-e3/": [ + { + "before": "madness inducing years of isolation", + "after": "madness-inducing years of isolation" + }, + { + "before": "Finale! Now!", + "after": "Finale! Now!" + } + ], + "https://www.parahumans.net/2020/04/21/last-20-e4/": [ + { + "before": "grown around the the maille sheath", + "after": "grown around the maille sheath" + }, + { + "before": "the size of a deserted earth", + "after": "the size of a deserted Earth" + } + ], + "https://www.parahumans.net/2020/04/25/last-20-e5/": [ + { + "before": "She has has some past therapy", + "after": "She has had some past therapy" + }, + { + "before": "

It was a sunny spring", + "after": "

It was a sunny spring" + }, + { + "before": "living like a king.

", + "after": "living like a king.

" + }, + { + "before": "dont’", + "after": "don’t" + }, + { + "before": "its a nightmare I know", + "after": "it’s a nightmare I know" + }, + { + "before": "what to do.”

\n

“Imp was saying Lookout", + "after": "what to do.

\n

“Imp was saying Lookout", + "_comment": "https://english.stackexchange.com/q/2288/242244" + }, + { + "before": "listening, lost in tinkering—

", + "after": "listening, lost in tinkering—”

" + }, + { + "before": "

:Transmit
\nI’ve got", + "after": "

:Transmit
I’ve got" + } + ], + "https://www.parahumans.net/2020/04/28/last-20-e6/": [ + { + "before": "mourning Eric and dad", + "after": "mourning Eric and Dad" + }, + { + "before": "ongoing fight with mom", + "after": "ongoing fight with Mom" + }, + { + "before": "His eyes locked to mom", + "after": "His eyes locked to Mom" + }, + { + "before": "the backup that mom provided", + "after": "the backup that Mom provided" + }, + { + "before": "Back to mom", + "after": "Back to Mom" + }, + { + "before": "Gold morning", + "after": "Gold Morning" + }, + { + "before": "pay it safe", + "after": "play it safe" + }, + { + "before": "“—You’ll want to pass on", + "after": "“—you’ll want to pass on" + }, + { + "before": "cross the Ocean", + "after": "cross the ocean" + } + ], + "https://www.parahumans.net/2020/05/02/last-20-end/": [ + { + "before": "saying dad had custody", + "after": "saying Dad had custody" + }, + { + "before": "I lied and said you and dad gave", + "after": "I lied and said you and Dad gave" + }, + { + "before": "their reservations about you and dad. But whatever
.", + "after": "their reservations about you and Dad. But whatever.
" + }, + { + "before": "decide if it’s you or dad", + "after": "decide if it’s you or Dad" + }, + { + "before": "Your issue with dad", + "after": "Your issue with Dad" + }, + { + "before": "My boss is-was", + "after": "My boss is—was" + }, + { + "before": "he mom shook her head", + "after": "her mom shook her head" + }, + { + "before": "with black slacks. his hair was chin", + "after": "with black slacks. His hair was chin" + }, + { + "before": "human right’s abuses", + "after": "human rights abuses" + }, + { + "before": "‘us‘", + "after": "‘us’" + }, + { + "before": "captain Gaile", + "after": "Captain Gaile" + } ] } diff --git a/lib/worm-scraper.js b/lib/worm-scraper.js index a288d6d..5f34617 100644 --- a/lib/worm-scraper.js +++ b/lib/worm-scraper.js @@ -2,86 +2,112 @@ "use strict"; /* eslint-disable no-process-exit */ const path = require("path"); -const mkdirp = require("mkdirp-then"); -const rimraf = require("rimraf-then"); +const fs = require("fs").promises; const yargs = require("yargs"); const packageJson = require("../package.json"); +const books = require("./books.js"); const download = require("./download.js"); const convert = require("./convert.js"); const scaffold = require("./scaffold.js"); const zip = require("./zip.js"); -const argv = yargs +const OUTPUT_DEFAULT = "(Book name).epub"; + +const { argv } = yargs .usage(`${packageJson.description}\n\n${packageJson.name} [ [ [ ...]]]\n\n` + - "Each command will fail if the previously-listed one has not yet been run (with matching options).") - .command("download", "download all chapters by crawling parahumans.wordpress.com") - .command("convert", "convert the raw chapter HTML files into cleaned-up ebook chapters") - .command("scaffold", "assemble the table of contents, etc. to complete the EPUB") - .command("zip", "zip up the EPUB files into a .epub output") - .option("s", { - alias: "start-url", - default: "https://parahumans.wordpress.com/2011/06/11/1-1/", - describe: "the URL from which to start crawling, for the download command", + "Each command will fail if the previously-listed one has not yet been run (with matching options).\n\n" + + "Running with no commands is equivalent to running download convert scaffold zip.") + .command("download", "download all chapters into the cache") + .command("convert", "convert the raw HTML into cleaned-up ebook chapters") + .command("scaffold", "assemble the table of contents, etc.") + .command("zip", "zip up the created files into a .epub output") + .option("b", { + alias: "book", + default: Object.keys(books)[0], + describe: "the book to operate on", + choices: Object.keys(books), requiresArg: true, global: true }) .option("c", { - alias: "cache-directory", + alias: "cache", default: "cache", - describe: "cache directory, for the download and convert commands", + describe: "cache directory for downloaded raw chapters", requiresArg: true, global: true }) - .option("b", { - alias: "book-directory", - default: "book", - describe: "directory in which to assemble the EPUB files before zipping, for the convert, scaffold, and zip " + - "commands", + .option("s", { + alias: "staging", + default: "staging", + describe: "directory in which to assemble the EPUB files", requiresArg: true, global: true }) .option("o", { alias: "out", - default: "Worm.epub", - describe: "output file destination, for the zip command", + default: OUTPUT_DEFAULT, + describe: "output file destination", + requiresArg: true, + global: true + }) + .option("j", { + alias: "jobs", + default: undefined, + defaultDescription: "# of CPU cores - 1", + describe: "number of concurrent read/write conversion jobs", requiresArg: true, global: true }) - .demandCommand(1) // TODO remove and allow all .recommendCommands() .help() - .version() - .argv; + .version(); -const cachePath = path.resolve(argv.cacheDirectory); +const outputFilename = argv.out === OUTPUT_DEFAULT ? `${books[argv.book].title}.epub` : argv.out; + +const cachePath = path.resolve(argv.cache, argv.book); const manifestPath = path.resolve(cachePath, "manifest.json"); const scaffoldingPath = path.resolve(__dirname, "../scaffolding"); -const bookPath = path.resolve(argv.bookDirectory); -const contentPath = path.resolve(bookPath, "OEBPS"); +const coverPath = path.resolve(__dirname, "../covers", argv.book); +const stagingPath = path.resolve(argv.staging, argv.book); +const contentPath = path.resolve(stagingPath, "OEBPS"); const chaptersPath = path.resolve(contentPath, "chapters"); const commands = []; +if (argv._.length === 0) { + argv._ = ["download", "convert", "scaffold", "zip"]; +} + if (argv._.includes("download")) { - commands.push(() => download(argv.startUrl, cachePath, manifestPath)); + const { startURL } = books[argv.book]; + commands.push(() => download(startURL, cachePath, manifestPath)); } if (argv._.includes("convert")) { commands.push(() => { - return rimraf(chaptersPath) - .then(() => mkdirp(chaptersPath)) - .then(() => convert(cachePath, manifestPath, chaptersPath)); + return fs.rm(chaptersPath, { force: true, recursive: true, maxRetries: 3 }) + .then(() => fs.mkdir(chaptersPath, { recursive: true })) + .then(() => convert(cachePath, manifestPath, chaptersPath, argv.book, argv.jobs)); }); } if (argv._.includes("scaffold")) { - commands.push(() => scaffold(scaffoldingPath, bookPath, contentPath, chaptersPath, manifestPath)); + const bookInfo = books[argv.book]; + commands.push(() => scaffold( + scaffoldingPath, + coverPath, + stagingPath, + contentPath, + chaptersPath, + manifestPath, + bookInfo + )); } if (argv._.includes("zip")) { - commands.push(() => zip(bookPath, contentPath, path.resolve(argv.out))); + commands.push(() => zip(stagingPath, contentPath, path.resolve(outputFilename))); } (async () => { @@ -89,8 +115,6 @@ if (argv._.includes("zip")) { for (const command of commands) { await command(); } - - console.log("All done!"); } catch (e) { console.error(e.stack); process.exit(1); diff --git a/lib/zip.js b/lib/zip.js index 3e7d20c..333eeec 100644 --- a/lib/zip.js +++ b/lib/zip.js @@ -21,7 +21,7 @@ module.exports = (bookPath, contentPath, outPath) => { archive.pipe(destStream); // Order matters; mimetype must be first for a valid EPUB - archive.file(path.resolve(bookPath, "mimetype"), { name: "mimetype" }); + archive.file(path.resolve(bookPath, "mimetype"), { name: "mimetype", store: true }); archive.directory(contentPath, "OEBPS", { name: "OEBPS" }); archive.directory(path.resolve(bookPath, "META-INF"), "META-INF", { name: "META-INF" }); diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a65e4fc..e99c2ae 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,109 +1,2161 @@ { "name": "worm-scraper", - "version": "2.3.0", - "lockfileVersion": 1, + "version": "5.1.0", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" + "packages": { + "": { + "name": "worm-scraper", + "version": "5.1.0", + "license": "WTFPL", + "dependencies": { + "archiver": "^5.3.1", + "cli-progress": "^3.11.1", + "cpr": "^3.0.1", + "jsdom": "^19.0.0", + "minipass-fetch": "^2.1.0", + "workerpool": "^6.2.1", + "yargs": "^17.5.1" + }, + "bin": { + "worm-scraper": "lib/worm-scraper.js" + }, + "devDependencies": { + "@domenic/eslint-config": "^2.0.0", + "eslint": "^8.16.0" + }, + "engines": { + "node": ">=16.13.2" } }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "node_modules/@domenic/eslint-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@domenic/eslint-config/-/eslint-config-2.0.0.tgz", + "integrity": "sha512-8y5OfzEbMLPqKxku8itEDxJOi7HrRzP1vhgJs7+XpjJOpiyHLGZ2vhpyA9ZmYwVak04er72PpPSSYvd8TUF09Q==", + "dev": true, + "peerDependencies": { + "eslint": "^8.7.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-progress": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.1.tgz", + "integrity": "sha512-TTMA2LHrYaZeNMcgZGO10oYqj9hvd03pltNtVbu4ddeyDTHlYV7gWxsFiuvaQlgwMBFCv1TukcjiODWFlb16tQ==", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cpr": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz", + "integrity": "sha512-Xch4PXQ/KC8lJ+KfJ9JI6eG/nmppLrPPWg5Q+vh65Qr9EjuJEubxh/H/Le1TmCZ7+Xv7iJuNRqapyOFZB+wsxA==", + "dependencies": { + "graceful-fs": "^4.1.5", + "minimist": "^1.2.0", + "mkdirp": "~0.5.1", + "rimraf": "^2.5.4" + }, + "bin": { + "cpr": "bin/cpr" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "dependencies": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + }, + "dependencies": { + "@domenic/eslint-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@domenic/eslint-config/-/eslint-config-2.0.0.tgz", + "integrity": "sha512-8y5OfzEbMLPqKxku8itEDxJOi7HrRzP1vhgJs7+XpjJOpiyHLGZ2vhpyA9ZmYwVak04er72PpPSSYvd8TUF09Q==", + "dev": true, + "requires": {} + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" } }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" }, "acorn-globals": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", - "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } } }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", - "dev": true + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", - "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", - "dev": true, - "requires": { - "type-fest": "^0.5.2" - } - }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, "archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "requires": { "archiver-utils": "^2.1.0", - "async": "^2.6.3", + "async": "^3.2.3", "buffer-crc32": "^0.2.1", - "glob": "^7.1.4", - "readable-stream": "^3.4.0", - "tar-stream": "^2.1.0", - "zip-stream": "^2.1.2" + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" } }, "archiver-utils": { @@ -124,9 +2176,9 @@ }, "dependencies": { "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -136,94 +2188,56 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } } } }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "requires": { - "readable-stream": "^3.0.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, "brace-expansion": { @@ -236,23 +2250,23 @@ } }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "buffer": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.0.tgz", - "integrity": "sha512-Xpgy0IwHK2N01ncykXTy6FpCWuM+CJSHoPVBLyNqyrWxsedpLvwsYUhf0ME3WRFNUhos0dMamz9cOS/xRDtU5g==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, "callsites": { "version": "3.1.0", @@ -260,70 +2274,46 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, + "cli-progress": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.1.tgz", + "integrity": "sha512-TTMA2LHrYaZeNMcgZGO10oYqj9hvd03pltNtVbu4ddeyDTHlYV7gWxsFiuvaQlgwMBFCv1TukcjiODWFlb16tQ==", "requires": { - "restore-cursor": "^3.1.0" + "string-width": "^4.2.3" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { "version": "1.0.8", @@ -334,51 +2324,30 @@ } }, "compress-commons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", - "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "requires": { "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", + "crc32-stream": "^4.0.2", "normalize-path": "^3.0.0", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "readable-stream": "^3.6.0" } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "cookie": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.2.4.tgz", - "integrity": "sha1-qMFVqnubLPLE0y68e5oKoojMxr0=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cpr": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz", - "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=", + "integrity": "sha512-Xch4PXQ/KC8lJ+KfJ9JI6eG/nmppLrPPWg5Q+vh65Qr9EjuJEubxh/H/Le1TmCZ7+Xv7iJuNRqapyOFZB+wsxA==", "requires": { "graceful-fs": "^4.1.5", "minimist": "^1.2.0", @@ -386,108 +2355,94 @@ "rimraf": "^2.5.4" } }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "requires": { - "buffer": "^5.1.0" - } + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "crc32-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", - "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "requires": { - "crc": "^3.4.4", + "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" }, "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { - "cssom": "0.3.x" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } } }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "doctrine": { "version": "3.0.0", @@ -499,244 +2454,255 @@ } }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "webidl-conversions": "^7.0.0" } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", + "esprima": "^4.0.1", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } } }, "eslint": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.1.0.tgz", - "integrity": "sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", + "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^6.0.0", - "esquery": "^1.0.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^11.7.0", - "ignore": "^4.0.6", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.4.1", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" } }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, "eslint-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", - "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, "espree": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.0.0.tgz", - "integrity": "sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" + "flat-cache": "^3.0.4" } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "dependencies": { "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -745,23 +2711,18 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, @@ -770,26 +2731,15 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "fs-cp": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/fs-cp/-/fs-cp-1.4.0.tgz", - "integrity": "sha1-XbGvWtPw3AyBhXblLdKUEeitDGU=", - "requires": { - "any-promise": "^1.1.0", - "destroy": "^1.0.0", - "mkdirp-then": "^1.0.0", - "mz": "^2.0.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "get-caller-file": { @@ -797,120 +2747,98 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "type-fest": "^0.20.2" } }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^2.0.0" } }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "agent-base": "6", + "debug": "4" } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -937,57 +2865,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "inquirer": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", - "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", - "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^5.2.0" - } - } - } - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -995,29 +2872,23 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "isarray": { "version": "1.0.0", @@ -1030,82 +2901,54 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } + "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "jsdom": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", - "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", "requires": { - "abab": "^2.0.0", - "acorn": "^6.1.1", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.3.6", - "cssstyle": "^1.2.2", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.4", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" } }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -1113,34 +2956,18 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "requires": { "readable-stream": "^2.0.5" }, "dependencies": { "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1150,32 +2977,32 @@ "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } } } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -1196,108 +3023,91 @@ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memorizer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/memorizer/-/memorizer-1.0.1.tgz", - "integrity": "sha1-/yGCKzCTlbqhzHqCTOGaE1zBFEc=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.40.0" + "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "yallist": "^4.0.0" } }, - "mkdirp-then": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mkdirp-then/-/mkdirp-then-1.2.0.tgz", - "integrity": "sha1-pJLIecpNhz9e5FAI+PVf0BUN48U=", + "minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", "requires": { - "any-promise": "^1.1.0", - "mkdirp": "^0.5.0" + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "natural-compare": { "version": "1.4.0", @@ -1305,31 +3115,15 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, "once": { "version": "1.4.0", @@ -1339,55 +3133,20 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -1397,23 +3156,10 @@ "callsites": "^3.0.0" } }, - "parse-link-header": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-0.4.1.tgz", - "integrity": "sha1-9r1hXcZxP9QJNc6XlF5NP1Iu3xQ=", - "requires": { - "xtend": "~4.0.0" - } - }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "path-is-absolute": { "version": "1.0.1", @@ -1421,188 +3167,67 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "psl": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", - "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, - "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "requires": { - "lodash": "^4.17.11" - } - }, - "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "requires": { - "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requisition": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/requisition/-/requisition-1.7.0.tgz", - "integrity": "sha1-P5n7S0W9e2JiGMeKF2MFGrWTow0=", - "requires": { - "any-promise": "^1.1.0", - "cookie": "^0.2.3", - "destroy": "^1.0.3", - "fs-cp": "^1.2.0", - "http-errors": "^1.2.7", - "media-typer": "^0.3.0", - "memorizer": "^1.0.0", - "methods": "^1.1.0", - "mime-types": "^2.0.2", - "mz": "^2.1.0", - "parse-link-header": "^0.4.1", - "statuses": "^1.2.0", - "stream-to-array": "^2.0.2", - "temp-path": "^1.0.0", - "type-is": "^1.5.2" - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -1611,37 +3236,10 @@ "glob": "^7.1.3" } }, - "rimraf-then": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rimraf-then/-/rimraf-then-1.0.1.tgz", - "integrity": "sha1-vURYp561YbdUiq7ArDdT70Kf5ws=", - "requires": { - "any-promise": "^1.3.0", - "rimraf": "2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -1649,146 +3247,73 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, - "stream-to-array": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", - "requires": { - "any-promise": "^1.1.0" + "safe-buffer": "~5.2.0" } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "symbol-tree": { @@ -1796,146 +3321,67 @@ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - } - }, "tar-stream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "requires": { - "bl": "^3.0.0", + "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, - "temp-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz", - "integrity": "sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs=" - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "requires": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" } }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", - "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -1945,100 +3391,82 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^4.0.0" } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" }, "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "requires": { - "iconv-lite": "0.4.24" + "iconv-lite": "0.6.3" } }, "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" }, "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -2046,82 +3474,59 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "ws": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", - "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", - "requires": { - "async-limiter": "^1.0.0" - } + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", + "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "requires": {} }, "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" }, "xmlchars": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz", - "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w==" - }, - "xmlserializer": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/xmlserializer/-/xmlserializer-0.6.1.tgz", - "integrity": "sha512-FNb0eEqqUUbnuvxuHqNuKH8qCGKqxu+558Zi8UzOoQk8Z9LdvpONK+v7m3gpKVHrk5Aq+0nNLsKxu/6OYh7Umw==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" }, "zip-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz", - "integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "requires": { "archiver-utils": "^2.1.0", - "compress-commons": "^2.1.1", - "readable-stream": "^3.4.0" + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" } } } diff --git a/package.json b/package.json index 55fef24..7939d64 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,20 @@ { "name": "worm-scraper", - "description": "Scrapes the web serial Worm into an eBook format", + "description": "Scrapes the web serial Worm and its sequel Ward into an eBook format", "keywords": [ "ebook", "worm", + "ward", "parahuman", "scraper" ], - "version": "2.3.0", + "version": "5.1.0", "author": "Domenic Denicola (https://domenic.me/)", "license": "WTFPL", "repository": "domenic/worm-scraper", "bin": "lib/worm-scraper.js", "files": [ + "covers/", "lib/", "scaffolding/", "npm-shrinkwrap.json" @@ -21,18 +23,19 @@ "lint": "eslint lib" }, "dependencies": { - "archiver": "^3.1.1", + "archiver": "^5.3.1", + "cli-progress": "^3.11.1", "cpr": "^3.0.1", - "jsdom": "^15.1.1", - "mkdirp-then": "^1.0.1", - "requisition": "^1.5.0", - "rimraf-then": "^1.0.0", - "thenify": "^3.3.0", - "throat": "^5.0.0", - "xmlserializer": "^0.6.1", - "yargs": "^13.3.0" + "jsdom": "^19.0.0", + "minipass-fetch": "^2.1.0", + "workerpool": "^6.2.1", + "yargs": "^17.5.1" }, "devDependencies": { - "eslint": "6.1.0" + "@domenic/eslint-config": "^2.0.0", + "eslint": "^8.16.0" + }, + "engines": { + "node": ">=16.13.2" } } diff --git a/scaffolding/OEBPS/cover.png b/scaffolding/OEBPS/cover.png deleted file mode 100644 index 04595ba..0000000 Binary files a/scaffolding/OEBPS/cover.png and /dev/null differ